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); } } } }
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); } } }
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(); }
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; } } }
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; } } }
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(); } } }
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; } } }