Merge branch 'master' of https://github.com/rmcrackan/Libation
This commit is contained in:
commit
b9e789bbcf
@ -1,109 +0,0 @@
|
|||||||
using DataLayer;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace LibationWinForms.BookLiberation
|
|
||||||
{
|
|
||||||
partial class DownloadForm
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Windows Form Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
this.filenameLbl = new System.Windows.Forms.Label();
|
|
||||||
this.progressBar1 = new System.Windows.Forms.ProgressBar();
|
|
||||||
this.progressLbl = new System.Windows.Forms.Label();
|
|
||||||
this.lastUpdateLbl = new System.Windows.Forms.Label();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// filenameLbl
|
|
||||||
//
|
|
||||||
this.filenameLbl.AutoSize = true;
|
|
||||||
this.filenameLbl.Location = new System.Drawing.Point(12, 9);
|
|
||||||
this.filenameLbl.Name = "filenameLbl";
|
|
||||||
this.filenameLbl.Size = new System.Drawing.Size(52, 13);
|
|
||||||
this.filenameLbl.TabIndex = 0;
|
|
||||||
this.filenameLbl.Text = "[filename]";
|
|
||||||
//
|
|
||||||
// progressBar1
|
|
||||||
//
|
|
||||||
this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.progressBar1.Location = new System.Drawing.Point(15, 67);
|
|
||||||
this.progressBar1.Name = "progressBar1";
|
|
||||||
this.progressBar1.Size = new System.Drawing.Size(877, 23);
|
|
||||||
this.progressBar1.TabIndex = 4;
|
|
||||||
//
|
|
||||||
// progressLbl
|
|
||||||
//
|
|
||||||
this.progressLbl.Location = new System.Drawing.Point(12, 36);
|
|
||||||
this.progressLbl.Name = "progressLbl";
|
|
||||||
this.progressLbl.Size = new System.Drawing.Size(173, 13);
|
|
||||||
this.progressLbl.TabIndex = 5;
|
|
||||||
this.progressLbl.Text = "[2,999,999,999] of [2,999,999,999]";
|
|
||||||
this.progressLbl.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
|
||||||
//
|
|
||||||
// lastUpdateLbl
|
|
||||||
//
|
|
||||||
this.lastUpdateLbl.AutoSize = true;
|
|
||||||
this.lastUpdateLbl.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
|
||||||
this.lastUpdateLbl.ForeColor = System.Drawing.Color.DarkRed;
|
|
||||||
this.lastUpdateLbl.Location = new System.Drawing.Point(361, 36);
|
|
||||||
this.lastUpdateLbl.Name = "lastUpdateLbl";
|
|
||||||
this.lastUpdateLbl.Size = new System.Drawing.Size(81, 13);
|
|
||||||
this.lastUpdateLbl.TabIndex = 6;
|
|
||||||
this.lastUpdateLbl.Text = "Last updated";
|
|
||||||
this.lastUpdateLbl.Visible = false;
|
|
||||||
//
|
|
||||||
// DownloadForm
|
|
||||||
//
|
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.ClientSize = new System.Drawing.Size(904, 102);
|
|
||||||
this.Controls.Add(this.lastUpdateLbl);
|
|
||||||
this.Controls.Add(this.progressLbl);
|
|
||||||
this.Controls.Add(this.progressBar1);
|
|
||||||
this.Controls.Add(this.filenameLbl);
|
|
||||||
this.MaximizeBox = false;
|
|
||||||
this.MinimizeBox = false;
|
|
||||||
this.Name = "DownloadForm";
|
|
||||||
this.ShowIcon = false;
|
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
|
||||||
this.Text = "Downloading";
|
|
||||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DownloadForm_FormClosing);
|
|
||||||
this.Load += new System.EventHandler(this.DownloadForm_Load);
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private System.Windows.Forms.Label filenameLbl;
|
|
||||||
private System.Windows.Forms.ProgressBar progressBar1;
|
|
||||||
private System.Windows.Forms.Label progressLbl;
|
|
||||||
private System.Windows.Forms.Label lastUpdateLbl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,85 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using Dinah.Core.Net.Http;
|
|
||||||
using Dinah.Core.Threading;
|
|
||||||
using FileLiberator;
|
|
||||||
|
|
||||||
namespace LibationWinForms.BookLiberation
|
|
||||||
{
|
|
||||||
public partial class DownloadForm : Form
|
|
||||||
{
|
|
||||||
protected Streamable Streamable { get; private set; }
|
|
||||||
protected LogMe LogMe { get; private set; }
|
|
||||||
private SynchronizeInvoker Invoker { get; init; }
|
|
||||||
|
|
||||||
public DownloadForm()
|
|
||||||
{
|
|
||||||
//SynchronizationContext.Current will be null until the process contains a Form.
|
|
||||||
//If this is the first form created, it will not exist until after execution
|
|
||||||
//reaches inside the constructor (after base class has been initialized).
|
|
||||||
Invoker = new SynchronizeInvoker();
|
|
||||||
InitializeComponent();
|
|
||||||
|
|
||||||
this.SetLibationIcon();
|
|
||||||
progressLbl.Text = "";
|
|
||||||
filenameLbl.Text = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RegisterFileLiberator(Streamable streamable, LogMe logMe = null)
|
|
||||||
{
|
|
||||||
if (streamable is null) return;
|
|
||||||
streamable.StreamingBegin += Streamable_StreamingBegin;
|
|
||||||
streamable.StreamingProgressChanged += Streamable_StreamingProgressChanged;
|
|
||||||
streamable.StreamingCompleted += (_, _) => this.UIThreadAsync(Close);
|
|
||||||
Streamable = streamable;
|
|
||||||
LogMe = logMe;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#region Streamable event handler overrides
|
|
||||||
public void Streamable_StreamingBegin(object sender, string beginString)
|
|
||||||
{
|
|
||||||
Invoker.UIThreadAsync(Show);
|
|
||||||
filenameLbl.UIThreadAsync(() => filenameLbl.Text = beginString);
|
|
||||||
}
|
|
||||||
public void Streamable_StreamingProgressChanged(object sender, DownloadProgress downloadProgress)
|
|
||||||
{
|
|
||||||
// this won't happen with download file. it will happen with download string
|
|
||||||
if (!downloadProgress.TotalBytesToReceive.HasValue || downloadProgress.TotalBytesToReceive.Value <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
progressLbl.UIThreadAsync(() => progressLbl.Text = $"{downloadProgress.BytesReceived:#,##0} of {downloadProgress.TotalBytesToReceive.Value:#,##0}");
|
|
||||||
|
|
||||||
var d = double.Parse(downloadProgress.BytesReceived.ToString()) / double.Parse(downloadProgress.TotalBytesToReceive.Value.ToString()) * 100.0;
|
|
||||||
var i = int.Parse(Math.Truncate(d).ToString());
|
|
||||||
progressBar1.UIThreadAsync(() => progressBar1.Value = i);
|
|
||||||
|
|
||||||
lastDownloadProgress = DateTime.Now;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region timer
|
|
||||||
private Timer timer { get; } = new Timer { Interval = 1000 };
|
|
||||||
private void DownloadForm_Load(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
timer.Tick += new EventHandler(timer_Tick);
|
|
||||||
timer.Start();
|
|
||||||
}
|
|
||||||
private DateTime lastDownloadProgress = DateTime.Now;
|
|
||||||
private void timer_Tick(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
// if no update in the last 30 seconds, display frozen label
|
|
||||||
lastUpdateLbl.UIThreadAsync(() => lastUpdateLbl.Visible = lastDownloadProgress.AddSeconds(30) < DateTime.Now);
|
|
||||||
if (lastUpdateLbl.Visible)
|
|
||||||
{
|
|
||||||
var diff = DateTime.Now - lastDownloadProgress;
|
|
||||||
var min = (int)diff.TotalMinutes;
|
|
||||||
var minText = min > 0 ? $"{min}min " : "";
|
|
||||||
|
|
||||||
lastUpdateLbl.UIThreadAsync(() => lastUpdateLbl.Text = $"Frozen? Last download activity: {minText}{diff.Seconds}sec ago");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void DownloadForm_FormClosing(object sender, FormClosingEventArgs e) => timer.Stop();
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,61 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
</root>
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace LibationWinForms.BookLiberation
|
namespace LibationWinForms.ProcessQueue
|
||||||
{
|
{
|
||||||
public interface ILogForm
|
public interface ILogForm
|
||||||
{
|
{
|
||||||
@ -1,11 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
|
||||||
using FileLiberator;
|
|
||||||
|
|
||||||
namespace LibationWinForms.BookLiberation
|
namespace LibationWinForms.ProcessQueue
|
||||||
{
|
{
|
||||||
// decouple serilog and form. include convenience factory method
|
// decouple serilog and form. include convenience factory method
|
||||||
public class LogMe
|
public class LogMe
|
||||||
@ -45,28 +44,4 @@ namespace LibationWinForms.BookLiberation
|
|||||||
public void Error(string text) => LogErrorString?.Invoke(this, text);
|
public void Error(string text) => LogErrorString?.Invoke(this, text);
|
||||||
public void Error(Exception ex, string text = null) => LogError?.Invoke(this, (ex, text));
|
public void Error(Exception ex, string text = null) => LogError?.Invoke(this, (ex, text));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ProcessorAutomationController
|
|
||||||
{
|
|
||||||
public static void DownloadFile(string url, string destination, bool showDownloadCompletedDialog = false)
|
|
||||||
{
|
|
||||||
Serilog.Log.Logger.Information($"Begin {nameof(DownloadFile)} for {url}");
|
|
||||||
|
|
||||||
void onDownloadFileStreamingCompleted(object sender, string savedFile)
|
|
||||||
{
|
|
||||||
Serilog.Log.Logger.Information($"Completed {nameof(DownloadFile)} for {url}. Saved to {savedFile}");
|
|
||||||
|
|
||||||
if (showDownloadCompletedDialog)
|
|
||||||
MessageBox.Show($"File downloaded to:{Environment.NewLine}{Environment.NewLine}{savedFile}");
|
|
||||||
}
|
|
||||||
|
|
||||||
var downloadFile = new DownloadFile();
|
|
||||||
var downloadForm = new DownloadForm();
|
|
||||||
downloadForm.RegisterFileLiberator(downloadFile);
|
|
||||||
downloadFile.StreamingCompleted += onDownloadFileStreamingCompleted;
|
|
||||||
|
|
||||||
async void runDownload() => await downloadFile.PerformDownloadFileAsync(url, destination);
|
|
||||||
new Task(runDownload).Start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -2,7 +2,6 @@
|
|||||||
using Dinah.Core;
|
using Dinah.Core;
|
||||||
using FileLiberator;
|
using FileLiberator;
|
||||||
using LibationFileManager;
|
using LibationFileManager;
|
||||||
using LibationWinForms.BookLiberation;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
using LibationWinForms.BookLiberation;
|
using System;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|||||||
@ -188,18 +188,25 @@ namespace LibationWinForms
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var result = MessageBox.Show($"New version available @ {htmlUrl}\r\nDownload the zip file?", "New version available", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
|
var result = MessageBox.Show($"New version available @ {htmlUrl}\r\n\r\nWould you like to upgrade?", "New version available", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
|
||||||
if (result != DialogResult.Yes)
|
if (result != DialogResult.Yes)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var fileSelector = new SaveFileDialog { FileName = zipName, Filter = "Zip Files (*.zip)|*.zip|All files (*.*)|*.*" };
|
//Download the upgrader app from github
|
||||||
if (fileSelector.ShowDialog() != DialogResult.OK)
|
string fileName = "ht" + "tps://github.com/Mbucari/Upgrader/raw/master/Upgrader/win-x86/Upgrader.exe";
|
||||||
return;
|
var cli = new System.Net.Http.HttpClient();
|
||||||
var selectedPath = fileSelector.FileName;
|
var upgrader = cli.GetByteArrayAsync(fileName).GetAwaiter().GetResult();
|
||||||
|
|
||||||
BookLiberation.ProcessorAutomationController.DownloadFile(zipUrl, selectedPath, true);
|
|
||||||
|
string upgraderPath = Path.Combine(Path.GetTempPath(), "Upgrader.exe");
|
||||||
|
File.WriteAllBytes(upgraderPath, upgrader);
|
||||||
|
var thisExe = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
|
||||||
|
|
||||||
|
//usage is Upgrader.exe [zip url] [extract directory] [exe to launch]
|
||||||
|
System.Diagnostics.Process.Start(upgraderPath, new string[] { zipUrl, Path.GetDirectoryName(thisExe), "Libation.exe" });
|
||||||
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user