/// <summary> /// Подключает к кодеку нижележащего уровня. /// </summary> /// <param name="bottomCodec">Низлежащий кодек в стеке протоколов.</param> /// <param name="filter">Предикат для фильтрации сообщений.</param> /// <param name="discardsMessages">if set to <c>true</c> удалять сообщения не прошедшие фильтр.</param> /// <returns> /// Объект, вызвав у которого <see cref="IDisposable.Dispose"/>, можно прервать связь. /// </returns> protected IDisposable LinkTo <T>(INibusCodec <T, TEncoded> bottomCodec, Predicate <TEncoded> filter, bool discardsMessages = false) { // Удаляем старые сообщения var receivable = bottomCodec.Decoder as IReceivableSourceBlock <TEncoded>; if (receivable != null) { if (discardsMessages) { IList <TEncoded> oldMessages; receivable.TryReceiveAll(out oldMessages); } else { TEncoded oldMessage; while (receivable.TryReceive(filter, out oldMessage)) { } } } var unlinker = new Unlinker(); unlinker.AddLink(bottomCodec.Decoder.LinkTo(Decoder, filter, discardsMessages)); unlinker.AddLink(Encoder.LinkTo(bottomCodec.Encoder)); _unlinker.AddLink(unlinker); return(unlinker); }
/// <summary> /// Подключает к транспорту. /// </summary> /// <param name="transport">Транспорт.</param> /// <returns> /// Объект, вызвав у которого <see cref="IDisposable.Dispose"/>, можно прервать связь. /// </returns> /// <remarks>Стандартная реализация <see cref="ConnectTo{T}"/></remarks> protected IDisposable LinkTo(INibusEndpoint <TEncoded> transport) { // Удаляем старые сообщения IList <TEncoded> oldMessages; transport.IncomingMessages.TryReceiveAll(out oldMessages); var unlinker = new Unlinker(); unlinker.AddLink(transport.IncomingMessages.LinkTo(Decoder)); unlinker.AddLink(Encoder.LinkTo(transport.OutgoingMessages)); _unlinker.AddLink(unlinker); return(unlinker); }
/// <summary> /// Подключает к кодеку нижележащего уровня. /// </summary> /// <param name="bottomCodec">Низлежащий кодек в стеке протоколов.</param> /// <returns> /// Объект, вызвав у которого <see cref="IDisposable.Dispose"/>, можно прервать связь. /// </returns> /// <remarks>Стандартная реализация <see cref="ConnectTo{T}"/></remarks> protected IDisposable LinkTo <T>(INibusCodec <T, TEncoded> bottomCodec) { // Удаляем старые сообщения var receivable = bottomCodec.Decoder as IReceivableSourceBlock <TEncoded>; if (receivable != null) { IList <TEncoded> oldMessages; receivable.TryReceiveAll(out oldMessages); } var unlinker = new Unlinker(); unlinker.AddLink(bottomCodec.Decoder.LinkTo(Decoder)); unlinker.AddLink(Encoder.LinkTo(bottomCodec.Encoder)); _unlinker.AddLink(unlinker); return(unlinker); }