using System; using System.IO; using System.Net; using System.Threading; using System.Windows.Forms; using Update.Config; using Update.Core.Entities; using Update.Core.Events; using Update.Net.Events; using ErrorEventArgs = Update.Core.Events.ErrorEventArgs; namespace Update.Core { partial class Updater { /// /// 异步检查开始 /// protected virtual void ClientCheckAsync() { DisposeAvaliables(); HostConfig.RefreshVersion(); if (!File.Exists(HostConfig.ExecutablePath)) { OnError(new ErrorEventArgs("要更新的程序不存在。")); return; } OnNotify(new NotifyEventArgs("正在下载更新信息。")); OnCheckStarted(new CheckStartedEventArgs()); try { string url = HttpUtils.GetDownloadUrl(Const.Key); m_Client.DownloadStringAsync(new Uri(url)); } catch (Exception e) { return; } } /// /// 异步检查完成 /// /// 结果 protected virtual void ClientCheckCompleted(DownloadStringCompletedEventArgs e) { //用户取消 if (e.Cancelled) { OnNotify(new NotifyEventArgs("已取消更新。")); return; } //出错 if (e.Error != null) { OnError(new ErrorEventArgs("下载更新信息失败:{0}。", e.Error.Message.TrimEnd(PERIOD))); return; } //解析 Packages packages; try { packages = new Packages(e.Result); } catch (Exception exp) { OnError(new ErrorEventArgs("解析更新信息失败:{0}。", exp.Message.TrimEnd(PERIOD))); return; } //可用更新 PackageCollection avaliables = packages.GetAvailables(HostConfig.CurrentVersion); //MessageBox.Show(e.Result+HostConfig.CurrentVersion); bool uptodate = avaliables.Count < 1; OnNotify(new NotifyEventArgs(uptodate ? "已是最新版本。" : "发现新版本。")); CheckCompletedEventArgs ce = new CheckCompletedEventArgs(uptodate); OnCheckCompleted(ce); if (uptodate || ce.Handled) { return; } m_Avaliables = avaliables.GetEnumerator(); //开始更新 OnUpdateStarted(new UpdateStartedEventArgs(avaliables)); ClientKillAsync(); } /// /// 异步结束进程开始 /// protected virtual void ClientKillAsync() { //结束进程 OnNotify(new NotifyEventArgs("正在结束占用进程。")); m_Client?.KillProcessAsync(HostConfig.ExecutableDirectory); } /// /// 异步结束进程完成 /// /// 结果 protected virtual void ClientKillCompleted(KillProcessCompletedEventArgs e) { //用户取消 if (e.Cancelled) { OnNotify(new NotifyEventArgs("已取消更新。")); return; } //出错 if (e.Error != null) { OnError(new ErrorEventArgs("结束占用进程失败:{0}。", e.Error.Message.TrimEnd(PERIOD))); return; } //开始下载 ClientDownloadAsync(); } /// /// 异步下载开始 /// protected virtual void ClientDownloadAsync() { //验证 if (m_Avaliables == null) { OnError(new ErrorEventArgs("必须先检查更新。")); return; } //下一个 if (!m_Avaliables.MoveNext()) { OnNotify(new NotifyEventArgs("更新完成。")); OnUpdateCompleted(new UpdateCompletedEventArgs()); return; } IPackage package = m_Avaliables.Current; OnNotify(new NotifyEventArgs("正在下载 {0}。", package.FileName)); try { string url = HttpUtils.GetDownloadUrl(package.FileName); m_Client.DownloadDataAsync(new Uri(url), package); } catch (Exception e) { return; } } /// /// 异步下载完成 /// /// 结果 protected virtual void ClientDownloadCompleted(DownloadDataCompletedEventArgs e) { //验证 IPackage package = e.UserState as IPackage; if (package == null) { OnError(new ErrorEventArgs("无效的下载操作。")); return; } //用户取消 if (e.Cancelled) { OnNotify(new NotifyEventArgs("已取消更新。")); return; } //出错 if (e.Error != null) { OnError(new ErrorEventArgs("下载 {0} 失败:{1}。", package.FileName, e.Error.Message.TrimEnd(PERIOD))); return; } ClientDecompressAsync(e.Result, package); } /// /// 异步解压开始 /// /// 要解压的数据 /// 更新包 protected virtual void ClientDecompressAsync(byte[] data, IPackage package) { //由于MBI的Exe的文件结构特殊,所以解压地址取上一级文件 string decompressPath = (new DirectoryInfo(HostConfig.ExecutableDirectory)).Parent?.FullName; //string decompressPath = HostConfig.ExecutableDirectory; //解压 OnNotify(new NotifyEventArgs("正在解压 {0}。", package.FileName)); m_Client.DecompressDataAsync(data, PACKAGE_DELETE, HostConfig.ExecutableName, decompressPath, package); } /// /// 异步解压完成 /// /// 结果 protected virtual void ClientDecompressCompleted(DecompressDataCompletedEventArgs e) { //验证 IPackage package = e.UserState as IPackage; if (package == null) { OnError(new ErrorEventArgs("无效的解压操作。")); return; } //用户取消 if (e.Cancelled) { OnNotify(new NotifyEventArgs("已取消更新。")); return; } //出错 if (e.Error != null) { OnError(new ErrorEventArgs("解压 {0} 失败:{1}。", package.FileName, e.Error.Message.TrimEnd(PERIOD))); return; } //继续下一个 ClientDownloadAsync(); } /// /// 检查版本是否过期 /// /// public bool IsClientOverdue() { //解析 Packages packages; try { string url = HostConfig.DownLoadURL; var result = m_Client.DownloadString(new Uri(url)); packages = new Packages(result); } catch (Exception exp) { return false; } //可用更新 return packages.HasAvailable(HostConfig.CurrentVersion); } } }