public GuiCommand(string name, GuiCommandHandler handler, int minParameterCount, int maxParameterCount) { Name = name; Handler = handler; MinParameterCount = minParameterCount; MaxParameterCount = maxParameterCount; }
/// <summary> /// Executes a "0install-win" command in-process in a new thread. Returns immediately. /// </summary> /// <param name="callback">A callback method to be raised once the command has finished executing. Uses <see cref="SynchronizationContext"/> of calling thread. Can be <c>null</c>.</param> /// <param name="machineWide">Appends --machine to <paramref name="args"/> if <c>true</c>.</param> /// <param name="args">Command name with arguments to execute.</param> internal static void RunCommand(Action?callback, bool machineWide, params string[] args) { if (machineWide) { args = args.Append("--machine"); } var context = SynchronizationContext.Current; ThreadUtils.StartAsync( () => { Log.Debug($"Launching {Commands.WinForms.Program.ExeName} in-process with arguments: {args.JoinEscapeArguments()}"); using (var handler = new GuiCommandHandler()) ProgramUtils.Run(Commands.WinForms.Program.ExeName, args, handler); if (callback != null) { try { context.Send(state => callback(), null); } catch (InvalidAsynchronousStateException) { // Ignore callback if UI was closed in the meantime } } }, "0install-win (" + args.JoinEscapeArguments() + ")"); }
/// <summary> /// The main entry point for the application. /// </summary> // NOTE: No [STAThread] here, because it could block .NET remoting callbacks private static int Main(string[] args) { ProgramUtils.Init(); WindowsUtils.SetCurrentProcessAppID(AppUserModelID); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); ErrorReportForm.SetupMonitoring(new Uri("https://0install.de/error-report/")); using (var handler = new GuiCommandHandler()) return (int)ProgramUtils.Run(ExeName, args, handler); }
/// <summary> /// Executes a "0install-win" command in-process in a new thread. Returns immediately. /// </summary> /// <param name="machineWide">Appends --machine to <paramref name="args"/> if <c>true</c>.</param> /// <param name="args">Command name with arguments to execute.</param> internal static Task RunCommandAsync(bool machineWide, params string[] args) { if (machineWide) { args = args.Append("--machine"); } return(Task.Run(() => ThreadUtils.RunSta(() => { Log.Debug($"Launching {Commands.WinForms.Program.ExeName} in-process with arguments: {args.JoinEscapeArguments()}"); using var handler = new GuiCommandHandler(); ProgramUtils.Run(Commands.WinForms.Program.ExeName, args, handler); }))); }
/// <summary> /// Executes a "0install-win" command in-process in a new thread. Returns immediately. /// </summary> /// <param name="machineWide">Appends --machine to <paramref name="args"/> if <c>true</c>.</param> /// <param name="args">Command name with arguments to execute.</param> internal static Task <ExitCode> RunCommandAsync(bool machineWide, params string[] args) { if (machineWide) { args = args.Append("--machine"); } return(Task.Run(() => ThreadUtils.RunSta(() => { Log.Debug($"Launching 0install-win in-process with arguments: {args.JoinEscapeArguments()}"); using var handler = new GuiCommandHandler(); return ProgramUtils.Run("0install-win", args, handler); }))); }
/// <summary> /// Executes a "0install-win" command in-process in a new thread. Returns immediately. /// </summary> /// <param name="callback">A callback method to be raised once the command has finished executing. Uses <see cref="SynchronizationContext"/> of calling thread. Can be <c>null</c>.</param> /// <param name="machineWide">Appends --machine to <paramref name="args"/> if <c>true</c>.</param> /// <param name="args">Command name with arguments to execute.</param> internal static void RunCommand([CanBeNull] Action callback, bool machineWide, [NotNull] params string[] args) { args = machineWide ? args.Append("--machine") : args; var context = SynchronizationContext.Current; ThreadUtils.StartAsync( () => { Log.Debug("Launching " + Commands.WinForms.Program.ExeName + " in-process with arguments: " + args.JoinEscapeArguments()); using (var handler = new GuiCommandHandler()) ProgramUtils.Run(Commands.WinForms.Program.ExeName, args, handler); if (callback != null) { context.Send(state => callback(), null); } }, "0install-win (" + args.JoinEscapeArguments() + ")"); }
public bool Parse(idScriptParser parser) { // first token should be function call // then a potentially variable set of parms // ended with a ; idToken token; GuiCommand cmd = new GuiCommand(); if ((token = parser.ReadToken()) == null) { parser.Error("Unexpected end of file"); return(false); } _handler = null; string tokenLower = token.ToString().ToLower(); foreach (GuiCommand tmp in CommandList) { if (tmp.Name.ToLower() == tokenLower) { _handler = tmp.Handler; cmd = tmp; break; } } if (_handler == null) { parser.Error("Unknown script call {0}", token.ToString()); } // now read parms til ; // all parms are read as idWinStr's but will be fixed up later // to be proper types while (true) { if ((token = parser.ReadToken()) == null) { parser.Error("Unexpected end of file"); return(false); } tokenLower = token.ToString().ToLower(); if (tokenLower == ";") { break; } else if (tokenLower == "}") { parser.UnreadToken(token); break; } idWinString str = new idWinString(string.Empty); str.Set(token.ToString()); _parameters.Add(new idWinGuiScript(true, str)); } // // verify min/max params if ((_handler != null) && ((_parameters.Count < cmd.MinParameterCount) || (_parameters.Count > cmd.MaxParameterCount))) { parser.Error("incorrect number of parameters for script {0}", cmd.Name); } // return(true); }
public static ExitCode Run(string[] args) { Log.Debug("Zero Install Command WinForms GUI started with: " + args.JoinEscapeArguments()); using (var handler = new GuiCommandHandler()) { try { var command = CommandFactory.CreateAndParse(args, handler); return command.Execute(); } #region Error handling catch (OperationCanceledException) { return ExitCode.UserCanceled; } catch (NotAdminException ex) { handler.DisableUI(); try { return (ExitCode)ProcessUtils.Assembly(ExeName, args).AsAdmin().Run(); } catch (OperationCanceledException) { return ExitCode.UserCanceled; } catch (PlatformNotSupportedException) { Log.Error(ex); Msg.Inform(null, ex.Message, MsgSeverity.Warn); return ExitCode.AccessDenied; } catch (IOException) { Log.Error(ex); Msg.Inform(null, ex.Message, MsgSeverity.Warn); return ExitCode.AccessDenied; } } catch (OptionException ex) { handler.DisableUI(); var message = new StringBuilder(ex.Message); if (ex.InnerException != null) message.Append("\n" + ex.InnerException.Message); message.Append("\n" + string.Format(Resources.TryHelp, ExeName)); Msg.Inform(null, message.ToString(), MsgSeverity.Warn); return ExitCode.InvalidArguments; } catch (FormatException ex) { handler.DisableUI(); ThreadUtils.RunSta(() => ErrorBox.Show(null, ex, handler.ErrorLog)); return ExitCode.InvalidArguments; } catch (WebException ex) { handler.DisableUI(); ThreadUtils.RunSta(() => ErrorBox.Show(null, ex, handler.ErrorLog)); return ExitCode.WebError; } catch (NotSupportedException ex) { handler.DisableUI(); ThreadUtils.RunSta(() => ErrorBox.Show(null, ex, handler.ErrorLog)); return ExitCode.NotSupported; } catch (IOException ex) { handler.DisableUI(); ThreadUtils.RunSta(() => ErrorBox.Show(null, ex, handler.ErrorLog)); return ExitCode.IOError; } catch (UnauthorizedAccessException ex) { handler.DisableUI(); ThreadUtils.RunSta(() => ErrorBox.Show(null, ex, handler.ErrorLog)); return ExitCode.AccessDenied; } catch (InvalidDataException ex) { handler.DisableUI(); ThreadUtils.RunSta(() => ErrorBox.Show(null, ex, handler.ErrorLog)); return ExitCode.InvalidData; } catch (SignatureException ex) { handler.DisableUI(); ThreadUtils.RunSta(() => ErrorBox.Show(null, ex, handler.ErrorLog)); return ExitCode.InvalidSignature; } catch (DigestMismatchException ex) { handler.DisableUI(); ThreadUtils.RunSta(() => ErrorBox.Show(null, ex, handler.ErrorLog)); return ExitCode.DigestMismatch; } catch (SolverException ex) { handler.DisableUI(); ThreadUtils.RunSta(() => ErrorBox.Show(null, ex, handler.ErrorLog)); return ExitCode.SolverError; } catch (ExecutorException ex) { handler.DisableUI(); ThreadUtils.RunSta(() => ErrorBox.Show(null, ex, handler.ErrorLog)); return ExitCode.ExecutorError; } catch (ConflictException ex) { handler.DisableUI(); ThreadUtils.RunSta(() => ErrorBox.Show(null, ex, handler.ErrorLog)); return ExitCode.Conflict; } #endregion finally { handler.CloseUI(); } } }
/// <summary> /// Executes a "0install-win" command in-process in a new thread. Returns immediately. /// </summary> /// <param name="callback">A callback method to be raised once the command has finished executing. Uses <see cref="SynchronizationContext"/> of calling thread. Can be <c>null</c>.</param> /// <param name="machineWide">Appends --machine to <paramref name="args"/> if <c>true</c>.</param> /// <param name="args">Command name with arguments to execute.</param> internal static void RunCommand([CanBeNull] Action callback, bool machineWide, [NotNull] params string[] args) { args = machineWide ? args.Append("--machine") : args; var context = SynchronizationContext.Current; ThreadUtils.StartAsync( () => { Log.Debug("Launching " + Commands.WinForms.Program.ExeName + " in-process with arguments: " + args.JoinEscapeArguments()); using (var handler = new GuiCommandHandler()) ProgramUtils.Run(Commands.WinForms.Program.ExeName, args, handler); if (callback != null) context.Send(state => callback(), null); }, "0install-win (" + args.JoinEscapeArguments() + ")"); }
public bool Parse(idScriptParser parser) { // first token should be function call // then a potentially variable set of parms // ended with a ; idToken token; GuiCommand cmd = new GuiCommand(); if((token = parser.ReadToken()) == null) { parser.Error("Unexpected end of file"); return false; } _handler = null; string tokenLower = token.ToString().ToLower(); foreach(GuiCommand tmp in CommandList) { if(tmp.Name.ToLower() == tokenLower) { _handler = tmp.Handler; cmd = tmp; break; } } if(_handler == null) { parser.Error("Unknown script call {0}", token.ToString()); } // now read parms til ; // all parms are read as idWinStr's but will be fixed up later // to be proper types while(true) { if((token = parser.ReadToken()) == null) { parser.Error("Unexpected end of file"); return false; } tokenLower = token.ToString().ToLower(); if(tokenLower == ";") { break; } else if(tokenLower == "}") { parser.UnreadToken(token); break; } idWinString str = new idWinString(string.Empty); str.Set(token.ToString()); _parameters.Add(new idWinGuiScript(true, str)); } // // verify min/max params if((_handler != null) && ((_parameters.Count < cmd.MinParameterCount) || (_parameters.Count > cmd.MaxParameterCount))) { parser.Error("incorrect number of parameters for script {0}", cmd.Name); } // return true; }