コード例 #1
0
ファイル: ID3v2.cs プロジェクト: stufkan/DeadDog.Audio
 public ID3v2(System.IO.Stream stream)
 {
     using (FrameReader reader = new FrameReader(stream))
     {
         setvalues(reader);
     }
 }
コード例 #2
0
 internal OutputPrepared(byte protocolVersion, FrameReader reader)
 {
     var length = reader.ReadInt16();
     QueryId = new byte[length];
     reader.Read(QueryId, 0, length);
     Metadata = new RowSetMetadata(reader, protocolVersion >= 4);
 }
コード例 #3
0
ファイル: ID3v2.cs プロジェクト: stufkan/DeadDog.Audio
        private void setvalues(FrameReader reader)
        {
            this.frameCount = reader.FrameCount;
            this.header = reader.TagHeader;
            this.title = reader.Read<string>("TIT2", ReadString, null);
            this.artist = reader.Read<string>("TPE1", ReadString, null);
            this.album = reader.Read<string>("TALB", ReadString, null);
            this.year = reader.Read<string>("TYER", ReadString, null);
            this.trackstring = reader.Read<string>("TRCK", ReadString, null);

            if (trackstring == null)
            {
                this.tracknumber = -1;
            }
            else if (trackstring.Contains("/"))
            {
                string s = trackstring.Substring(0, trackstring.IndexOf('/'));

                this.tracknumber = -1;
                int.TryParse(s, out this.tracknumber);
            }
            else
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < trackstring.Length; i++)
                {
                    if (char.IsDigit(trackstring[i]))
                        sb.Append(trackstring[i]);
                }
                this.tracknumber = -1;
                int.TryParse(sb.ToString(), out this.tracknumber);
            }
        }
コード例 #4
0
        public static Task <DS4CalibrationRecord> CalibrateAsync(FrameReader reader)
        {
#if DSAPI
            return(Task <DS4CalibrationRecord> .Run(() => Calibrator.Calibrate(reader.DSAPI)));
#else
            return(Task <DS4CalibrationRecord> .Run(() => Calibrator.Calibrate(reader.Device)));
#endif
        }
コード例 #5
0
        internal OutputPrepared(byte protocolVersion, FrameReader reader)
        {
            var length = reader.ReadInt16();

            QueryId = new byte[length];
            reader.Read(QueryId, 0, length);
            Metadata = new RowSetMetadata(reader, protocolVersion >= 4);
        }
コード例 #6
0
        public void can_parse_header(string input, string key, string value)
        {
            var parser = new FrameReader(new MemoryStream());
            var result = parser.ParseHeader(input);

            Assert.AreEqual(key, result.Key, "key");
            Assert.AreEqual(value, result.Value, "value");
        }
コード例 #7
0
ファイル: ID3v2.cs プロジェクト: stufkan/DeadDog.Audio
 public ID3v2(string filename)
 {
     using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open))
     using (FrameReader reader = new FrameReader(fs))
     {
         setvalues(reader);
     }
 }
コード例 #8
0
 protected override void Load(FrameReader reader)
 {
     _exception = new FunctionFailureException(Message)
     {
         Keyspace      = reader.ReadString(),
         Name          = reader.ReadString(),
         ArgumentTypes = reader.ReadStringList()
     };
 }
コード例 #9
0
        /// <summary>
        /// Get ready for the first shot.
        /// </summary>
        public void AttachToReader(FrameReader reader)
        {
            if (_reader != null)
            {
                throw new InvalidOperationException("We've already attached to a reader!");
            }

            _reader = reader;
        }
