Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
 /// <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));
 }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
 /// <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));
 }