1
0
mirror of https://github.com/chylex/TweetDuck.git synced 2024-10-17 09:42:45 +02:00
TweetDuck/lib/TweetLib.Core/Systems/Updates/UpdateInfo.cs
2022-02-05 23:34:00 +01:00

95 lines
2.5 KiB
C#

using System;
using System.IO;
using System.Net;
using TweetLib.Utils.Static;
namespace TweetLib.Core.Systems.Updates {
public sealed class UpdateInfo {
public string VersionTag { get; }
public string ReleaseNotes { get; }
public string InstallerPath { get; }
public UpdateDownloadStatus DownloadStatus { get; private set; }
public Exception? DownloadError { get; private set; }
private readonly string? downloadUrl;
private readonly string installerFolder;
private WebClient? currentDownload;
public UpdateInfo(string versionTag, string releaseNotes, string? downloadUrl, string installerFolder) {
this.downloadUrl = downloadUrl;
this.installerFolder = installerFolder;
this.VersionTag = versionTag;
this.ReleaseNotes = releaseNotes;
this.InstallerPath = Path.Combine(installerFolder, $"{Lib.BrandName}.{versionTag}.exe");
}
internal void BeginSilentDownload() {
if (FileUtils.FileExistsAndNotEmpty(InstallerPath)) {
DownloadStatus = UpdateDownloadStatus.Done;
return;
}
if (DownloadStatus is UpdateDownloadStatus.None or UpdateDownloadStatus.Failed) {
DownloadStatus = UpdateDownloadStatus.InProgress;
if (string.IsNullOrEmpty(downloadUrl)) {
DownloadError = new InvalidDataException("Missing installer asset.");
DownloadStatus = UpdateDownloadStatus.AssetMissing;
return;
}
try {
Directory.CreateDirectory(installerFolder);
} catch (Exception e) {
DownloadError = e;
DownloadStatus = UpdateDownloadStatus.Failed;
return;
}
WebClient client = WebUtils.NewClient();
client.DownloadFileCompleted += WebUtils.FileDownloadCallback(InstallerPath, () => {
DownloadStatus = UpdateDownloadStatus.Done;
currentDownload = null;
}, e => {
DownloadError = e;
DownloadStatus = UpdateDownloadStatus.Failed;
currentDownload = null;
});
client.DownloadFileAsync(new Uri(downloadUrl!), InstallerPath);
}
}
internal void DeleteInstaller() {
DownloadStatus = UpdateDownloadStatus.None;
if (currentDownload is { IsBusy: true }) {
currentDownload.CancelAsync(); // deletes file when cancelled
return;
}
try {
File.Delete(InstallerPath);
} catch {
// rip
}
}
public void CancelDownload() {
DeleteInstaller();
DownloadStatus = UpdateDownloadStatus.Canceled;
}
public override bool Equals(object? obj) {
return obj is UpdateInfo info && VersionTag == info.VersionTag;
}
public override int GetHashCode() {
return VersionTag.GetHashCode();
}
}
}