private void RepeatCallback(IAsyncResult result)
        {
            try {
                int n = _socket.EndReceive(result);
                _dataFragment.Set(_buf, 0, n);
                Debug.Assert(_ownerConnection != null);               //これを呼び出すようになるまでにはセットされていること!

                if (n > 0)
                {
                    if (OnReceptionCore(_dataFragment) == GenericResult.Succeeded)
                    {
                        BeginReceive();
                    }
                }
                else if (n < 0)
                {
                    //WindowsMEにおいては、ときどきここで-1が返ってきていることが発覚した。下のErrorCode 995の場合も同様
                    BeginReceive();
                }
                else
                {
                    OnNormalTerminationCore();
                }
            }
            catch (Exception ex) {
                if (!_ownerConnection.IsClosed)
                {
                    RuntimeUtil.SilentReportException(ex);
                    if ((ex is SocketException) && ((SocketException)ex).ErrorCode == 995)
                    {
                        BeginReceive();
                    }
                    else
                    {
                        OnAbnormalTerminationCore(ex.Message);
                    }
                }
            }
        }
示例#2
0
        private void _buttonOK_Click(object sender, EventArgs e)
        {
            PipeTerminalParameter param;
            PipeTerminalSettings  settings;

            if (ValidateParams(out param, out settings))
            {
                try {
                    bool succeeded = false;
                    try {
                        Cursor.Current = Cursors.WaitCursor;
                        this.Enabled   = false;

                        if (OpenPipe != null)
                        {
                            succeeded = OpenPipe(param, settings);
                        }
                    }
                    finally {
                        // when succeeded, this form will be closed. no need to change form status.
                        if (!succeeded)
                        {
                            this.Enabled = true;
                        }
                        Cursor.Current = Cursors.Default;
                    }

                    if (succeeded)
                    {
                        this.DialogResult = DialogResult.OK;
                        this.Close();
                    }
                }
                catch (Exception ex) {
                    RuntimeUtil.SilentReportException(ex);
                    GUtil.Warning(this.Parent, ex.Message);
                }
            }
        }
示例#3
0
        private void UploadThread(string[] localFiles, string remotePath, bool recursive, bool preseveTime)
        {
            Debug.Assert(_scp != null);
            Debug.Assert(localFiles != null);
            Debug.Assert(remotePath != null);
            Debug.Assert(remotePath.Length > 0);

            ClearLog();
            ClearProgressBar();

            bool assumeRemoteIsDir;

            if (localFiles.Length >= 2)
            {
                assumeRemoteIsDir = true;
            }
            else
            {
                assumeRemoteIsDir = false;
            }

            Log("=== UPLOAD ===");
            Log("Remote: " + remotePath);

            try {
                foreach (string localPath in localFiles)
                {
                    string scpLocalPath = Path.GetFullPath(localPath);

                    string scpRemotePath;
                    if (assumeRemoteIsDir && !recursive)
                    {
                        scpRemotePath = CombineUnixPath(remotePath, Path.GetFileName(scpLocalPath));
                    }
                    else
                    {
                        scpRemotePath = remotePath;
                    }

                    string basePath;
                    if (recursive)
                    {
                        basePath = Path.GetDirectoryName(scpLocalPath);
                    }
                    else
                    {
                        basePath = null;
                    }

                    Log((recursive ? "Uplaod (recursive): " : "Uplaod: ") + scpLocalPath);
                    _scp.Upload(scpLocalPath, scpRemotePath, recursive, preseveTime, _fileTransferCancellation,
                                delegate(string localFullPath, string fileName, SCPFileTransferStatus status, ulong fileSize, ulong transmitted) {
                        ShowProgress(basePath, localFullPath, fileName, status, fileSize, transmitted);
                    });
                }

                Log("Completed.");
            }
            catch (Exception e) {
                RuntimeUtil.SilentReportException(e);
                if (e is SCPClientException)
                {
                    Log("*** FAILED: " + e.Message);
                }
                else
                {
                    Log("*** ERROR: " + e.Message);
                }
            }

            ClearProgressBar();
        }
