From 6af8eba6c632e03a6fb5ff31ccb1f1ab54f6e1e4 Mon Sep 17 00:00:00 2001 From: JFronny <33260128+JFronny@users.noreply.github.com> Date: Mon, 8 Feb 2021 19:00:46 +0100 Subject: [PATCH] Split UpToolLib into v1 (basically an interface over XElements with rudementary parsing) and v2 (more object-oriented, less hacky API, will allow easier migration to a more suited information backend) and start work on a new eto-based UI (not functional currently) --- .idea/.idea.UpTool2/.idea/riderModule.iml | 7 + Installer/InstallerForm.Designer.cs | 1 + Installer/InstallerForm.cs | 36 ++--- Installer/Program.cs | 16 +-- Installer/UTLibFunctions.cs | 10 +- InstallerCLI/Program.cs | 49 ++++--- InstallerCLI/UTLibFunctions.cs | 7 +- UpTool2.sln | 21 +++ UpTool2/MainForm.cs | 39 ++--- UpTool2/Program.cs | 44 +++--- UpTool2/SourcesForm.cs | 24 ++-- UpTool2/Task/IAppTask.cs | 7 - UpTool2/Task/UploadTask.cs | 49 ------- UpTool2/TaskPreview.cs | 6 +- UpToolCLI/CacheManagement.cs | 27 ++-- UpToolCLI/Other.cs | 41 +++--- UpToolCLI/PackageManagement.cs | 56 ++++---- UpToolCLI/Program.cs | 13 +- UpToolCLI/ReposManagement.cs | 17 +-- UpToolCLI/TableParser.cs | 4 +- UpToolCLI/UTLibFunctions.cs | 6 +- UpToolEto/UpToolEto.Gtk/Program.cs | 17 +++ UpToolEto/UpToolEto.Gtk/UpToolEto.Gtk.csproj | 16 +++ UpToolEto/UpToolEto.Wpf/Program.cs | 38 +++++ UpToolEto/UpToolEto.Wpf/UpToolEto.Wpf.csproj | 16 +++ UpToolEto/UpToolEto/Controls/AppList.cs | 43 ++++++ UpToolEto/UpToolEto/Controls/AppPanel.cs | 38 +++++ UpToolEto/UpToolEto/Controls/RepoItem.cs | 35 +++++ UpToolEto/UpToolEto/Controls/UTMenuBar.cs | 51 +++++++ UpToolEto/UpToolEto/Forms/DownloadDialog.cs | 52 +++++++ UpToolEto/UpToolEto/Forms/InitScreen.cs | 43 ++++++ UpToolEto/UpToolEto/Forms/MainForm.cs | 36 +++++ UpToolEto/UpToolEto/Forms/RepoForm.cs | 54 +++++++ UpToolEto/UpToolEto/Main.cs | 133 ++++++++++++++++++ UpToolEto/UpToolEto/UTLibFunctions.cs | 51 +++++++ UpToolEto/UpToolEto/UpToolEto.csproj | 15 ++ UpToolLib/{Resources => }/C_64.ico | Bin UpToolLib/DataStructures/Repo.cs | 8 ++ UpToolLib/ExternalFunctionalityManager.cs | 14 -- UpToolLib/GlobalVariables.cs | 18 --- UpToolLib/Lock.cs | 43 ------ UpToolLib/MutexLockLockedException.cs | 8 ++ UpToolLib/Tool/PathTool.cs | 25 ---- UpToolLib/UpToolLib.csproj | 7 + UpToolLib/UpToolLibMain.cs | 38 +++++ UpToolLib/UpdateCheck.cs | 32 ----- UpToolLib/{ => v1}/PlatformCheck.cs | 8 +- UpToolLib/{ => v1}/Tool/AppExtras.cs | 44 +++--- UpToolLib/{ => v1}/Tool/AppInstall.cs | 38 +++-- UpToolLib/v1/Tool/PathTool.cs | 25 ++++ UpToolLib/{ => v1}/Tool/XmlTool.cs | 30 ++-- UpToolLib/v1/UpToolLibV1.cs | 26 ++++ UpToolLib/{DataStructures => v2}/App.cs | 17 ++- UpToolLib/v2/AppFactory.cs | 18 +++ UpToolLib/{Tool => v2}/RepoManagement.cs | 111 ++++++++++----- UpToolLib/v2/TaskQueue/AppTask.cs | 13 ++ .../v2/TaskQueue}/InstallTask.cs | 16 +-- .../v2/TaskQueue/KnownAppTask.cs | 9 +- .../v2/TaskQueue}/RemoveTask.cs | 15 +- UpToolLib/v2/TaskQueue/TaskFactory.cs | 35 +++++ .../v2/TaskQueue}/UpdateTask.cs | 15 +- UpToolLib/v2/TaskQueue/UploadTask.cs | 56 ++++++++ UpToolLib/v2/UpToolLibV2.cs | 24 ++++ UpToolLib/v2/UpdateCheck.cs | 23 +++ UpToolLib/v2/UpdateChecker.cs | 13 ++ 65 files changed, 1353 insertions(+), 494 deletions(-) create mode 100644 .idea/.idea.UpTool2/.idea/riderModule.iml delete mode 100644 UpTool2/Task/IAppTask.cs delete mode 100644 UpTool2/Task/UploadTask.cs create mode 100644 UpToolEto/UpToolEto.Gtk/Program.cs create mode 100644 UpToolEto/UpToolEto.Gtk/UpToolEto.Gtk.csproj create mode 100644 UpToolEto/UpToolEto.Wpf/Program.cs create mode 100644 UpToolEto/UpToolEto.Wpf/UpToolEto.Wpf.csproj create mode 100644 UpToolEto/UpToolEto/Controls/AppList.cs create mode 100644 UpToolEto/UpToolEto/Controls/AppPanel.cs create mode 100644 UpToolEto/UpToolEto/Controls/RepoItem.cs create mode 100644 UpToolEto/UpToolEto/Controls/UTMenuBar.cs create mode 100644 UpToolEto/UpToolEto/Forms/DownloadDialog.cs create mode 100644 UpToolEto/UpToolEto/Forms/InitScreen.cs create mode 100644 UpToolEto/UpToolEto/Forms/MainForm.cs create mode 100644 UpToolEto/UpToolEto/Forms/RepoForm.cs create mode 100644 UpToolEto/UpToolEto/Main.cs create mode 100644 UpToolEto/UpToolEto/UTLibFunctions.cs create mode 100644 UpToolEto/UpToolEto/UpToolEto.csproj rename UpToolLib/{Resources => }/C_64.ico (100%) create mode 100644 UpToolLib/DataStructures/Repo.cs delete mode 100644 UpToolLib/ExternalFunctionalityManager.cs delete mode 100644 UpToolLib/GlobalVariables.cs delete mode 100644 UpToolLib/Lock.cs create mode 100644 UpToolLib/MutexLockLockedException.cs delete mode 100644 UpToolLib/Tool/PathTool.cs create mode 100644 UpToolLib/UpToolLibMain.cs delete mode 100644 UpToolLib/UpdateCheck.cs rename UpToolLib/{ => v1}/PlatformCheck.cs (58%) rename UpToolLib/{ => v1}/Tool/AppExtras.cs (72%) rename UpToolLib/{ => v1}/Tool/AppInstall.cs (85%) create mode 100644 UpToolLib/v1/Tool/PathTool.cs rename UpToolLib/{ => v1}/Tool/XmlTool.cs (75%) create mode 100644 UpToolLib/v1/UpToolLibV1.cs rename UpToolLib/{DataStructures => v2}/App.cs (84%) create mode 100644 UpToolLib/v2/AppFactory.cs rename UpToolLib/{Tool => v2}/RepoManagement.cs (64%) create mode 100644 UpToolLib/v2/TaskQueue/AppTask.cs rename {UpTool2/Task => UpToolLib/v2/TaskQueue}/InstallTask.cs (57%) rename UpTool2/Task/IKnownAppTask.cs => UpToolLib/v2/TaskQueue/KnownAppTask.cs (73%) rename {UpTool2/Task => UpToolLib/v2/TaskQueue}/RemoveTask.cs (53%) create mode 100644 UpToolLib/v2/TaskQueue/TaskFactory.cs rename {UpTool2/Task => UpToolLib/v2/TaskQueue}/UpdateTask.cs (53%) create mode 100644 UpToolLib/v2/TaskQueue/UploadTask.cs create mode 100644 UpToolLib/v2/UpToolLibV2.cs create mode 100644 UpToolLib/v2/UpdateCheck.cs create mode 100644 UpToolLib/v2/UpdateChecker.cs diff --git a/.idea/.idea.UpTool2/.idea/riderModule.iml b/.idea/.idea.UpTool2/.idea/riderModule.iml new file mode 100644 index 0000000..1a4e0d9 --- /dev/null +++ b/.idea/.idea.UpTool2/.idea/riderModule.iml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Installer/InstallerForm.Designer.cs b/Installer/InstallerForm.Designer.cs index 36f1b39..7db8765 100644 --- a/Installer/InstallerForm.Designer.cs +++ b/Installer/InstallerForm.Designer.cs @@ -17,6 +17,7 @@ { components.Dispose(); } + _lib.Dispose(); base.Dispose(disposing); } diff --git a/Installer/InstallerForm.cs b/Installer/InstallerForm.cs index 2a323d7..3899239 100644 --- a/Installer/InstallerForm.cs +++ b/Installer/InstallerForm.cs @@ -11,7 +11,8 @@ using System.Windows.Forms; using System.Xml.Linq; using Microsoft.Win32; using UpToolLib; -using UpToolLib.Tool; +using UpToolLib.v1.Tool; +using UpToolLib.v2; namespace Installer { @@ -20,16 +21,17 @@ namespace Installer private const string AppName = "UpTool2"; private readonly RegistryKey _rkApp; private string _log = ""; + private UpToolLibMain _lib; public InstallerForm() { - ExternalFunctionalityManager.Init(new UtLibFunctionsGui(Log)); + _lib = new UpToolLibMain(new UtLibFunctionsGui(Log)); InitializeComponent(); Step(0, "Initialized"); _log = _log.TrimStart(Environment.NewLine.ToCharArray()); _rkApp = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true); - pathBox.Checked = !File.Exists(PathTool.InfoXml) || - Path.Content.Contains(Path.GetName(PathTool.GetRelative("Install"))); + pathBox.Checked = !File.Exists(_lib.V1.PathTool.InfoXml) || + Path.Content.Contains(Path.GetName(_lib.V1.PathTool.GetRelative("Install"))); startupBox.Checked = pathBox.Checked && _rkApp.GetValue(AppName) != null; updateAppsBox.Checked = pathBox.Checked && startupBox.Checked && (string) _rkApp.GetValue(AppName) == "uptool dist-upgrade"; @@ -41,7 +43,7 @@ namespace Installer try { progress.Visible = true; - WebClient client = new WebClient(); + WebClient client = new(); Step(1, "Downloading metadata"); XElement meta = XDocument .Load("https://gitlab.com/JFronny/UpTool2/-/jobs/artifacts/master/raw/meta.xml?job=uptool") @@ -49,7 +51,7 @@ namespace Installer Step(2, "Downloading binary"); byte[] dl = client.DownloadData(meta.Element("File").Value); Step(3, "Verifying integrity"); - using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider()) + using (SHA256CryptoServiceProvider sha256 = new()) { string pkgHash = BitConverter.ToString(sha256.ComputeHash(dl)).Replace("-", string.Empty).ToUpper(); if (pkgHash != meta.Element("Hash").Value.ToUpper()) @@ -59,26 +61,26 @@ Package: {pkgHash} Online: {meta.Element("Hash").Value.ToUpper()}"); } Step(4, "Extracting"); - if (Directory.Exists(PathTool.GetRelative("Install"))) - Directory.Delete(PathTool.GetRelative("Install"), true); - Directory.CreateDirectory(PathTool.GetRelative("Install")); - using (MemoryStream ms = new MemoryStream(dl)) + if (Directory.Exists(_lib.V1.PathTool.GetRelative("Install"))) + Directory.Delete(_lib.V1.PathTool.GetRelative("Install"), true); + Directory.CreateDirectory(_lib.V1.PathTool.GetRelative("Install")); + using (MemoryStream ms = new(dl)) { - using ZipArchive ar = new ZipArchive(ms); - ar.ExtractToDirectory(PathTool.GetRelative("Install"), true); + using ZipArchive ar = new(ms); + ar.ExtractToDirectory(_lib.V1.PathTool.GetRelative("Install"), true); } Step(5, "Creating shortcut"); - Shortcut.Make(PathTool.GetRelative("Install", "UpTool2.exe"), + Shortcut.Make(_lib.V1.PathTool.GetRelative("Install", "UpTool2.exe"), System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Programs), "UpTool2.lnk")); Step(6, "Preparing Repos"); - XmlTool.FixXml(); - RepoManagement.FetchRepos(); + _lib.V1.XmlTool.FixXml(); + _lib.V2.RepoManagement.FetchRepos(); if (pathBox.Checked) { Step(7, startupBox.Checked ? "Creating PATH & Autostart entry" : "Creating PATH entry"); - if (!Path.Content.Contains(Path.GetName(PathTool.GetRelative("Install")))) - Path.Append(PathTool.GetRelative("Install")); + if (!Path.Content.Contains(Path.GetName(_lib.V1.PathTool.GetRelative("Install")))) + Path.Append(_lib.V1.PathTool.GetRelative("Install")); if (startupBox.Checked) _rkApp.SetValue(AppName, updateAppsBox.Checked ? "uptool dist-upgrade" : "uptool upgrade-self"); else if (_rkApp.GetValue(AppName) != null) diff --git a/Installer/Program.cs b/Installer/Program.cs index 7376ff7..95e68f3 100644 --- a/Installer/Program.cs +++ b/Installer/Program.cs @@ -12,18 +12,10 @@ namespace Installer [STAThread] private static void Main() { - try - { - MutexLock.Lock(); - Application.SetHighDpiMode(HighDpiMode.SystemAware); - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new InstallerForm()); - } - finally - { - MutexLock.Unlock(); - } + Application.SetHighDpiMode(HighDpiMode.SystemAware); + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new InstallerForm()); } } } \ No newline at end of file diff --git a/Installer/UTLibFunctions.cs b/Installer/UTLibFunctions.cs index bd6c439..f112a50 100644 --- a/Installer/UTLibFunctions.cs +++ b/Installer/UTLibFunctions.cs @@ -16,7 +16,7 @@ namespace Installer public Tuple Download(Uri link) { - using WebClient cli = new WebClient(); + using WebClient cli = new(); try { return new Tuple(true, cli.DownloadData(link)); @@ -29,10 +29,10 @@ namespace Installer public string FetchImageB64(Uri link) { - using WebClient client = new WebClient(); + using WebClient client = new(); Image src = Image.FromStream( client.OpenRead(link)); - Bitmap dest = new Bitmap(70, 70); + Bitmap dest = new(70, 70); dest.SetResolution(src.HorizontalResolution, src.VerticalResolution); using (Graphics g = Graphics.FromImage(dest)) { @@ -41,12 +41,12 @@ namespace Installer g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.SmoothingMode = SmoothingMode.HighQuality; g.PixelOffsetMode = PixelOffsetMode.HighQuality; - using ImageAttributes wrapMode = new ImageAttributes(); + using ImageAttributes wrapMode = new(); wrapMode.SetWrapMode(WrapMode.TileFlipXY); g.DrawImage(src, new Rectangle(0, 0, 70, 70), 0, 0, src.Width, src.Height, GraphicsUnit.Pixel, wrapMode); } - using MemoryStream ms = new MemoryStream(); + using MemoryStream ms = new(); dest.Save(ms, ImageFormat.Png); return Convert.ToBase64String(ms.ToArray()); } diff --git a/InstallerCLI/Program.cs b/InstallerCLI/Program.cs index b5116c7..972b6a2 100644 --- a/InstallerCLI/Program.cs +++ b/InstallerCLI/Program.cs @@ -7,24 +7,26 @@ using System.Net; using System.Security.Cryptography; using System.Threading; using UpToolLib; -using UpToolLib.Tool; +using UpToolLib.v1.Tool; +using UpToolLib.v2; namespace Installer { public static class Program { public static bool Basic; + private static UpToolLibMain _lib; public static int Main(string[] args) { Thread.Sleep(2000); - MutexLock.Lock(); try { Basic = args.Length > 0 && args[0].ToLower() == "--basic"; - ExternalFunctionalityManager.Init(new UtLibFunctions()); - RootCommand rootCommand = new RootCommand(); - rootCommand.AddGlobalOption(new Option("--basic", "Use only basic console functionality. Must be the first parameter in the call")); - Command install = new Command("install", "Install UpTool") + _lib = new UpToolLibMain(new UtLibFunctions()); + RootCommand rootCommand = new(); + rootCommand.AddGlobalOption(new Option("--basic", + "Use only basic console functionality. Must be the first parameter in the call")); + Command install = new("install", "Install UpTool") { new Option(new[] {"--noPrep", "-p"}, "Doesn't initialize repos. Use with caution!") }; @@ -41,45 +43,48 @@ namespace Installer } finally { - MutexLock.Unlock(); + _lib?.Dispose(); } } private static void Install(bool noPrep) { - WebClient client = new WebClient(); + WebClient client = new(); Console.WriteLine("Downloading metadata"); - UpdateCheck.Reload("https://gitlab.com/JFronny/UpTool2/-/jobs/artifacts/master/raw/meta.xml?job=uptool"); + UpdateCheck check = + _lib.V2.UpdateChecker.Check( + "https://gitlab.com/JFronny/UpTool2/-/jobs/artifacts/master/raw/meta.xml?job=uptool"); + PathTool pathTool = _lib.V1.PathTool; Console.WriteLine("Downloading binary"); - byte[] dl = client.DownloadData(UpdateCheck.App); + byte[] dl = client.DownloadData(check.App); Console.WriteLine("Verifying integrity"); - using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider()) + using (SHA256CryptoServiceProvider sha256 = new()) { string pkgHash = BitConverter.ToString(sha256.ComputeHash(dl)).Replace("-", string.Empty) .ToUpper(); - if (pkgHash != UpdateCheck.AppHash) + if (pkgHash != check.AppHash) throw new Exception($@"The hash is not equal to the one stored in the repo: Package: {pkgHash} -Online: {UpdateCheck.AppHash}"); +Online: {check.AppHash}"); } Console.WriteLine("Extracting"); - if (Directory.Exists(PathTool.GetRelative("Install"))) + if (Directory.Exists(pathTool.GetRelative("Install"))) { - foreach (string file in Directory.GetFiles(PathTool.GetRelative("Install"))) File.Delete(file); - foreach (string dir in Directory.GetDirectories(PathTool.GetRelative("Install"))) + foreach (string file in Directory.GetFiles(pathTool.GetRelative("Install"))) File.Delete(file); + foreach (string dir in Directory.GetDirectories(pathTool.GetRelative("Install"))) if (Path.GetFileName(dir) != "tmp") Directory.Delete(dir, true); } - Directory.CreateDirectory(PathTool.GetRelative("Install")); - using (MemoryStream ms = new MemoryStream(dl)) + Directory.CreateDirectory(pathTool.GetRelative("Install")); + using (MemoryStream ms = new(dl)) { - using ZipArchive ar = new ZipArchive(ms); - ar.ExtractToDirectory(PathTool.GetRelative("Install"), true); + using ZipArchive ar = new(ms); + ar.ExtractToDirectory(pathTool.GetRelative("Install"), true); } if (noPrep) return; Console.WriteLine("Preparing Repos"); - XmlTool.FixXml(); - RepoManagement.FetchRepos(); + _lib.V1.XmlTool.FixXml(); + _lib.V2.RepoManagement.FetchRepos(); } } } \ No newline at end of file diff --git a/InstallerCLI/UTLibFunctions.cs b/InstallerCLI/UTLibFunctions.cs index 9691937..83a5b93 100644 --- a/InstallerCLI/UTLibFunctions.cs +++ b/InstallerCLI/UTLibFunctions.cs @@ -13,7 +13,7 @@ namespace Installer { public Tuple Download(Uri link) { - using WebClient client = new WebClient(); + using WebClient client = new(); byte[] result = new byte[0]; bool finished = false; bool success = true; @@ -41,10 +41,9 @@ namespace Installer public string FetchImageB64(Uri link) { - using WebClient client = new WebClient(); + using WebClient client = new(); using Image image = Image.Load(client.OpenRead(link)); - image.Mutate(x => x.Resize(70, 70)); - using MemoryStream ms = new MemoryStream(); + using MemoryStream ms = new(); image.SaveAsPng(ms); return Convert.ToBase64String(ms.ToArray()); } diff --git a/UpTool2.sln b/UpTool2.sln index b2991d7..b479d40 100644 --- a/UpTool2.sln +++ b/UpTool2.sln @@ -29,6 +29,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{0E7784 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InstallerCLI", "InstallerCLI\InstallerCLI.csproj", "{493B2CC5-29E9-4F10-A2F5-E10B9584D667}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UpToolEto", "UpToolEto\UpToolEto\UpToolEto.csproj", "{213FF69B-426E-475F-8A77-0A20EA4257C2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UpToolEto.Gtk", "UpToolEto\UpToolEto.Gtk\UpToolEto.Gtk.csproj", "{8A544AEA-3081-45C9-BED2-7E424EB287B1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UpToolEto.Wpf", "UpToolEto\UpToolEto.Wpf\UpToolEto.Wpf.csproj", "{C89EC79F-CC2B-4B8E-B4CB-D4DFD30A58AB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -59,6 +65,18 @@ Global {493B2CC5-29E9-4F10-A2F5-E10B9584D667}.Debug|Any CPU.Build.0 = Debug|Any CPU {493B2CC5-29E9-4F10-A2F5-E10B9584D667}.Release|Any CPU.ActiveCfg = Release|Any CPU {493B2CC5-29E9-4F10-A2F5-E10B9584D667}.Release|Any CPU.Build.0 = Release|Any CPU + {213FF69B-426E-475F-8A77-0A20EA4257C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {213FF69B-426E-475F-8A77-0A20EA4257C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {213FF69B-426E-475F-8A77-0A20EA4257C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {213FF69B-426E-475F-8A77-0A20EA4257C2}.Release|Any CPU.Build.0 = Release|Any CPU + {8A544AEA-3081-45C9-BED2-7E424EB287B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A544AEA-3081-45C9-BED2-7E424EB287B1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A544AEA-3081-45C9-BED2-7E424EB287B1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A544AEA-3081-45C9-BED2-7E424EB287B1}.Release|Any CPU.Build.0 = Release|Any CPU + {C89EC79F-CC2B-4B8E-B4CB-D4DFD30A58AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C89EC79F-CC2B-4B8E-B4CB-D4DFD30A58AB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C89EC79F-CC2B-4B8E-B4CB-D4DFD30A58AB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C89EC79F-CC2B-4B8E-B4CB-D4DFD30A58AB}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -73,5 +91,8 @@ Global {3EC369B9-D927-4A53-BE1A-7E7006081BCE} = {3CFAB991-C12A-4B51-BC91-6965133DAF53} {1D273392-3796-4BE9-A67F-BB402315D52D} = {EA919DFD-766B-423C-99DF-C99356592842} {493B2CC5-29E9-4F10-A2F5-E10B9584D667} = {3CFAB991-C12A-4B51-BC91-6965133DAF53} + {213FF69B-426E-475F-8A77-0A20EA4257C2} = {EA919DFD-766B-423C-99DF-C99356592842} + {8A544AEA-3081-45C9-BED2-7E424EB287B1} = {EA919DFD-766B-423C-99DF-C99356592842} + {C89EC79F-CC2B-4B8E-B4CB-D4DFD30A58AB} = {EA919DFD-766B-423C-99DF-C99356592842} EndGlobalSection EndGlobal diff --git a/UpTool2/MainForm.cs b/UpTool2/MainForm.cs index 496e0cb..6cf726d 100644 --- a/UpTool2/MainForm.cs +++ b/UpTool2/MainForm.cs @@ -6,30 +6,31 @@ using System.Linq; using System.Reflection; using System.Threading; using System.Windows.Forms; -using UpTool2.Task; using UpToolLib; using UpToolLib.DataStructures; -using UpToolLib.Tool; using System.Diagnostics; +using UpToolLib.v1.Tool; +using UpToolLib.v2; +using UpToolLib.v2.TaskQueue; namespace UpTool2 { public sealed partial class MainForm : Form { private readonly HelpEventHandler _help; - private List _tasks; + private List _tasks; public MainForm() { InitializeComponent(); - _tasks = new List(); + _tasks = new List(); _help = MainForm_HelpRequested; HelpRequested += _help; filterBox.DataSource = Enum.GetValues(typeof(Status)); if (Program.Online) { Program.SetSplash(8, "Fetching repositories"); - RepoManagement.FetchRepos(); + Program.Lib.V2.RepoManagement.FetchRepos(); } else { @@ -40,8 +41,8 @@ namespace UpTool2 } Program.SetSplash(9, "Reloading data"); ReloadElements(); - if (!Directory.Exists(PathTool.AppsPath)) - Directory.CreateDirectory(PathTool.AppsPath); + if (!Directory.Exists(Program.Lib.V1.PathTool.AppsPath)) + Directory.CreateDirectory(Program.Lib.V1.PathTool.AppsPath); } private void Action_install_Click(object sender, EventArgs e) @@ -54,7 +55,7 @@ namespace UpTool2 } else { - _tasks.Add(new InstallTask(tmp, ReloadElements)); + _tasks.Add(Program.Lib.V2.TaskFactory.CreateInstall(tmp, ReloadElements)); action_install.BackColor = Color.Green; } UpdateChangesLabel(); @@ -70,7 +71,7 @@ namespace UpTool2 } else { - _tasks.Add(new RemoveTask(tmp, ReloadElements)); + _tasks.Add(Program.Lib.V2.TaskFactory.CreateRemove(tmp, ReloadElements)); action_remove.BackColor = Color.Green; } UpdateChangesLabel(); @@ -81,7 +82,7 @@ namespace UpTool2 if (searchPackageDialog.ShowDialog() != DialogResult.OK) return; if (!_tasks.Any(s => s is UploadTask t && t.ZipFile == searchPackageDialog.FileName)) - _tasks.Add(new UploadTask(searchPackageDialog.FileName, AppNameDialog.Show(), ReloadElements)); + _tasks.Add(Program.Lib.V2.TaskFactory.CreateUpload(searchPackageDialog.FileName, AppNameDialog.Show(), ReloadElements)); UpdateChangesLabel(); } @@ -95,7 +96,7 @@ namespace UpTool2 } else { - _tasks.Add(new UpdateTask(tmp, ReloadElements)); + _tasks.Add(Program.Lib.V2.TaskFactory.CreateUpdate(tmp, ReloadElements)); action_update.BackColor = Color.Green; } UpdateChangesLabel(); @@ -110,7 +111,7 @@ namespace UpTool2 infoPanel_Description.Invalidate(); int f = sidebarPanel.Controls.Count; for (int i = 0; i < f; i++) sidebarPanel.Controls[0].Dispose(); - GlobalVariables.Apps.Clear(); + Program.Lib.V1.Apps.Clear(); //add toolTip.SetToolTip(controls_settings, "Settings"); toolTip.SetToolTip(controls_reload, "Refresh repositories"); @@ -120,9 +121,9 @@ namespace UpTool2 toolTip.SetToolTip(action_remove, "Remove"); toolTip.SetToolTip(action_update, "Update"); toolTip.SetToolTip(action_run, "Run"); - RepoManagement.GetReposFromDisk(); + Program.Lib.V2.RepoManagement.GetReposFromDisk(); int availableUpdates = 0; - foreach (App app in GlobalVariables.Apps.Values) + foreach (App app in Program.Lib.V1.Apps.Values) { Panel sidebarIcon = new Panel { @@ -180,7 +181,7 @@ namespace UpTool2 { try { - AppExtras.RunApp((App) action_run.Tag); + Program.Lib.V1.AppExtras.RunApp((App) action_run.Tag); } catch (Exception e1) { @@ -195,7 +196,7 @@ namespace UpTool2 { new Thread(() => { - RepoManagement.FetchRepos(); + Program.Lib.V2.RepoManagement.FetchRepos(); Invoke((Action) (() => { ReloadElements(); @@ -229,7 +230,7 @@ namespace UpTool2 string tmpFile = Path.GetTempFileName(); File.WriteAllText(tmpFile, string.Join("\r\n\r\n", - GlobalVariables.Apps.Values.Select(app => app.ToString()).Concat(new[] + Program.Lib.V1.Apps.Values.Select(app => app.ToString()).Concat(new[] { $"Assembly version: {Assembly.GetExecutingAssembly().GetName().Version}" }).ToArray())); @@ -241,7 +242,7 @@ namespace UpTool2 } else { - App[] apps = AppExtras.FindApps(searchBox.Text); + App[] apps = Program.Lib.V1.AppExtras.FindApps(searchBox.Text); Enum.TryParse(filterBox.SelectedValue.ToString(), out Status status); for (int i = 0; i < sidebarPanel.Controls.Count; i++) { @@ -315,7 +316,7 @@ Build Date: {buildTime:dd.MM.yyyy}", "UpTool2"); { progressBar1.Maximum = _tasks.Count; progressBar1.Value = 0; - foreach (IAppTask task in _tasks) + foreach (AppTask task in _tasks) { task.Run(); progressBar1.PerformStep(); diff --git a/UpTool2/Program.cs b/UpTool2/Program.cs index 6f5de18..114c77d 100644 --- a/UpTool2/Program.cs +++ b/UpTool2/Program.cs @@ -9,7 +9,8 @@ using System.Windows.Forms; using System.Xml; using UpTool2.Tool; using UpToolLib; -using UpToolLib.Tool; +using UpToolLib.v1.Tool; +using UpToolLib.v2; namespace UpTool2 { @@ -19,6 +20,7 @@ namespace UpTool2 private static int _splashProgress; private static string? _splashMessage; public static bool Online; + public static UpToolLibMain Lib; [STAThread] private static void Main(string[] args) @@ -29,7 +31,7 @@ namespace UpTool2 Splash.Show(); try { - MutexLock.Lock(); + Lib = new UpToolLibMain(new UtLibFunctions()); } catch (MutexLockLockedException) { @@ -43,23 +45,22 @@ namespace UpTool2 try { #endif - ExternalFunctionalityManager.Init(new UtLibFunctions()); SetSplash(1, "Initializing paths"); - if (!Directory.Exists(PathTool.Dir)) - Directory.CreateDirectory(PathTool.Dir); + if (!Directory.Exists(Lib.V1.PathTool.Dir)) + Directory.CreateDirectory(Lib.V1.PathTool.Dir); FixXml(); SetSplash(2, "Performing checks"); try { - UpToolLib.UpdateCheck.Reload(); + Lib.V2.UpdateChecker.Check(); Online = true; } catch { Online = false; } - if (!Directory.Exists(PathTool.GetRelative("Apps"))) - Directory.CreateDirectory(PathTool.GetRelative("Apps")); + if (!Directory.Exists(Lib.V1.PathTool.GetRelative("Apps"))) + Directory.CreateDirectory(Lib.V1.PathTool.GetRelative("Apps")); if (!Online) SetSplash(7, "Opening"); if (!Online || UpdateCheck()) @@ -80,7 +81,7 @@ namespace UpTool2 } finally { - MutexLock.Unlock(); + Lib.Dispose(); } #endif } @@ -157,28 +158,29 @@ namespace UpTool2 { try { - XmlTool.FixXml(); + Lib.V1.XmlTool.FixXml(); } catch (XmlException) { if (throwOnError) throw; MessageBox.Show("Something went wrong while trying to parse XML. Retrying..."); - File.Delete(PathTool.InfoXml); + File.Delete(Lib.V1.PathTool.InfoXml); FixXml(); } } private static bool UpdateCheck() { + UpdateCheck check = Lib.V2.UpdateChecker.Check(); SetSplash(3, "Comparing online version"); - if (Assembly.GetExecutingAssembly().GetName().Version >= UpToolLib.UpdateCheck.OnlineVersion) + if (Assembly.GetExecutingAssembly().GetName().Version >= check.OnlineVersion) { SetSplash(7, "Opening"); return true; } byte[] dl; SetSplash(4, "Downloading latest"); - using (DownloadDialog dlg = new DownloadDialog(UpToolLib.UpdateCheck.Installer.AbsoluteUri)) + using (DownloadDialog dlg = new DownloadDialog(check.Installer.AbsoluteUri)) { if (dlg.ShowDialog() != DialogResult.OK) throw new Exception("Failed to update"); @@ -188,27 +190,27 @@ namespace UpTool2 using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider()) { string pkgHash = BitConverter.ToString(sha256.ComputeHash(dl)).Replace("-", string.Empty).ToUpper(); - if (pkgHash != UpToolLib.UpdateCheck.InstallerHash) + if (pkgHash != check.InstallerHash) throw new Exception( - $"The hash is not equal to the one stored in the repo:\r\nPackage: {pkgHash}\r\nOnline: {UpToolLib.UpdateCheck.InstallerHash}"); + $"The hash is not equal to the one stored in the repo:\r\nPackage: {pkgHash}\r\nOnline: {check.InstallerHash}"); } SetSplash(9, "Installing"); - if (Directory.Exists(PathTool.GetRelative("Install", "tmp"))) - Directory.Delete(PathTool.GetRelative("Install", "tmp"), true); - Directory.CreateDirectory(PathTool.GetRelative("Install", "tmp")); + if (Directory.Exists(Lib.V1.PathTool.GetRelative("Install", "tmp"))) + Directory.Delete(Lib.V1.PathTool.GetRelative("Install", "tmp"), true); + Directory.CreateDirectory(Lib.V1.PathTool.GetRelative("Install", "tmp")); using (MemoryStream ms = new MemoryStream(dl)) { using ZipArchive ar = new ZipArchive(ms); - ar.ExtractToDirectory(PathTool.GetRelative("Install", "tmp"), true); + ar.ExtractToDirectory(Lib.V1.PathTool.GetRelative("Install", "tmp"), true); } Splash.Hide(); Process.Start(new ProcessStartInfo { - FileName = PathTool.GetRelative("Install", "tmp", "Installer.exe"), + FileName = Lib.V1.PathTool.GetRelative("Install", "tmp", "Installer.exe"), Arguments = "i -p", CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, - WorkingDirectory = PathTool.GetRelative("Install") + WorkingDirectory = Lib.V1.PathTool.GetRelative("Install") }); SetSplash(7, "Installing"); return false; diff --git a/UpTool2/SourcesForm.cs b/UpTool2/SourcesForm.cs index bcc7dcc..db5d646 100644 --- a/UpTool2/SourcesForm.cs +++ b/UpTool2/SourcesForm.cs @@ -1,35 +1,27 @@ -using System.Windows.Forms; -using System.Xml.Linq; -using UpToolLib.Tool; +using System.Collections.Generic; +using System.Windows.Forms; +using UpToolLib.DataStructures; namespace UpTool2 { public partial class SettingsForms : Form { - private readonly XDocument _doc; - private readonly XElement _repos; - + private readonly List _repos = new List(); public SettingsForms() { InitializeComponent(); Program.FixXml(); - _doc = XDocument.Load(PathTool.InfoXml); - _repos = _doc.Element("meta").Element("Repos"); + _repos.AddRange(Program.Lib.V2.RepoManagement.GetRepos()); sourceGrid.Columns.Clear(); sourceGrid.Columns.Add("name", "Name"); sourceGrid.Columns.Add("link", "Link"); - foreach (XElement repo in _repos.Elements("Repo")) - sourceGrid.Rows.Add(repo.Element("Name").Value, repo.Element("Link").Value); + foreach (Repo repo in _repos) + sourceGrid.Rows.Add(repo.Name, repo.Url); } private void SettingsForms_FormClosing(object sender, FormClosingEventArgs e) { - _repos.RemoveNodes(); - for (int y = 0; y < sourceGrid.Rows.Count; y++) - if (y + 1 < sourceGrid.Rows.Count) - _repos.Add(new XElement("Repo", new XElement("Name", (string) sourceGrid.Rows[y].Cells[0].Value), - new XElement("Link", (string) sourceGrid.Rows[y].Cells[1].Value))); - _doc.Save(PathTool.InfoXml); + Program.Lib.V2.RepoManagement.Save(_repos); } } } \ No newline at end of file diff --git a/UpTool2/Task/IAppTask.cs b/UpTool2/Task/IAppTask.cs deleted file mode 100644 index 4c947d4..0000000 --- a/UpTool2/Task/IAppTask.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace UpTool2.Task -{ - internal interface IAppTask - { - public void Run(); - } -} \ No newline at end of file diff --git a/UpTool2/Task/UploadTask.cs b/UpTool2/Task/UploadTask.cs deleted file mode 100644 index 8323928..0000000 --- a/UpTool2/Task/UploadTask.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Drawing; -using System.IO; -using System.Windows.Forms; -using UpTool2.Properties; -using UpToolLib; -using UpToolLib.DataStructures; -using UpToolLib.Tool; - -namespace UpTool2.Task -{ - internal class UploadTask : IAppTask - { - private readonly string _name; - private readonly Action? _postInstall; - public readonly string ZipFile; - - public UploadTask(string zipFile, string name, Action? postInstall = null) - { - ZipFile = zipFile; - _name = name; - _postInstall = postInstall; - } - - public void Run() - { -#if !DEBUG - try - { -#endif - Guid id = Guid.NewGuid(); - while (GlobalVariables.Apps.ContainsKey(id) || Directory.Exists(PathTool.GetAppPath(id))) - id = Guid.NewGuid(); - App appI = new App(_name, "Locally installed package, removal only", - GlobalVariables.MinimumVer, "", true, "", id, Color.Red, Resources.C_64.ToBitmap(), false, ""); - AppInstall.InstallZip(ZipFile, appI, true); - _postInstall?.Invoke(); -#if !DEBUG - } - catch (Exception e1) - { - MessageBox.Show(e1.ToString(), "Install failed"); - } -#endif - } - - public override string ToString() => $"Install local {Path.GetFileName(ZipFile)}"; - } -} \ No newline at end of file diff --git a/UpTool2/TaskPreview.cs b/UpTool2/TaskPreview.cs index 5f36faf..43cd120 100644 --- a/UpTool2/TaskPreview.cs +++ b/UpTool2/TaskPreview.cs @@ -2,13 +2,13 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; -using UpTool2.Task; +using UpToolLib.v2.TaskQueue; namespace UpTool2 { internal static class TaskPreview { - public static bool Show(ref List tasks, bool showOk) + public static bool Show(ref List tasks, bool showOk) { bool ok = false; using Form tmp = new Form {Size = new Size(600, 300), MinimumSize = new Size(300, showOk ? 138 : 133)}; @@ -25,7 +25,7 @@ namespace UpTool2 }; if (showOk) tmp.Controls.Add(okButton); tmp.ShowDialog(); - tasks = list.Items.OfType().Where((s, i) => list.GetItemChecked(i)).ToList(); + tasks = list.Items.OfType().Where((s, i) => list.GetItemChecked(i)).ToList(); return !showOk || ok; } } diff --git a/UpToolCLI/CacheManagement.cs b/UpToolCLI/CacheManagement.cs index f4d6629..979715a 100644 --- a/UpToolCLI/CacheManagement.cs +++ b/UpToolCLI/CacheManagement.cs @@ -6,7 +6,8 @@ using System.Linq; using System.Reflection; using UpToolLib; using UpToolLib.DataStructures; -using UpToolLib.Tool; +using UpToolLib.v1.Tool; +using UpToolLib.v2; namespace UpToolCLI { @@ -19,14 +20,14 @@ namespace UpToolCLI Handler = CommandHandler.Create(List) }); - Command search = new Command("search", "Search for packages") + Command search = new("search", "Search for packages") { new Argument("identifier", "Something to identify the app") }; search.Handler = CommandHandler.Create(Search); rootCommand.AddCommand(search); - Command show = new Command("show", "Shows package info") + Command show = new("show", "Shows package info") { new Argument("identifier", "Something to identify the app") }; @@ -41,8 +42,8 @@ namespace UpToolCLI private static void List() { - RepoManagement.GetReposFromDisk(); - Console.WriteLine(GlobalVariables.Apps.Where(s => (s.Value.Status & Status.Installed) == Status.Installed) + Program.Lib.V2.RepoManagement.GetReposFromDisk(); + Console.WriteLine(Program.Lib.V1.Apps.Where(s => (s.Value.Status & Status.Installed) == Status.Installed) .ToStringTable(new[] { "Name", "State", "Guid" @@ -55,8 +56,8 @@ namespace UpToolCLI private static void Search(string identifier) { - RepoManagement.GetReposFromDisk(); - App[] apps = AppExtras.FindApps(identifier); + Program.Lib.V2.RepoManagement.GetReposFromDisk(); + App[] apps = Program.Lib.V1.AppExtras.FindApps(identifier); Console.WriteLine($"Found {apps.Length} app(s)"); if (apps.Length > 0) Console.WriteLine(apps.ToStringTable(new[] @@ -69,8 +70,8 @@ namespace UpToolCLI private static void Show(string identifier) { - RepoManagement.GetReposFromDisk(); - App[] apps = AppExtras.FindApps(identifier); + Program.Lib.V2.RepoManagement.GetReposFromDisk(); + App[] apps = Program.Lib.V1.AppExtras.FindApps(identifier); if (apps.Length == 0) Console.WriteLine("Package not found."); else @@ -80,10 +81,10 @@ namespace UpToolCLI private static void Update() { Console.WriteLine("Fetching Repos..."); - RepoManagement.FetchRepos(); - RepoManagement.GetReposFromDisk(); + Program.Lib.V2.RepoManagement.FetchRepos(); + Program.Lib.V2.RepoManagement.GetReposFromDisk(); Console.WriteLine(); - IEnumerable tmp = GlobalVariables.Apps.Where(s => + IEnumerable tmp = Program.Lib.V1.Apps.Where(s => (s.Value.Status & Status.Updatable) == Status.Updatable).Select(s => s.Value); IEnumerable apps = tmp as App[] ?? tmp.ToArray(); int updatableCount = apps.Count(); @@ -92,7 +93,7 @@ namespace UpToolCLI : $@"Found {updatableCount} Updates: {string.Join(Environment.NewLine, apps.Select(s => $"- {s.Name} ({s.Version})"))}"); Version vLocal = Assembly.GetExecutingAssembly().GetName().Version; - Version vOnline = UpdateCheck.OnlineVersion; + Version vOnline = Program.Lib.V2.UpdateChecker.Check().OnlineVersion; if (vLocal < vOnline) Console.WriteLine($"uptool is outdated ({vLocal} vs {vOnline}), update using \"uptool upgrade-self\""); } diff --git a/UpToolCLI/Other.cs b/UpToolCLI/Other.cs index 0d446e6..39de9c5 100644 --- a/UpToolCLI/Other.cs +++ b/UpToolCLI/Other.cs @@ -9,7 +9,8 @@ using System.Reflection; using System.Security.Cryptography; using UpToolLib; using UpToolLib.DataStructures; -using UpToolLib.Tool; +using UpToolLib.v1.Tool; +using UpToolLib.v2; using Process = System.Diagnostics.Process; namespace UpToolCLI @@ -18,14 +19,14 @@ namespace UpToolCLI { public static void RegisterCommands(RootCommand rootCommand) { - Command command = new Command("upgrade-self", "Upgrades UpToolCLI") + Command command = new("upgrade-self", "Upgrades UpToolCLI") { new Option(new[] {"--force", "-f"}, "Overwrites older files") }; command.Handler = CommandHandler.Create(UpgradeSelf); rootCommand.AddCommand(command); - Command start = new Command("start", "Starts an app") + Command start = new("start", "Starts an app") { new Argument("identifier", "Something to identify the app"), new Option(new[] {"--arguments", "--args", "-a"}, () => "", "The arguments to run the file with"), @@ -38,39 +39,41 @@ namespace UpToolCLI public static void UpgradeSelf(bool force) { - if (!force && Assembly.GetExecutingAssembly().GetName().Version >= UpdateCheck.OnlineVersion) + PathTool pathTool = Program.Lib.V1.PathTool; + UpdateCheck updateCheck = Program.Lib.V2.UpdateChecker.Check(); + if (!force && Assembly.GetExecutingAssembly().GetName().Version >= updateCheck.OnlineVersion) Console.WriteLine("Already up-to-date"); else { Console.WriteLine("Downloading latest"); - (bool success, byte[] dl) = Program.Functions.Download(UpdateCheck.Installer); + (bool success, byte[] dl) = Program.Functions.Download(updateCheck.Installer); if (!success) throw new Exception("Failed to update"); Console.WriteLine("Verifying"); - using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider()) + using (SHA256CryptoServiceProvider sha256 = new()) { string pkgHash = BitConverter.ToString(sha256.ComputeHash(dl)).Replace("-", string.Empty).ToUpper(); - if (pkgHash != UpdateCheck.InstallerHash) + if (pkgHash != updateCheck.InstallerHash) throw new Exception($@"The hash is not equal to the one stored in the repo: Package: {pkgHash} -Online: {UpdateCheck.InstallerHash}"); +Online: {updateCheck.InstallerHash}"); } Console.WriteLine("Installing"); - if (Directory.Exists(PathTool.GetRelative("Install", "tmp"))) - Directory.Delete(PathTool.GetRelative("Install", "tmp"), true); - Directory.CreateDirectory(PathTool.GetRelative("Install", "tmp")); - using (MemoryStream ms = new MemoryStream(dl)) + if (Directory.Exists(pathTool.GetRelative("Install", "tmp"))) + Directory.Delete(pathTool.GetRelative("Install", "tmp"), true); + Directory.CreateDirectory(pathTool.GetRelative("Install", "tmp")); + using (MemoryStream ms = new(dl)) { - using ZipArchive ar = new ZipArchive(ms); - ar.ExtractToDirectory(PathTool.GetRelative("Install", "tmp"), true); + using ZipArchive ar = new(ms); + ar.ExtractToDirectory(pathTool.GetRelative("Install", "tmp"), true); } - string file = PathTool.GetRelative("Install", "tmp", "Installer.exe"); + string file = pathTool.GetRelative("Install", "tmp", "Installer.exe"); Console.WriteLine($"Starting {file}"); Process.Start(new ProcessStartInfo { FileName = file, Arguments = "i", - WorkingDirectory = PathTool.GetRelative("Install"), + WorkingDirectory = pathTool.GetRelative("Install"), UseShellExecute = false }); } @@ -78,8 +81,8 @@ Online: {UpdateCheck.InstallerHash}"); private static void Start(string identifier, string arguments, string file, bool waitForExit) { - RepoManagement.GetReposFromDisk(); - App[] apps = AppExtras.FindApps(identifier); + Program.Lib.V2.RepoManagement.GetReposFromDisk(); + App[] apps = Program.Lib.V1.AppExtras.FindApps(identifier); if (apps.Length == 0) Console.WriteLine("Package not found."); else @@ -88,7 +91,7 @@ Online: {UpdateCheck.InstallerHash}"); if (tmp.Runnable) { Console.WriteLine($"Starting {tmp.Name}"); - Process tmp1 = AppExtras.RunApp(tmp, file ?? tmp.MainFile, arguments); + Process tmp1 = Program.Lib.V1.AppExtras.RunApp(tmp, file ?? tmp.MainFile, arguments); if (waitForExit) tmp1.WaitForExit(); } diff --git a/UpToolCLI/PackageManagement.cs b/UpToolCLI/PackageManagement.cs index 7c9b926..bff796a 100644 --- a/UpToolCLI/PackageManagement.cs +++ b/UpToolCLI/PackageManagement.cs @@ -8,7 +8,9 @@ using System.Linq; using System.Reflection; using UpToolLib; using UpToolLib.DataStructures; -using UpToolLib.Tool; +using UpToolLib.v1; +using UpToolLib.v1.Tool; +using UpToolLib.v2; namespace UpToolCLI { @@ -16,7 +18,7 @@ namespace UpToolCLI { public static void RegisterCommands(RootCommand rootCommand) { - Command install = new Command("install", "Install a package") + Command install = new("install", "Install a package") { new Argument("identifier", "Something to identify the app or the file name"), new Option(new[] {"--force", "-f"}, "Overwrites older files") @@ -24,7 +26,7 @@ namespace UpToolCLI install.Handler = CommandHandler.Create(Install); rootCommand.AddCommand(install); - Command upgrade = new Command("upgrade", "Upgrade a package") + Command upgrade = new("upgrade", "Upgrade a package") { new Argument("identifier", "Something to identify the app"), new Option(new[] {"--force", "-f"}, "Overwrites older files") @@ -32,7 +34,7 @@ namespace UpToolCLI upgrade.Handler = CommandHandler.Create(Upgrade); rootCommand.AddCommand(upgrade); - Command reinstall = new Command("reinstall", "Reinstall a package") + Command reinstall = new("reinstall", "Reinstall a package") { new Argument("identifier", "Something to identify the app"), new Option(new[] {"--force", "-f"}, "Overwrites older files") @@ -40,14 +42,14 @@ namespace UpToolCLI reinstall.Handler = CommandHandler.Create(Reinstall); rootCommand.AddCommand(reinstall); - Command remove = new Command("remove", "Remove a package") + Command remove = new("remove", "Remove a package") { new Argument("identifier", "Something to identify the app") }; remove.Handler = CommandHandler.Create(Remove); rootCommand.AddCommand(remove); - Command purge = new Command("purge", "Completely remove a package") + Command purge = new("purge", "Completely remove a package") { new Argument("identifier", "Something to identify the app") }; @@ -62,16 +64,16 @@ namespace UpToolCLI private static void Install(string identifier, bool force) { - RepoManagement.GetReposFromDisk(); - App[] apps = AppExtras.FindApps(identifier); + Program.Lib.V2.RepoManagement.GetReposFromDisk(); + App[] apps = Program.Lib.V1.AppExtras.FindApps(identifier); if (apps.Length == 0) { if (File.Exists(identifier)) { Console.WriteLine("Name:"); string name = Console.ReadLine(); - AppInstall.InstallZip(identifier, new App(name, "Locally installed package, removal only", - GlobalVariables.MinimumVer, "", true, "", + Program.Lib.V1.Installer.InstallZip(identifier, Program.Lib.V2.AppFactory.CreateApp(name, "Locally installed package, removal only", + UpToolLibV1.MinimumVer, "", true, "", Guid.NewGuid(), Color.Red, "", false, ""), force); Console.WriteLine($"Successfully installed \"{name}\""); } @@ -89,7 +91,7 @@ namespace UpToolCLI else { Console.WriteLine($"Installing {tmp.Name}"); - AppInstall.Install(tmp, true); + Program.Lib.V1.Installer.Install(tmp, true); } } Console.WriteLine("Done!"); @@ -97,8 +99,8 @@ namespace UpToolCLI private static void Upgrade(string identifier, bool force) { - RepoManagement.GetReposFromDisk(); - App[] apps = AppExtras.FindApps(identifier); + Program.Lib.V2.RepoManagement.GetReposFromDisk(); + App[] apps = Program.Lib.V1.AppExtras.FindApps(identifier); if (apps.Length == 0) Console.WriteLine("Package not found."); else @@ -107,7 +109,7 @@ namespace UpToolCLI if ((tmp.Status & Status.Updatable) == Status.Updatable) { Console.WriteLine($"Upgrading {tmp.Name}"); - AppExtras.Update(tmp, force); + Program.Lib.V1.AppExtras.Update(tmp, force); } else Console.WriteLine("Package is up-to-date"); @@ -117,23 +119,23 @@ namespace UpToolCLI private static void Reinstall(string identifier, bool force) { - RepoManagement.GetReposFromDisk(); - App[] apps = AppExtras.FindApps(identifier); + Program.Lib.V2.RepoManagement.GetReposFromDisk(); + App[] apps = Program.Lib.V1.AppExtras.FindApps(identifier); if (apps.Length == 0) Console.WriteLine("Package not found."); else { App tmp = apps.First(); Console.WriteLine($"Reinstalling {tmp.Name}"); - AppExtras.Update(tmp, force); + Program.Lib.V1.AppExtras.Update(tmp, force); } Console.WriteLine("Done!"); } private static void Remove(string identifier) { - RepoManagement.GetReposFromDisk(); - App[] apps = AppExtras.FindApps(identifier); + Program.Lib.V2.RepoManagement.GetReposFromDisk(); + App[] apps = Program.Lib.V1.AppExtras.FindApps(identifier); if (apps.Length == 0) Console.WriteLine("Package not found."); else @@ -142,7 +144,7 @@ namespace UpToolCLI if ((tmp.Status & Status.Installed) == Status.Installed) { Console.WriteLine($"Removing {tmp.Name}"); - AppExtras.Remove(tmp, false); + Program.Lib.V1.AppExtras.Remove(tmp, false); } else Console.WriteLine("Package is not installed"); @@ -152,8 +154,8 @@ namespace UpToolCLI private static void Purge(string identifier) { - RepoManagement.GetReposFromDisk(); - App[] apps = AppExtras.FindApps(identifier); + Program.Lib.V2.RepoManagement.GetReposFromDisk(); + App[] apps = Program.Lib.V1.AppExtras.FindApps(identifier); if (apps.Length == 0) Console.WriteLine("Package not found."); else @@ -162,7 +164,7 @@ namespace UpToolCLI if ((tmp.Status & Status.Installed) == Status.Installed) { Console.WriteLine($"Purging {tmp.Name}"); - AppExtras.Remove(tmp, true); + Program.Lib.V1.AppExtras.Remove(tmp, true); } else Console.WriteLine("Package is not installed"); @@ -172,14 +174,14 @@ namespace UpToolCLI private static void DistUpgrade() { - RepoManagement.GetReposFromDisk(); - foreach (KeyValuePair app in GlobalVariables.Apps.Where(s => + Program.Lib.V2.RepoManagement.GetReposFromDisk(); + foreach (KeyValuePair app in Program.Lib.V1.Apps.Where(s => (s.Value.Status & Status.Updatable) == Status.Updatable)) { Console.WriteLine($"Updating {app.Value.Name}"); - AppExtras.Update(app.Value, false); + Program.Lib.V1.AppExtras.Update(app.Value, false); } - if (Assembly.GetExecutingAssembly().GetName().Version < UpdateCheck.OnlineVersion) + if (Assembly.GetExecutingAssembly().GetName().Version < Program.Lib.V2.UpdateChecker.Check().OnlineVersion) { Console.WriteLine("Updating self"); Other.UpgradeSelf(false); diff --git a/UpToolCLI/Program.cs b/UpToolCLI/Program.cs index 80f3d29..28b97a8 100644 --- a/UpToolCLI/Program.cs +++ b/UpToolCLI/Program.cs @@ -1,24 +1,23 @@ using System; using System.CommandLine; using UpToolLib; -using UpToolLib.Tool; namespace UpToolCLI { public static class Program { - public static readonly UtLibFunctions Functions = new UtLibFunctions(); + public static readonly UtLibFunctions Functions = new(); public static bool Basic; + public static UpToolLibMain Lib; public static int Main(string[] args) { - MutexLock.Lock(); try { Basic = args.Length > 0 && args[0].ToLower() == "--basic"; - ExternalFunctionalityManager.Init(Functions); - XmlTool.FixXml(); - RootCommand rootCommand = new RootCommand(); + Lib = new UpToolLibMain(Functions); + Lib.V1.XmlTool.FixXml(); + RootCommand rootCommand = new(); rootCommand.AddGlobalOption(new Option("--basic", "Use only basic console functionality. Must be the first parameter in the call")); PackageManagement.RegisterCommands(rootCommand); @@ -35,7 +34,7 @@ namespace UpToolCLI } finally { - MutexLock.Unlock(); + Lib?.Dispose(); } } } diff --git a/UpToolCLI/ReposManagement.cs b/UpToolCLI/ReposManagement.cs index dbaf550..a59172d 100644 --- a/UpToolCLI/ReposManagement.cs +++ b/UpToolCLI/ReposManagement.cs @@ -3,12 +3,13 @@ using System.CommandLine; using System.CommandLine.Invocation; using System.Linq; using System.Xml.Linq; -using UpToolLib.Tool; +using UpToolLib.v1.Tool; namespace UpToolCLI { public class ReposManagement { + private static string InfoXml => Program.Lib.V1.PathTool.InfoXml; public static void RegisterCommands(RootCommand rootCommand) { rootCommand.AddCommand(new Command("list-repo", "Lists current repositories") @@ -16,7 +17,7 @@ namespace UpToolCLI Handler = CommandHandler.Create(ListRepo) }); - Command addRepo = new Command("add-repo", "Adds a repository") + Command addRepo = new("add-repo", "Adds a repository") { new Argument("name", "The new repositories name"), new Argument("link", "A link to the repositories XML") @@ -24,7 +25,7 @@ namespace UpToolCLI addRepo.Handler = CommandHandler.Create(AddRepo); rootCommand.AddCommand(addRepo); - Command removeRepo = new Command("remove-repo", "Removes a repository") + Command removeRepo = new("remove-repo", "Removes a repository") { new Argument("name", "The repositories name") }; @@ -34,7 +35,7 @@ namespace UpToolCLI private static void ListRepo() { - XDocument doc = XDocument.Load(PathTool.InfoXml); + XDocument doc = XDocument.Load(InfoXml); XElement repos = doc.Element("meta").Element("Repos"); Console.WriteLine("Current repos:"); Console.WriteLine(repos.Elements("Repo").ToStringTable(new[] @@ -47,17 +48,17 @@ namespace UpToolCLI private static void AddRepo(string name, string link) { - XDocument doc = XDocument.Load(PathTool.InfoXml); + XDocument doc = XDocument.Load(InfoXml); XElement repos = doc.Element("meta").Element("Repos"); repos.Add(new XElement("Repo", new XElement("Name", name), new XElement("Link", link))); - doc.Save(PathTool.InfoXml); + doc.Save(InfoXml); Console.WriteLine("Added repo. Remember to update the cache using \"uptool update\""); } private static void RemoveRepo(string name) { - XDocument doc = XDocument.Load(PathTool.InfoXml); + XDocument doc = XDocument.Load(InfoXml); XElement repos = doc.Element("meta").Element("Repos"); XElement[] sRepos = repos.Elements("Repo") .Where(s => s.Element("Name").Value.ToLower().StartsWith(name.ToLower())).ToArray(); @@ -85,7 +86,7 @@ namespace UpToolCLI Console.WriteLine($"Removing {t.Element("Name").Value}"); t.Remove(); } - doc.Save(PathTool.InfoXml); + doc.Save(InfoXml); Console.WriteLine("Removed repo. Remember to update the cache using \"uptool update\""); } } diff --git a/UpToolCLI/TableParser.cs b/UpToolCLI/TableParser.cs index f39182d..7b7cd7a 100644 --- a/UpToolCLI/TableParser.cs +++ b/UpToolCLI/TableParser.cs @@ -39,9 +39,9 @@ namespace UpToolCLI public static string ToStringTable(this string[,] arrValues) { int[] maxColumnsWidth = GetMaxColumnsWidth(arrValues); - string headerSpliter = new string('-', maxColumnsWidth.Sum(i => i + 3) - 1); + string headerSpliter = new('-', maxColumnsWidth.Sum(i => i + 3) - 1); - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new(); for (int rowIndex = 0; rowIndex < arrValues.GetLength(0); rowIndex++) { for (int colIndex = 0; colIndex < arrValues.GetLength(1); colIndex++) diff --git a/UpToolCLI/UTLibFunctions.cs b/UpToolCLI/UTLibFunctions.cs index 5d60cff..1453e84 100644 --- a/UpToolCLI/UTLibFunctions.cs +++ b/UpToolCLI/UTLibFunctions.cs @@ -13,7 +13,7 @@ namespace UpToolCLI { public Tuple Download(Uri link) { - using WebClient client = new WebClient(); + using WebClient client = new(); byte[] result = new byte[0]; bool finished = false; bool success = true; @@ -41,10 +41,10 @@ namespace UpToolCLI public string FetchImageB64(Uri link) { - using WebClient client = new WebClient(); + using WebClient client = new(); using Image image = Image.Load(client.OpenRead(link)); image.Mutate(x => x.Resize(70, 70)); - using MemoryStream ms = new MemoryStream(); + using MemoryStream ms = new(); image.SaveAsPng(ms); return Convert.ToBase64String(ms.ToArray()); } diff --git a/UpToolEto/UpToolEto.Gtk/Program.cs b/UpToolEto/UpToolEto.Gtk/Program.cs new file mode 100644 index 0000000..c5f5234 --- /dev/null +++ b/UpToolEto/UpToolEto.Gtk/Program.cs @@ -0,0 +1,17 @@ +using System; +using Eto.Forms; + +namespace UpToolEto.Gtk +{ + class MainClass + { + [STAThread] + public static void Main(string[] args) + { + UpToolEto.Main.Entry(new Application(Eto.Platforms.Gtk), () => + { + + }); + } + } +} \ No newline at end of file diff --git a/UpToolEto/UpToolEto.Gtk/UpToolEto.Gtk.csproj b/UpToolEto/UpToolEto.Gtk/UpToolEto.Gtk.csproj new file mode 100644 index 0000000..7fa8b4a --- /dev/null +++ b/UpToolEto/UpToolEto.Gtk/UpToolEto.Gtk.csproj @@ -0,0 +1,16 @@ + + + + WinExe + net5.0 + + + + + + + + + + + diff --git a/UpToolEto/UpToolEto.Wpf/Program.cs b/UpToolEto/UpToolEto.Wpf/Program.cs new file mode 100644 index 0000000..7232248 --- /dev/null +++ b/UpToolEto/UpToolEto.Wpf/Program.cs @@ -0,0 +1,38 @@ +using System; +using Eto.Forms; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace UpToolEto.Wpf +{ + class MainClass + { + [STAThread] + public static void Main(string[] args) + { + UpToolEto.Main.Entry(new Application(Eto.Platforms.Wpf), () => + { + Process[] processes = Process.GetProcessesByName("UpTool2"); + if (processes.Length > 0) + BringProcessToFront(processes[0]); + }); + } + + public static void BringProcessToFront(Process process) + { + IntPtr handle = process.MainWindowHandle; + if (IsIconic(handle)) + ShowWindow(handle, 9); + SetForegroundWindow(handle); + } + + [DllImport("User32.dll")] + private static extern bool SetForegroundWindow(IntPtr handle); + + [DllImport("User32.dll")] + private static extern bool ShowWindow(IntPtr handle, int nCmdShow); + + [DllImport("User32.dll")] + private static extern bool IsIconic(IntPtr handle); + } +} \ No newline at end of file diff --git a/UpToolEto/UpToolEto.Wpf/UpToolEto.Wpf.csproj b/UpToolEto/UpToolEto.Wpf/UpToolEto.Wpf.csproj new file mode 100644 index 0000000..81ad858 --- /dev/null +++ b/UpToolEto/UpToolEto.Wpf/UpToolEto.Wpf.csproj @@ -0,0 +1,16 @@ + + + + WinExe + net5.0-windows + + + + + + + + + + + diff --git a/UpToolEto/UpToolEto/Controls/AppList.cs b/UpToolEto/UpToolEto/Controls/AppList.cs new file mode 100644 index 0000000..28c2c06 --- /dev/null +++ b/UpToolEto/UpToolEto/Controls/AppList.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using Eto.Drawing; +using Eto.Forms; +using UpToolLib.v2; + +namespace UpToolEto.Controls +{ + public class AppList : Scrollable + { + private readonly IDictionary _apps; + private readonly Action _itemClickEvent; + private readonly StackLayout _layout; + + public AppList(IDictionary apps, Action itemClickEvent) + { + _apps = apps; + _itemClickEvent = itemClickEvent; + _layout = new StackLayout + { + Padding = 10, + Orientation = Orientation.Vertical, + Width = 200 + }; + Content = _layout; + Update(); + } + + public void Update() + { + _layout.Items.Clear(); + foreach ((Guid id, App app) in _apps) + { + _layout.Items.Add(new Button((_, _) => _itemClickEvent(id, app)) + { + Text = app.Name, + Image = (Icon)app.Icon, + ImagePosition = ButtonImagePosition.Left, + }); + } + } + } +} diff --git a/UpToolEto/UpToolEto/Controls/AppPanel.cs b/UpToolEto/UpToolEto/Controls/AppPanel.cs new file mode 100644 index 0000000..51cfd1b --- /dev/null +++ b/UpToolEto/UpToolEto/Controls/AppPanel.cs @@ -0,0 +1,38 @@ +using Eto.Drawing; +using Eto.Forms; +using UpToolLib.v2; + +namespace UpToolEto.Controls +{ + public class AppPanel : Panel + { + private readonly Label _appNameLabel; + private readonly Label _appDescriptionLabel; + public AppPanel() + { + _appDescriptionLabel = new Label(); + _appNameLabel = new Label(); + _appNameLabel.Font = new Font(_appNameLabel.Font.Family, _appNameLabel.Font.Size * 2); + Content = new StackLayout + { + Items = + { + _appNameLabel, + _appDescriptionLabel + } + }; + } + + public void FromApp(App app) + { + _appNameLabel.Text = app.Name; + _appDescriptionLabel.Text = app.Description; + } + + public void Clear() + { + _appNameLabel.Text = "Welcome to UpTool2"; + _appDescriptionLabel.Text = "Select an app to get started"; + } + } +} \ No newline at end of file diff --git a/UpToolEto/UpToolEto/Controls/RepoItem.cs b/UpToolEto/UpToolEto/Controls/RepoItem.cs new file mode 100644 index 0000000..8086d5a --- /dev/null +++ b/UpToolEto/UpToolEto/Controls/RepoItem.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using Eto.Forms; +using UpToolLib.DataStructures; + +namespace UpToolEto.Controls +{ + public class RepoItem : StackLayout + { + public RepoItem(Repo repo, int index, Action update, IList repos) + { + TextBox name = new() + { + Text = repo.Name + }; + name.TextChanged += (_, _) => repo.Name = name.Text; + TextBox link = new() + { + Text = repo.Url + }; + link.TextChanged += (_, _) => repo.Url = link.Text; + Orientation = Orientation.Horizontal; + Items.Add(name); + Items.Add(new StackLayoutItem(link, HorizontalAlignment.Stretch, true)); + Items.Add(new Button((_, _) => + { + repos.RemoveAt(index); + update(); + }) + { + Text = "-" + }); + } + } +} \ No newline at end of file diff --git a/UpToolEto/UpToolEto/Controls/UTMenuBar.cs b/UpToolEto/UpToolEto/Controls/UTMenuBar.cs new file mode 100644 index 0000000..058e4a2 --- /dev/null +++ b/UpToolEto/UpToolEto/Controls/UTMenuBar.cs @@ -0,0 +1,51 @@ +using Eto.Forms; +using UpToolEto.Forms; +using UpToolLib.v2; + +namespace UpToolEto.Controls +{ + public class UTMenuBar : MenuBar + { + public UTMenuBar(MainForm mainForm, RepoManagement repoManagement, AppList appList) + { + Command reloadRepos = new() {MenuText = "Reload", ToolBarText = "Reload"}; + reloadRepos.Executed += (_, _) => + { + if (Main.Platform.YesNoDialog("This may take some time. Are you sure?", true)) + { + repoManagement.FetchRepos(); + repoManagement.GetReposFromDisk(); + appList.Update(); + } + }; + + Command openSettings = new() {MenuText = "Sources", ToolBarText = "Sources"}; + openSettings.Executed += (_, _) => new RepoForm(repoManagement).Show(); + + Command quitCommand = new() {MenuText = "Quit", Shortcut = Application.Instance.CommonModifier | Keys.Q}; + quitCommand.Executed += (_, _) => Application.Instance.Quit(); + + Command aboutCommand = new() {MenuText = "About Eto..."}; + aboutCommand.Executed += (_, _) => new AboutDialog().ShowDialog(mainForm); + + Items.Add(new ButtonMenuItem + { + Text = "&File", Items = + { + reloadRepos, + openSettings + } + }); + // File submenu + // new ButtonMenuItem { Text = "&Edit", Items = { /* commands/items */ } }, + // new ButtonMenuItem { Text = "&View", Items = { /* commands/items */ } }, + /*ApplicationItems = + { + // application (OS X) or file menu (others) + new ButtonMenuItem {Text = "&Preferences..."}, + },*/ + QuitItem = quitCommand; + AboutItem = aboutCommand; + } + } +} \ No newline at end of file diff --git a/UpToolEto/UpToolEto/Forms/DownloadDialog.cs b/UpToolEto/UpToolEto/Forms/DownloadDialog.cs new file mode 100644 index 0000000..92eee40 --- /dev/null +++ b/UpToolEto/UpToolEto/Forms/DownloadDialog.cs @@ -0,0 +1,52 @@ +using System; +using System.Net; +using Eto.Drawing; +using Eto.Forms; + +namespace UpToolEto.Forms +{ + public class DownloadDialog : Form + { + public bool Success = false; + public byte[] Download = new byte[0]; + public DownloadDialog(Uri url) + { + Title = "Downloader"; + Resizable = false; + Maximizable = false; + Minimizable = false; + WindowStyle = WindowStyle.Utility; + ProgressBar bar = new(); + bar.MaxValue = 100; + Content = new StackLayout + { + Padding = 10, + Items = + { + "Downloading " + url, + new StackLayoutItem(bar, HorizontalAlignment.Stretch, true) + } + }; + Size = new Size(700, 400); + try + { + WebClient client = new(); + client.DownloadProgressChanged += (_, args) => + { + bar.Value = args.ProgressPercentage; + }; + client.DownloadDataCompleted += (_, args) => + { + Success = true; + Download = args.Result; + Close(); + }; + client.DownloadDataAsync(url, client); + } + catch + { + Close(); + } + } + } +} \ No newline at end of file diff --git a/UpToolEto/UpToolEto/Forms/InitScreen.cs b/UpToolEto/UpToolEto/Forms/InitScreen.cs new file mode 100644 index 0000000..d294736 --- /dev/null +++ b/UpToolEto/UpToolEto/Forms/InitScreen.cs @@ -0,0 +1,43 @@ +using System; +using Eto.Drawing; +using Eto.Forms; + +namespace UpToolEto.Forms +{ + public class InitScreen : Form + { + private readonly Application _application; + private readonly Label _lab; + public InitScreen(Application application) + { + _application = application; + Title = "UpTool2 Init"; + Resizable = false; + Maximizable = false; + Minimizable = false; + WindowStyle = WindowStyle.None; + _lab = new Label(); + Label header = new(); + header.Font = new Font(header.Font.Family, header.Font.Size * 2); + header.Text = "UpTool2"; + Content = new StackLayout + { + Padding = 10, + Items = + { + new StackLayoutItem(header, HorizontalAlignment.Center), + new StackLayoutItem(_lab, HorizontalAlignment.Center) + }, + VerticalContentAlignment = VerticalAlignment.Center + }; + Shown += (_, _) => Size = new Size(700, 400); + } + + public void SetText(string text) + { + Console.WriteLine(text); + _lab.Text = text; + _application.RunIteration(); + } + } +} \ No newline at end of file diff --git a/UpToolEto/UpToolEto/Forms/MainForm.cs b/UpToolEto/UpToolEto/Forms/MainForm.cs new file mode 100644 index 0000000..7470557 --- /dev/null +++ b/UpToolEto/UpToolEto/Forms/MainForm.cs @@ -0,0 +1,36 @@ +using Eto.Drawing; +using Eto.Forms; +using UpToolEto.Controls; +using UpToolLib; + +//TODO implement tasks queue UI +//TODO keep track of app state +//TODO app filters (search by name/tags) +//TODO add control_upload action_run action_update action_remove action_install +namespace UpToolEto.Forms +{ + public partial class MainForm : Form + { + private readonly AppPanel _appPanel; + public MainForm(InitScreen init, UpToolLibMain lib) + { + Title = "UpTool2"; + MinimumSize = new Size(600, 100); + AppList appList = new(lib.V1.Apps, (guid, app) => _appPanel.FromApp(app)); + _appPanel = new AppPanel(); + + Content = new StackLayout + { + Padding = 10, + Items = + { + appList, + new StackLayoutItem(_appPanel, true) + }, + Orientation = Orientation.Horizontal + }; + Menu = new UTMenuBar(this, lib.V2.RepoManagement, appList); + Shown += (_, _) => init.Close(); + } + } +} diff --git a/UpToolEto/UpToolEto/Forms/RepoForm.cs b/UpToolEto/UpToolEto/Forms/RepoForm.cs new file mode 100644 index 0000000..d6446b3 --- /dev/null +++ b/UpToolEto/UpToolEto/Forms/RepoForm.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using Eto.Forms; +using UpToolEto.Controls; +using UpToolLib.DataStructures; +using UpToolLib.v2; + +namespace UpToolEto.Forms +{ + public class RepoForm : Form + { + private readonly RepoManagement _management; + private List _repos = new(); + private StackLayout _layout; + public RepoForm(RepoManagement management) + { + _management = management; + _repos.AddRange(management.GetRepos()); + Title = "Sources"; + _layout = new StackLayout(); + Content = _layout; + Update(); + } + + private void Update() + { + _layout.Items.Clear(); + _layout.Items.Add(new StackLayoutItem(new Button((_, _) => + { + _repos.Add(new Repo + { + Name = "New repo", + Url = "https://example.com/repo.xml" + }); + Update(); + }) + { + Text = "Add", + }, HorizontalAlignment.Stretch)); + StackLayout reposLayout = new(); + for (int i = 0; i < _repos.Count; i++) + reposLayout.Items.Add(new StackLayoutItem(new RepoItem(_repos[i], i, Update, _repos), HorizontalAlignment.Stretch)); + _layout.Items.Add(new StackLayoutItem(new Scrollable{Content = reposLayout}, HorizontalAlignment.Stretch, true)); + _layout.Items.Add(new StackLayoutItem(new Button((_, _) => + { + _management.Save(_repos); + Close(); + }) + { + Text = "Save" + }, HorizontalAlignment.Stretch)); + } + } +} diff --git a/UpToolEto/UpToolEto/Main.cs b/UpToolEto/UpToolEto/Main.cs new file mode 100644 index 0000000..b47b716 --- /dev/null +++ b/UpToolEto/UpToolEto/Main.cs @@ -0,0 +1,133 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.IO.Compression; +using System.Reflection; +using System.Security.Cryptography; +using System.Threading; +using System.Xml; +using Eto.Forms; +using UpToolEto.Forms; +using UpToolLib; +using UpToolLib.DataStructures; +using UpToolLib.v1; +using UpToolLib.v1.Tool; +using UpToolLib.v2; + +namespace UpToolEto +{ + public class Main + { + public static bool Online; + public static IExternalFunctionality Platform; + public static void Entry(Application application, Action activityExistsException) + { + InitScreen init = new(application); + init.Show(); + try + { + Platform = new UTLibFunctions(); + UpToolLibMain lib = new(Platform); + init.SetText("Initializing paths"); + if (!Directory.Exists(lib.V1.PathTool.Dir)) + Directory.CreateDirectory(lib.V1.PathTool.Dir); + FixXml(lib.V1.XmlTool, lib.V1.PathTool); + init.SetText("Performing checks"); + UpdateCheck updateCheck = null; + try + { + updateCheck = lib.V2.UpdateChecker.Check(); + Online = true; + } + catch + { + Online = false; + } + if (Online) + { + if (UpdateCheck(updateCheck, lib.V1.PathTool, init)) + { + application.Quit(); + return; + } + } + if (!Directory.Exists(lib.V1.PathTool.GetRelative("Apps"))) + Directory.CreateDirectory(lib.V1.PathTool.GetRelative("Apps")); + /*if (Online) + { + init.SetText("Fetching repos"); + lib.V2.RepoManagement.FetchRepos(); + }*/ + lib.V2.RepoManagement.GetReposFromDisk(); + init.SetText("Opening"); + application.Run(new MainForm(init, lib)); + } + catch (MutexLockLockedException) + { + init.Close(); + MessageBox.Show("Mutex property of other process, quitting"); + activityExistsException(); + } + } + + public static void FixXml(XmlTool xmlTool, PathTool pathTool, bool throwOnError = false) + { + try + { + xmlTool.FixXml(); + } + catch (XmlException) + { + if (throwOnError) throw; + MessageBox.Show("Something went wrong while trying to parse XML. Retrying..."); + File.Delete(pathTool.InfoXml); + FixXml(xmlTool, pathTool); + } + } + + private static bool UpdateCheck(UpdateCheck updateCheck, PathTool pathTool, InitScreen init) + { + init.SetText("Comparing online version"); + if (Assembly.GetExecutingAssembly().GetName().Version >= updateCheck.OnlineVersion) return false; + if (PlatformCheck.IsWindows) + { + init.SetText("Downloading latest"); + (bool success, byte[] dl) = Platform.Download(updateCheck.Installer); + if (!success) + throw new Exception("Failed to update"); + init.SetText("Verifying"); + using (SHA256CryptoServiceProvider sha256 = new()) + { + string pkgHash = BitConverter.ToString(sha256.ComputeHash(dl)).Replace("-", string.Empty).ToUpper(); + if (pkgHash != updateCheck.InstallerHash) + throw new Exception( + $"The hash is not equal to the one stored in the repo:\r\nPackage: {pkgHash}\r\nOnline: {updateCheck.InstallerHash}"); + } + init.SetText("Installing"); + if (Directory.Exists(pathTool.GetRelative("Install", "tmp"))) + Directory.Delete(pathTool.GetRelative("Install", "tmp"), true); + Directory.CreateDirectory(pathTool.GetRelative("Install", "tmp")); + using (MemoryStream ms = new(dl)) + { + using ZipArchive ar = new(ms); + ar.ExtractToDirectory(pathTool.GetRelative("Install", "tmp"), true); + } + init.Close(); + Process.Start(new ProcessStartInfo + { + FileName = pathTool.GetRelative("Install", "tmp", "Installer.exe"), + Arguments = "i -p", + CreateNoWindow = true, + WindowStyle = ProcessWindowStyle.Hidden, + WorkingDirectory = pathTool.GetRelative("Install") + }); + return true; + } + else + { + MessageBox.Show("A new version is available. Please install it"); + return false; + } + } + } +} \ No newline at end of file diff --git a/UpToolEto/UpToolEto/UTLibFunctions.cs b/UpToolEto/UpToolEto/UTLibFunctions.cs new file mode 100644 index 0000000..6d483ed --- /dev/null +++ b/UpToolEto/UpToolEto/UTLibFunctions.cs @@ -0,0 +1,51 @@ +using System; +using System.IO; +using System.Net; +using System.Threading; +using Eto.Drawing; +using Eto.Forms; +using UpToolEto.Forms; +using UpToolLib; +using UpToolLib.DataStructures; + +namespace UpToolEto +{ + public class UTLibFunctions : IExternalFunctionality + { + private const int ImgSize = 32; + public Tuple Download(Uri link) + { + DownloadDialog dlg = new(link); + dlg.Show(); + while (dlg.Visible) Thread.Sleep(20); + return new Tuple(dlg.Success, dlg.Download); + } + + public string FetchImageB64(Uri link) + { + using WebClient client = new(); + using Stream s = client.OpenRead(link); + using Bitmap source = new(s); + using Icon bmp = source.WithSize(ImgSize, ImgSize); + using Bitmap bitmapResized = new(bmp); + using MemoryStream ms = new(); + bitmapResized.Save(ms, ImageFormat.Png); + return Convert.ToBase64String(ms.ToArray()); + } + + public bool YesNoDialog(string text, bool defaultVal) => + MessageBox.Show(text, MessageBoxButtons.YesNo, + defaultButton: defaultVal ? MessageBoxDefaultButton.Yes : MessageBoxDefaultButton.No) == DialogResult.Yes; + + public void OkDialog(string text) => MessageBox.Show(text); + + public object GetDefaultIcon() => Bitmap.FromResource("UpToolLib.C_64.ico", typeof(UpToolLibMain)).WithSize(ImgSize, ImgSize); + + public object ImageFromB64(string b64) => new Bitmap(Convert.FromBase64String(b64)).WithSize(ImgSize, ImgSize); + + public void Log(string text) + { + //TODO implement visual logging + } + } +} \ No newline at end of file diff --git a/UpToolEto/UpToolEto/UpToolEto.csproj b/UpToolEto/UpToolEto/UpToolEto.csproj new file mode 100644 index 0000000..4c957f0 --- /dev/null +++ b/UpToolEto/UpToolEto/UpToolEto.csproj @@ -0,0 +1,15 @@ + + + + net5.0 + + + + + + + + + + + \ No newline at end of file diff --git a/UpToolLib/Resources/C_64.ico b/UpToolLib/C_64.ico similarity index 100% rename from UpToolLib/Resources/C_64.ico rename to UpToolLib/C_64.ico diff --git a/UpToolLib/DataStructures/Repo.cs b/UpToolLib/DataStructures/Repo.cs new file mode 100644 index 0000000..0d133e0 --- /dev/null +++ b/UpToolLib/DataStructures/Repo.cs @@ -0,0 +1,8 @@ +namespace UpToolLib.DataStructures +{ + public class Repo + { + public string Name { get; set; } + public string Url { get; set; } + } +} \ No newline at end of file diff --git a/UpToolLib/ExternalFunctionalityManager.cs b/UpToolLib/ExternalFunctionalityManager.cs deleted file mode 100644 index 3135bdc..0000000 --- a/UpToolLib/ExternalFunctionalityManager.cs +++ /dev/null @@ -1,14 +0,0 @@ -using UpToolLib.DataStructures; - -namespace UpToolLib -{ - public static class ExternalFunctionalityManager - { - internal static IExternalFunctionality Instance; - - public static void Init(IExternalFunctionality externalFunctionality) - { - Instance = externalFunctionality; - } - } -} \ No newline at end of file diff --git a/UpToolLib/GlobalVariables.cs b/UpToolLib/GlobalVariables.cs deleted file mode 100644 index 9085790..0000000 --- a/UpToolLib/GlobalVariables.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using UpToolLib.DataStructures; - -namespace UpToolLib -{ - public static class GlobalVariables - { - public const string Windows = "WINDOWS"; - public const string Posix = "POSIX"; - public static readonly Dictionary Apps = new Dictionary(); - public static Version MinimumVer => Version.Parse("0.0.0.0"); - - public static string CurrentPlatform => - PlatformCheck.IsWindows ? Windows : - PlatformCheck.IsPosix ? Posix : throw new Exception("Unexpeccted PlatformCheck"); - } -} \ No newline at end of file diff --git a/UpToolLib/Lock.cs b/UpToolLib/Lock.cs deleted file mode 100644 index 4b9da88..0000000 --- a/UpToolLib/Lock.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Threading; - -namespace UpToolLib -{ - public static class MutexLock - { - private static Mutex _mutex; - private static bool _hasHandle; - - public static void Lock() - { - _mutex = new Mutex(false, - "Global\\{c0c1e002-9e13-4e8f-a035-dbdc5128e00e}", - out bool _); - _hasHandle = false; - try - { - _hasHandle = _mutex.WaitOne(5000, false); - if (_hasHandle) - return; - throw new MutexLockLockedException(); - } - catch (AbandonedMutexException) - { -#if DEBUG - System.Diagnostics.Debug.WriteLine("Mutex abandoned"); -#endif - _hasHandle = true; - } - } - - public static void Unlock() - { - if (_hasHandle) - _mutex.ReleaseMutex(); - } - } - - public class MutexLockLockedException : Exception - { - } -} \ No newline at end of file diff --git a/UpToolLib/MutexLockLockedException.cs b/UpToolLib/MutexLockLockedException.cs new file mode 100644 index 0000000..b27bd91 --- /dev/null +++ b/UpToolLib/MutexLockLockedException.cs @@ -0,0 +1,8 @@ +using System; + +namespace UpToolLib +{ + public class MutexLockLockedException : Exception + { + } +} \ No newline at end of file diff --git a/UpToolLib/Tool/PathTool.cs b/UpToolLib/Tool/PathTool.cs deleted file mode 100644 index 9597dfb..0000000 --- a/UpToolLib/Tool/PathTool.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.IO; -using System.Linq; - -namespace UpToolLib.Tool -{ - public static class PathTool - { - public static string Dir => - Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "UpTool2"); - - public static string TempPath => GetRelative("tmp"); - public static string AppsPath => GetRelative("Apps"); - public static string InfoXml => GetRelative("info.xml"); - - public static string GetRelative(params string[] segments) => - Path.Combine(new[] {Dir}.Concat(segments).ToArray()); - - public static string GetAppPath(Guid app) => Path.Combine(AppsPath, app.ToString()); - - public static string GetDataPath(Guid app) => Path.Combine(GetAppPath(app), "app"); - - public static string GetInfoPath(Guid app) => Path.Combine(GetAppPath(app), "info.xml"); - } -} \ No newline at end of file diff --git a/UpToolLib/UpToolLib.csproj b/UpToolLib/UpToolLib.csproj index eda6799..d7906c2 100644 --- a/UpToolLib/UpToolLib.csproj +++ b/UpToolLib/UpToolLib.csproj @@ -6,4 +6,11 @@ 1.0.* + + + + + + + diff --git a/UpToolLib/UpToolLibMain.cs b/UpToolLib/UpToolLibMain.cs new file mode 100644 index 0000000..801ea20 --- /dev/null +++ b/UpToolLib/UpToolLibMain.cs @@ -0,0 +1,38 @@ +using System; +using System.Threading; +using UpToolLib.DataStructures; +using UpToolLib.v1; +using UpToolLib.v2; + +namespace UpToolLib +{ + public class UpToolLibMain : IDisposable + { + private static Mutex _mutex; + public UpToolLibMain(IExternalFunctionality platform) + { + V1 = new UpToolLibV1(platform); + V2 = new UpToolLibV2(platform, V1.Installer, V1.AppExtras, V1.PathTool, V1.XmlTool, V1.Apps); + _mutex = new Mutex(false, + "Global\\{c0c1e002-9e13-4e8f-a035-dbdc5128e00e}", + out bool _); + try + { + if (_mutex.WaitOne(5000, false)) + return; + throw new MutexLockLockedException(); + } + catch (AbandonedMutexException) + { +#if DEBUG + _platform.Log("Mutex abandoned"); +#endif + } + } + + public readonly UpToolLibV1 V1; + public readonly UpToolLibV2 V2; + public void Dispose() => _mutex.ReleaseMutex(); + ~UpToolLibMain() => Dispose(); + } +} \ No newline at end of file diff --git a/UpToolLib/UpdateCheck.cs b/UpToolLib/UpdateCheck.cs deleted file mode 100644 index f2d0da7..0000000 --- a/UpToolLib/UpdateCheck.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Xml.Linq; -using UpToolLib.Tool; - -namespace UpToolLib -{ - public static class UpdateCheck - { - private static XElement _meta; - - private static XElement Meta - { - get - { - if (_meta is null) Reload(); - return _meta; - } - set => _meta = value; - } - - public static Version OnlineVersion => Version.Parse(Meta.Element("Version").Value); - public static Uri Installer => new Uri(Meta.Element("Installer").Value); - public static string InstallerHash => Meta.Element("InstallerHash").Value.ToUpper(); - public static Uri App => new Uri(Meta.Element("File").Value); - public static string AppHash => Meta.Element("Hash").Value.ToUpper(); - - public static void Reload() => - Reload(XDocument.Load(PathTool.InfoXml).Element("meta").Element("UpdateSource").Value); - - public static void Reload(string source) => Meta = XDocument.Load(source).Element("meta"); - } -} \ No newline at end of file diff --git a/UpToolLib/PlatformCheck.cs b/UpToolLib/v1/PlatformCheck.cs similarity index 58% rename from UpToolLib/PlatformCheck.cs rename to UpToolLib/v1/PlatformCheck.cs index 9305305..ef78092 100644 --- a/UpToolLib/PlatformCheck.cs +++ b/UpToolLib/v1/PlatformCheck.cs @@ -1,7 +1,7 @@ using System; using System.Linq; -namespace UpToolLib +namespace UpToolLib.v1 { public static class PlatformCheck { @@ -13,5 +13,11 @@ namespace UpToolLib .Contains(Environment.OSVersion.Platform); public static bool IsPosix => !IsWindows; + + public const string Windows = "WINDOWS"; + public const string Posix = "POSIX"; + public static string CurrentPlatform => + IsWindows ? Windows : + IsPosix ? Posix : throw new Exception("Unexpected PlatformCheck"); } } \ No newline at end of file diff --git a/UpToolLib/Tool/AppExtras.cs b/UpToolLib/v1/Tool/AppExtras.cs similarity index 72% rename from UpToolLib/Tool/AppExtras.cs rename to UpToolLib/v1/Tool/AppExtras.cs index 5a1d341..b6a124a 100644 --- a/UpToolLib/Tool/AppExtras.cs +++ b/UpToolLib/v1/Tool/AppExtras.cs @@ -4,15 +4,26 @@ using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; -using UpToolLib.DataStructures; +using UpToolLib.v2; -namespace UpToolLib.Tool +namespace UpToolLib.v1.Tool { - public static class AppExtras + public class AppExtras { - public static Process RunApp(App app) => RunApp(app, app.MainFile, ""); - public static Process RunApp(App app, string arguments) => RunApp(app, app.MainFile, arguments); - public static Process RunApp(App app, string file, string arguments) => + private readonly AppInstall _appInstall; + private readonly PathTool _pathTool; + private readonly IDictionary _apps; + + internal AppExtras(AppInstall appInstall, PathTool pathTool, IDictionary apps) + { + _appInstall = appInstall; + _pathTool = pathTool; + _apps = apps; + } + + public Process RunApp(App app) => RunApp(app, app.MainFile, ""); + public Process RunApp(App app, string arguments) => RunApp(app, app.MainFile, arguments); + public Process RunApp(App app, string file, string arguments) => Process.Start( new ProcessStartInfo { @@ -21,15 +32,15 @@ namespace UpToolLib.Tool WorkingDirectory = app.DataPath }); - public static void Update(App app, bool overwrite) + public void Update(App app, bool overwrite) { Remove(app, overwrite); - AppInstall.Install(app, overwrite); + _appInstall.Install(app, overwrite); } - public static void Remove(App app, bool deleteAll) + public void Remove(App app, bool deleteAll) { - string tmp = PathTool.TempPath; + string tmp = _pathTool.TempPath; if (Directory.Exists(tmp)) Directory.Delete(tmp, true); Directory.CreateDirectory(tmp); @@ -46,7 +57,7 @@ namespace UpToolLib.Tool }).WaitForExit();*/ int key = PlatformCheck.IsWindows ? 0 : File.Exists(Path.Combine(tmp, "Remove.sh")) ? 1 : 2; - ProcessStartInfo prc = new ProcessStartInfo + ProcessStartInfo prc = new() { FileName = key switch { @@ -81,7 +92,7 @@ namespace UpToolLib.Tool Directory.Delete(app.AppPath, true); } - private static void CheckDirecory(string tmp, string app) + private void CheckDirecory(string tmp, string app) { foreach (string file in Directory.GetFiles(tmp)) { @@ -95,12 +106,11 @@ namespace UpToolLib.Tool Directory.Delete(app); } - public static App[] FindApps(string identifier) + public App[] FindApps(string identifier) { - Dictionary tmp = GlobalVariables.Apps; - IEnumerable> tmp1 = tmp.Where(s => s.Key.ToString().StartsWith(identifier)); - tmp1 = tmp1.Concat(tmp.Where(s => s.Value.Name.Contains(identifier))); - tmp1 = tmp1.Concat(tmp.Where(s => s.Value.Description.Contains(identifier))); + IEnumerable> tmp1 = _apps.Where(s => s.Key.ToString().StartsWith(identifier)); + tmp1 = tmp1.Concat(_apps.Where(s => s.Value.Name.Contains(identifier))); + tmp1 = tmp1.Concat(_apps.Where(s => s.Value.Description.Contains(identifier))); return tmp1.Select(s => s.Value).ToArray(); } } diff --git a/UpToolLib/Tool/AppInstall.cs b/UpToolLib/v1/Tool/AppInstall.cs similarity index 85% rename from UpToolLib/Tool/AppInstall.cs rename to UpToolLib/v1/Tool/AppInstall.cs index c1060e7..2eff208 100644 --- a/UpToolLib/Tool/AppInstall.cs +++ b/UpToolLib/v1/Tool/AppInstall.cs @@ -5,17 +5,27 @@ using System.IO.Compression; using System.Security.Cryptography; using System.Xml.Linq; using UpToolLib.DataStructures; +using UpToolLib.v2; -namespace UpToolLib.Tool +namespace UpToolLib.v1.Tool { - public static class AppInstall + public class AppInstall { + private readonly IExternalFunctionality _platform; + private readonly PathTool _pathTool; + + internal AppInstall(IExternalFunctionality platform, PathTool pathTool) + { + _platform = platform; + _pathTool = pathTool; + } + /// /// Install an application /// /// The app to install /// Set to true to overwrite all old data - public static void Install(App appI, bool force) + public void Install(App appI, bool force) { string app = ""; string tmp = ""; @@ -24,7 +34,7 @@ namespace UpToolLib.Tool { #endif app = appI.AppPath; - tmp = PathTool.TempPath; + tmp = _pathTool.TempPath; if (Directory.Exists(tmp)) Directory.Delete(tmp, true); Directory.CreateDirectory(tmp); @@ -39,10 +49,10 @@ namespace UpToolLib.Tool if (!Directory.Exists(app)) Directory.CreateDirectory(app); } - (bool dlSuccess, byte[] dlData) = ExternalFunctionalityManager.Instance.Download(new Uri(appI.File)); + (bool dlSuccess, byte[] dlData) = _platform.Download(new Uri(appI.File)); if (!dlSuccess) throw new Exception("Download failed"); - using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider()) + using (SHA256CryptoServiceProvider sha256 = new()) { string pkgHash = BitConverter.ToString(sha256.ComputeHash(dlData)).Replace("-", string.Empty) .ToUpper(); @@ -71,7 +81,7 @@ Online: {appI.Hash.ToUpper()}"); #endif } - public static void InstallZip(string zipPath, App meta, bool force) + public void InstallZip(string zipPath, App meta, bool force) { string app = ""; string tmp = ""; @@ -79,7 +89,7 @@ Online: {appI.Hash.ToUpper()}"); { app = meta.AppPath; Directory.CreateDirectory(app); - tmp = PathTool.TempPath; + tmp = _pathTool.TempPath; if (Directory.Exists(tmp)) Directory.Delete(tmp, true); Directory.CreateDirectory(tmp); @@ -102,13 +112,13 @@ Online: {appI.Hash.ToUpper()}"); //Use //PowerShell -Command "Add-Type -AssemblyName PresentationFramework;[System.Windows.MessageBox]::Show('Hello World')" //for message boxes - private static void CompleteInstall(App app, bool force) => CompleteInstall(app.AppPath, app.Name, + private void CompleteInstall(App app, bool force) => CompleteInstall(app.AppPath, app.Name, app.Description, app.Version, app.MainFile, force); - private static void CompleteInstall(string appPath, string name, string description, Version version, + private void CompleteInstall(string appPath, string name, string description, Version version, string mainFile, bool force) { - string tmp = PathTool.TempPath; + string tmp = _pathTool.TempPath; ZipFile.ExtractToDirectory(Path.Combine(appPath, "package.zip"), tmp); if (force) Directory.Move(Path.Combine(tmp, "Data"), Path.Combine(appPath, "app")); @@ -117,7 +127,7 @@ Online: {appI.Hash.ToUpper()}"); CopyAll(Path.Combine(tmp, "Data"), Path.Combine(appPath, "app")); Directory.Delete(Path.Combine(tmp, "Data"), true); } - XElement el = new XElement("app", new XElement("Name", name), new XElement("Description", description), + XElement el = new("app", new XElement("Name", name), new XElement("Description", description), new XElement("Version", version)); if (mainFile != null) el.Add(new XElement(new XElement("MainFile", mainFile))); @@ -151,7 +161,7 @@ Online: {appI.Hash.ToUpper()}"); }).WaitForExit();*/ int key = PlatformCheck.IsWindows ? 0 : File.Exists(Path.Combine(tmp, "Install.sh")) ? 1 : 2; - ProcessStartInfo prc = new ProcessStartInfo + ProcessStartInfo prc = new() { FileName = key switch { @@ -175,7 +185,7 @@ Online: {appI.Hash.ToUpper()}"); Process.Start(prc)?.WaitForExit(); } - private static void CopyAll(string source, string target) + private void CopyAll(string source, string target) { if (string.Equals(Path.GetFullPath(source), Path.GetFullPath(target), StringComparison.CurrentCultureIgnoreCase)) diff --git a/UpToolLib/v1/Tool/PathTool.cs b/UpToolLib/v1/Tool/PathTool.cs new file mode 100644 index 0000000..40c07b9 --- /dev/null +++ b/UpToolLib/v1/Tool/PathTool.cs @@ -0,0 +1,25 @@ +using System; +using System.IO; +using System.Linq; + +namespace UpToolLib.v1.Tool +{ + public class PathTool + { + public string Dir => + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "UpTool2"); + + public string TempPath => GetRelative("tmp"); + public string AppsPath => GetRelative("Apps"); + public string InfoXml => GetRelative("info.xml"); + + public string GetRelative(params string[] segments) => + Path.Combine(new[] {Dir}.Concat(segments).ToArray()); + + public string GetAppPath(Guid app) => Path.Combine(AppsPath, app.ToString()); + + public string GetDataPath(Guid app) => Path.Combine(GetAppPath(app), "app"); + + public string GetInfoPath(Guid app) => Path.Combine(GetAppPath(app), "info.xml"); + } +} \ No newline at end of file diff --git a/UpToolLib/Tool/XmlTool.cs b/UpToolLib/v1/Tool/XmlTool.cs similarity index 75% rename from UpToolLib/Tool/XmlTool.cs rename to UpToolLib/v1/Tool/XmlTool.cs index cbc2124..fc34481 100644 --- a/UpToolLib/Tool/XmlTool.cs +++ b/UpToolLib/v1/Tool/XmlTool.cs @@ -1,18 +1,28 @@ using System.IO; using System.Linq; using System.Xml.Linq; +using UpToolLib.DataStructures; -namespace UpToolLib.Tool +namespace UpToolLib.v1.Tool { - public static class XmlTool + public class XmlTool { - public static void FixXml() + private readonly IExternalFunctionality _platform; + private readonly PathTool _pathTool; + + internal XmlTool(IExternalFunctionality platform, PathTool pathTool) { - if (!Directory.Exists(PathTool.AppsPath)) - Directory.CreateDirectory(PathTool.AppsPath); - if (!File.Exists(PathTool.InfoXml) || XDocument.Load(PathTool.InfoXml).Element("meta") == null) - new XElement("meta").Save(PathTool.InfoXml); - XDocument x = XDocument.Load(PathTool.InfoXml); + _platform = platform; + _pathTool = pathTool; + } + + public void FixXml() + { + if (!Directory.Exists(_pathTool.AppsPath)) + Directory.CreateDirectory(_pathTool.AppsPath); + if (!File.Exists(_pathTool.InfoXml) || XDocument.Load(_pathTool.InfoXml).Element("meta") == null) + new XElement("meta").Save(_pathTool.InfoXml); + XDocument x = XDocument.Load(_pathTool.InfoXml); XElement meta = x.Element("meta"); if (meta.Element("UpdateSource") == null) meta.Add(new XElement("UpdateSource")); @@ -32,7 +42,7 @@ namespace UpToolLib.Tool meta.Add(new XElement("Repos")); if (meta.Element("Repos").Elements("Repo").Count() == 0) { - if (ExternalFunctionalityManager.Instance.YesNoDialog( + if (_platform.YesNoDialog( "No active repository was detected. Add the default repo?", false)) { meta.Element("Repos").Add(new XElement("Repo", new XElement("Name", "UpTool2 official Repo"), @@ -53,7 +63,7 @@ namespace UpToolLib.Tool "https://gitlab.com/uptool/UpTool2/-/snippets/1988600/raw/master/Repo.xml"); if (meta.Element("LocalRepo") == null) meta.Add(new XElement("LocalRepo")); - x.Save(PathTool.InfoXml); + x.Save(_pathTool.InfoXml); } } } diff --git a/UpToolLib/v1/UpToolLibV1.cs b/UpToolLib/v1/UpToolLibV1.cs new file mode 100644 index 0000000..987b1b5 --- /dev/null +++ b/UpToolLib/v1/UpToolLibV1.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using UpToolLib.DataStructures; +using UpToolLib.v1.Tool; +using UpToolLib.v2; + +namespace UpToolLib.v1 +{ + public class UpToolLibV1 + { + internal UpToolLibV1(IExternalFunctionality platform) + { + PathTool = new PathTool(); + XmlTool = new XmlTool(platform, PathTool); + Installer = new AppInstall(platform, PathTool); + AppExtras = new AppExtras(Installer, PathTool, Apps); + } + public readonly AppExtras AppExtras; + public readonly AppInstall Installer; + public readonly PathTool PathTool; + public readonly XmlTool XmlTool; + + public readonly IDictionary Apps = new Dictionary(); + public static Version MinimumVer => Version.Parse("0.0.0.0"); + } +} \ No newline at end of file diff --git a/UpToolLib/DataStructures/App.cs b/UpToolLib/v2/App.cs similarity index 84% rename from UpToolLib/DataStructures/App.cs rename to UpToolLib/v2/App.cs index 9e18469..ead1ac9 100644 --- a/UpToolLib/DataStructures/App.cs +++ b/UpToolLib/v2/App.cs @@ -3,10 +3,11 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Xml.Linq; -using UpToolLib.Tool; +using UpToolLib.DataStructures; +using UpToolLib.v1.Tool; using static System.Environment; -namespace UpToolLib.DataStructures +namespace UpToolLib.v2 { public struct App : IEquatable { @@ -21,9 +22,10 @@ namespace UpToolLib.DataStructures public readonly object Icon; public readonly bool Runnable; public readonly string MainFile; + private readonly PathTool _pathTool; - public App(string name, string description, Version version, string file, bool local, string hash, Guid iD, - Color color, object icon, bool runnable, string mainFile) + internal App(string name, string description, Version version, string file, bool local, string hash, Guid iD, + Color color, object icon, bool runnable, string mainFile, PathTool pathTool) { Name = name ?? throw new ArgumentNullException(nameof(name)); Description = description ?? throw new ArgumentNullException(nameof(description)); @@ -36,6 +38,7 @@ namespace UpToolLib.DataStructures Icon = icon ?? throw new ArgumentNullException(nameof(icon)); Runnable = runnable; MainFile = mainFile ?? throw new ArgumentNullException(nameof(mainFile)); + _pathTool = pathTool; } public Status Status @@ -75,8 +78,8 @@ Object Hash Code: {GetHashCode()}"; public static bool operator !=(App left, App right) => !(left == right); - public string AppPath => PathTool.GetAppPath(Id); - public string DataPath => PathTool.GetDataPath(Id); - public string InfoPath => PathTool.GetInfoPath(Id); + public string AppPath => _pathTool.GetAppPath(Id); + public string DataPath => _pathTool.GetDataPath(Id); + public string InfoPath => _pathTool.GetInfoPath(Id); } } \ No newline at end of file diff --git a/UpToolLib/v2/AppFactory.cs b/UpToolLib/v2/AppFactory.cs new file mode 100644 index 0000000..ffbbec5 --- /dev/null +++ b/UpToolLib/v2/AppFactory.cs @@ -0,0 +1,18 @@ +using System; +using System.Drawing; +using UpToolLib.DataStructures; +using UpToolLib.v1.Tool; + +namespace UpToolLib.v2 +{ + public class AppFactory + { + private readonly PathTool _pathTool; + + internal AppFactory(PathTool pathTool) => _pathTool = pathTool; + + public App CreateApp(string name, string description, Version version, string file, bool local, string hash, + Guid iD, Color color, object icon, bool runnable, string mainFile) => + new(name, description, version, file, local, hash, iD, color, icon, runnable, mainFile, _pathTool); + } +} \ No newline at end of file diff --git a/UpToolLib/Tool/RepoManagement.cs b/UpToolLib/v2/RepoManagement.cs similarity index 64% rename from UpToolLib/Tool/RepoManagement.cs rename to UpToolLib/v2/RepoManagement.cs index d9ba8bd..de26176 100644 --- a/UpToolLib/Tool/RepoManagement.cs +++ b/UpToolLib/v2/RepoManagement.cs @@ -5,16 +5,60 @@ using System.IO; using System.Linq; using System.Xml.Linq; using UpToolLib.DataStructures; +using UpToolLib.v1; +using UpToolLib.v1.Tool; -namespace UpToolLib.Tool +namespace UpToolLib.v2 { - public static class RepoManagement + public class RepoManagement { - public static void FetchRepos() + private readonly IExternalFunctionality _platform; + private readonly XmlTool _xmlTool; + private readonly PathTool _pathTool; + private readonly AppFactory _appFactory; + private readonly IDictionary _apps; + + public RepoManagement(IExternalFunctionality platform, XmlTool xmlTool, PathTool pathTool, AppFactory appFactory, IDictionary apps) { - XmlTool.FixXml(); - XElement meta = XDocument.Load(PathTool.InfoXml).Element("meta"); - List tmpAppsList = new List(); + _platform = platform; + _xmlTool = xmlTool; + _pathTool = pathTool; + _appFactory = appFactory; + _apps = apps; + } + + public void Save(IEnumerable repos) + { + XDocument doc = XDocument.Load(_pathTool.InfoXml); + XElement reposEl = doc.Element("meta").Element("Repos"); + reposEl.RemoveNodes(); + foreach (Repo repo in repos) + reposEl.Add(new XElement("Repo", new XElement("Name", repo.Name), new XElement("Link", repo.Url))); + doc.Save(_pathTool.InfoXml); + } + + public IEnumerable GetRepos() + { + _xmlTool.FixXml(); + XDocument doc = XDocument.Load(_pathTool.InfoXml); + XElement reposEl = doc.Element("meta").Element("Repos"); + List repos = new(); + foreach (XElement repo in reposEl.Elements("Repo")) + { + repos.Add(new Repo + { + Name = repo.Element("Name").Value, + Url = repo.Element("Link").Value + }); + } + return repos.ToArray(); + } + + public void FetchRepos() + { + _xmlTool.FixXml(); + XElement meta = XDocument.Load(_pathTool.InfoXml).Element("meta"); + List tmpAppsList = new(); List repArr = meta.Element("Repos").Elements("Repo").Select(s => s.Element("Link").Value).Distinct() .ToList(); int i = 0; @@ -25,7 +69,7 @@ namespace UpToolLib.Tool try { #endif - ExternalFunctionalityManager.Instance.Log($"[{i + 1}] Loading {repArr[i]}"); + _platform.Log($"[{i + 1}] Loading {repArr[i]}"); status = $"Loading {repArr[i]}"; XDocument repo = XDocument.Load(new Uri(repArr[i]).AbsoluteUri); status = $"Extracting repolinks"; @@ -36,11 +80,11 @@ namespace UpToolLib.Tool !tmpAppsList.Any(a => a.Element("ID").Value == app.Element("ID").Value) || !tmpAppsList .Where(a => a.Element("ID").Value == app.Element("ID").Value).Any(a => - GetVer(a.Element("Version")) >= app.Element("Version").GetVer())).ToArray() + GetVer(a.Element("Version")) >= GetVer(app.Element("Version")))).ToArray() .Concat(repo.Element("repo").Elements("applink") .Select(s => { - ExternalFunctionalityManager.Instance.Log($"- Loading {s.Value}"); + _platform.Log($"- Loading {s.Value}"); status = $"Fetching app data tag: {s.Value}"; XElement ret = XDocument.Load(new Uri(s.Value).AbsoluteUri) .Element("app"); @@ -69,8 +113,7 @@ namespace UpToolLib.Tool { tmpAppsList.Last() .Add(new XElement("Icon", - ExternalFunctionalityManager.Instance.FetchImageB64( - new Uri(app.Element("Icon").Value)))); + _platform.FetchImageB64(new Uri(app.Element("Icon").Value)))); } catch { @@ -78,9 +121,9 @@ namespace UpToolLib.Tool } tmpAppsList.Last().Add(new XElement("Platform", app.Element("Platform") == null || - !new[] {GlobalVariables.Posix, GlobalVariables.Windows}.Contains(app.Element("Platform") + !new[] {PlatformCheck.Posix, PlatformCheck.Windows}.Contains(app.Element("Platform") .Value) - ? GlobalVariables.CurrentPlatform + ? PlatformCheck.CurrentPlatform : app.Element("Platform").Value)); XElement app1 = app; if (tmpAppsList.Count(a => a.Element("ID").Value == app1.Element("ID").Value) > 1) @@ -92,7 +135,7 @@ namespace UpToolLib.Tool } catch (Exception e) { - ExternalFunctionalityManager.Instance.OkDialog( + _platform.OkDialog( $"Failed to load repo: {repArr[i]}{Environment.NewLine}Last status was: {status}{Environment.NewLine}{e}"); } #endif @@ -105,29 +148,29 @@ namespace UpToolLib.Tool XElement repos = meta.Element("LocalRepo"); repos.RemoveNodes(); tmpAppsList.ForEach(app => repos.Add(app)); - meta.Save(PathTool.InfoXml); + meta.Save(_pathTool.InfoXml); } - private static Version GetVer(this XElement el) => + private Version GetVer(XElement el) => int.TryParse(el.Value, out int i) ? new Version(0, 0, 0, i) : Version.Parse(el.Value); /// /// Load the repository cache /// /// Function to call on an exception, will ask the user whether he wants to quit - public static void GetReposFromDisk() + public void GetReposFromDisk() { - GlobalVariables.Apps.Clear(); - string xml = PathTool.InfoXml; + _apps.Clear(); + string xml = _pathTool.InfoXml; XDocument.Load(xml).Element("meta").Element("LocalRepo").Elements().ToList().ForEach(app => { - if (app.Element("Platform").Value != GlobalVariables.CurrentPlatform) return; + if (app.Element("Platform").Value != PlatformCheck.CurrentPlatform) return; Guid id = Guid.Parse(app.Element("ID").Value); - string locInPath = PathTool.GetInfoPath(id); + string locInPath = _pathTool.GetInfoPath(id); XElement locIn = File.Exists(locInPath) ? XDocument.Load(locInPath).Element("app") : app; if (int.TryParse(app.Element("Version").Value, out _)) - app.Element("Version").Value = GlobalVariables.MinimumVer.ToString(); - GlobalVariables.Apps.Add(id, new App( + app.Element("Version").Value = UpToolLibV1.MinimumVer.ToString(); + _apps.Add(id, _appFactory.CreateApp( locIn.Element("Name").Value, locIn.Element("Description").Value, Version.Parse(app.Element("Version").Value), @@ -137,38 +180,38 @@ namespace UpToolLib.Tool id, Color.White, app.Element("Icon") == null - ? ExternalFunctionalityManager.Instance.GetDefaultIcon() - : ExternalFunctionalityManager.Instance.ImageFromB64(app.Element("Icon").Value), + ? _platform.GetDefaultIcon() + : _platform.ImageFromB64(app.Element("Icon").Value), locIn.Element("MainFile") != null || app.Element("MainFile") != null, locIn.Element("MainFile") == null ? app.Element("MainFile") == null ? "" : app.Element("MainFile").Value : locIn.Element("MainFile").Value )); }); - Directory.GetDirectories(PathTool.AppsPath) + Directory.GetDirectories(_pathTool.AppsPath) .Where(s => Guid.TryParse(Path.GetFileName(s), out Guid guid) && - !GlobalVariables.Apps.ContainsKey(guid)).ToList().ForEach(s => + !_apps.ContainsKey(guid)).ToList().ForEach(s => { Guid tmp = Guid.Parse(Path.GetFileName(s)); try { - XElement data = XDocument.Load(PathTool.GetInfoPath(tmp)).Element("app"); - GlobalVariables.Apps.Add(tmp, - new App($"(local) {data.Element("Name").Value}", data.Element("Description").Value, - GlobalVariables.MinimumVer, "", true, "", tmp, Color.Red, - ExternalFunctionalityManager.Instance.GetDefaultIcon(), + XElement data = XDocument.Load(_pathTool.GetInfoPath(tmp)).Element("app"); + _apps.Add(tmp, + _appFactory.CreateApp($"(local) {data.Element("Name").Value}", data.Element("Description").Value, + UpToolLibV1.MinimumVer, "", true, "", tmp, Color.Red, + _platform.GetDefaultIcon(), data.Element("MainFile") != null, data.Element("MainFile") == null ? "" : data.Element("MainFile").Value)); } catch (Exception e) { - if (ExternalFunctionalityManager.Instance.YesNoDialog( + if (_platform.YesNoDialog( $@"An error occured while loading this local repo: {e.Message} Do you want to exit? Otherwise the folder will be deleted, possibly causeing problems later.", false)) Environment.Exit(0); else - Directory.Delete(PathTool.GetAppPath(tmp), true); + Directory.Delete(_pathTool.GetAppPath(tmp), true); } }); } diff --git a/UpToolLib/v2/TaskQueue/AppTask.cs b/UpToolLib/v2/TaskQueue/AppTask.cs new file mode 100644 index 0000000..0826d16 --- /dev/null +++ b/UpToolLib/v2/TaskQueue/AppTask.cs @@ -0,0 +1,13 @@ +using UpToolLib.DataStructures; + +namespace UpToolLib.v2.TaskQueue +{ + public abstract class AppTask + { + public abstract void Run(); + + public AppTask(IExternalFunctionality platform) => Platform = platform; + + protected IExternalFunctionality Platform { get; } + } +} \ No newline at end of file diff --git a/UpTool2/Task/InstallTask.cs b/UpToolLib/v2/TaskQueue/InstallTask.cs similarity index 57% rename from UpTool2/Task/InstallTask.cs rename to UpToolLib/v2/TaskQueue/InstallTask.cs index c8ec485..64fe618 100644 --- a/UpTool2/Task/InstallTask.cs +++ b/UpToolLib/v2/TaskQueue/InstallTask.cs @@ -1,17 +1,18 @@ using System; -using System.Windows.Forms; using UpToolLib.DataStructures; -using UpToolLib.Tool; +using UpToolLib.v1.Tool; -namespace UpTool2.Task +namespace UpToolLib.v2.TaskQueue { - internal class InstallTask : IKnownAppTask + public class InstallTask : KnownAppTask { + private readonly AppInstall _installer; private readonly Action? _postInstall; - public InstallTask(App app, Action? postInstall = null) + internal InstallTask(IExternalFunctionality platform, AppInstall installer, App app, Action? postInstall) : base(platform) { App = app; + _installer = installer; _postInstall = postInstall; } @@ -26,15 +27,14 @@ namespace UpTool2.Task try { #endif - AppInstall.Install(App, true); + _installer.Install(App, true); _postInstall?.Invoke(); trying = false; #if !DEBUG } catch (Exception e1) { - trying = MessageBox.Show(e1.ToString(), "Install failed", MessageBoxButtons.RetryCancel) == - DialogResult.Retry; + trying = Platform.YesNoDialog("Install failed. Retry?\r\nException=" + e1, true); } #endif } diff --git a/UpTool2/Task/IKnownAppTask.cs b/UpToolLib/v2/TaskQueue/KnownAppTask.cs similarity index 73% rename from UpTool2/Task/IKnownAppTask.cs rename to UpToolLib/v2/TaskQueue/KnownAppTask.cs index 2cc3f84..437126f 100644 --- a/UpTool2/Task/IKnownAppTask.cs +++ b/UpToolLib/v2/TaskQueue/KnownAppTask.cs @@ -1,11 +1,10 @@ using UpToolLib.DataStructures; -namespace UpTool2.Task +namespace UpToolLib.v2.TaskQueue { - internal abstract class IKnownAppTask : IAppTask + public abstract class KnownAppTask : AppTask { public abstract App App { get; } - public abstract void Run(); public override string ToString() => $"{TrimEnd(GetType().Name, "Task")} {App.Name}"; @@ -18,5 +17,9 @@ namespace UpTool2.Task return result; } + + protected KnownAppTask(IExternalFunctionality platform) : base(platform) + { + } } } \ No newline at end of file diff --git a/UpTool2/Task/RemoveTask.cs b/UpToolLib/v2/TaskQueue/RemoveTask.cs similarity index 53% rename from UpTool2/Task/RemoveTask.cs rename to UpToolLib/v2/TaskQueue/RemoveTask.cs index cc569d7..e1cafcc 100644 --- a/UpTool2/Task/RemoveTask.cs +++ b/UpToolLib/v2/TaskQueue/RemoveTask.cs @@ -1,17 +1,18 @@ using System; -using System.Windows.Forms; using UpToolLib.DataStructures; -using UpToolLib.Tool; +using UpToolLib.v1.Tool; -namespace UpTool2.Task +namespace UpToolLib.v2.TaskQueue { - internal class RemoveTask : IKnownAppTask + public class RemoveTask : KnownAppTask { + private readonly AppExtras _extras; private readonly Action? _postInstall; - public RemoveTask(App app, Action? postInstall = null) + internal RemoveTask(IExternalFunctionality platform, AppExtras extras, App app, Action? postInstall) : base(platform) { App = app; + _extras = extras; _postInstall = postInstall; } @@ -23,13 +24,13 @@ namespace UpTool2.Task try { #endif - AppExtras.Remove(App, true); + _extras.Remove(App, true); _postInstall?.Invoke(); #if !DEBUG } catch (Exception e1) { - MessageBox.Show(e1.ToString(), "Removal failed"); + Platform.OkDialog("Removal failed.\r\nException=" + e1); } #endif } diff --git a/UpToolLib/v2/TaskQueue/TaskFactory.cs b/UpToolLib/v2/TaskQueue/TaskFactory.cs new file mode 100644 index 0000000..eba526f --- /dev/null +++ b/UpToolLib/v2/TaskQueue/TaskFactory.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using UpToolLib.DataStructures; +using UpToolLib.v1.Tool; + +namespace UpToolLib.v2.TaskQueue +{ + public class TaskFactory + { + private IExternalFunctionality _platform; + private readonly AppInstall _installer; + private readonly AppExtras _extras; + private readonly PathTool _pathTool; + private readonly AppFactory _appFactory; + private readonly IDictionary _apps; + + internal TaskFactory(IExternalFunctionality platform, AppInstall installer, AppExtras extras, PathTool pathTool, AppFactory appFactory, IDictionary apps) + { + _platform = platform; + _installer = installer; + _extras = extras; + _pathTool = pathTool; + _appFactory = appFactory; + _apps = apps; + } + + public KnownAppTask CreateInstall(App app, Action? postInstall = null) => new InstallTask(_platform, _installer, app, postInstall); + + public KnownAppTask CreateRemove(App app, Action? postInstall = null) => new RemoveTask(_platform, _extras, app, postInstall); + + public KnownAppTask CreateUpdate(App app, Action? postInstall = null) => new UpdateTask(_platform, _extras, app, postInstall); + + public AppTask CreateUpload(string zipFile, string name, Action? postInstall = null) => new UploadTask(_platform, _installer, _appFactory, _pathTool, _apps, zipFile, name, postInstall); + } +} \ No newline at end of file diff --git a/UpTool2/Task/UpdateTask.cs b/UpToolLib/v2/TaskQueue/UpdateTask.cs similarity index 53% rename from UpTool2/Task/UpdateTask.cs rename to UpToolLib/v2/TaskQueue/UpdateTask.cs index e234e9e..ae37d28 100644 --- a/UpTool2/Task/UpdateTask.cs +++ b/UpToolLib/v2/TaskQueue/UpdateTask.cs @@ -1,17 +1,18 @@ using System; -using System.Windows.Forms; using UpToolLib.DataStructures; -using UpToolLib.Tool; +using UpToolLib.v1.Tool; -namespace UpTool2.Task +namespace UpToolLib.v2.TaskQueue { - internal class UpdateTask : IKnownAppTask + public class UpdateTask : KnownAppTask { + private readonly AppExtras _extras; private readonly Action? _postInstall; - public UpdateTask(App app, Action? postInstall = null) + internal UpdateTask(IExternalFunctionality platform, AppExtras extras, App app, Action? postInstall) : base(platform) { App = app; + _extras = extras; _postInstall = postInstall; } @@ -23,13 +24,13 @@ namespace UpTool2.Task try { #endif - AppExtras.Update(App, false); + _extras.Update(App, false); _postInstall?.Invoke(); #if !DEBUG } catch (Exception e1) { - MessageBox.Show(e1.ToString(), "Install failed"); + Platform.OkDialog("Update failed.\r\nException=" + e1); } #endif } diff --git a/UpToolLib/v2/TaskQueue/UploadTask.cs b/UpToolLib/v2/TaskQueue/UploadTask.cs new file mode 100644 index 0000000..9358317 --- /dev/null +++ b/UpToolLib/v2/TaskQueue/UploadTask.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using UpToolLib.DataStructures; +using UpToolLib.v1; +using UpToolLib.v1.Tool; + +namespace UpToolLib.v2.TaskQueue +{ + public class UploadTask : AppTask + { + private readonly string _name; + private readonly Action? _postInstall; + private readonly AppInstall _installer; + private readonly AppFactory _appFactory; + private readonly PathTool _pathTool; + private readonly IDictionary _apps; + public readonly string ZipFile; + + internal UploadTask(IExternalFunctionality platform, AppInstall installer, AppFactory appFactory, PathTool pathTool, IDictionary apps, string zipFile, string name, Action? postInstall) : base(platform) + { + _installer = installer; + _appFactory = appFactory; + _pathTool = pathTool; + _apps = apps; + ZipFile = zipFile; + _name = name; + _postInstall = postInstall; + } + + public override void Run() + { +#if !DEBUG + try + { +#endif + Guid id = Guid.NewGuid(); + while (_apps.ContainsKey(id) || Directory.Exists(_pathTool.GetAppPath(id))) + id = Guid.NewGuid(); + App appI = _appFactory.CreateApp(_name, "Locally installed package, removal only", + UpToolLibV1.MinimumVer, "", true, "", id, Color.Red, Platform.GetDefaultIcon(), false, ""); + _installer.InstallZip(ZipFile, appI, true); + _postInstall?.Invoke(); +#if !DEBUG + } + catch (Exception e1) + { + Platform.OkDialog("Upload failed.\r\nException=" + e1); + } +#endif + } + + public override string ToString() => $"Install local {Path.GetFileName(ZipFile)}"; + } +} \ No newline at end of file diff --git a/UpToolLib/v2/UpToolLibV2.cs b/UpToolLib/v2/UpToolLibV2.cs new file mode 100644 index 0000000..40cd064 --- /dev/null +++ b/UpToolLib/v2/UpToolLibV2.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using UpToolLib.DataStructures; +using UpToolLib.v1.Tool; +using UpToolLib.v2.TaskQueue; + +namespace UpToolLib.v2 +{ + public class UpToolLibV2 + { + internal UpToolLibV2(IExternalFunctionality platform, AppInstall install, AppExtras extras, PathTool pathTool, XmlTool xmlTool, IDictionary apps) + { + AppFactory = new AppFactory(pathTool); + UpdateChecker = new UpdateChecker(pathTool); + TaskFactory = new TaskFactory(platform, install, extras, pathTool, AppFactory, apps); + RepoManagement = new RepoManagement(platform, xmlTool, pathTool, AppFactory, apps); + } + + public readonly UpdateChecker UpdateChecker; + public readonly TaskFactory TaskFactory; + public readonly AppFactory AppFactory; + public readonly RepoManagement RepoManagement; + } +} \ No newline at end of file diff --git a/UpToolLib/v2/UpdateCheck.cs b/UpToolLib/v2/UpdateCheck.cs new file mode 100644 index 0000000..4cbeb87 --- /dev/null +++ b/UpToolLib/v2/UpdateCheck.cs @@ -0,0 +1,23 @@ +using System; +using System.Xml.Linq; + +namespace UpToolLib.v2 +{ + public class UpdateCheck + { + public readonly Version OnlineVersion; + public readonly Uri Installer; + public readonly string InstallerHash; + public readonly Uri App; + public readonly string AppHash; + + public UpdateCheck(XElement meta) + { + OnlineVersion = Version.Parse(meta.Element("Version").Value); + Installer = new Uri(meta.Element("Installer").Value); + InstallerHash = meta.Element("InstallerHash").Value.ToUpper(); + App = new Uri(meta.Element("File").Value); + AppHash = meta.Element("Hash").Value.ToUpper(); + } + } +} \ No newline at end of file diff --git a/UpToolLib/v2/UpdateChecker.cs b/UpToolLib/v2/UpdateChecker.cs new file mode 100644 index 0000000..d4bceab --- /dev/null +++ b/UpToolLib/v2/UpdateChecker.cs @@ -0,0 +1,13 @@ +using System.Xml.Linq; +using UpToolLib.v1.Tool; + +namespace UpToolLib.v2 +{ + public class UpdateChecker + { + private readonly PathTool _pathTool; + public UpdateCheck Check() => Check(XDocument.Load(_pathTool.InfoXml).Element("meta").Element("UpdateSource").Value); + public UpdateCheck Check(string source) => new(XDocument.Load(source).Element("meta")); + internal UpdateChecker(PathTool pathTool) => _pathTool = pathTool; + } +} \ No newline at end of file