コード例 #10
0
ファイル: TagHeader.cs プロジェクト: stufkan/DeadDog.Audio
        public TagHeader(FrameReader reader)
        {
            byte[] buffer = new byte[9];
            bool found = false;
            int offset = 0;
            this.version = new Version(0, 0);
            while (reader.stream.Position < reader.stream.Length && !found && reader.stream.Position < 200)
            {
                int b = reader.stream.ReadByte();
                if (b == 0x49)
                {
                    reader.stream.Read(buffer, offset, 9);
                    string text = Encoding.ASCII.GetString(buffer);
                    if (buffer[0] == 0x44 &&
                        buffer[1] == 0x33 &&
                        buffer[2] < 0xff &&
                        buffer[3] < 0xff &&
                        //buffer[4] is the flag byte
                        buffer[5] < 0x80 &&
                        buffer[6] < 0x80 &&
                        buffer[7] < 0x80 &&
                        buffer[8] < 0x80)
                    {
                        this.version = new Version(buffer[2], buffer[3]);
                        this.flags = (TagFlags)buffer[4];
                        this.size = BinaryConverter.ToInt32(buffer, 5, true);

                        if (this.size + reader.stream.Position > reader.stream.Length)
                        {
                            this.version = new Version(0, 0);
                            break;
                        }

                        if ((flags & TagFlags.ExtendedHeader) == TagFlags.ExtendedHeader)
                        {
                            reader.stream.Read(buffer, 0, 4);
                            int extendedsize = BinaryConverter.ToInt32(buffer, 0, true);
                            reader.stream.Seek(extendedsize - 4, SeekOrigin.Current);
                        }

                        this.firstframe = reader.stream.Position;
                        break;
                    }
                    else
                        reader.stream.Seek(-9, SeekOrigin.Current);
                }
            }
            if (version == new Version(0, 0))
            {
                this.isempty = true;
                this.version = empty.version;
                this.flags = empty.flags;
                this.size = empty.size;
                this.firstframe = empty.firstframe;
            }
        }
コード例 #11
0
ファイル: MessageBroker.cs プロジェクト: roblans/ZWave4Net-v2
        public MessageBroker(IDuplexStream stream)
        {
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            _reader = new FrameReader(stream);
            _writer = new FrameWriter(stream);
        }
コード例 #12
0
        public PlainTextLogEventReader(TextReader input, string extractionPattern)
        {
            if (extractionPattern == null)
            {
                throw new ArgumentNullException(nameof(extractionPattern));
            }
            _nameValueExtractor = ExtractionPatternInterpreter.CreateNameValueExtractor(ExtractionPatternParser.Parse(extractionPattern));

            _reader = new FrameReader(input, SpanEx.MatchedBy(_nameValueExtractor.StartMarker), TrailingLineArrivalDeadline);
        }
コード例 #13
0
 protected override void Load(FrameReader reader)
 {
     _consistencyLevel = (ConsistencyLevel)reader.ReadInt16();
     _received         = reader.ReadInt32();
     _blockFor         = reader.ReadInt32();
     if (_isFailure)
     {
         _failures = reader.ReadInt32();
     }
     _writeType = reader.ReadString();
 }
コード例 #14
0
ファイル: FrameReaderTests.cs プロジェクト: datalust/seqcli
        public async Task TerminatesWhenNoLinesArePresent()
        {
            var reader = new FrameReader(
                new StringReader(""),
                SpanEx.MatchedBy(Character.Letter),
                TimeSpan.FromMilliseconds(100));

            var none = await reader.TryReadAsync();

            Assert.False(none.HasValue);
        }
コード例 #15
0
 protected override void Load(FrameReader reader)
 {
     _consistency = (ConsistencyLevel)reader.ReadInt16();
     _received    = reader.ReadInt32();
     _blockFor    = reader.ReadInt32();
     if (_isFailure)
     {
         _failures = reader.ReadInt32();
     }
     _dataPresent = reader.ReadByte() != 0;
 }
コード例 #16
0
 protected override void Load(FrameReader reader)
 {
     _consistency = (ConsistencyLevel) reader.ReadInt16();
     _received = reader.ReadInt32();
     _blockFor = reader.ReadInt32();
     if (_isFailure)
     {
         _failures = reader.ReadInt32();
     }
     _dataPresent = reader.ReadByte() != 0;
 }
コード例 #17
0
ファイル: OutputPrepared.cs プロジェクト: weexp/csharp-driver
        internal OutputPrepared(ProtocolVersion protocolVersion, FrameReader reader)
        {
            QueryId = reader.ReadShortBytes();

            if (protocolVersion.SupportsResultMetadataId())
            {
                ResultMetadataId = reader.ReadShortBytes();
            }

            Metadata = new RowSetMetadata(reader, protocolVersion.SupportsPreparedPartitionKey());
        }
コード例 #18
0
 protected override void Load(FrameReader reader)
 {
     _consistencyLevel = (ConsistencyLevel) reader.ReadInt16();
     _received = reader.ReadInt32();
     _blockFor = reader.ReadInt32();
     if (_isFailure)
     {
         _failures = reader.ReadInt32();
     }
     _writeType = reader.ReadString();
 }
