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; } } }
private MessageHandlerBase FindNextFirstActiveHandler(int startIndex) { while (startIndex < _handlers.Count - 1) { startIndex++; MessageHandlerBase handler = _handlers[startIndex]; if (handler.IsActive) { return(handler); } } return(null); }
private MessageHandlerBase FindPrevFirstActiveHandler(int startIndex) { while (startIndex > 0) { startIndex--; MessageHandlerBase handler = _handlers[startIndex]; if (handler.IsActive) { return(handler); } } return(null); }
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); }
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); } }
private void LinkFirstHandler(MessageHandlerBase firstHandler) { _firstHandler = firstHandler; _firstHandler.PrevHandler = SendToChannel; }