/// <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="bottomCodec">Низлежащий кодек в стеке протоколов.</param> /// <returns> /// Объект, вызвав у которого <see cref="IDisposable.Dispose"/>, можно прервать связь. /// </returns> public virtual IDisposable ConnectTo <T>(INibusCodec <T, TEncoded> bottomCodec) { Contract.Requires(!IsDisposed); Contract.Requires(bottomCodec != null); Contract.Requires(bottomCodec.Decoder != null); Contract.Requires(bottomCodec.Encoder != null); Contract.Requires(Decoder != null); Contract.Requires(Encoder != null); return(LinkTo(bottomCodec)); }
/// <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); }
/// <summary> /// Подключает к кодеку нижележащего уровня. /// </summary> /// <param name="bottomCodec">Нижележащий кодек в стеке протоколов.</param> /// <returns>Объект, вызвав у которого <see cref="IDisposable.Dispose"/>, можно прервать связь.</returns> public override IDisposable ConnectTo <T>(INibusCodec <T, NibusDatagram> bottomCodec) { return(LinkTo(bottomCodec, datagram => datagram.ProtocolType == ProtocolType)); }