示例#1
0
        /// <summary>
        /// Pump thread
        /// </summary>
        /// <param name="receiver"></param>
        private void PumpThread(IByteAsyncInputStream receiver) {
            lock (_pumpThreadSync) {
                while (true) {
                    if (_isClosed)
                        break;

                    if (_generator != null) {
                        IEnumerable<byte[]> generator = _generator;
                        _generator = null;

                        _isProcessing = true;

                        foreach (byte[] data in generator) {
                            if (_isClosed)
                                break;
                            ByteDataFragment fragment = new ByteDataFragment(data, 0, data.Length);
                            receiver.OnReception(fragment);
                        }

                        _isProcessing = false;

                        Monitor.PulseAll(_pumpThreadSync);
                    }

                    if (_isClosed)
                        break;

                    Monitor.Wait(_pumpThreadSync);
                }
            }
        }
示例#2
0
 public void RepeatAsyncRead(IByteAsyncInputStream cb)
 {
     _callback = cb;
     if (_channelHandler != null)
     {
         _channelHandler.SetReceptionHandler(cb);
     }
 }
示例#3
0
 public void RepeatAsyncRead(IByteAsyncInputStream receiver)
 {
     _callback = receiver;
     if (_prompts != null)
     {
         ShowPrompt(_prompts);
     }
 }
示例#4
0
        /// <summary>
        /// Implements IPoderosaSocket.
        /// New pump thread is started.
        /// </summary>
        /// <param name="receiver"></param>
        public void RepeatAsyncRead(IByteAsyncInputStream receiver) {
            if (_pumpThread != null)
                return;

            _pumpThread = new Thread((ThreadStart)delegate() {
                PumpThread(receiver);
            });
            _pumpThread.Name = "Poderosa.Benchmark.MockSocket";
            _pumpThread.Start();
        }
示例#5
0
        public void RepeatAsyncRead(IByteAsyncInputStream cb)
        {
            if (_callback != null)
            {
                throw new InvalidOperationException("duplicated AsyncRead() is attempted");
            }

            _callback     = cb;
            _dataFragment = new ByteDataFragment();
            new Thread(new ThreadStart(AsyncEntry)).Start();
            //_stream.BeginRead(_buf, 0, _buf.Length, new AsyncCallback(RepeatCallback), null);
        }
示例#6
0
        /// <summary>
        /// Implements IPoderosaSocket.
        /// New pump thread is started.
        /// </summary>
        /// <param name="receiver"></param>
        public void RepeatAsyncRead(IByteAsyncInputStream receiver)
        {
            if (_pumpThread != null)
            {
                return;
            }

            _pumpThread = new Thread((ThreadStart) delegate() {
                PumpThread(receiver);
            });
            _pumpThread.Name = "Poderosa.Benchmark.MockSocket";
            _pumpThread.Start();
        }
示例#7
0
        /// <summary>
        /// Thread input from stream
        /// </summary>
        /// <param name="asyncInput"></param>
        private void InputThread(IByteAsyncInputStream asyncInput)
        {
            byte[] buff = new byte[4096];

            ByteDataFragment _dataFragment = new ByteDataFragment();

            try {
                bool endOfStream = false;

                while (!_terminateInputThread && !_processExited)
                {
                    IAsyncResult asyncResult = _inputStream.BeginRead(buff, 0, buff.Length, null, null);

                    while (!_terminateInputThread && !_processExited)
                    {
                        bool signaled = asyncResult.AsyncWaitHandle.WaitOne(500);
                        if (signaled)
                        {
                            int len = _inputStream.EndRead(asyncResult);
                            if (len == 0)
                            {
                                endOfStream = true;
                                goto EndThread;
                            }

                            _dataFragment.Set(buff, 0, len);
                            asyncInput.OnReception(_dataFragment);

                            break;
                        }
                    }
                }

EndThread:
                if (endOfStream || _processExited)
                {
                    _skipInputThreadJoin = true; // avoids deadlock
                    Close();
                    asyncInput.OnNormalTermination();
                }
            }
            catch (Exception e) {
                RuntimeUtil.SilentReportException(e);
                _skipInputThreadJoin = true; // avoids deadlock
                Close();
                asyncInput.OnAbnormalTermination("Input thread error: " + e.Message);
            }
        }