コード例 #19
0
 internal ATSITrackTimestamp(FrameReader fr)
 {
     sector_pointers = new List <int>();
     track_nr        = fr.read_ushort();
     unknown2        = fr.read_ushort();
     pg_id           = fr.read_byte();
     unknown3        = fr.read_byte();
     first_pts       = fr.read_uint();
     len_in_pts      = fr.read_uint();
     padding1        = fr.read_ushort();
     padding2        = fr.read_uint();
 }
コード例 #20
0
        public void Should_Throw_Helpful_Exception_On_Unknown_Error_Code()
        {
            int         unknownCode    = int.MaxValue;
            string      unknownMessage = "This message should be included in the exception";
            FrameReader frameReader    = null; // This isn't currently needed to reproduce so set as null

            // Make sure we get an exception
            var caught = Assert.Catch <DriverInternalError>(() => OutputError.CreateOutputError(unknownCode, unknownMessage, frameReader));

            // Verify the exception message contains the code and the message from the server
            Assert.True(caught.Message.Contains(unknownCode.ToString()));
            Assert.True(caught.Message.Contains(unknownMessage));
        }
コード例 #21
0
        /// <summary>
        /// Get ready for the first shot.
        /// </summary>
        public void AttachToReader(FrameReader reader)
        {
            if (_reader != null)
            {
                throw new InvalidOperationException("We've already attached to a reader!");
            }

            _reader = reader;
            _reader.AddResponder(this);

            // We fire this event here to avoid doing actual work in the constructor,
            // and to give the caller a chance to register for the ReadyForShot event.
            PrepareForNextShot();
        }
コード例 #22
0
        public async Task can_parse_connect()
        {
            string input  = @"CONNECT
hello:world

" + '\0';
            var    parser = new FrameReader(new MemoryStream(Encoding.UTF8.GetBytes(input)));
            var    f      = await parser.Parse();

            Assert.IsNotNull(f, "frame");
            Assert.AreEqual("CONNECT", f.Command);
            Assert.AreEqual("world", f.Headers["hello"]);
            Assert.AreEqual(0, f.Body.Length, "Body.Length");
        }
コード例 #23
0
 private async void ToggleSwitch_Toggled(object sender, RoutedEventArgs e)
 {
     if (sender is ToggleSwitch @switch)
     {
         if (@switch.IsOn)
         {
             await FrameReader.StartAsync();
         }
         else
         {
             await FrameReader.StopAsync();
         }
     }
 }
コード例 #24
0
        internal PCM_EXTRAHEADER(FrameReader fr)
        {
            byte tmp;

            first_audio_frame  = fr.read_ushort();
            padding1           = fr.read_byte();
            group1_bits        = (byte)(((tmp = fr.read_byte()) >> 4) & 0xf);
            group2_bits        = (byte)(tmp & 0xf);
            group1_freq        = (byte)(((tmp = fr.read_byte()) >> 4) & 0xf);
            group2_freq        = (byte)(tmp & 0xf);
            padding2           = fr.read_byte();
            channel_assignment = fr.read_byte();
            padding3           = fr.read_byte();
            cci = fr.read_byte();
        }
コード例 #25
0
        public ConnectionIO(Connection connection) : base(channelNum: 0)
        {
            _conn         = connection;
            _socketHolder = new SocketHolder();

            _commandOutboxEvent = new AutoResetEvent(false);
            _waitingServerReply = new ManualResetEventSlim(true);
            // _commandOutboxEvent = new AutoResetSuperSlimLock(false);
            _commandOutbox = new ConcurrentQueue <CommandToSend>();

            _cmdToSendObjPool = new ObjectPool <CommandToSend>(() => new CommandToSend(i => _cmdToSendObjPool.PutObject(i)), 200, true);

            _amqpWriter  = new AmqpPrimitivesWriter();
            _amqpReader  = new AmqpPrimitivesReader();
            _frameReader = new FrameReader();
        }
コード例 #26
0
        internal MLP_SIGNATURE(FrameReader fr)
        {
            byte tmp;

            signature1         = fr.read_uint();
            group1_bits        = (byte)(((tmp = fr.read_byte()) >> 4) & 0xf);
            group2_bits        = (byte)(tmp & 0xf);
            group1_freq        = (byte)(((tmp = fr.read_byte()) >> 4) & 0xf);
            group2_freq        = (byte)(tmp & 0xf);
            padding1           = fr.read_byte();
            channel_assignment = fr.read_byte();
            signature2         = fr.read_ushort();
            padding2           = fr.read_uint();
            bitrate            = fr.read_ushort();
            substreams         = (byte)(fr.read_byte() & 0xf);
        }
