public override void Launch(Response response, dynamic args) { var startupScript = (string)args["program"]; if (startupScript == null) { SendErrorResponse(response, 1001, "Property 'program' is missing or empty."); return; } if (!File.Exists(startupScript)) { SendErrorResponse(response, 1002, "Script '{path}' does not exist.", new { path = Path.Combine(Directory.GetCurrentDirectory(), startupScript) }); return; } // validate argument 'args' string[] arguments = null; if (args.args != null) { arguments = args.args.ToObject <string[]>(); if (arguments != null && arguments.Length == 0) { arguments = null; } } // validate argument 'cwd' var workingDirectory = (string)args.cwd; if (workingDirectory != null) { workingDirectory = workingDirectory.Trim(); if (workingDirectory.Length == 0) { SendErrorResponse(response, 3003, "Property 'cwd' is empty."); return; } workingDirectory = ConvertClientPathToDebugger(workingDirectory); if (!Directory.Exists(workingDirectory)) { SendErrorResponse(response, 3004, "Working directory '{path}' does not exist.", new { path = workingDirectory }); return; } } else { workingDirectory = Path.GetDirectoryName(startupScript); } // validate argument 'runtimeExecutable' var runtimeExecutable = (string)args.runtimeExecutable; if (runtimeExecutable != null) { runtimeExecutable = runtimeExecutable.Trim(); if (runtimeExecutable.Length == 0) { SendErrorResponse(response, 3005, "Property 'runtimeExecutable' is empty."); return; } runtimeExecutable = ConvertClientPathToDebugger(runtimeExecutable); if (!File.Exists(runtimeExecutable)) { SendErrorResponse(response, 3006, "Runtime executable '{path}' does not exist.", new { path = runtimeExecutable }); return; } } else { runtimeExecutable = "oscript.exe"; } _process = new DebugeeProcess(); _process.RuntimeExecutable = runtimeExecutable; _process.RuntimeArguments = Utilities.ConcatArguments(args.runtimeArgs); _process.StartupScript = startupScript; _process.ScriptArguments = Utilities.ConcatArguments(args.args); _process.WorkingDirectory = workingDirectory; _process.OutputReceived += (s, e) => { SessionLog.WriteLine("output received: " + e.Content); SendOutput(e.Category, e.Content); }; _process.ProcessExited += (s, e) => { SessionLog.WriteLine("_process exited"); SendEvent(new TerminatedEvent()); }; try { _process.Start(); } catch (Exception e) { SendErrorResponse(response, 3012, "Can't launch debugee ({reason}).", new { reason = e.Message }); return; } int port = getInt(args, "debugPort", 2801); try { _process.Connect(port, this); } catch (Exception e) { _process.Kill(); _process = null; SendErrorResponse(response, 4550, "Can't connect: " + e.ToString()); return; } SendResponse(response); }