示例#8
0
 public void SetReceptionHandler(IByteAsyncInputStream output)
 {
     lock (_outputSync) {
         if (_output != null)
         {
             return;
         }
         _output = output;
         if (_buffer != null && _buffer.Length > 0)
         {
             byte[] bytes = _buffer.ToArray();
             _buffer.Dispose();
             _buffer = null;
             _dataFragment.Set(bytes, 0, bytes.Length);
             _output.OnReception(_dataFragment);
         }
     }
 }
示例#9
0
        public void RepeatAsyncRead(IByteAsyncInputStream receiver)
        {
            if (_inputThread != null)
            {
                throw new InvalidOperationException("duplicated RepeatAsyncRead() is attempted");
            }
            if (_closed)
            {
                throw new InvalidOperationException("invalid call of RepeatAsyncRead()");
            }

            _skipInputThreadJoin = false;
            IByteAsyncInputStream asyncInput = receiver;

            _inputThread      = new Thread((ThreadStart) delegate() { InputThread(asyncInput); });
            _inputThread.Name = "Poderosa.Pipe.PipeSocket.InputThread";
            _inputThread.Start();
        }
示例#10
0
        /// <summary>
        /// Thread input from stream
        /// </summary>
        /// <param name="asyncInput"></param>
        private void InputThread(IByteAsyncInputStream asyncInput) {
            byte[] buff = new byte[4096];

            ByteDataFragment _dataFragment = new ByteDataFragment();

            try {
                bool endOfStream = false;

                while (!_terminateInputThread && !_processExited) {
                    IAsyncResult asyncResult = _inputStream.BeginRead(buff, 0, buff.Length, null, null);

                    while (!_terminateInputThread && !_processExited) {
                        bool signaled = asyncResult.AsyncWaitHandle.WaitOne(500);
                        if (signaled) {
                            int len = _inputStream.EndRead(asyncResult);
                            if (len == 0) {
                                endOfStream = true;
                                goto EndThread;
                            }

                            _dataFragment.Set(buff, 0, len);
                            asyncInput.OnReception(_dataFragment);

                            break;
                        }
                    }
                }

            EndThread:
                if (endOfStream || _processExited) {
                    _skipInputThreadJoin = true; // avoids deadlock
                    Close();
                    asyncInput.OnNormalTermination();
                }
            }
            catch (Exception e) {
                RuntimeUtil.SilentReportException(e);
                _skipInputThreadJoin = true; // avoids deadlock
                Close();
                asyncInput.OnAbnormalTermination("Input thread error: " + e.Message);
            }
        }
示例#11
0
        /// <summary>
        /// Pump thread
        /// </summary>
        /// <param name="receiver"></param>
        private void PumpThread(IByteAsyncInputStream receiver)
        {
            lock (_pumpThreadSync) {
                while (true)
                {
                    if (_isClosed)
                    {
                        break;
                    }

                    if (_generator != null)
                    {
                        IEnumerable <byte[]> generator = _generator;
                        _generator = null;

                        _isProcessing = true;

                        foreach (byte[] data in generator)
                        {
                            if (_isClosed)
                            {
                                break;
                            }
                            ByteDataFragment fragment = new ByteDataFragment(data, 0, data.Length);
                            receiver.OnReception(fragment);
                        }

                        _isProcessing = false;

                        Monitor.PulseAll(_pumpThreadSync);
                    }

                    if (_isClosed)
                    {
                        break;
                    }

                    Monitor.Wait(_pumpThreadSync);
                }
            }
        }
示例#12
0
 public void RepeatAsyncRead(IByteAsyncInputStream cb)
 {
     _callback = cb;
     //バッファに何がしか溜まっている場合:
     //NOTE これは、IPoderosaSocket#StartAsyncReadを呼ぶシーケンスをなくし、接続を開始する瞬間(IProtocolServiceのメソッド系)から
     //データ本体を受信する口を提供させるようにすれば除去できる。しかしプログラマの側としては、接続成功を確認してからデータ受信口を用意したいので、
     //(Poderosaでいえば、ログインボタンのOKを押す時点でAbstractTerminalまで準備せねばならないということ)、それよりはデータを保留しているほうがいいだろう
     if (_buffer != null)
     {
         lock (this) {
             _buffer.Close();
             byte[] t = _buffer.ToArray();
             _data.Set(t, 0, t.Length);
             if (t.Length > 0)
             {
                 _callback.OnReception(_data);
             }
             _buffer = null;
         }
     }
 }
