Esempio n. 1
0
/*
 *      //ModalTerminalTaskŽü•Ó
 *      public virtual void StartModalTerminalTask(IModalTerminalTask task) {
 *          _modalTerminalTask = task;
 *          new ModalTerminalTaskSite(this).Start(task);
 *      }
 *      public virtual void EndModalTerminalTask() {
 *          _modalTerminalTask = null;
 *      }
 *      public IModalTerminalTask CurrentModalTerminalTask {
 *          get {
 *              return _modalTerminalTask;
 *          }
 *      }
 */
        #region IByteAsyncInputStream
        public void OnReception(ByteDataFragment data)
        {
            try {
                bool pass_to_terminal = true;
                //if(_modalTerminalTask!=null) {
                //    bool show_input = _modalTerminalTask.ShowInputInTerminal;
                //    _modalTerminalTask.OnReception(data);
                //    if(!show_input) pass_to_terminal = false; //“ü—Í‚ðŒ©‚¹‚È‚¢(XMODEM‚Æ‚©)‚Ì‚Æ‚«‚̓^[ƒ~ƒiƒ‹‚É—^‚¦‚È‚¢
                //}

                //ƒoƒCƒiƒŠƒƒO‚̏o—Í
                _logService.BinaryLogger.Write(data);

                if (pass_to_terminal)
                {
                    TerminalDocument document = _document;
                    if (document != null)
                    {
                        lock (document)
                        {
                            //_invalidateParam.Reset();
                            //‚±‚±‚©‚ç‹ŒInput()
                            //_manipulator.Load(GetDocument().CurrentLine, 0);
                            //_manipulator.CaretColumn = GetDocument().CaretColumn;

                            //ˆ—–{‘Ì
                            _decoder.OnReception(data);

                            //GetDocument().ReplaceCurrentLine(_manipulator.Export());
                            //GetDocument().CaretColumn = _manipulator.CaretColumn;
                            //‚±‚±‚Ü‚Å

                            //‰E’[‚ɃLƒƒƒŒƒbƒg‚ª—ˆ‚½‚Æ‚«‚Í•Ö‹X“I‚ÉŽŸs‚Ì“ª‚É‚à‚Á‚Ä‚¢‚­
                            //if(document.CaretColumn==document.TerminalWidth) {
                            //    document.CurrentLineNumber++; //‚±‚ê‚É‚æ‚Á‚ÄŽŸs‚Ì‘¶Ý‚ð•ÛØ
                            //    document.CaretColumn = 0;
                            //}

                            CheckDiscardDocument();
                            //AdjustTransientScrollBar();

                            //Œ»Ýs‚ª‰º’[‚ÉŒ©‚¦‚é‚悤‚ÈScrollBarValue‚ðŒvŽZ
                            //int n = document.CurrentLineNumber-document.TerminalHeight+1-document.FirstLineNumber;
                            //if(n < 0) n = 0;

                            //Debug.WriteLine(String.Format("E={0} C={1} T={2} H={3} LC={4} MAX={5} n={6}", _transientScrollBarEnabled, _tag.Document.CurrentLineNumber, _tag.Document.TopLineNumber, _tag.Connection.TerminalHeight, _transientScrollBarLargeChange, _transientScrollBarMaximum, n));

                            /* if(IsAutoScrollMode(n)) {
                             *  _scrollBarValues.Value = n;
                             *  document.TopLineNumber = n + document.FirstLineNumber;
                             * }
                             * else
                             *  _scrollBarValues.Value = document.TopLineNumber - document.FirstLineNumber;
                             */
                            //Invalidate‚ðlock‚ÌŠO‚ɏo‚·B‚±‚Ì‚Ù‚¤‚ªˆÀ‘S‚ÆŽv‚í‚ꂽ

                            //ŽóMƒXƒŒƒbƒh“à‚ł̓}[ƒN‚ð‚‚¯‚é‚̂݁Bƒ^ƒCƒ}[‚ōs‚¤‚Ì‚ÍIntelliSense‚É•›ì—p‚ ‚é‚̂ňꎞ’âŽ~
                            //_promptRecognizer.SetContentUpdateMark();
                            //_promptRecognizer.Recognize();
                        }
                    }

                    if (_afterExitLockActions.Count > 0)
                    {
                        //Control main = _session.OwnerWindow.AsControl();
                        //foreach(AfterExitLockDelegate action in _afterExitLockActions) {
                        //    main.Invoke(action);
                        //}
                        _afterExitLockActions.Clear();
                    }
                }

                //if(_modalTerminalTask!=null) _modalTerminalTask.NotifyEndOfPacket();
                _session.NotifyViewsDataArrived();
            }
            catch (Exception ex) {
                RuntimeUtil.ReportException(ex);
            }
        }
