コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
 public void RetrieveCall(IXdrReadable argument) => argument.ReadFrom(this.xdrReader);