From 6ba8c0ca91750dd089355fe0727168ed084f8958 Mon Sep 17 00:00:00 2001 From: Robert McRackan Date: Wed, 21 Jul 2021 07:10:01 -0400 Subject: [PATCH] Decrypt form: remove debug window --- FileManager/Configuration.cs | 22 +- LibationLauncher/LibationLauncher.csproj | 2 +- LibationLauncher/Program.cs | 194 ++++++++++-------- .../BookLiberation/DecryptForm.Designer.cs | 23 +-- .../BookLiberation/DecryptForm.cs | 42 +--- 5 files changed, 132 insertions(+), 151 deletions(-) diff --git a/FileManager/Configuration.cs b/FileManager/Configuration.cs index 2c182afd..83ff73fd 100644 --- a/FileManager/Configuration.cs +++ b/FileManager/Configuration.cs @@ -248,23 +248,29 @@ namespace FileManager // Directory.Delete(AppDir); //} - libationFilesPathCache = null; - var startingContents = File.ReadAllText(APPSETTINGS_JSON); var jObj = JObject.Parse(startingContents); jObj[LIBATION_FILES_KEY] = directory; var endingContents = JsonConvert.SerializeObject(jObj, Formatting.Indented); - if (startingContents != endingContents) - { - try { Serilog.Log.Logger.Information("Libation files changed {@DebugInfo}", new { APPSETTINGS_JSON, LIBATION_FILES_KEY, directory }); } - catch { } - File.WriteAllText(APPSETTINGS_JSON, endingContents); - } + if (startingContents == endingContents) + return true; + try + { + Serilog.Log.Logger.Information("Libation files changed {@DebugInfo}", new { APPSETTINGS_JSON, LIBATION_FILES_KEY, directory }); + } + catch { } + + // now it's set in the file again but no settings have moved yet + File.WriteAllText(APPSETTINGS_JSON, endingContents); + + //// attempting this will try to change the settings file which has not yet been moved + // var logPath = Path.Combine(LibationFiles, "Log.log"); + // SetWithJsonPath("Serilog.WriteTo[1].Args", "path", logPath); return true; } diff --git a/LibationLauncher/LibationLauncher.csproj b/LibationLauncher/LibationLauncher.csproj index f04f6077..977a5834 100644 --- a/LibationLauncher/LibationLauncher.csproj +++ b/LibationLauncher/LibationLauncher.csproj @@ -13,7 +13,7 @@ win-x64 - 5.2.2.1 + 5.2.2.47 diff --git a/LibationLauncher/Program.cs b/LibationLauncher/Program.cs index 7db329cc..0911315c 100644 --- a/LibationLauncher/Program.cs +++ b/LibationLauncher/Program.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Windows.Forms; using AudibleApi; using AudibleApi.Authorization; +using Dinah.Core.IO; using Dinah.Core.Logging; using FileManager; using InternalUtilities; @@ -18,9 +19,16 @@ namespace LibationLauncher { static class Program { + [System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)] + [return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)] + static extern bool AllocConsole(); + [STAThread] static void Main() { + //// uncomment to see Console. MUST be called before anything writes to Console. Might only work from VS + //AllocConsole(); + Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); @@ -47,8 +55,8 @@ namespace LibationLauncher ensureSerilogConfig(config); configureLogging(config); - checkForUpdate(config); logStartupState(config); + checkForUpdate(config); Application.Run(new Form1()); } @@ -257,7 +265,7 @@ namespace LibationLauncher new JObject { // for this sink to work, a path must be provided. we override this below - { "path", Path.Combine(Configuration.Instance.LibationFiles, "_Log.log") }, + { "path", Path.Combine(config.LibationFiles, "_Log.log") }, { "rollingInterval", "Month" }, // Serilog template formatting examples // - default: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" @@ -276,109 +284,35 @@ namespace LibationLauncher config.SetObject("Serilog", serilogObj); } + // to restore original: Console.SetOut(origOut); + private static System.IO.TextWriter origOut { get; } = Console.Out; + private static void configureLogging(Configuration config) { - // override path. always use current libation files - var logPath = Path.Combine(Configuration.Instance.LibationFiles, "Log.log"); - config.SetWithJsonPath("Serilog.WriteTo[1].Args", "path", logPath); + { + // always override path here. + // init in ensureSerilogConfig() only happens when serilog setting is first created (prob on 1st run). + // the override here uses current libation files every time we restart libation + var logPath = Path.Combine(config.LibationFiles, "Log.log"); + config.SetWithJsonPath("Serilog.WriteTo[1].Args", "path", logPath); + } - //// hack which achieves the same - //configuration["Serilog:WriteTo:1:Args:path"] = logPath; - - // CONFIGURATION-DRIVEN (json) var configuration = new ConfigurationBuilder() - .AddJsonFile(config.SettingsFilePath) + .AddJsonFile(config.SettingsFilePath, optional: false, reloadOnChange: true) .Build(); Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .CreateLogger(); - //// MANUAL HARD CODED - //Log.Logger = new LoggerConfiguration() - // // requires: using Dinah.Core.Logging; - // .Enrich.WithCaller() - // .MinimumLevel.Information() - // .WriteTo.File(logPath, - // rollingInterval: RollingInterval.Month, - // outputTemplate: code_outputTemplate) - // .CreateLogger(); + // Fwd Console to serilog. Serilog also write to Console (should probably change this) so it might be asking for trouble. + // First SerilogTextWriter needs to be more robust and tested. Esp the Write() methods + Console.SetOut(new MultiTextWriter(origOut, new SerilogTextWriter())); // .Here() captures debug info via System.Runtime.CompilerServices attributes. Warning: expensive //var withLineNumbers_outputTemplate = "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message}{NewLine}in method {MemberName} at {FilePath}:{LineNumber}{NewLine}{Exception}{NewLine}"; //Log.Logger.Here().Debug("Begin Libation. Debug with line numbers"); } - private static void checkForUpdate(Configuration config) - { - string zipUrl; - string selectedPath; - - try - { - // timed out - var latest = getLatestRelease(TimeSpan.FromSeconds(30)); - if (latest is null) - return; - - var latestVersionString = latest.TagName.Trim('v'); - if (!Version.TryParse(latestVersionString, out var latestRelease)) - return; - - // we're up to date - if (latestRelease <= BuildVersion) - return; - - // we have an update - var zip = latest.Assets.FirstOrDefault(a => a.BrowserDownloadUrl.EndsWith(".zip")); - zipUrl = zip?.BrowserDownloadUrl; - if (zipUrl is null) - { - MessageBox.Show(latest.HtmlUrl, "New version available"); - return; - } - - var result = MessageBox.Show($"New version available @ {latest.HtmlUrl}\r\nDownload the zip file?", "New version available", MessageBoxButtons.YesNo, MessageBoxIcon.Question); - if (result != DialogResult.Yes) - return; - - using var fileSelector = new SaveFileDialog { FileName = zip.Name, Filter = "Zip Files (*.zip)|*.zip|All files (*.*)|*.*" }; - if (fileSelector.ShowDialog() != DialogResult.OK) - return; - selectedPath = fileSelector.FileName; - } - catch (Exception ex) - { - MessageBoxAlertAdmin.Show("Error checking for update", "Error checking for update", ex); - return; - } - - try - { - LibationWinForms.BookLiberation.ProcessorAutomationController.DownloadFile(zipUrl, selectedPath, true); - } - catch (Exception ex) - { - MessageBoxAlertAdmin.Show("Error downloading update", "Error downloading update", ex); - } - } - - private static Octokit.Release getLatestRelease(TimeSpan timeout) - { - var task = System.Threading.Tasks.Task.Run(() => getLatestRelease()); - if (task.Wait(timeout)) - return task.Result; - return null; - } - private static Octokit.Release getLatestRelease() - { - var gitHubClient = new Octokit.GitHubClient(new Octokit.ProductHeaderValue("Libation")); - - // https://octokitnet.readthedocs.io/en/latest/releases/ - var releases = gitHubClient.Repository.Release.GetAll("rmcrackan", "Libation").GetAwaiter().GetResult(); - var latest = releases.First(r => !r.Draft && !r.Prerelease); - return latest; - } - private static void logStartupState(Configuration config) { // begin logging session with a form feed @@ -421,6 +355,86 @@ Libation. ".Trim(), "Verbose logging enabled", MessageBoxButtons.OK, MessageBoxIcon.Warning); } + private static void checkForUpdate(Configuration config) + { + string zipUrl; + string selectedPath; + + try + { + // timed out + var latest = getLatestRelease(TimeSpan.FromSeconds(30)); + if (latest is null) + return; + + var latestVersionString = latest.TagName.Trim('v'); + if (!Version.TryParse(latestVersionString, out var latestRelease)) + return; + + // we're up to date + if (latestRelease <= BuildVersion) + return; + + // we have an update + var zip = latest.Assets.FirstOrDefault(a => a.BrowserDownloadUrl.EndsWith(".zip")); + zipUrl = zip?.BrowserDownloadUrl; + + Log.Logger.Information("Update available: {@DebugInfo}", new { + latestRelease = latestRelease.ToString(), + latest.HtmlUrl, + zipUrl + }); + + if (zipUrl is null) + { + MessageBox.Show(latest.HtmlUrl, "New version available"); + return; + } + + var result = MessageBox.Show($"New version available @ {latest.HtmlUrl}\r\nDownload the zip file?", "New version available", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + if (result != DialogResult.Yes) + return; + + using var fileSelector = new SaveFileDialog { FileName = zip.Name, Filter = "Zip Files (*.zip)|*.zip|All files (*.*)|*.*" }; + if (fileSelector.ShowDialog() != DialogResult.OK) + return; + selectedPath = fileSelector.FileName; + } + catch (Exception ex) + { + MessageBoxAlertAdmin.Show("Error checking for update", "Error checking for update", ex); + return; + } + + try + { + LibationWinForms.BookLiberation.ProcessorAutomationController.DownloadFile(zipUrl, selectedPath, true); + } + catch (Exception ex) + { + MessageBoxAlertAdmin.Show("Error downloading update", "Error downloading update", ex); + } + } + + private static Octokit.Release getLatestRelease(TimeSpan timeout) + { + var task = System.Threading.Tasks.Task.Run(() => getLatestRelease()); + if (task.Wait(timeout)) + return task.Result; + + Log.Logger.Information("Timed out"); + return null; + } + private static Octokit.Release getLatestRelease() + { + var gitHubClient = new Octokit.GitHubClient(new Octokit.ProductHeaderValue("Libation")); + + // https://octokitnet.readthedocs.io/en/latest/releases/ + var releases = gitHubClient.Repository.Release.GetAll("rmcrackan", "Libation").GetAwaiter().GetResult(); + var latest = releases.First(r => !r.Draft && !r.Prerelease); + return latest; + } + private static Version BuildVersion => System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; } } diff --git a/LibationWinForms/BookLiberation/DecryptForm.Designer.cs b/LibationWinForms/BookLiberation/DecryptForm.Designer.cs index 39afd4c0..e279b1ec 100644 --- a/LibationWinForms/BookLiberation/DecryptForm.Designer.cs +++ b/LibationWinForms/BookLiberation/DecryptForm.Designer.cs @@ -31,7 +31,6 @@ this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.bookInfoLbl = new System.Windows.Forms.Label(); this.progressBar1 = new System.Windows.Forms.ProgressBar(); - this.rtbLog = new System.Windows.Forms.RichTextBox(); this.remainingTimeLbl = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.SuspendLayout(); @@ -60,28 +59,16 @@ // this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.progressBar1.Location = new System.Drawing.Point(14, 607); + this.progressBar1.Location = new System.Drawing.Point(14, 143); this.progressBar1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); this.progressBar1.Name = "progressBar1"; this.progressBar1.Size = new System.Drawing.Size(611, 27); this.progressBar1.TabIndex = 2; // - // rtbLog - // - this.rtbLog.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.rtbLog.Location = new System.Drawing.Point(14, 136); - this.rtbLog.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.rtbLog.Name = "rtbLog"; - this.rtbLog.Size = new System.Drawing.Size(678, 463); - this.rtbLog.TabIndex = 1; - this.rtbLog.Text = ""; - // // remainingTimeLbl // this.remainingTimeLbl.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.remainingTimeLbl.Location = new System.Drawing.Point(632, 607); + this.remainingTimeLbl.Location = new System.Drawing.Point(632, 143); this.remainingTimeLbl.Name = "remainingTimeLbl"; this.remainingTimeLbl.Size = new System.Drawing.Size(60, 31); this.remainingTimeLbl.TabIndex = 3; @@ -92,9 +79,8 @@ // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(707, 647); + this.ClientSize = new System.Drawing.Size(707, 183); this.Controls.Add(this.remainingTimeLbl); - this.Controls.Add(this.rtbLog); this.Controls.Add(this.progressBar1); this.Controls.Add(this.bookInfoLbl); this.Controls.Add(this.pictureBox1); @@ -102,8 +88,6 @@ this.Name = "DecryptForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "DecryptForm"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DecryptForm_FormClosing); - this.Load += new System.EventHandler(this.DecryptForm_Load); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -115,7 +99,6 @@ private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.Label bookInfoLbl; private System.Windows.Forms.ProgressBar progressBar1; - private System.Windows.Forms.RichTextBox rtbLog; private System.Windows.Forms.Label remainingTimeLbl; } } \ No newline at end of file diff --git a/LibationWinForms/BookLiberation/DecryptForm.cs b/LibationWinForms/BookLiberation/DecryptForm.cs index 3dcf7360..bbd562d0 100644 --- a/LibationWinForms/BookLiberation/DecryptForm.cs +++ b/LibationWinForms/BookLiberation/DecryptForm.cs @@ -1,43 +1,21 @@ using System; using System.Windows.Forms; -using Dinah.Core.Drawing; -using Dinah.Core.IO; using Dinah.Core.Windows.Forms; namespace LibationWinForms.BookLiberation { public partial class DecryptForm : Form { - public DecryptForm() - { - InitializeComponent(); - } - - System.IO.TextWriter origOut { get; } = Console.Out; - private void DecryptForm_Load(object sender, EventArgs e) - { - // redirect Console.WriteLine to console, textbox - var multiLogger = new MultiTextWriter( - origOut, - new RichTextBoxTextWriter(this.rtbLog), - new SerilogTextWriter()); - Console.SetOut(multiLogger); - } - - private void DecryptForm_FormClosing(object sender, FormClosingEventArgs e) - { - // restore original - Console.SetOut(origOut); - } + public DecryptForm() => InitializeComponent(); // book info - string title; - string authorNames; - string narratorNames; + private string title; + private string authorNames; + private string narratorNames; public void SetTitle(string title) { - this.UIThread(() => this.Text = " Decrypting " + title); + this.UIThread(() => this.Text = "Decrypting " + title); this.title = title; updateBookInfo(); } @@ -62,15 +40,15 @@ namespace LibationWinForms.BookLiberation public void UpdateProgress(int percentage) { if (percentage == 0) - remainingTimeLbl.UIThread(() => remainingTimeLbl.Text = "ETA:\r\n0 sec"); - + updateRemainingTime(0); else progressBar1.UIThread(() => progressBar1.Value = percentage); } public void UpdateRemainingTime(TimeSpan remaining) - { - remainingTimeLbl.UIThread(() => remainingTimeLbl.Text = $"ETA:\r\n{(int)remaining.TotalSeconds} sec"); - } + => updateRemainingTime((int)remaining.TotalSeconds); + + private void updateRemainingTime(int remaining) + => remainingTimeLbl.UIThread(() => remainingTimeLbl.Text = $"ETA:\r\n{remaining} sec"); } }