コード例 #27
0
        internal ATSITitle(AudioDecoder atsi, FrameReader fr)
        {
            this.atsi = atsi;

            track_timestamp = new List <ATSITrackTimestamp>();
            track_sector    = new List <ATSITrackSector>();

            unknown1   = fr.read_ushort();
            ntracks    = fr.read_byte();
            nindexes   = fr.read_byte();
            length_pts = fr.read_uint();
            unknown2   = fr.read_ushort();
            unknown3   = fr.read_ushort();
            track_sector_table_offset = fr.read_ushort();
            unknown4 = fr.read_ushort();
        }
コード例 #28
0
        private async Task StartOperationAsync()
        {
            CollectedColorFrames = new ConcurrentBag <ExampleMediaFrame>();
            CollectedNonIlluminatedInfraredFrames = new ConcurrentBag <ExampleMediaFrame>();
            CollectedIlluminatedInfraredFrames    = new ConcurrentBag <ExampleMediaFrame>();
            Stopwatch = new Stopwatch();
            WrittenToDiskFramesCount = 0;

            // Open the capture object to pump the frames to UI preview element
            // More information, including how to keep the display on:
            // https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/simple-camera-preview-access
            // ExampleMediaCapture interface is based on Windows.Media.Capture.MediaCapture
            // https://docs.microsoft.com/en-us/uwp/api/Windows.Media.Capture.MediaCapture

            MediaCapture = new ExampleMediaCapture();
            await MediaCapture.InitializeAsync();

            FrameCollection = new ExampleMediaFrameCollection(MediaCapture);
            FrameCollection.CollectionProgressed += FrameCollection_CollectionProgressed;

            CaptureElement.Source        = MediaCapture.PreviewMediaCapture;
            CaptureElement.FlowDirection = MediaCapture.PreviewFlowDirection;
            await MediaCapture.StartPreviewAsync();

            // Open the reader object to subscribe to arriving frames
            // More information:
            // https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/process-media-frames-with-mediaframereader#create-a-frame-reader-for-the-frame-source
            // ExampleMediaFrameReader interface is based on Windows.Media.Capture.Frames.MultiSourceMediaFrameReader
            // https://docs.microsoft.com/en-us/uwp/api/windows.media.capture.frames.multisourcemediaframereader

            FrameReader = await MediaCapture.CreateFrameReaderAsync();

            FrameReader.AcquisitionMode = MediaFrameReaderAcquisitionMode.Buffered;
            FrameReader.FrameArrived   += FrameReader_FrameArrived;

            // Start frame reader immediately

            await FrameReader.StartAsync();

            DispatcherTimer = new DispatcherTimer
            {
                Interval = TimeSpan.FromMilliseconds(100)
            };
            DispatcherTimer.Tick += DispatcherTimer_Tick;
            DispatcherTimer.Start();
            Stopwatch.Start();
        }
コード例 #29
0
        private void WriteAndRead(FrameWriter writer, FrameReader reader, Input.DirectX.Identifier input, Output.Joystick.Identifier output, Axis axis, double value)
        {
            writer.Write(new Dictionary <Output.IIdentifier, State>
            {
                { output, new State()
                  {
                      Axis = new Dictionary <Axis, double>
                      {
                          { axis, value }
                      }
                  } }
            });
            Thread.Sleep(1);
            var actual = reader.Read()[input].Axis[axis];

            Assert.IsTrue(value <= actual + 0.001 && actual - 0.001 <= value);
        }
コード例 #30
0
ファイル: ZlibReader.cs プロジェクト: lulzzz/Port
        public ZlibReader(
            IFrameReader frameReader,
            byte[] dictionary,
            int length)
        {
            if (length <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(length), $"{length} is an invalid length of a Zlib stream");
            }

            _frameReader  = frameReader;
            _headerReader = new FrameReader(_pipe.Reader);
            _dictionary   = dictionary;
            _length       = length;

            _backgroundTask = RunZlibDecompress();
        }