示例#4
0
        public override void ProcessChar(char ch)
        {
            if (_processCharResult != ProcessCharResult.Escaping)
            {
                if (ch == 0x1B)
                {
                    _processCharResult = ProcessCharResult.Escaping;
                }
                else
                {
                    //if(_currentCharacterTask!=null) { //ƒ}ƒNƒ‚ȂǁAchar‚ðŽæ‚éƒ^ƒCƒv
                    //    _currentCharacterTask.ProcessChar(ch);
                    //}

                    this.LogService.XmlLogger.Write(ch);

                    if (ch < 0x20 || (ch >= 0x80 && ch < 0xA0))
                    {
                        _processCharResult = ProcessControlChar(ch);
                    }
                    else
                    {
                        _processCharResult = ProcessNormalChar(ch);
                    }
                }
            }
            else
            {
                if (ch == '\0')
                {
                    return;                          //ƒV[ƒPƒ“ƒX’†‚ÉNULL•¶Žš‚ª“ü‚Á‚Ä‚¢‚éƒP[ƒX‚ªŠm”F‚³‚ꂽ ‚È‚¨¡‚ÍXmlLogger‚É‚à‚±‚̃f[ƒ^‚͍s‚©‚È‚¢B
                }
                _escapeSequence.Append(ch);
                bool end_flag = false;                 //escape sequence‚̏I‚í‚è‚©‚Ç‚¤‚©‚ðŽ¦‚·ƒtƒ‰ƒO
                if (_escapeSequence.Length == 1)       //ESC+‚P•¶Žš‚Å‚ ‚éê‡
                {
                    end_flag = ('0' <= ch && ch <= '9') || ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ch == '>' || ch == '=' || ch == '|' || ch == '}' || ch == '~';
                }
                else if (_escapeSequence[0] == ']')                //OSC‚̏I’[‚ÍBEL‚©ST(String Terminator)
                {
                    end_flag = ch == 0x07 || ch == 0x9c;
                }
                else if (this._escapeSequence[0] == '@')
                {
                    end_flag = (ch == '0') || (ch == '1');
                }
                else
                {
                    end_flag = ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ch == '@' || ch == '~' || ch == '|' || ch == '{';
                }

                if (end_flag)                  //ƒV[ƒPƒ“ƒX‚Ì‚¨‚í‚è
                {
                    char[] seq = _escapeSequence.ToString().ToCharArray();

                    this.LogService.XmlLogger.EscapeSequence(seq);

                    try {
                        char code = seq[0];
                        _processCharResult = ProcessCharResult.Unsupported;                         //ProcessEscapeSequence‚Å—áŠO‚ª—ˆ‚½Œã‚ŏó‘Ô‚ªEscaping‚͂Ђǂ¢Œ‹‰Ê‚ðµ‚­‚Ì‚Å
                        _processCharResult = ProcessEscapeSequence(code, seq, 1);
                        if (_processCharResult == ProcessCharResult.Unsupported)
                        {
                            throw new UnknownEscapeSequenceException(String.Format("ESC {0}", new string(seq)));
                        }
                    }
                    catch (UnknownEscapeSequenceException ex) {
                        CharDecodeError("Message.EscapesequenceTerminal.UnsupportedSequence" + ex.Message);
                        RuntimeUtil.SilentReportException(ex);
                    }
                    finally {
                        _escapeSequence.Remove(0, _escapeSequence.Length);
                    }
                }
                else
                {
                    _processCharResult = ProcessCharResult.Escaping;
                }
            }
        }
