mirror of
https://github.com/chylex/TweetDuck.git
synced 2025-04-22 09:15:48 +02:00
Add update downloader and installer
This commit is contained in:
parent
f0132f59e5
commit
de363c982f
@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using CefSharp;
|
||||
@ -8,6 +7,7 @@
|
||||
using TweetDck.Core.Handling;
|
||||
using TweetDck.Core.Other;
|
||||
using TweetDck.Resources;
|
||||
using TweetDck.Core.Utils;
|
||||
using TweetDck.Core.Controls;
|
||||
|
||||
namespace TweetDck.Core{
|
||||
@ -18,6 +18,8 @@ private static UserConfig Config{
|
||||
}
|
||||
}
|
||||
|
||||
public string UpdateInstallerPath { get; private set; }
|
||||
|
||||
private readonly ChromiumWebBrowser browser;
|
||||
private readonly TweetDeckBridge bridge;
|
||||
private readonly FormNotification notification;
|
||||
@ -174,5 +176,24 @@ public void OpenAbout(){
|
||||
public void OnTweetPopup(TweetNotification tweet){
|
||||
notification.ShowNotification(tweet);
|
||||
}
|
||||
|
||||
public void BeginUpdateProcess(string versionTag, string downloadUrl){
|
||||
Hide();
|
||||
|
||||
FormUpdateDownload downloadForm = new FormUpdateDownload(new UpdateInfo(versionTag,downloadUrl));
|
||||
downloadForm.MoveToCenter(this);
|
||||
downloadForm.ShowDialog();
|
||||
|
||||
if (downloadForm.UpdateStatus == FormUpdateDownload.Status.Succeeded){
|
||||
UpdateInstallerPath = downloadForm.InstallerPath;
|
||||
Close();
|
||||
}
|
||||
else if (downloadForm.UpdateStatus == FormUpdateDownload.Status.Manual){
|
||||
Close();
|
||||
}
|
||||
else{
|
||||
Show();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -58,6 +58,7 @@ public void OnTweetPopup(string tweetHtml, int tweetCharacters){
|
||||
|
||||
public void OnUpdateAccepted(string versionTag, string downloadUrl){
|
||||
form.InvokeSafe(() => {
|
||||
form.BeginUpdateProcess(versionTag,downloadUrl);
|
||||
});
|
||||
}
|
||||
|
||||
|
103
Core/Other/FormUpdateDownload.Designer.cs
generated
Normal file
103
Core/Other/FormUpdateDownload.Designer.cs
generated
Normal file
@ -0,0 +1,103 @@
|
||||
namespace TweetDck.Core.Other {
|
||||
partial class FormUpdateDownload {
|
||||
/// <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.progressDownload = new System.Windows.Forms.ProgressBar();
|
||||
this.btnCancel = new System.Windows.Forms.Button();
|
||||
this.labelDescription = new System.Windows.Forms.Label();
|
||||
this.labelStatus = new System.Windows.Forms.Label();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// progressDownload
|
||||
//
|
||||
this.progressDownload.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.progressDownload.Location = new System.Drawing.Point(12, 32);
|
||||
this.progressDownload.MarqueeAnimationSpeed = 40;
|
||||
this.progressDownload.Maximum = 1000;
|
||||
this.progressDownload.Name = "progressDownload";
|
||||
this.progressDownload.Size = new System.Drawing.Size(361, 23);
|
||||
this.progressDownload.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
|
||||
this.progressDownload.TabIndex = 0;
|
||||
//
|
||||
// btnCancel
|
||||
//
|
||||
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnCancel.AutoSize = true;
|
||||
this.btnCancel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||
this.btnCancel.Location = new System.Drawing.Point(317, 61);
|
||||
this.btnCancel.Name = "btnCancel";
|
||||
this.btnCancel.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||
this.btnCancel.Size = new System.Drawing.Size(56, 23);
|
||||
this.btnCancel.TabIndex = 1;
|
||||
this.btnCancel.Text = "Cancel";
|
||||
this.btnCancel.UseVisualStyleBackColor = true;
|
||||
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
|
||||
//
|
||||
// labelDescription
|
||||
//
|
||||
this.labelDescription.AutoSize = true;
|
||||
this.labelDescription.Location = new System.Drawing.Point(13, 13);
|
||||
this.labelDescription.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);
|
||||
this.labelDescription.Name = "labelDescription";
|
||||
this.labelDescription.Size = new System.Drawing.Size(0, 13);
|
||||
this.labelDescription.TabIndex = 2;
|
||||
//
|
||||
// labelStatus
|
||||
//
|
||||
this.labelStatus.AutoSize = true;
|
||||
this.labelStatus.Location = new System.Drawing.Point(12, 62);
|
||||
this.labelStatus.Name = "labelStatus";
|
||||
this.labelStatus.Size = new System.Drawing.Size(0, 13);
|
||||
this.labelStatus.TabIndex = 3;
|
||||
//
|
||||
// FormUpdateDownload
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(385, 96);
|
||||
this.Controls.Add(this.labelStatus);
|
||||
this.Controls.Add(this.labelDescription);
|
||||
this.Controls.Add(this.btnCancel);
|
||||
this.Controls.Add(this.progressDownload);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||
this.Icon = global::TweetDck.Properties.Resources.icon;
|
||||
this.MaximizeBox = false;
|
||||
this.Name = "FormUpdateDownload";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormUpdateDownload_FormClosing);
|
||||
this.Shown += new System.EventHandler(this.FormUpdateDownload_Shown);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.ProgressBar progressDownload;
|
||||
private System.Windows.Forms.Button btnCancel;
|
||||
private System.Windows.Forms.Label labelDescription;
|
||||
private System.Windows.Forms.Label labelStatus;
|
||||
}
|
||||
}
|
108
Core/Other/FormUpdateDownload.cs
Normal file
108
Core/Other/FormUpdateDownload.cs
Normal file
@ -0,0 +1,108 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Windows.Forms;
|
||||
using TweetDck.Core.Controls;
|
||||
using TweetDck.Core.Utils;
|
||||
|
||||
namespace TweetDck.Core.Other{
|
||||
sealed partial class FormUpdateDownload : Form{
|
||||
public string InstallerPath{
|
||||
get{
|
||||
return Path.Combine(Path.GetTempPath(),updateInfo.FileName);
|
||||
}
|
||||
}
|
||||
|
||||
public enum Status{
|
||||
Waiting, Failed, Cancelled, Manual, Succeeded
|
||||
}
|
||||
|
||||
public Status UpdateStatus { get; private set; }
|
||||
|
||||
private readonly WebClient webClient;
|
||||
private readonly UpdateInfo updateInfo;
|
||||
|
||||
public FormUpdateDownload(UpdateInfo info){
|
||||
InitializeComponent();
|
||||
|
||||
this.webClient = new WebClient{ Proxy = null };
|
||||
this.webClient.Headers[HttpRequestHeader.UserAgent] = BrowserUtils.HeaderUserAgent;
|
||||
|
||||
this.updateInfo = info;
|
||||
this.UpdateStatus = Status.Waiting;
|
||||
|
||||
Disposed += (sender, args) => webClient.Dispose();
|
||||
|
||||
webClient.DownloadProgressChanged += webClient_DownloadProgressChanged;
|
||||
webClient.DownloadFileCompleted += webClient_DownloadFileCompleted;
|
||||
|
||||
Text = "Updating "+Program.BrandName;
|
||||
labelDescription.Text = "Downloading version "+info.VersionTag+"...";
|
||||
}
|
||||
|
||||
private void FormUpdateDownload_Shown(object sender, EventArgs e){
|
||||
webClient.DownloadFileAsync(new Uri(updateInfo.DownloadUrl),InstallerPath);
|
||||
}
|
||||
|
||||
private void btnCancel_Click(object sender, EventArgs e){
|
||||
webClient.CancelAsync();
|
||||
btnCancel.Enabled = false;
|
||||
}
|
||||
|
||||
private void FormUpdateDownload_FormClosing(object sender, FormClosingEventArgs e){
|
||||
if (UpdateStatus == Status.Waiting){
|
||||
e.Cancel = true;
|
||||
webClient.CancelAsync();
|
||||
UpdateStatus = e.CloseReason == CloseReason.UserClosing ? Status.Cancelled : Status.Manual; // manual will exit the app
|
||||
}
|
||||
}
|
||||
|
||||
private void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e){
|
||||
this.InvokeSafe(() => {
|
||||
if (e.TotalBytesToReceive == -1){
|
||||
if (progressDownload.Style != ProgressBarStyle.Marquee){
|
||||
progressDownload.Style = ProgressBarStyle.Continuous;
|
||||
progressDownload.SetValueInstant(1000);
|
||||
}
|
||||
|
||||
labelStatus.Text = (e.BytesReceived/(1024.0*1024.0)).ToString("0.0")+" MB";
|
||||
}
|
||||
else{
|
||||
if (progressDownload.Style != ProgressBarStyle.Continuous){
|
||||
progressDownload.Style = ProgressBarStyle.Continuous;
|
||||
}
|
||||
|
||||
progressDownload.SetValueInstant(e.ProgressPercentage*10);
|
||||
labelStatus.Text = (e.BytesReceived/(1024.0*1024.0)).ToString("0.0")+" / "+(e.TotalBytesToReceive/(1024.0*1024.0)).ToString("0.0")+" MB";
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void webClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e){
|
||||
this.InvokeSafe(() => {
|
||||
if (e.Cancelled){
|
||||
if (UpdateStatus == Status.Waiting){
|
||||
UpdateStatus = Status.Cancelled;
|
||||
}
|
||||
}
|
||||
else if (e.Error != null){
|
||||
Program.Log(e.Error.ToString());
|
||||
|
||||
if (MessageBox.Show("Could not download the update: "+e.Error.Message+"\r\n\r\nDo you want to open the website and try downloading the update manually?","Update Has Failed",MessageBoxButtons.YesNo,MessageBoxIcon.Error,MessageBoxDefaultButton.Button1) == DialogResult.Yes){
|
||||
BrowserUtils.OpenExternalBrowser(Program.Website);
|
||||
UpdateStatus = Status.Manual;
|
||||
}
|
||||
else{
|
||||
UpdateStatus = Status.Failed;
|
||||
}
|
||||
}
|
||||
else{
|
||||
UpdateStatus = Status.Succeeded;
|
||||
}
|
||||
|
||||
Close();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
17
Core/Utils/UpdateInfo.cs
Normal file
17
Core/Utils/UpdateInfo.cs
Normal file
@ -0,0 +1,17 @@
|
||||
namespace TweetDck.Core.Utils{
|
||||
class UpdateInfo{
|
||||
public readonly string VersionTag;
|
||||
public readonly string DownloadUrl;
|
||||
|
||||
public string FileName{
|
||||
get{
|
||||
return BrowserUtils.GetFileNameFromUrl(DownloadUrl) ?? Program.BrandName+".Update.exe";
|
||||
}
|
||||
}
|
||||
|
||||
public UpdateInfo(string versionTag, string downloadUrl){
|
||||
this.VersionTag = versionTag;
|
||||
this.DownloadUrl = downloadUrl;
|
||||
}
|
||||
}
|
||||
}
|
@ -91,7 +91,13 @@ private static void Main(){
|
||||
Cef.Shutdown();
|
||||
};
|
||||
|
||||
Application.Run(new FormBrowser());
|
||||
FormBrowser mainForm = new FormBrowser();
|
||||
Application.Run(mainForm);
|
||||
|
||||
if (mainForm.UpdateInstallerPath != null){
|
||||
Process.Start(mainForm.UpdateInstallerPath,"/SP- /SILENT /NOICONS /CLOSEAPPLICATIONS");
|
||||
Application.Exit();
|
||||
}
|
||||
}
|
||||
|
||||
public static void HandleException(string message, Exception e){
|
||||
|
@ -239,8 +239,8 @@
|
||||
});
|
||||
|
||||
buttonDiv.children(".tdu-btn-download").click(function(){
|
||||
ele.remove();
|
||||
$TD.onUpdateAccepted(version,download);
|
||||
ele.slideUp(function(){ ele.remove(); });
|
||||
});
|
||||
|
||||
buttonDiv.children(".tdu-btn-dismiss").click(function(){
|
||||
@ -267,9 +267,8 @@
|
||||
$.getJSON("https://api.github.com/repos/chylex/"+$TD.brandName+"/releases/latest",function(response){
|
||||
var tagName = response.tag_name;
|
||||
|
||||
if (tagName != $TD.versionTag && tagName != $TD.dismissedVersionTag){
|
||||
var dlLink = "https://github.com/chylex/"+$TD.brandName+"/releases/download/"+tagName+"/"+response.assets[0].name;
|
||||
createUpdateNotificationElement(tagName,dlLink);
|
||||
if (tagName != $TD.versionTag && tagName != $TD.dismissedVersionTag && response.assets.length > 0){
|
||||
createUpdateNotificationElement(tagName,response.assets[0].browser_download_url);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
@ -125,7 +125,14 @@
|
||||
<Compile Include="Core\Other\FormSettings.Designer.cs">
|
||||
<DependentUpon>FormSettings.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Core\Other\FormUpdateDownload.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Core\Other\FormUpdateDownload.Designer.cs">
|
||||
<DependentUpon>FormUpdateDownload.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Core\Utils\BrowserUtils.cs" />
|
||||
<Compile Include="Core\Utils\UpdateInfo.cs" />
|
||||
<Compile Include="Migration\FormMigrationQuestion.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
|
Loading…
Reference in New Issue
Block a user