/// <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); } } }
public void RepeatAsyncRead(IByteAsyncInputStream cb) { _callback = cb; if (_channelHandler != null) { _channelHandler.SetReceptionHandler(cb); } }
public void RepeatAsyncRead(IByteAsyncInputStream receiver) { _callback = receiver; if (_prompts != null) { ShowPrompt(_prompts); } }
/// <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(); }
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); }
/// <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(); }
/// <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); } }
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); } } }
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(); }
/// <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); } } }
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 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‚Ü‚Å€”õ‚¹‚˂΂Ȃç‚È‚¢‚Æ‚¢‚¤‚±‚ÆjA‚»‚ê‚æ‚è‚̓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; }
public void InitializeModelTerminalTask(IModalTerminalTaskSite site, IByteAsyncInputStream default_handler, ITerminalConnection connection) { _site = site; _defaultHandler = default_handler; _connection = connection; }
public void RepeatAsyncRead(IByteAsyncInputStream receiver) { _callback = receiver; BeginReceive(); }
public void RepeatAsyncRead(IByteAsyncInputStream callback) { _callback.SetReceiver(callback); _socket.RepeatAsyncRead(_callback); }
public void InitializeModelTerminalTask(IModalTerminalTaskSite site, IByteAsyncInputStream default_handler, ITerminalConnection connection) { _site = site; _bufferForMacro = new StringBuilder(); _closed = false; }
public void SetReceiver(IByteAsyncInputStream receiver) { _callback = receiver; }
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 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; } } }
public void RepeatAsyncRead(IByteAsyncInputStream receiver) { _callback = receiver; if (_prompts != null) ShowPrompt(_prompts); }
/// <summary> /// コンストラクタ /// </summary> public void InitializeModelTerminalTask(IModalTerminalTaskSite site, IByteAsyncInputStream default_handler, ITerminalConnection connection) { _site = site; _buffer = new StringBuilder(); _closed = false; }
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); }