コード例 #31
0
        public async Task WriteReadAckFrame()
        {
            var stream = new MockDuplexStream();

            var writer  = new FrameWriter(stream);
            var request = Frame.ACK;
            await writer.Write(request, CancellationToken.None);

            var data = stream.Output.ToArray();
            await stream.Input.WriteAsync(data, 0, data.Length);

            stream.Input.Position = 0;

            var reader   = new FrameReader(stream);
            var response = await reader.Read(CancellationToken.None);

            Assert.AreEqual(request, response);
        }
コード例 #32
0
        public async Task WriteReadDataFrame()
        {
            var input  = new byte[] { 1, 12, 0, 4, 0, 15, 6, 49, 5, 4, 34, 0, 3, 239 };
            var stream = new MockDuplexStream();

            stream.Input.Write(input, 0, input.Length);
            stream.Input.Position = 0;
            var reader   = new FrameReader(stream);
            var response = (DataFrame)(await reader.Read(CancellationToken.None));

            var request = new DataFrame(DataFrameType.REQ, response.Payload);
            var writer  = new FrameWriter(stream);
            await writer.Write(request, CancellationToken.None);

            var output = stream.Output.ToArray();

            Assert.IsTrue(input.SequenceEqual(output));
        }
コード例 #33
0
        public Http2Session(SecureSocket sessionSocket, ConnectionEnd end,
                            bool usePriorities, bool useFlowControl,
                            IDictionary <string, object> handshakeResult = null)
        {
            _ourEnd           = end;
            _usePriorities    = usePriorities;
            _useFlowControl   = useFlowControl;
            _handshakeHeaders = new Dictionary <string, string>(16);
            ApplyHandshakeResults(handshakeResult);

            if (_ourEnd == ConnectionEnd.Client)
            {
                _remoteEnd = ConnectionEnd.Server;
                _lastId    = -1; // Streams opened by client are odd
            }
            else
            {
                _remoteEnd = ConnectionEnd.Client;
                _lastId    = 0; // Streams opened by server are even
            }

            _goAwayReceived  = false;
            _settingsManager = new SettingsManager();
            _comprProc       = new CompressionProcessor(_ourEnd);
            _sessionSocket   = sessionSocket;

            _frameReader = new FrameReader(_sessionSocket);

            ActiveStreams = new ActiveStreams();

            _writeQueue = new WriteQueue(_sessionSocket, ActiveStreams, _usePriorities);

            OurMaxConcurrentStreams    = 100; //Spec recommends value 100 by default
            RemoteMaxConcurrentStreams = 100;

            _flowControlManager = new FlowControlManager(this);

            if (!_useFlowControl)
            {
                _flowControlManager.Options = (byte)FlowControlOptions.DontUseFlowControl;
            }

            SessionWindowSize = 0;
        }
コード例 #34
0
ファイル: FrameReaderTests.cs プロジェクト: datalust/seqcli
        static async Task <Frame[]> ReadAllFrames(string source, TextParser <TextSpan> frameStart)
        {
            var reader = new FrameReader(
                new StringReader(source),
                frameStart,
                TimeSpan.FromMilliseconds(100));

            var result = new List <Frame>();

            var frame = await reader.TryReadAsync();

            while (frame.HasValue)
            {
                result.Add(frame);
                frame = await reader.TryReadAsync();
            }

            return(result.ToArray());
        }
コード例 #35
0
        private async void MediaCapture_FaceDetected(ExampleMediaCapture sender, FaceDetectedEventArgs args)
        {
            // This event is raised even when no faces are present, the argument must be inspected

            if (args.ResultFrame.DetectedFaces.Any() && FrameReader != null)
            {
                if (PreviewOpacity == 0.0)
                {
                    await FrameReader.StartAsync();

                    PreviewOpacity = 1.0;
                }

                // Reset the countdown to turning off camera
                FrameReaderStopTrigger.Stop();
                FrameReaderStopTrigger.Start();
            }

            UpdateSystemRelativeTime(args.ResultFrame.SystemRelativeTime);
        }
コード例 #36
0
        unsafe int getSubstreamHeaderLen(byte[] substream_buf, int substream_off, int substream_len)
        {
            if (substream_len <= 4)
                return(0);

            fixed(byte *p = &substream_buf[substream_off])
            {
                var fr  = new FrameReader(p, substream_len);
                var hdr = new SUB_HEADER(fr);

                switch (hdr.stream_id)
                {
                case DVDA.PCM_STREAM_ID:
                case DVDA.MLP_STREAM_ID:
                    return(SUB_HEADER.SIZE + hdr.extra_len);

                default:
                    return(0);
                }
            }
        }