示例#13
0
 public void RepeatAsyncRead(IByteAsyncInputStream cb)
 {
     _callback = cb;
     //ƒoƒbƒtƒ@‚ɉ½‚ª‚µ‚©—­‚Ü‚Á‚Ä‚¢‚éê‡F
     //NOTE ‚±‚ê‚́AIPoderosaSocket#StartAsyncRead‚ðŒÄ‚ÔƒV[ƒPƒ“ƒX‚ð‚È‚­‚µAÚ‘±‚ðŠJŽn‚·‚éuŠÔ(IProtocolService‚̃ƒ\ƒbƒhŒn)‚©‚ç
     //ƒf[ƒ^–{‘Ì‚ðŽóM‚·‚éŒû‚ð’ñ‹Ÿ‚³‚¹‚é‚悤‚É‚·‚ê‚Ώœ‹Ž‚Å‚«‚éB‚µ‚©‚µƒvƒƒOƒ‰ƒ}‚Ì‘¤‚Æ‚µ‚ẮAÚ‘±¬Œ÷‚ðŠm”F‚µ‚Ä‚©‚çƒf[ƒ^ŽóMŒû‚ð—pˆÓ‚µ‚½‚¢‚̂ŁA
     //iPoderosa‚Å‚¢‚¦‚΁AƒƒOƒCƒ“ƒ{ƒ^ƒ“‚ÌOK‚ð‰Ÿ‚·Žž“_‚ÅAbstractTerminal‚܂ŏ€”õ‚¹‚˂΂Ȃç‚È‚¢‚Æ‚¢‚¤‚±‚ƁjA‚»‚ê‚æ‚è‚̓f[ƒ^‚ð•Û—¯‚µ‚Ä‚¢‚é‚Ù‚¤‚ª‚¢‚¢‚¾‚낤
     if (_buffer != null)
     {
         lock (this) {
             _buffer.Close();
             byte[] t = _buffer.ToArray();
             _data.Set(t, 0, t.Length);
             if (t.Length > 0)
             {
                 _callback.OnReception(_data);
             }
             _buffer = null;
         }
     }
 }
 public void RepeatAsyncRead(IByteAsyncInputStream receiver)
 {
     _receiver = receiver;
 }
示例#15
0
 public void InitializeModelTerminalTask(IModalTerminalTaskSite site, IByteAsyncInputStream default_handler, ITerminalConnection connection)
 {
     _site           = site;
     _defaultHandler = default_handler;
     _connection     = connection;
 }
示例#16
0
 public void RepeatAsyncRead(IByteAsyncInputStream receiver)
 {
     _callback = receiver;
     BeginReceive();
 }
 public void RepeatAsyncRead(IByteAsyncInputStream receiver)
 {
     _callback = receiver;
     BeginReceive();
 }
示例#18
0
 public void InitializeModelTerminalTask(IModalTerminalTaskSite site, IByteAsyncInputStream default_handler, ITerminalConnection connection) {
     _site = site;
     _defaultHandler = default_handler;
     _connection = connection;
 }
示例#19
0
 public void RepeatAsyncRead(IByteAsyncInputStream callback)
 {
     _callback.SetReceiver(callback);
     _socket.RepeatAsyncRead(_callback);
 }
示例#20
0
 public void InitializeModelTerminalTask(IModalTerminalTaskSite site, IByteAsyncInputStream default_handler, ITerminalConnection connection)
 {
     _site = site;
     _bufferForMacro = new StringBuilder();
     _closed = false;
 }
示例#21
0
 public void RepeatAsyncRead(IByteAsyncInputStream cb)
 {
     _callback = cb;
     if (_channelHandler != null) {
         _channelHandler.SetReceptionHandler(cb);
     }
 }
 public void SetReceiver(IByteAsyncInputStream receiver)
 {
     _callback = receiver;
 }
