public void Open(SessionOptions sessionOptions) { using (Logger.CreateCallstackAndLock()) { CheckNotDisposed(); if (Opened) { throw new InvalidOperationException("Session is already opened"); } try { SetupTempPath(); _process = new ExeSessionProcess(this); _process.OutputDataReceived += ProcessOutputDataReceived; _process.Start(); GotOutput(); // setup batch mode WriteCommand("option batch on"); WriteCommand("option confirm off"); if (ReconnectTime != TimeSpan.MaxValue) { WriteCommand(string.Format(CultureInfo.InvariantCulture, "option reconnecttime {0}", (int)ReconnectTime.TotalSeconds)); } WriteCommand("open " + SessionOptionsToOpenArguments(sessionOptions)); string logExplanation = string.Format(CultureInfo.CurrentCulture, "(response log file {0} was not created). This could indicate lack of write permissions to the log folder or problems starting WinSCP itself.", XmlLogPath); // Wait until the log file gets created or WinSCP terminates (in case of fatal error) do { if (_process.HasExited && !File.Exists(XmlLogPath)) { string[] output = new string[Output.Count]; Output.CopyTo(output, 0); Logger.WriteCounters(); Logger.WriteProcesses(); _process.WriteStatus(); throw new SessionLocalException(this, string.Format(CultureInfo.CurrentCulture, "WinSCP process terminated with exit code {0} and output \"{1}\", without responding {2}", _process.ExitCode, string.Join(Environment.NewLine, output), logExplanation)); } Thread.Sleep(50); CheckForTimeout( string.Format(CultureInfo.CurrentCulture, "WinSCP has not responded in time {0}", logExplanation)); } while (!File.Exists(XmlLogPath)); _logReader = new SessionLogReader(this); _reader = _logReader.WaitForNonEmptyElementAndCreateLogReader("session", LogReadFlags.ThrowFailures); using (ElementLogReader groupReader = _reader.WaitForGroupAndCreateLogReader()) { ReadElement(groupReader, LogReadFlags.ThrowFailures); } } catch(Exception e) { Logger.WriteLine("Exception: {0}", e); Cleanup(); throw; } } }
public void Open(SessionOptions sessionOptions) { using (Logger.CreateCallstackAndLock()) { CheckNotDisposed(); if (Opened) { throw new InvalidOperationException("Session is already opened"); } try { SetupTempPath(); _process = new ExeSessionProcess(this); _process.OutputDataReceived += ProcessOutputDataReceived; _process.Start(); GotOutput(); // setup batch mode WriteCommand("option batch on"); WriteCommand("option confirm off"); object reconnectTimeValue; if (ReconnectTime != TimeSpan.MaxValue) { reconnectTimeValue = (int)ReconnectTime.TotalSeconds; } else { reconnectTimeValue = "off"; } string reconnectTimeCommand = string.Format(CultureInfo.InvariantCulture, "option reconnecttime {0}", reconnectTimeValue); WriteCommand(reconnectTimeCommand); string command; string log; SessionOptionsToOpenCommand(sessionOptions, out command, out log); WriteCommand(command, log); string logExplanation = string.Format(CultureInfo.CurrentCulture, "(response log file {0} was not created). This could indicate lack of write permissions to the log folder or problems starting WinSCP itself.", XmlLogPath); // Wait until the log file gets created or WinSCP terminates (in case of fatal error) do { if (_process.HasExited && !File.Exists(XmlLogPath)) { string[] output = new string[Output.Count]; Output.CopyTo(output, 0); Logger.WriteCounters(); Logger.WriteProcesses(); _process.WriteStatus(); string exitCode = string.Format(CultureInfo.CurrentCulture, "{0}", _process.ExitCode); if (_process.ExitCode < 0) { exitCode = string.Format(CultureInfo.CurrentCulture, "{0} ({1:X})", exitCode, _process.ExitCode); } throw new SessionLocalException(this, string.Format(CultureInfo.CurrentCulture, "WinSCP process terminated with exit code {0} and output \"{1}\", without responding {2}", exitCode, string.Join(Environment.NewLine, output), logExplanation)); } Thread.Sleep(50); CheckForTimeout( string.Format(CultureInfo.CurrentCulture, "WinSCP has not responded in time {0}", logExplanation)); } while (!File.Exists(XmlLogPath)); _logReader = new SessionLogReader(this); _logReader.WaitForNonEmptyElement("session", LogReadFlags.ThrowFailures); // special variant of ElementLogReader that throws when closing element (</session>) is encountered _reader = new SessionElementLogReader(_logReader); // Skip "open" command <group> using (ElementLogReader groupReader = _reader.WaitForGroupAndCreateLogReader()) { ReadElement(groupReader, LogReadFlags.ThrowFailures); } WriteCommand("pwd"); using (ElementLogReader groupReader = _reader.WaitForGroupAndCreateLogReader()) using (ElementLogReader cwdReader = groupReader.WaitForNonEmptyElementAndCreateLogReader("cwd", LogReadFlags.ThrowFailures)) { while (cwdReader.Read(0)) { string value; if (cwdReader.GetEmptyElementValue("cwd", out value)) { _homePath = value; } } groupReader.ReadToEnd(LogReadFlags.ThrowFailures); } } catch(Exception e) { Logger.WriteLine("Exception: {0}", e); Cleanup(); throw; } } }