コード例 #37
0
ファイル: Response.cs プロジェクト: alprema/csharp-driver
        internal Response(Frame frame)
        {
            if (frame == null) throw new ArgumentNullException("frame");
            if (frame.Body == null) throw new InvalidOperationException("Response body of the received frame was null");
            if (!frame.Header.Flags.HasFlag(HeaderFlag.Compression) && frame.Header.BodyLength > frame.Body.Length - frame.Body.Position)
            {
                throw new DriverInternalError(string.Format(
                    "Response body length should be contained in stream: Expected {0} but was {1} (position {2})",
                    frame.Header.BodyLength, frame.Body.Length - frame.Body.Position, frame.Body.Position));
            }

            Reader = new FrameReader(frame.Body, frame.Serializer);

            if (frame.Header.Flags.HasFlag(HeaderFlag.Tracing))
            {
                //If a response frame has the tracing flag set, the first item in its body is the trace id
                var buffer = new byte[16];
                Reader.Read(buffer, 0, 16);
                TraceId = new Guid(TypeSerializer.GuidShuffle(buffer));
            }
        }
コード例 #38
0
        /// <summary>
        /// Load or reload previews asynchronously.
        /// </summary>
        public async Task LoadAsync()
        {
            var             cancelSource = new CancellationTokenSource();
            CancellableTask newLoadTask  = new CancellableTask(() => {
                foreach (string?path in PhotoFiles.GetPaths())
                {
                    cancelSource.Token.ThrowIfCancellationRequested();

                    BitmapImage?thumb;
                    using (FrameReader reader = new FrameReader(path)) {
                        try {
                            thumb = reader.ReadThumbnail();
                        } catch (Exception) {
                            thumb = null;
                        }
                    }

                    if (thumb != null)
                    {
                        var preview = new PhotoPreview(thumb, path);
                        dispatcher.Invoke(() =>
                                          collection.Add(preview)
                                          );
                    }
                }
            }, cancelSource);

            var prevTask = Interlocked.Exchange(ref loadTask, newLoadTask);

            if (prevTask != null)
            {
                await prevTask.Cancel();
            }

            collection.Clear();
            collection.Add(defaultPreview);
            newLoadTask.Start();
        }
コード例 #39
0
 protected override void Load(FrameReader cb)
 {
     short len = cb.ReadInt16();
     _info.UnknownId = new byte[len];
     cb.Read(_info.UnknownId, 0, len);
 }
コード例 #40
0
 IdentifyResponse Identify(NetworkStream stream, FrameReader reader)
 {
     var identify = new Identify(_options);
     SendCommandToStream(stream, identify);
     var frame = reader.ReadFrame();
     if (frame.Type != FrameType.Result)
     {
         throw new InvalidOperationException("Unexpected frame type after IDENTIFY");
     }
     return identify.ParseIdentifyResponse(frame.Data);
 }
コード例 #41
0
        void Handshake(NetworkStream stream, FrameReader reader)
        {
            // Initiate the V2 protocol
            stream.Write(MAGIC_V2, 0, MAGIC_V2.Length);
            _identifyResponse = Identify(stream, reader);
            if (_identifyResponse.AuthRequired)
            {
                Dispose();
                throw new NotSupportedException("Authorization is not supported");
            }

            SendCommandToStream(stream, new Subscribe(_options.Topic, _options.Channel));
        }
