using System; using System.IO; using System.Net; using TweetDuck.Core.Utils; namespace TweetDuck.Updates{ 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, $"TweetDuck.{versionTag}.exe"); } public void BeginSilentDownload(){ if (DownloadStatus == UpdateDownloadStatus.None || DownloadStatus == 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; } currentDownload = BrowserUtils.DownloadFileAsync(downloadUrl, InstallerPath, () => { DownloadStatus = UpdateDownloadStatus.Done; currentDownload = null; }, e => { DownloadError = e; DownloadStatus = UpdateDownloadStatus.Failed; currentDownload = null; }); } } public void DeleteInstaller(){ DownloadStatus = UpdateDownloadStatus.None; if (currentDownload != null && currentDownload.IsBusy){ 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(); } } }