コード例 #1
0
ファイル: Transfering.cs プロジェクト: sharkbrainguy/Ogam3
        public byte[] Send(byte[] data)
        {
            if (isTranferDead)
            {
                return(new byte[0]);
            }

            var rap    = TpLspHelper.NewUID();
            var sync   = new Synchronizer(true);
            var result = new byte[0];

            _synchronizer.TryAdd(rap, (rslt) => {
                result = rslt;
                sync.Unlock();
            });

            SendManager(data, rap);

            if (!sync.Wait(TimeSpan.FromMinutes(15)))       // timeout
            {
                return(new byte[0]);
            }

            Action <byte[]> res;

            _synchronizer.TryRemove(rap, out res);
            return(result);
        }
コード例 #2
0
ファイル: Transfering.cs プロジェクト: sharkbrainguy/Ogam3
        Thread StartListener(Stream transferChannel, System.Action <ulong, byte[]> receiveDataSet)
        {
            var listenThrd = new Thread(() => { // Listener thread
                try {
                    var pkgBuilder = new Dictionary <uint, DataBuilder>();
                    while (true)
                    {
                        foreach (var tpLspS in TpLspHelper.SequenceReader(transferChannel))
                        {
                            if (tpLspS.IsQuantizied)
                            {
                                DataBuilder db = null;
                                if (!pkgBuilder.TryGetValue(tpLspS.QuantId, out db))
                                {
                                    db = new DataBuilder(tpLspS.DataLength);
                                    pkgBuilder.Add(tpLspS.QuantId, db);
                                }

                                db.WriteData(tpLspS.QuantData, tpLspS.QuantShift);

                                if (db.IsComplete())
                                {
                                    var result = db.GetData();

                                    pkgBuilder.Remove(tpLspS.QuantId);
                                    receiveDataSet.Invoke(tpLspS.Rap, result);
                                }
                            }
                            else
                            {
                                var result = tpLspS.QuantData;
                                receiveDataSet.Invoke(tpLspS.Rap, result);
                            }
                        }
                    }
                }
                catch (Exception e) {
                    isTranferDead = true;
                    OnConnectionError(e);
                }
            })
            {
                IsBackground = true, Priority = ThreadPriority.Normal
            };

            listenThrd.Start();

            return(listenThrd);
        }
コード例 #3
0
ファイル: Transfering.cs プロジェクト: sharkbrainguy/Ogam3
 private void SendManager(byte[] data, ulong rap)
 {
     try {
         using (var sync = Stream.Synchronized(_sendStream)) {
             foreach (var quant in TpLspHelper.Quantize(data, _quantSize, rap))
             {
                 lock (_sendLocker) {
                     sync.Write(quant, 0, quant.Length);
                 }
             }
         }
         OnTransferSuccess();
     }
     catch (Exception e) {
         OnConnectionError(e);
     }
 }