示例#23
0
 public void RepeatAsyncRead(IByteAsyncInputStream cb)
 {
     _callback = cb;
     //バッファに何がしか溜まっている場合:
     //NOTE これは、IPoderosaSocket#StartAsyncReadを呼ぶシーケンスをなくし、接続を開始する瞬間(IProtocolServiceのメソッド系)から
     //データ本体を受信する口を提供させるようにすれば除去できる。しかしプログラマの側としては、接続成功を確認してからデータ受信口を用意したいので、
     //(Poderosaでいえば、ログインボタンのOKを押す時点でAbstractTerminalまで準備せねばならないということ)、それよりはデータを保留しているほうがいいだろう
     if (_buffer != null) {
         lock (this) {
             _buffer.Close();
             byte[] t = _buffer.ToArray();
             _data.Set(t, 0, t.Length);
             if (t.Length > 0)
                 _callback.OnReception(_data);
             _buffer = null;
         }
     }
 }
 public void RepeatAsyncRead(IByteAsyncInputStream callback)
 {
     _callback.SetReceiver(callback);
     _socket.RepeatAsyncRead(_callback);
 }
示例#25
0
 public void SetReceptionHandler(IByteAsyncInputStream output)
 {
     lock (_outputSync) {
         if (_output != null) {
             return;
         }
         _output = output;
         if (_buffer != null && _buffer.Length > 0) {
             byte[] bytes = _buffer.ToArray();
             _buffer.Dispose();
             _buffer = null;
             _dataFragment.Set(bytes, 0, bytes.Length);
             _output.OnReception(_dataFragment);
         }
     }
 }
示例#26
0
        public void RepeatAsyncRead(IByteAsyncInputStream receiver) {
            if (_inputThread != null)
                throw new InvalidOperationException("duplicated RepeatAsyncRead() is attempted");
            if (_closed)
                throw new InvalidOperationException("invalid call of RepeatAsyncRead()");

            _skipInputThreadJoin = false;
            IByteAsyncInputStream asyncInput = receiver;
            _inputThread = new Thread((ThreadStart)delegate() {
                InputThread(asyncInput);
            });
            _inputThread.Name = "Poderosa.Pipe.PipeSocket.InputThread";
            _inputThread.Start();
        }
 public void RepeatAsyncRead(IByteAsyncInputStream cb)
 {
     _callback = cb;
     //�o�b�t�@�ɉ����������܂��Ă���ꍇ�F
     //NOTE ����́AIPoderosaSocket#StartAsyncRead��ĂԃV�[�P���X��Ȃ����A�ڑ���J�n����u��(IProtocolService�̃��\�b�h�n)����
     //�f�[�^�{�̂��M�������񋟂�����悤�ɂ���Ώ����ł���B�������v���O���}�̑��Ƃ��ẮA�ڑ�������m�F���Ă���f�[�^��M����p�ӂ������̂ŁA
     //�iPoderosa�ł����΁A���O�C���{�^����OK��������_��AbstractTerminal�܂ŏ������˂΂Ȃ�Ȃ��Ƃ������Ɓj�A������̓f�[�^��ۗ����Ă���ق����������낤
     if (_buffer != null) {
         lock (this) {
             _buffer.Close();
             byte[] t = _buffer.ToArray();
             _data.Set(t, 0, t.Length);
             if (t.Length > 0)
                 _callback.OnReception(_data);
             _buffer = null;
         }
     }
 }
示例#28
0
 public void RepeatAsyncRead(IByteAsyncInputStream receiver)
 {
     _receiver = receiver;
 }
 public void RepeatAsyncRead(IByteAsyncInputStream receiver)
 {
     _callback = receiver;
     if (_prompts != null)
         ShowPrompt(_prompts);
 }
示例#30
0
 public void SetReceiver(IByteAsyncInputStream receiver)
 {
     _callback = receiver;
 }
 /// <summary>
 /// コンストラクタ
 /// </summary>
 public void InitializeModelTerminalTask(IModalTerminalTaskSite site, IByteAsyncInputStream default_handler, ITerminalConnection connection)
 {
     _site   = site;
     _buffer = new StringBuilder();
     _closed = false;
 }
示例#32
0
        public void RepeatAsyncRead(IByteAsyncInputStream cb)
        {
            if (_callback != null)
                throw new InvalidOperationException("duplicated AsyncRead() is attempted");

            _callback = cb;
            _dataFragment = new ByteDataFragment();
            new Thread(new ThreadStart(AsyncEntry)).Start();
            //_stream.BeginRead(_buf, 0, _buf.Length, new AsyncCallback(RepeatCallback), null);
        }