//Called from editor's CommandLine. Almost same as _Run. Does not throw. internal static int RunCL_(wnd w, int mode, string script, string[] args, Action <string> resultA) { bool wait = 0 != (mode & 1), needResult = 0 != (mode & 2); using var tr = new _TaskResults(); if (needResult && !tr.Init()) { return((int)RunResult_.cannotGetResult); } var data = Serializer_.Serialize(script, args, tr.pipeName); int pid = (int)WndCopyData.Send <byte>(w, 101, data, mode); if (pid == 0) { pid--; //RunResult_.failed } switch ((RunResult_)pid) { case RunResult_.failed: case RunResult_.notFound: return(pid); case RunResult_.deferred: //possible only if !wait case RunResult_.editorThread: //the script ran sync and already returned. Ignore needResult, as it it auto-detected, not explicitly specified. return(0); } if (wait) { using var hProcess = WaitHandle_.FromProcessId(pid, Api.SYNCHRONIZE | Api.PROCESS_QUERY_LIMITED_INFORMATION); if (hProcess == null) { return((int)RunResult_.cannotWait); } if (!needResult) { hProcess.WaitOne(-1); } else if (!tr.WaitAndRead(hProcess, resultA)) { return((int)RunResult_.cannotWaitGetResult); } if (!Api.GetExitCodeProcess(hProcess.SafeWaitHandle.DangerousGetHandle(), out pid)) { pid = int.MinValue; } } return(pid); }
#pragma warning restore CS1573 // Parameter has no matching param tag in the XML comment (but other parameters do) static int _Run(int mode, string script, string[] args, out string resultS, Action <string> resultA = null) { resultS = null; var w = WndMsg_; if (w.Is0) { throw new AuException("Editor process not found."); //CONSIDER: run editor program, if installed } bool wait = 0 != (mode & 1), needResult = 0 != (mode & 2); using var tr = new _TaskResults(); if (needResult && !tr.Init()) { throw new AuException("*get task results"); } var data = Serializer_.Serialize(script, args, tr.pipeName); int pid = (int)WndCopyData.Send <byte>(w, 100, data, mode); if (pid == 0) { pid--; //RunResult_.failed } switch ((RunResult_)pid) { case RunResult_.failed: return(!wait ? -1 : throw new AuException("*start task")); case RunResult_.notFound: throw new FileNotFoundException($"Script '{script}' not found."); case RunResult_.deferred: //possible only if !wait case RunResult_.editorThread: //the script ran sync and already returned return(0); } if (wait) { using var hProcess = WaitHandle_.FromProcessId(pid, Api.SYNCHRONIZE | Api.PROCESS_QUERY_LIMITED_INFORMATION); if (hProcess == null) { throw new AuException("*wait for task"); } if (!needResult) { hProcess.WaitOne(-1); } else if (!tr.WaitAndRead(hProcess, resultA)) { throw new AuException("*get task result"); } else if (resultA == null) { resultS = tr.ResultString; } if (!Api.GetExitCodeProcess(hProcess.SafeWaitHandle.DangerousGetHandle(), out pid)) { pid = int.MinValue; } } return(pid); }
/// <summary> /// Processes command line of this program. Called after partial initialization. /// Returns true if this instance must exit: /// 1. If finds previous program instance; then sends the command line to it if need. /// 2. If incorrect command line. /// </summary> public static bool ProgramStarted2(string[] args) { string s = null; int cmd = 0; if (args.Length > 0) { //print.it(args); for (int i = 0; i < args.Length; i++) { if (args[i].Starts('-')) { args[i] = args[i].ReplaceAt(0, 1, "/"); } //if (args[i].Starts('/')) args[i] = args[i].Lower(); } s = args[0]; if (s.Starts('/')) { for (int i = 0; i < args.Length; i++) { s = args[i]; switch (s) { case "/test": if (++i < args.Length) { TestArg = args[i]; } break; case "/v": StartVisible = true; break; default: dialog.showError("Unknown command line parameter", s); return(true); } } } else //one or more files { if (args.Length == 1 && FilesModel.IsWorkspaceDirectoryOrZip_ShowDialogOpenImport(s, out cmd)) { switch (cmd) { case 1: WorkspaceDirectory = s; break; case 2: _importWorkspace = s; break; default: return(true); } } else { cmd = 3; _importFiles = args; } StartVisible = true; } } //single instance s_mutex = new Mutex(true, "Au.Editor.Mutex.m3gVxcTJN02pDrHiQ00aSQ", out bool createdNew); if (createdNew) { return(false); } var w = wnd.findFast(null, script.c_msgWndClassName, true); if (!w.Is0) { w.Send(Api.WM_USER, 0, 1); //auto-creates, shows and activates main window if (cmd != 0) { Thread.Sleep(100); if (cmd == 3) { s = string.Join("\0", args); //import files } WndCopyData.Send <char>(w, cmd, s); } } return(true); }