コード例 #42
0
        void WorkerLoop(object messageHandler)
        {
            MessageHandler handler = (MessageHandler)messageHandler;
            bool firstConnectionAttempt = true;
            TcpClient client = null;
            FrameReader reader = null;
            IBackoffLimiter backoffLimiter = null;
            IDisposable cancellationRegistration = Disposable.Empty;

            while (true)
            {
                try
                {
                    if (_connectionClosedSource.IsCancellationRequested)
                    {
                        return;
                    }

                    if (!Connected)
                    {
                        lock (_connectionSwapLock)
                        {
                            if (firstConnectionAttempt)
                            {
                                firstConnectionAttempt = false;
                            }
                            else
                            {
                                if (backoffLimiter == null)
                                    backoffLimiter = _backoffStrategy.Create();

                                TimeSpan delay;
                                if (backoffLimiter.ShouldReconnect(out delay))
                                {
                                    OnInternalMessage("Delaying {0} ms before reconnecting", (int)delay.TotalMilliseconds);
                                    Thread.Sleep(delay);
                                }
                                else
                                {
                                    // We give up
                                    OnInternalMessage("Abandoning connection");
                                    Dispose();
                                    return;
                                }
                            }

                            lock (_connectionSwapInProgressLock)
                            {
                                CancellationToken cancellationToken;
                                lock (_disposeLock)
                                {
                                    if (_disposed) return;

                                    if (client != null)
                                    {
                                        cancellationRegistration.Dispose();
                                        ((IDisposable)client).Dispose();
                                    }

                                    cancellationToken = _connectionClosedSource.Token;
                                }

                                OnInternalMessage("TCP client starting");
                                client = new TcpClient(_endPoint.Host, _endPoint.Port);
                                cancellationRegistration = cancellationToken.Register(() => ((IDisposable)client).Dispose(), false);
                                Connected = true;
                                OnInternalMessage("TCP client started");

                                _stream = client.GetStream();
                                reader = new FrameReader(_stream);

                                Handshake(_stream, reader);

                                _firstConnection.TrySetResult(true);

                                // Start a new backoff cycle next time we disconnect
                                backoffLimiter = null;

                                _nextReconnectionTaskSource.SetResult(true);
                                _nextReconnectionTaskSource = new TaskCompletionSource<bool>();
                            }
                        }
                    }

                    Frame frame;
                    while ((frame = reader.ReadFrame()) != null)
                    {
                        if (frame.Type == FrameType.Result)
                        {
                            if (HEARTBEAT.SequenceEqual(frame.Data))
                            {
                                OnInternalMessage("Heartbeat");
                                SendCommandAsync(new Nop())
                                    .ContinueWith(t => Dispose(), TaskContinuationOptions.OnlyOnFaulted);
                            }
                            else
                            {
                                OnInternalMessage("Received result. Length = {0}", frame.MessageSize);
                            }
                        }
                        else if (frame.Type == FrameType.Message)
                        {
                            OnInternalMessage("Received message. Length = {0}", frame.MessageSize);
                            var message = new Message(frame, this);
                            // TODO: Rethink this
                            ThreadPool.QueueUserWorkItem(new WaitCallback(_ => { handler(message); }));
                        }
                        else if (frame.Type == FrameType.Error)
                        {
                            string errorString;
                            try
                            {
                                errorString = Encoding.ASCII.GetString(frame.Data);
                            }
                            catch
                            {
                                errorString = BitConverter.ToString(frame.Data);
                            }
                            OnInternalMessage("Received error. Message = {0}", errorString);
                        }
                        else
                        {
                            OnInternalMessage("Unknown message type: {0}", frame.Type);
                            throw new InvalidOperationException("Unknown message type " + frame.Type);
                        }
                    }
                }
                catch (ObjectDisposedException ex)
                {
                    OnInternalMessage("Exiting worker loop due to disposal. Message = {0}", ex.Message);
                    Connected = false;
                    return;
                }
                catch (IOException ex)
                {
                    if (!_disposed) OnInternalMessage("EXCEPTION: {0}", ex.Message);
                    Connected = false;
                    continue;
                }
                catch (SocketException ex)
                {
                    if (!_disposed) OnInternalMessage("EXCEPTION: {0}", ex.Message);
                    Connected = false;
                    continue;
                }
            }
        }
コード例 #43
0
        public static Task<DS4CalibrationRecord> CalibrateAsync(FrameReader reader)
        {
            #if DSAPI
            return Task<DS4CalibrationRecord>.Run(() => Calibrator.Calibrate(reader.DSAPI));
            #else

            return Task<DS4CalibrationRecord>.Run(() => Calibrator.Calibrate(reader.Device));
            #endif
        }
コード例 #44
0
 protected override void Load(FrameReader cb)
 {
     _info.Ks = cb.ReadString();
     _info.Table = cb.ReadString();
 }
コード例 #45
0
 protected override void Load(FrameReader cb)
 {
     _consistency = (ConsistencyLevel) cb.ReadInt16();
     _required = cb.ReadInt32();
     _alive = cb.ReadInt32();
 }
コード例 #46
0
 protected override void Load(FrameReader reader)
 {
 }