Esempio n. 2
0
        public void OnReception(ByteDataFragment data)
        {
            try {
                bool pass_to_terminal = true;
                if (_modalTerminalTask != null)
                {
                    bool show_input = _modalTerminalTask.ShowInputInTerminal;
                    _modalTerminalTask.OnReception(data);
                    if (!show_input)
                    {
                        pass_to_terminal = false; //入力を見せない(XMODEMとか)のときはターミナルに与えない
                    }
                }

                //バイナリログの出力
                _logService.BinaryLogger.Write(data);

                if (pass_to_terminal)
                {
                    TerminalDocument document = _document;
                    lock (document) {
                        //_invalidateParam.Reset();
                        //ここから旧Input()
                        _manipulator.Load(GetDocument().CurrentLine, 0);
                        _manipulator.CaretColumn       = GetDocument().CaretColumn;
                        _manipulator.DefaultDecoration = _currentdecoration;

                        //処理本体
                        _decoder.OnReception(data);

                        GetDocument().ReplaceCurrentLine(_manipulator.Export());
                        GetDocument().CaretColumn = _manipulator.CaretColumn;
                        //ここまで

                        //右端にキャレットが来たときは便宜的に次行の頭にもっていく
                        if (document.CaretColumn == document.TerminalWidth)
                        {
                            document.CurrentLineNumber++; //これによって次行の存在を保証
                            document.CaretColumn = 0;
                        }

                        CheckDiscardDocument();
                        AdjustTransientScrollBar();

                        //現在行が下端に見えるようなScrollBarValueを計算
                        int n = document.CurrentLineNumber - document.TerminalHeight + 1 - document.FirstLineNumber;
                        if (n < 0)
                        {
                            n = 0;
                        }

                        //Debug.WriteLine(String.Format("E={0} C={1} T={2} H={3} LC={4} MAX={5} n={6}", _transientScrollBarEnabled, _tag.Document.CurrentLineNumber, _tag.Document.TopLineNumber, _tag.Connection.TerminalHeight, _transientScrollBarLargeChange, _transientScrollBarMaximum, n));
                        if (IsAutoScrollMode(n))
                        {
                            _scrollBarValues.Value = n;
                            document.TopLineNumber = n + document.FirstLineNumber;
                        }
                        else
                        {
                            _scrollBarValues.Value = document.TopLineNumber - document.FirstLineNumber;
                        }

                        //Invalidateをlockの外に出す。このほうが安全と思われた

                        //受信スレッド内ではマークをつけるのみ。タイマーで行うのはIntelliSenseに副作用あるので一時停止
                        //_promptRecognizer.SetContentUpdateMark();
                        _promptRecognizer.Recognize();
                    }

                    if (_afterExitLockActions.Count > 0)
                    {
                        Control main = _session.OwnerWindow.AsControl();
                        foreach (AfterExitLockDelegate action in _afterExitLockActions)
                        {
                            main.Invoke(action);
                        }
                        _afterExitLockActions.Clear();
                    }
                }

                if (_modalTerminalTask != null)
                {
                    _modalTerminalTask.NotifyEndOfPacket();
                }
                _session.NotifyViewsDataArrived();
            }
            catch (Exception ex) {
                RuntimeUtil.ReportException(ex);
            }
        }