using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Net; using System.Runtime.InteropServices; using System.Threading.Tasks; using Ameliorated.ConsoleUtils; namespace amecs { public class amecs { public static bool RunBasicAction(string status, string result, Action action, bool logoff = false, bool restart = false) { ConsoleTUI.OpenFrame.WriteCentered(status); try { using (new ConsoleUtils.LoadingIndicator(true)) { action.Invoke(); } } catch (Exception e) { Console.WriteLine(); ConsoleTUI.OpenFrame.Close("Error: " + e.Message.TrimEnd('\n').TrimEnd('\r'), ConsoleColor.Red, Console.BackgroundColor, new ChoicePrompt() { AnyKey = true, Text = "Press any key to return to the Menu: " }); return false; } Console.WriteLine(); if (logoff) { if ((int?)ConsoleTUI.OpenFrame.Close(result, ConsoleColor.Green, Console.BackgroundColor, new ChoicePrompt() { TextForeground = ConsoleColor.Yellow, Text = "Logoff to apply changes? (Y/N): " }) == 0) amecs.RestartWindows(true); return true; } if (restart) { if ((int?)ConsoleTUI.OpenFrame.Close(result, ConsoleColor.Green, Console.BackgroundColor, new ChoicePrompt() { TextForeground = ConsoleColor.Yellow, Text = "Restart to apply changes? (Y/N): " }) == 0) amecs.RestartWindows(false); return true; } ConsoleTUI.OpenFrame.Close(result, ConsoleColor.Green, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "}); return true; } public static bool RunBasicAction(string status, string result, Action action, ChoicePrompt prompt = null, bool logoff = false, bool restart = false) { int choice = -1; if (prompt != null) { var choiceRes = prompt.Start(); if (!choiceRes.HasValue) return true; choice = choiceRes.Value; } ConsoleTUI.OpenFrame.WriteCentered(status); try { using (new ConsoleUtils.LoadingIndicator(true)) { action.Invoke(choice); } } catch (Exception e) { Console.WriteLine(); ConsoleTUI.OpenFrame.Close("Error: " + e.Message.TrimEnd('\n').TrimEnd('\r'), ConsoleColor.Red, Console.BackgroundColor, new ChoicePrompt() { AnyKey = true, Text = "Press any key to return to the Menu: " }); return false; } Console.WriteLine(); if (logoff) { if ((int?)ConsoleTUI.OpenFrame.Close(result, ConsoleColor.Green, Console.BackgroundColor, new ChoicePrompt() { TextForeground = ConsoleColor.Yellow, Text = "Logoff to apply changes? (Y/N): " }) == 0) amecs.RestartWindows(true); return true; } if (restart) { if ((int?)ConsoleTUI.OpenFrame.Close(result, ConsoleColor.Green, Console.BackgroundColor, new ChoicePrompt() { TextForeground = ConsoleColor.Yellow, Text = "Restart to apply changes? (Y/N): " }) == 0) amecs.RestartWindows(false); return true; } ConsoleTUI.OpenFrame.Close(result, ConsoleColor.Green, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "}); return true; } [Flags] enum ExitWindows : uint { // ONE of the following five: LogOff = 0x00, ShutDown = 0x01, Reboot = 0x02, PowerOff = 0x08, RestartApps = 0x40, // plus AT MOST ONE of the following two: Force = 0x04, ForceIfHung = 0x10, } [Flags] enum ShutdownReason : uint { MajorApplication = 0x00040000, MajorHardware = 0x00010000, MajorLegacyApi = 0x00070000, MajorOperatingSystem = 0x00020000, MajorOther = 0x00000000, MajorPower = 0x00060000, MajorSoftware = 0x00030000, MajorSystem = 0x00050000, MinorBlueScreen = 0x0000000F, MinorCordUnplugged = 0x0000000b, MinorDisk = 0x00000007, MinorEnvironment = 0x0000000c, MinorHardwareDriver = 0x0000000d, MinorHotfix = 0x00000011, MinorHung = 0x00000005, MinorInstallation = 0x00000002, MinorMaintenance = 0x00000001, MinorMMC = 0x00000019, MinorNetworkConnectivity = 0x00000014, MinorNetworkCard = 0x00000009, MinorOther = 0x00000000, MinorOtherDriver = 0x0000000e, MinorPowerSupply = 0x0000000a, MinorProcessor = 0x00000008, MinorReconfig = 0x00000004, MinorSecurity = 0x00000013, MinorSecurityFix = 0x00000012, MinorSecurityFixUninstall = 0x00000018, MinorServicePack = 0x00000010, MinorServicePackUninstall = 0x00000016, MinorTermSrv = 0x00000020, MinorUnstable = 0x00000006, MinorUpgrade = 0x00000003, MinorWMI = 0x00000015, FlagUserDefined = 0x40000000, FlagPlanned = 0x80000000 } [DllImport("user32.dll")] static extern bool ExitWindowsEx(uint uFlags, uint dwReason); [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)] private static extern bool InitiateSystemShutdownEx( string lpMachineName, string lpMessage, uint dwTimeout, bool bForceAppsClosed, bool bRebootAfterShutdown, ShutdownReason dwReason); public static void RestartWindows(bool logoff, bool cmd = false) { if (cmd) { var psi = new ProcessStartInfo("shutdown","/r /t 0"); psi.CreateNoWindow = true; psi.UseShellExecute = false; Process.Start(psi); Environment.Exit(0); } if (!logoff) { NSudo.GetShutdownPrivilege(); InitiateSystemShutdownEx(null, null, 0, false, true, ShutdownReason.MinorInstallation); } else ExitWindowsEx((uint)ExitWindows.LogOff | (uint)ExitWindows.ForceIfHung, (uint)ShutdownReason.MinorInstallation); Environment.Exit(0); } public static object ShowDefaultMenu(List list) { list.AddRange(new [] { Menu.MenuItem.BlankStatic, new Menu.MenuItem("Next Page", null) { IsNextButton = true }, new Menu.MenuItem("Previous Page", null) { IsPreviousButton = true }, new Menu.MenuItem("Return to Menu", new Func(() => true)) { IsStatic = true }, new Menu.MenuItem("Exit", new Func(Globals.Exit)) { IsStatic = true }, }); var mainMenu = new Menu() { Choices = list, SelectionForeground = ConsoleColor.Green }; mainMenu.Write(); return mainMenu.Load(); } [DllImport("wininet.dll", SetLastError = true)] public static extern bool InternetCheckConnection(string lpszUrl, int dwFlags, int dwReserved); [DllImport("wininet.dll", SetLastError=true)] private extern static bool InternetGetConnectedState(out int lpdwFlags, int dwReserved); public static bool IsInternetAvailable() { try { try { if (!InternetCheckConnection("http://archlinux.org", 1, 0)) { if (!InternetCheckConnection("http://google.com", 1, 0)) return false; } return true; } catch { var request = (HttpWebRequest)WebRequest.Create("http://google.com"); request.KeepAlive = false; request.Timeout = 5000; using (var response = (HttpWebResponse)request.GetResponse()) return true; } } catch { return false; } } } }