示例#5
0
        public override void ProcessChar(char ch)
        {
            if (_processCharResult != ProcessCharResult.Escaping)
            {
                if (ch == ControlCode.ESC)
                {
                    _processCharResult = ProcessCharResult.Escaping;
                }
                else
                {
                    if (_currentCharacterTask != null)   //マクロなど、charを取るタイプ
                    {
                        _currentCharacterTask.ProcessChar(ch);
                    }

                    this.LogService.XmlLogger.Write(Unicode.ToOriginal(ch));

                    if (Unicode.IsControlCharacter(ch))
                    {
                        _processCharResult = ProcessControlChar(ch);
                    }
                    else
                    {
                        _processCharResult = ProcessNormalChar(ch);
                    }
                }
            }
            else
            {
                if (ch == ControlCode.NUL)
                {
                    return; //シーケンス中にNULL文字が入っているケースが確認された なお今はXmlLoggerにもこのデータは行かない。
                }
                if (ch == ControlCode.ESC)
                {
                    // escape sequence restarted ?
                    // save log silently
                    RuntimeUtil.SilentReportException(new UnknownEscapeSequenceException("Incomplete escape sequence: ESC " + _escapeSequence.ToString()));
                    _escapeSequence.Remove(0, _escapeSequence.Length);
                    return;
                }

                _escapeSequence.Append(ch);
                bool end_flag = false;           //escape sequenceの終わりかどうかを示すフラグ
                if (_escapeSequence.Length == 1) //ESC+1文字である場合
                {
                    end_flag = ('0' <= ch && ch <= '9') || ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ch == '>' || ch == '=' || ch == '|' || ch == '}' || ch == '~';
                }
                else if (_escapeSequence[0] == ']')   //OSCの終端はBELかST(String Terminator)
                {
                    end_flag = (ch == ControlCode.BEL) || (ch == ControlCode.ST);
                    // Note: The conversion from "ESC \" to ST would be done in XTerm.ProcessChar(char).
                }
                else if (this._escapeSequence[0] == '@')
                {
                    end_flag = (ch == '0') || (ch == '1');
                }
                else
                {
                    end_flag = ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ch == '@' || ch == '~' || ch == '|' || ch == '{';
                }

                if (end_flag)   //シーケンスのおわり
                {
                    char[] seq = _escapeSequence.ToString().ToCharArray();

                    this.LogService.XmlLogger.EscapeSequence(seq);

                    try {
                        char code = seq[0];
                        _processCharResult = ProcessCharResult.Unsupported; //ProcessEscapeSequenceで例外が来た後で状態がEscapingはひどい結果を招くので
                        _processCharResult = ProcessEscapeSequence(code, seq, 1);
                        if (_processCharResult == ProcessCharResult.Unsupported)
                        {
                            throw new UnknownEscapeSequenceException("Unknown escape sequence: ESC " + new string(seq));
                        }
                    }
                    catch (UnknownEscapeSequenceException ex) {
                        CharDecodeError(GEnv.Strings.GetString("Message.EscapesequenceTerminal.UnsupportedSequence") + ex.Message);
                        RuntimeUtil.SilentReportException(ex);
                    }
                    finally {
                        _escapeSequence.Remove(0, _escapeSequence.Length);
                    }
                }
                else
                {
                    _processCharResult = ProcessCharResult.Escaping;
                }
            }
        }
示例#6
0
        public static SerialTerminalConnection CreateNewSerialConnection(IPoderosaMainWindow window, SerialTerminalParam param, SerialTerminalSettings settings)
        {
            bool       successful = false;
            FileStream strm       = null;

            try {
                StringResource sr = SerialPortPlugin.Instance.Strings;
                //Debug.WriteLine("OPENING COM"+param.Port);
                string portstr = String.Format("\\\\.\\{0}", param.PortName);
                IntPtr ptr     = Win32Serial.CreateFile(portstr, Win32.GENERIC_READ | Win32.GENERIC_WRITE, 0, IntPtr.Zero, Win32.OPEN_EXISTING, Win32.FILE_ATTRIBUTE_NORMAL | Win32.FILE_FLAG_OVERLAPPED, IntPtr.Zero);
                if (ptr == Win32.INVALID_HANDLE_VALUE)
                {
                    string msg = sr.GetString("Message.FailedToOpenSerial");
                    int    err = Marshal.GetLastWin32Error();
                    if (err == 2)
                    {
                        msg += sr.GetString("Message.NoSuchDevice");
                    }
                    else if (err == 5)
                    {
                        msg += sr.GetString("Message.DeviceIsBusy");
                    }
                    else
                    {
                        msg += "\nGetLastError=" + Marshal.GetLastWin32Error();
                    }
                    throw new Exception(msg);
                }
                //strm = new FileStream(ptr, FileAccess.Write, true, 8, true);
                Win32Serial.DCB dcb = new Win32Serial.DCB();
                FillDCB(ptr, ref dcb);
                UpdateDCB(ref dcb, settings);

                if (!Win32Serial.SetCommState(ptr, ref dcb))
                {
                    Win32.CloseHandle(ptr);
                    throw new Exception(sr.GetString("Message.FailedToConfigSerial"));
                }
                Win32Serial.COMMTIMEOUTS timeouts = new Win32Serial.COMMTIMEOUTS();
                Win32Serial.GetCommTimeouts(ptr, ref timeouts);
                timeouts.ReadIntervalTimeout         = 0xFFFFFFFF;
                timeouts.ReadTotalTimeoutConstant    = 0;
                timeouts.ReadTotalTimeoutMultiplier  = 0;
                timeouts.WriteTotalTimeoutConstant   = 100;
                timeouts.WriteTotalTimeoutMultiplier = 100;
                Win32Serial.SetCommTimeouts(ptr, ref timeouts);
                successful = true;
                SerialTerminalConnection r = new SerialTerminalConnection(param, settings, ptr);
                return(r);
            }
            catch (Exception ex) {
                RuntimeUtil.SilentReportException(ex);
                if (window != null)
                {
                    window.Warning(ex.Message);
                }
                else
                {
                    GUtil.Warning(Form.ActiveForm, ex.Message); //TODO 苦しい逃げ。IPoderosaFormを実装したベースクラスをCoreにでも持っていたほうがいいのか
                }
                return(null);
            }
            finally {
                if (!successful && strm != null)
                {
                    strm.Close();
                }
            }
        }
