コード例 #1
0
        private void LinkHandlers(MessageHandlerBase prev, MessageHandlerBase next)
        {
            if (prev != null)
            {
                if (next != null)
                {
                    prev.NextHandler      = next.HandleUpstreamMessage;
                    prev.ChannelActivated = next.OnChannelActivated;
                }
                else
                {
                    prev.NextHandler      = null;
                    prev.ChannelActivated = null;
                }
            }

            if (next != null)
            {
                if (prev != null)
                {
                    next.PrevHandler = prev.HandleDownstreamMessage;
                }
                else
                {
                    next.PrevHandler = null;
                }
            }
        }
コード例 #2
0
        private MessageHandlerBase FindNextFirstActiveHandler(int startIndex)
        {
            while (startIndex < _handlers.Count - 1)
            {
                startIndex++;

                MessageHandlerBase handler = _handlers[startIndex];
                if (handler.IsActive)
                {
                    return(handler);
                }
            }

            return(null);
        }
コード例 #3
0
        private MessageHandlerBase FindPrevFirstActiveHandler(int startIndex)
        {
            while (startIndex > 0)
            {
                startIndex--;

                MessageHandlerBase handler = _handlers[startIndex];
                if (handler.IsActive)
                {
                    return(handler);
                }
            }

            return(null);
        }
コード例 #4
0
        public void Add(MessageHandlerBase handler)
        {
            handler.IsActive = true;
            handler.Pipeline = this;

            if (_firstHandler == null)
            {
                LinkFirstHandler(handler);
            }
            else
            {
                MessageHandlerBase lastHandler = _handlers.Count > 0
                    ? _handlers[_handlers.Count - 1]
                    : null;

                LinkHandlers(lastHandler /* prev */, handler /* next */);
            }

            _handlers.Add(handler);
        }
コード例 #5
0
        public void DeactivateHandler(MessageHandlerBase handler)
        {
            handler.IsActive = false;

            int handlerIndex = _handlers.IndexOf(handler);

            MessageHandlerBase prevHandler = FindPrevFirstActiveHandler(handlerIndex);
            MessageHandlerBase nextHandler = FindNextFirstActiveHandler(handlerIndex);

            if (prevHandler == null && nextHandler == null)
            {
                throw new Exception("No handlers remain.");
            }

            LinkHandlers(prevHandler, nextHandler);

            if (prevHandler == null)
            {
                // Текущий хэндлер был первым. Линкуем следующий хэндлер как первый.
                LinkFirstHandler(nextHandler);
            }
        }
コード例 #6
0
 private void LinkFirstHandler(MessageHandlerBase firstHandler)
 {
     _firstHandler             = firstHandler;
     _firstHandler.PrevHandler = SendToChannel;
 }