public void SendCall(int procedure, int version, IXdrWritable argument, IXdrReadable result) { for (int i = 0; i < 2; i++) { if (!this.SendMessage(procedure, version, argument, out string errorMessage)) { if (i == 0) { this.logger?.Error(errorMessage + " Retrying..."); this.reestablishConnection?.Invoke(); continue; } throw new RpcException(errorMessage); } if (!this.ReceiveReply(result, out errorMessage)) { if (i == 0) { this.logger?.Error(errorMessage + " Retrying..."); this.reestablishConnection?.Invoke(); continue; } throw new RpcException(errorMessage); } break; } }
private bool ReceiveReply(IXdrReadable result, out string errorMessage) { var reply = new RpcMessage(); reply.ReadFrom(this.xdrReader); if (reply.Xid != this.rpcMessage.Xid) { errorMessage = $"Wrong XID. Expected {this.rpcMessage.Xid}, but was {reply.Xid}."; return(false); } if (reply.Body.MessageType != MessageType.Reply) { errorMessage = $"Wrong message type. Expected {MessageType.Reply}, but was {reply.Body.MessageType}."; return(false); } if (reply.Body.ReplyBody.ReplyStatus != ReplyStatus.Accepted) { errorMessage = "Call was denied."; return(false); } if (reply.Body.ReplyBody.AcceptedReply.ReplyData.AcceptStatus != AcceptStatus.Success) { errorMessage = $"Call was unsuccessful: {reply.Body.ReplyBody.AcceptedReply.ReplyData.AcceptStatus}."; return(false); } result.ReadFrom(this.xdrReader); this.networkReader.EndReading(); errorMessage = null; return(true); }
public void RetrieveCall(IXdrReadable argument) => argument.ReadFrom(this.xdrReader);