/// <summary>
        /// Called when the <see cref="OpenSession" /> message is recieved.
        /// </summary>
        /// <param name="e">The <see cref="ProtocolEventArgs{OpenSession}" /> instance containing the event data.</param>
        public void OnSessionOpened(ProtocolEventArgs <OpenSession> e)
        {
            if (e.Message.SupportedProtocols.All(x => x.Protocol != (int)Protocols.ChannelStreaming))
            {
                return;
            }

            var protocol = e.Message.SupportedProtocols
                           .First(x => x.Protocol == (int)Protocols.ChannelStreaming);

            IsSimpleStreamer = protocol.ProtocolCapabilities
                               .Where(x => x.Key.EqualsIgnoreCase(ChannelStreamingProducerHandler.SimpleStreamer))
                               .Select(x => x.Value.Item)
                               .OfType <bool>()
                               .FirstOrDefault();

            var handler = Parent.Client.Handler <IChannelStreamingConsumer>();

            handler.OnChannelMetadata += OnChannelMetadata;
            handler.OnChannelData     += OnChannelData;

            CanStart         = true;
            CanStopStreaming = false;
            UpdateCanDescribe();

            Channels.Clear();
            ChannelStreamingInfos.Clear();
        }
        private void OnChannelMetadata(object sender, ProtocolEventArgs <ChannelMetadata> e)
        {
            if (!e.Message.Channels.Any())
            {
                Parent.Details.Append(Environment.NewLine + "// No channels were described");
                return;
            }

            // add to channel metadata collection
            e.Message.Channels.ForEach(x =>
            {
                if (Channels.Any(c => c.ChannelUri.EqualsIgnoreCase(x.ChannelUri)))
                {
                    return;
                }

                Channels.Add(x);
                ChannelStreamingInfos.Add(ToChannelStreamingInfo(x));
            });

            if (e.Header.MessageFlags != (int)MessageFlags.MultiPart)
            {
                LogChannelMetadata(Channels);

                if (!IsStreaming())
                {
                    CanStartStreaming = !IsSimpleStreamer;
                    CanStopStreaming  = IsSimpleStreamer;
                    UpdateCanRequestRange();
                }
            }
        }
 private void UpdateCanRequestRange()
 {
     CanRequestRange = CanStartStreaming &&
                       !IsSimpleStreamer &&
                       ChannelStreamingInfos.Any() &&
                       ("TimeIndex".EqualsIgnoreCase(Model.Streaming.StreamingType) ||
                        "DepthIndex".EqualsIgnoreCase(Model.Streaming.StreamingType));
 }
        /// <summary>
        /// Starts the streaming of channel data.
        /// </summary>
        public void StartStreaming()
        {
            // Prepare ChannelStreamingInfos startIndexes
            ChannelStreamingInfos.ForEach(x => x.StartIndex = new StreamingStartIndex {
                Item = GetStreamingStartValue()
            });

            Parent.Client.Handler <IChannelStreamingConsumer>()
            .ChannelStreamingStart(ChannelStreamingInfos);

            //CanDescribe = false;
            CanStartStreaming = false;
            CanStopStreaming  = true;
            CanRequestRange   = false;
        }