public bool AcpiPowerOff(IMachineMetadata machine, int waitLimitInMilliseconds)
        {
            if (machine == null)
            {
                throw new ArgumentNullException(nameof(machine));
            }

            using var instance = factory.Create(version);

            var session = instance.LockMachine(machine.Uuid);

            if (session == null)
            {
                return(false);
            }

            if (!session.AcpiPowerOff())
            {
                return(false);
            }

            var stopwatch = new Stopwatch();

            stopwatch.Start();

            while (stopwatch.ElapsedMilliseconds < waitLimitInMilliseconds && session.IsLocked)
            {
                Thread.Sleep(250);
            }

            return(session.Machine.State == VirtualMachineState.PoweredOff);
        }
        public bool Start(IMachineMetadata machine, bool headless)
        {
            if (machine == null)
            {
                throw new ArgumentNullException(nameof(machine));
            }

            using var instance = factory.Create(version);

            return(instance.PowerOn(machine.Uuid, headless).CheckForSuccess());
        }
        public bool PowerOff(IMachineMetadata machine)
        {
            if (machine == null)
            {
                throw new ArgumentNullException(nameof(machine));
            }

            using var instance = factory.Create(version);

            var session = instance.LockMachine(machine.Uuid);

            return(session?.PowerDown().CheckForSuccess() == true);
        }
        public bool Reset(IMachineMetadata machine)
        {
            if (machine == null)
            {
                throw new ArgumentNullException(nameof(machine));
            }

            using var instance = factory.Create(version);

            var session = instance.LockMachine(machine.Uuid);

            return(session?.Reset() == true);
        }
 private ToolStripItem[] BuildSubMenu(IMachineMetadata machine)
 {
     return(new ToolStripItem[]
     {
         new MachineStatusToolStripItem(machine),
         new ToolStripSeparator(),
         new ToolStripMenuItem(
             "Headless start",
             null,
             (_, __) => new Task(() => machineController.Start(machine, true)).Start()
             ),
         new ToolStripMenuItem(
             "Normal start",
             null,
             (_, __) => new Task(() => machineController.Start(machine, false)).Start()
             ),
         new ToolStripSeparator(),
         new ToolStripMenuItem(
             "Save State",
             null,
             (_, __) => new Task(() => machineController.SaveState(machine)).Start()
             ),
         new ToolStripMenuItem(
             "ACPI Shutdown",
             null,
             (_, __) => new Task(() => machineController.AcpiPowerOff(machine, 90000)).Start()
             ),
         new ToolStripMenuItem(
             "Power off",
             null,
             (_, __) => new Task(() => machineController.PowerOff(machine)).Start()
             ),
         new ToolStripSeparator(),
         new ToolStripMenuItem(
             "Reset",
             null,
             (_, __) => machineController.Reset(machine)
             )
     });
 }
            public void Update(IMachineMetadata machine)
            {
                var text = new StringBuilder();

                text.Append(Regex.Replace(machine.State.ToString(), "([a-z])_?([A-Z])", "$1 $2"));

                if (machine is MachineMetadata metadata)
                {
                    text.Append(" since ");

                    text.Append(
                        metadata.LastAction.Date == DateTime.Today
                            ? metadata.LastAction.ToString("t", CultureInfo.CurrentCulture)
                            : metadata.LastAction.ToString("g", CultureInfo.CurrentCulture)
                        );

                    if (!string.IsNullOrWhiteSpace(metadata.SessionName))
                    {
                        text.Append(" (").Append(metadata.SessionName).Append(')');
                    }
                }

                Text = text.ToString();
            }
 public MachineStatusToolStripItem(IMachineMetadata machine)
 {
     Update(machine);
 }