예제 #1
0
 public GuiCommand(string name, GuiCommandHandler handler, int minParameterCount, int maxParameterCount)
 {
     Name              = name;
     Handler           = handler;
     MinParameterCount = minParameterCount;
     MaxParameterCount = maxParameterCount;
 }
예제 #2
0
        /// <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() + ")");
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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);
            })));
        }
예제 #5
0
        /// <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);
            })));
        }
예제 #6
0
        /// <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() + ")");
        }
예제 #7
0
        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);
        }
예제 #8
0
        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();
                }
            }
        }
예제 #9
0
        /// <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() + ")");
        }
예제 #10
0
		public GuiCommand(string name, GuiCommandHandler handler, int minParameterCount, int maxParameterCount)
		{
			Name = name;
			Handler = handler;
			MinParameterCount = minParameterCount;
			MaxParameterCount = maxParameterCount;
		}
예제 #11
0
		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;
		}