示例#7
0
        public override void ProcessChar(char ch)
        {
            if (_processCharResult != ProcessCharResult.Escaping)
            {
                if (ch == 0x1B)
                {
                    _processCharResult = ProcessCharResult.Escaping;
                }
                else
                {
                    if (_currentCharacterTask != null)                    //マクロなど、charを取るタイプ
                    {
                        _currentCharacterTask.ProcessChar(ch);
                    }

                    this.LogService.XmlLogger.Write(ch);

                    if (ch < 0x20 || (ch >= 0x80 && ch < 0xA0))
                    {
                        _processCharResult = ProcessControlChar(ch);
                    }
                    else
                    {
                        _processCharResult = ProcessNormalChar(ch);
                    }
                }
            }
            else
            {
                if (ch == '\0')
                {
                    return;                          //シーケンス中にNULL文字が入っているケースが確認された なお今はXmlLoggerにもこのデータは行かない。
                }
                _escapeSequence.Append(ch);
                bool end_flag = false;                 //escape sequenceの終わりかどうかを示すフラグ
                if (_escapeSequence.Length == 1)       //ESC+1文字である場合
                {
                    end_flag = ('0' <= ch && ch <= '9') || ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ch == '>' || ch == '=' || ch == '|' || ch == '}' || ch == '~';
                }
                else if (_escapeSequence[0] == ']')                //OSCの終端はBELかST(String Terminator)
                {
                    end_flag = ch == 0x07 || ch == 0x9c;
                    if (ch == '\\' && _escapeSequence[_escapeSequence.Length - 2] == 0x1b)
                    {
                        // ESC \ も OSC の終端
                        _escapeSequence.Remove(_escapeSequence.Length - 1, 1);
                        end_flag = true;
                    }
                }
                else if (this._escapeSequence[0] == '@')
                {
                    end_flag = (ch == '0') || (ch == '1');
                }
                else
                {
                    end_flag = ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ch == '@' || ch == '~' || ch == '|' || ch == '{';
                }

                if (end_flag)                  //シーケンスのおわり
                {
                    char[] seq = _escapeSequence.ToString().ToCharArray();

                    this.LogService.XmlLogger.EscapeSequence(seq);

                    try {
                        char code = seq[0];
                        _processCharResult = ProcessCharResult.Unsupported;                         //ProcessEscapeSequenceで例外が来た後で状態がEscapingはひどい結果を招くので
                        _processCharResult = ProcessEscapeSequence(code, seq, 1);
                        if (_processCharResult == ProcessCharResult.Unsupported)
                        {
                            throw new UnknownEscapeSequenceException(String.Format("ESC {0}", new string(seq)));
                        }
                    }
                    catch (UnknownEscapeSequenceException ex) {
                        CharDecodeError(GEnv.Strings.GetString("Message.EscapesequenceTerminal.UnsupportedSequence") + ex.Message);
                        RuntimeUtil.SilentReportException(ex);
                    }
                    finally {
                        _escapeSequence.Remove(0, _escapeSequence.Length);
                    }
                }
                else
                {
                    _processCharResult = ProcessCharResult.Escaping;
                }
            }
        }