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");
}
}