예제 #1
0
        //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);
        }
예제 #2
0
#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);
        }
예제 #3
0
    /// <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);
    }