static void OnPollTimeout(object state)
        {
            MakeConnectionRequestContext thisPtr = (MakeConnectionRequestContext)state;

            thisPtr.pollTimer = null;
            thisPtr.SendAck();
        }
            public TryReplyAsyncResult(Message message, TimeSpan timeout, MakeConnectionRequestContext context, AsyncCallback callback, object state)
                : base(callback, state)
            {
                this.message       = message;
                this.timeoutHelper = new TimeoutHelper(timeout);
                this.context       = context;

                if (this.context.IsMakeConnectionPollingMessage || this.message.Headers.RelatesTo == this.context.RequestMesssageId)
                {
                    this.retval = this.context.TrySetResponded();

                    if (this.retval)
                    {
                        IAsyncResult result = this.context.BeginReply(this.message, this.timeoutHelper.RemainingTime(), onReplyCompleted, this);
                        if (!result.CompletedSynchronously)
                        {
                            return;
                        }

                        OnReplyCompletedCore(result);
                    }
                }
                else
                {
                    IAsyncResult result = this.context.BeginSendAck(onSendResponseCompleted, this);
                    if (!result.CompletedSynchronously)
                    {
                        return;
                    }

                    OnSendResponseCompletedCore(result);
                }

                base.Complete(true);
            }
 bool TryGetContextForMessageId(UniqueId messageId, out MakeConnectionRequestContext context)
 {
     lock (this.contextDictionary)
     {
         return(this.contextDictionary.TryGetValue(messageId, out context));
     }
 }
        static void OnFaultCompleted(IAsyncResult result)
        {
            if (result.CompletedSynchronously)
            {
                return;
            }

            MakeConnectionRequestContext thisPtr = (MakeConnectionRequestContext)result.AsyncState;

            thisPtr.OnFaultCompletedCore(result);
        }
 public void RemoveContext(MakeConnectionRequestContext context)
 {
     if (context.RequestMesssageId != null)
     {
         lock (this.contextDictionary)
         {
             if (this.contextDictionary.ContainsKey(context.RequestMesssageId))
             {
                 this.contextDictionary.Remove(context.RequestMesssageId);
             }
         }
     }
 }
 public void AddContext(MakeConnectionRequestContext context)
 {
     if (context.RequestMesssageId != null)
     {
         lock (this.contextDictionary)
         {
             if (!this.contextDictionary.ContainsKey(context.RequestMesssageId))
             {
                 this.contextDictionary.Add(context.RequestMesssageId, context);
             }
         }
     }
 }
 public void AddContext(MakeConnectionRequestContext context)
 {
     if (context.RequestMesssageId != null)
     {
         lock (this.contextDictionary)
         {
             if (!this.contextDictionary.ContainsKey(context.RequestMesssageId))
             {
                 this.contextDictionary.Add(context.RequestMesssageId, context);
             }
         }
     }
 }
        public void EnqueueAndDispatchContext(MakeConnectionRequestContext context)
        {
            MakeConnectionRequestContext oldContext;

            if (context.IsMakeConnectionPollingMessage && TryDequeue(out oldContext))
            {
                ThreadPool.QueueUserWorkItem(onReplyAndEnqueueLater, new EnqueueData(this, oldContext, context));
            }
            else
            {
                this.contexts.EnqueueAndDispatch(context, new Action(context.OnDequeue), false);
            }
        }
            bool OnContextDequeueCompletedCore(IAsyncResult result)
            {
                this.context = this.dispatcher.contexts.EndDequeue(result);

                IAsyncResult replyResult = context.BeginTryReply(this.message, this.timeoutHelper.RemainingTime(), onReplyCompleted, this);

                if (replyResult.CompletedSynchronously)
                {
                    return(OnReplyCompletedCore(replyResult));
                }

                return(false);
            }
            public SendAckAsyncResult(MakeConnectionRequestContext context, AsyncCallback callback, object state)
                : base(callback, state)
            {
                this.context = context;
                if (this.context.TrySetResponded())
                {
                    IAsyncResult result = this.context.BeginReply(null, onReplyCompleted, this);
                    if (!result.CompletedSynchronously)
                    {
                        return;
                    }

                    OnReplyCompletedCore(result);
                }

                base.Complete(true);
            }
        void OnReceiveCompletedCore(IAsyncResult result)
        {
            while (true)
            {
                MakeConnectionRequestContext context = this.EndReceiveRequest(result);
                if (context == null)
                {
                    this.Shutdown();
                }
                else
                {
                    Message requestMessage = context.RequestMessage;
                    bool    enqueued       = false;

                    if (!context.IsMakeConnectionPollingMessage)
                    {
                        // this wasn't a poll, so we can dispatch the message
                        EnsureAddress(requestMessage);
                        enqueued = this.EnqueueWithoutDispatch(requestMessage, null);
                    }

                    // this.Dispatch jumps threads, so it is ok to dispatch the message
                    // before dispatching or acknowledging the context
                    if (enqueued)
                    {
                        this.Dispatch();
                    }

                    context.DispatchOrAcknowledge();

                    result = this.BeginReceiveRequest(onReceiveCompleted, this);
                }

                if (context == null || !result.CompletedSynchronously)
                {
                    return;
                }
            }
        }
 bool TryDequeue(out MakeConnectionRequestContext context)
 {
     return(this.contexts.Dequeue(TimeSpan.Zero, out context));
 }
            bool OnContextDequeueCompletedCore(IAsyncResult result)
            {
                this.context = this.dispatcher.contexts.EndDequeue(result);

                IAsyncResult replyResult = context.BeginTryReply(this.message, this.timeoutHelper.RemainingTime(), onReplyCompleted, this);
                if (replyResult.CompletedSynchronously)
                {
                    return OnReplyCompletedCore(replyResult);
                }

                return false;
            }
 bool TryGetContextForMessageId(UniqueId messageId, out MakeConnectionRequestContext context)
 {
     lock (this.contextDictionary)
     {
         return this.contextDictionary.TryGetValue(messageId, out context);
     }
 }
 public EnqueueData(MakeConnectionDispatcher dispatcher, MakeConnectionRequestContext oldContext, MakeConnectionRequestContext newContext)
 {
     this.Dispatcher = dispatcher;
     this.OldContext = oldContext;
     this.NewContext = newContext;
 }
        public void EnqueueAndDispatchContext(MakeConnectionRequestContext context)
        {
            MakeConnectionRequestContext oldContext;

            if (context.IsMakeConnectionPollingMessage && TryDequeue(out oldContext))
            {
                ThreadPool.QueueUserWorkItem(onReplyAndEnqueueLater, new EnqueueData(this, oldContext, context));
            }
            else
            {
                this.contexts.EnqueueAndDispatch(context, new Action(context.OnDequeue), false);
            }
        }
            public SendAckAsyncResult(MakeConnectionRequestContext context, AsyncCallback callback, object state)
                : base(callback, state)
            {
                this.context = context;
                if (this.context.TrySetResponded())
                {
                    IAsyncResult result = this.context.BeginReply(null, onReplyCompleted, this);
                    if (!result.CompletedSynchronously)
                    {
                        return;
                    }

                    OnReplyCompletedCore(result);
                }

                base.Complete(true);
            }
            public TryReplyAsyncResult(Message message, TimeSpan timeout, MakeConnectionRequestContext context, AsyncCallback callback, object state)
                : base(callback, state)
            {
                this.message = message;
                this.timeoutHelper = new TimeoutHelper(timeout);
                this.context = context;

                if (this.context.IsMakeConnectionPollingMessage || this.message.Headers.RelatesTo == this.context.RequestMesssageId)
                {
                    this.retval = this.context.TrySetResponded();

                    if (this.retval)
                    {
                        IAsyncResult result = this.context.BeginReply(this.message, this.timeoutHelper.RemainingTime(), onReplyCompleted, this);
                        if (!result.CompletedSynchronously)
                        {
                            return;
                        }

                        OnReplyCompletedCore(result);
                    }
                }
                else
                {
                    IAsyncResult result = this.context.BeginSendAck(onSendResponseCompleted, this);
                    if (!result.CompletedSynchronously)
                    {
                        return;
                    }

                    OnSendResponseCompletedCore(result);
                }

                base.Complete(true);
            }
 bool TryDequeue(out MakeConnectionRequestContext context)
 {
     return this.contexts.Dequeue(TimeSpan.Zero, out context);
 }
 public EnqueueData(MakeConnectionDispatcher dispatcher, MakeConnectionRequestContext oldContext, MakeConnectionRequestContext newContext)
 {
     this.Dispatcher = dispatcher;
     this.OldContext = oldContext;
     this.NewContext = newContext;
 }
 public void RemoveContext(MakeConnectionRequestContext context)
 {
     if (context.RequestMesssageId != null)
     {
         lock (this.contextDictionary)
         {
             if (this.contextDictionary.ContainsKey(context.RequestMesssageId))
             {
                 this.contextDictionary.Remove(context.RequestMesssageId);
             }
         }
     }
 }