Пример #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);
        }
Пример #2
0
 /// <summary>
 /// Releases unmanaged and - optionally - managed resources
 /// </summary>
 /// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
 protected virtual void Dispose(bool disposing)
 {
     if (disposing)
     {
         using (_unlinker)
         {
             _unlinker = null;
         }
     }
     IsDisposed = true;
 }
Пример #3
0
        /// <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);
        }
Пример #4
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);
        }