From 5ef72b81aef8c565ead7091fa62ea6c77b47a250 Mon Sep 17 00:00:00 2001 From: qianlifeng Date: Sun, 1 Feb 2015 22:46:56 +0800 Subject: [PATCH] Add upgrade dialog --- Wox.Core/Updater/Release.cs | 5 + Wox.Core/Updater/UpdaterManager.cs | 103 ++++++++---- Wox.Core/Updater/WoxUpdateSource.cs | 68 ++++++++ Wox.Core/Wox.Core.csproj | 1 + Wox.Infrastructure/Http/HttpRequest.cs | 33 ++-- Wox/Images/update.png | Bin 0 -> 17420 bytes Wox/Languages/en.xaml | 10 +- Wox/Languages/zh-cn.xaml | 220 +++++++++++++------------ Wox/Languages/zh-tw.xaml | 219 ++++++++++++------------ Wox/MainWindow.xaml.cs | 21 +++ Wox/Wox.csproj | 13 ++ Wox/WoxUpdate.xaml | 45 +++++ Wox/WoxUpdate.xaml.cs | 34 ++++ Wox/packages.config | 1 + 14 files changed, 507 insertions(+), 266 deletions(-) create mode 100644 Wox.Core/Updater/WoxUpdateSource.cs create mode 100644 Wox/Images/update.png create mode 100644 Wox/WoxUpdate.xaml create mode 100644 Wox/WoxUpdate.xaml.cs diff --git a/Wox.Core/Updater/Release.cs b/Wox.Core/Updater/Release.cs index e2e157a943..4808ffefb1 100644 --- a/Wox.Core/Updater/Release.cs +++ b/Wox.Core/Updater/Release.cs @@ -7,5 +7,10 @@ public string download_link1 { get; set; } public string download_link2 { get; set; } public string description { get; set; } + + public override string ToString() + { + return version; + } } } \ No newline at end of file diff --git a/Wox.Core/Updater/UpdaterManager.cs b/Wox.Core/Updater/UpdaterManager.cs index c45ab02ff8..258d3c0b6f 100644 --- a/Wox.Core/Updater/UpdaterManager.cs +++ b/Wox.Core/Updater/UpdaterManager.cs @@ -1,11 +1,15 @@ using System; +using System.Collections.Generic; using System.IO; +using System.Linq; +using System.Net; using System.Reflection; using System.Windows.Forms; using System.Windows.Threading; using NAppUpdate.Framework; using NAppUpdate.Framework.Common; using NAppUpdate.Framework.Sources; +using NAppUpdate.Framework.Tasks; using Newtonsoft.Json; using Wox.Core.i18n; using Wox.Core.UserSettings; @@ -18,9 +22,15 @@ namespace Wox.Core.Updater { private static UpdaterManager instance; private const string VersionCheckURL = "https://api.getwox.com/release/latest/"; - private const string UpdateFeedURL = "http://upgrade.getwox.com/update.xml"; + //private const string UpdateFeedURL = "http://upgrade.getwox.com/update.xml"; + private const string UpdateFeedURL = "http://127.0.0.1:8888/update.xml"; private static SemanticVersion currentVersion; + public event EventHandler PrepareUpdateReady; + public event EventHandler UpdateError; + + public Release NewRelease { get; set; } + public static UpdaterManager Instance { get @@ -57,6 +67,19 @@ namespace Wox.Core.Updater return new SemanticVersion(release.version) > CurrentVersion; } + public List GetAvailableUpdateFiles() + { + List files = new List(); + foreach (var task in UpdateManager.Instance.Tasks) + { + if (task is FileUpdateTask) + { + files.Add(((FileUpdateTask)task).LocalPath); + } + } + return files; + } + public void CheckUpdate() { string json = HttpRequest.Get(VersionCheckURL, HttpProxy.Instance); @@ -64,14 +87,15 @@ namespace Wox.Core.Updater { try { - Release newRelease = JsonConvert.DeserializeObject(json); - if (IsNewerThanCurrent(newRelease)) + NewRelease = JsonConvert.DeserializeObject(json); + if (IsNewerThanCurrent(NewRelease) && !UserSettingStorage.Instance.DontPromptUpdateMsg) { StartUpdate(); } } - catch + catch (System.Exception e) { + Log.Error(e); } } } @@ -105,45 +129,52 @@ namespace Wox.Core.Updater updManager.BeginPrepareUpdates(result => { ((UpdateProcessAsyncResult)result).EndInvoke(); - string updateReady = InternationalizationManager.Instance.GetTranslation("update_wox_update_ready"); - string updateInstall = InternationalizationManager.Instance.GetTranslation("update_wox_update_install"); - updateInstall = string.Format(updateInstall, updManager.UpdatesAvailable); - DialogResult dr = MessageBox.Show(updateInstall, updateReady, MessageBoxButtons.YesNo); - - if (dr == DialogResult.Yes) - { - - // ApplyUpdates is a synchronous method by design. Make sure to save all user work before calling - // it as it might restart your application - // get out of the way so the console window isn't obstructed - try - { - updManager.ApplyUpdates(true, UserSettingStorage.Instance.EnableUpdateLog, false); - } - catch (System.Exception e) - { - string updateError = - InternationalizationManager.Instance.GetTranslation("update_wox_update_error"); - Log.Error(e); - MessageBox.Show(updateError); - } - - updManager.CleanUp(); - } - else - { - updManager.CleanUp(); - } + OnPrepareUpdateReady(); }, null); }, null); } + public void CleanUp() + { + UpdateManager.Instance.CleanUp(); + } + + public void ApplyUpdates() + { + // ApplyUpdates is a synchronous method by design. Make sure to save all user work before calling + // it as it might restart your application + // get out of the way so the console window isn't obstructed + try + { + UpdateManager.Instance.ApplyUpdates(true, UserSettingStorage.Instance.EnableUpdateLog, false); + } + catch (System.Exception e) + { + string updateError = InternationalizationManager.Instance.GetTranslation("update_wox_update_error"); + Log.Error(e); + MessageBox.Show(updateError); + OnUpdateError(); + } + + UpdateManager.Instance.CleanUp(); + } + private IUpdateSource GetUpdateSource() { - // Normally this would be a web based source. - // But for the demo app, we prepare an in-memory source. - var source = new SimpleWebSource(UpdateFeedURL); + var source = new WoxUpdateSource(UpdateFeedURL, HttpRequest.GetWebProxy(HttpProxy.Instance)); return source; } + + protected virtual void OnPrepareUpdateReady() + { + var handler = PrepareUpdateReady; + if (handler != null) handler(this, EventArgs.Empty); + } + + protected virtual void OnUpdateError() + { + var handler = UpdateError; + if (handler != null) handler(this, EventArgs.Empty); + } } } diff --git a/Wox.Core/Updater/WoxUpdateSource.cs b/Wox.Core/Updater/WoxUpdateSource.cs new file mode 100644 index 0000000000..20b66e2f66 --- /dev/null +++ b/Wox.Core/Updater/WoxUpdateSource.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using NAppUpdate.Framework.Common; +using NAppUpdate.Framework.Sources; +using NAppUpdate.Framework.Utils; + +namespace Wox.Core.Updater +{ + internal class WoxUpdateSource : IUpdateSource + { + public IWebProxy Proxy { get; set; } + + public string FeedUrl { get; set; } + + public WoxUpdateSource(string feedUrl,IWebProxy proxy) + { + this.FeedUrl = feedUrl; + this.Proxy = proxy; + } + + private void TryResolvingHost() + { + Uri uri = new Uri(this.FeedUrl); + try + { + Dns.GetHostEntry(uri.Host); + } + catch (System.Exception ex) + { + throw new WebException(string.Format("Failed to resolve {0}. Check your connectivity.", (object)uri.Host), WebExceptionStatus.ConnectFailure); + } + } + + public string GetUpdatesFeed() + { + this.TryResolvingHost(); + string str = string.Empty; + WebRequest webRequest = WebRequest.Create(this.FeedUrl); + webRequest.Method = "GET"; + webRequest.Proxy = this.Proxy; + using (WebResponse response = webRequest.GetResponse()) + { + Stream responseStream = response.GetResponseStream(); + if (responseStream != null) + { + using (StreamReader streamReader = new StreamReader(responseStream, true)) + str = streamReader.ReadToEnd(); + } + } + return str; + } + + public bool GetData(string url, string baseUrl, Action onProgress, ref string tempLocation) + { + if (!string.IsNullOrEmpty(baseUrl) && !baseUrl.EndsWith("/")) + baseUrl += "/"; + FileDownloader fileDownloader = !Uri.IsWellFormedUriString(url, UriKind.Absolute) ? (!Uri.IsWellFormedUriString(baseUrl, UriKind.Absolute) ? (string.IsNullOrEmpty(baseUrl) ? new FileDownloader(url) : new FileDownloader(new Uri(new Uri(baseUrl), url))) : new FileDownloader(new Uri(new Uri(baseUrl, UriKind.Absolute), url))) : new FileDownloader(url); + fileDownloader.Proxy = this.Proxy; + if (string.IsNullOrEmpty(tempLocation) || !Directory.Exists(Path.GetDirectoryName(tempLocation))) + tempLocation = Path.GetTempFileName(); + return fileDownloader.DownloadToFile(tempLocation, onProgress); + } + } +} diff --git a/Wox.Core/Wox.Core.csproj b/Wox.Core/Wox.Core.csproj index 032f760103..84940b3039 100644 --- a/Wox.Core/Wox.Core.csproj +++ b/Wox.Core/Wox.Core.csproj @@ -71,6 +71,7 @@ + diff --git a/Wox.Infrastructure/Http/HttpRequest.cs b/Wox.Infrastructure/Http/HttpRequest.cs index 5c08377d6b..e80501936f 100644 --- a/Wox.Infrastructure/Http/HttpRequest.cs +++ b/Wox.Infrastructure/Http/HttpRequest.cs @@ -14,6 +14,24 @@ namespace Wox.Infrastructure.Http return Get(url, encoding, proxy); } + public static WebProxy GetWebProxy(IHttpProxy proxy) + { + if (proxy != null && proxy.Enabled && !string.IsNullOrEmpty(proxy.Server)) + { + if (string.IsNullOrEmpty(proxy.UserName) || string.IsNullOrEmpty(proxy.Password)) + { + return new WebProxy(proxy.Server, proxy.Port); + } + + return new WebProxy(proxy.Server, proxy.Port) + { + Credentials = new NetworkCredential(proxy.UserName, proxy.Password) + }; + } + + return null; + } + private static string Get(string url, string encoding, IHttpProxy proxy) { if (string.IsNullOrEmpty(url)) return string.Empty; @@ -21,20 +39,7 @@ namespace Wox.Infrastructure.Http HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Method = "GET"; request.Timeout = 10 * 1000; - if (proxy != null && proxy.Enabled && !string.IsNullOrEmpty(proxy.Server)) - { - if (string.IsNullOrEmpty(proxy.UserName) || string.IsNullOrEmpty(proxy.Password)) - { - request.Proxy = new WebProxy(proxy.Server, proxy.Port); - } - else - { - request.Proxy = new WebProxy(proxy.Server, proxy.Port) - { - Credentials = new NetworkCredential(proxy.UserName, proxy.Password) - }; - } - } + request.Proxy = GetWebProxy(proxy); try { diff --git a/Wox/Images/update.png b/Wox/Images/update.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e43cf0cdb85140eedfd9f034c8672d8acc35d8 GIT binary patch literal 17420 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 literal 0 HcmV?d00001 diff --git a/Wox/Languages/en.xaml b/Wox/Languages/en.xaml index b53fe9640a..54ad62c9a4 100644 --- a/Wox/Languages/en.xaml +++ b/Wox/Languages/en.xaml @@ -103,8 +103,14 @@ Wox got an error - Wox updates available - Wox updates are ready to install. {0} files will be added and replaced, this operation may restart Wox. Do you wish to install them now? + Wox new version V{0} is available An error occurred while trying to install software updates + Update + Cancel + This upgrade will restart Wox + Following files will be updated + Update files + Update description + \ No newline at end of file diff --git a/Wox/Languages/zh-cn.xaml b/Wox/Languages/zh-cn.xaml index a55209272e..39688d68f7 100644 --- a/Wox/Languages/zh-cn.xaml +++ b/Wox/Languages/zh-cn.xaml @@ -1,108 +1,114 @@ - - - 注册热键:{0} 失败 - 启动命令 {0} 失败 - 不是合法的Wox插件格式 - - - - Wox设置 - 通用 - 开机启动 - 失去焦点时自动隐藏Wox - 不显示新版本提示 - 语言 - - - 插件 - 浏览更多插件 - 禁用 - 触发关键字 - 插件目录 - 作者 - - - 主题 - 浏览更多主题 - 你好,Wox - 查询框字体 - 结果项字体 - 窗口模式 - 透明度 - - - 热键 - Wox激活热键 - 自定义查询热键 - 删除 - 编辑 - 增加 - 请选择一项 - 你确定要删除插件 {0} 的热键吗? - - - 代理 - 启用代理 - 服务器 - 端口 - 用户名 - 密码 - 测试代理 - 保存 - 服务器不能为空 - 端口不能为空 - 非法的端口格式 - 保存代理设置成功 - 代理设置正确 - 代理连接失败 - - - 关于 - 网站 - 版本 - 你已经激活了Wox {0} 次 - - - 旧触发关键字 - 新触发关键字 - 取消 - 确定 - 找不到指定的插件 - 新触发关键字不能为空 - 新触发关键字已经被指派给其他插件了,请重新选择一个关键字 - 成功 - 如果你不想设置触发关键字,可以使用*代替 - - - 预览 - 热键不可用,请选择一个新的热键 - 插件热键不合法 - 更新 - - - 热键不可用 - - - 版本 - 时间 - 请告诉我们如何重现此问题,以便我们进行修复 - 发送报告 - 取消 - 基本信息 - 异常信息 - 异常类型 - 异常源 - 堆栈信息 - 发送中 - 发送成功 - 发送失败 - Wox出错啦 - - - Wox更新 - Wox更新啦!{0}个文件会被添加和替换,并且在此过程中可能会重启Wox。你确定需要更新吗? - 更新Wox出错 - + + + 注册热键:{0} 失败 + 启动命令 {0} 失败 + 不是合法的Wox插件格式 + + + + Wox设置 + 通用 + 开机启动 + 失去焦点时自动隐藏Wox + 不显示新版本提示 + 语言 + + + 插件 + 浏览更多插件 + 禁用 + 触发关键字 + 插件目录 + 作者 + + + 主题 + 浏览更多主题 + 你好,Wox + 查询框字体 + 结果项字体 + 窗口模式 + 透明度 + + + 热键 + Wox激活热键 + 自定义查询热键 + 删除 + 编辑 + 增加 + 请选择一项 + 你确定要删除插件 {0} 的热键吗? + + + 代理 + 启用代理 + 服务器 + 端口 + 用户名 + 密码 + 测试代理 + 保存 + 服务器不能为空 + 端口不能为空 + 非法的端口格式 + 保存代理设置成功 + 代理设置正确 + 代理连接失败 + + + 关于 + 网站 + 版本 + 你已经激活了Wox {0} 次 + + + 旧触发关键字 + 新触发关键字 + 取消 + 确定 + 找不到指定的插件 + 新触发关键字不能为空 + 新触发关键字已经被指派给其他插件了,请重新选择一个关键字 + 成功 + 如果你不想设置触发关键字,可以使用*代替 + + + 预览 + 热键不可用,请选择一个新的热键 + 插件热键不合法 + 更新 + + + 热键不可用 + + + 版本 + 时间 + 请告诉我们如何重现此问题,以便我们进行修复 + 发送报告 + 取消 + 基本信息 + 异常信息 + 异常类型 + 异常源 + 堆栈信息 + 发送中 + 发送成功 + 发送失败 + Wox出错啦 + + + 发现Wox新版本 V{0} + 更新Wox出错 + 更新 + 取消 + 此更新需要重启Wox + 下列文件会被更新 + 更新文件 + 更新日志 + + \ No newline at end of file diff --git a/Wox/Languages/zh-tw.xaml b/Wox/Languages/zh-tw.xaml index 587eb7fd81..694cd3175a 100644 --- a/Wox/Languages/zh-tw.xaml +++ b/Wox/Languages/zh-tw.xaml @@ -1,108 +1,113 @@ - - - 註冊熱鍵:{0} 失敗 - 啟動命令 {0} 失敗 - 不是合法的Wox插件格式 - - - - Wox設置 - 通用 - 開機啟動 - 失去焦點時自動隱藏Wox - 不顯示新版本提示 - 語言 - - - 插件 - 瀏覽更多插件 - 禁用 - 觸發關鍵字 - 插件目錄 - 作者 - - - 主題 - 瀏覽更多主題 - 你好,Wox - 查詢框字體 - 結果項字體 - 窗口模式 - 透明度 - - - 熱鍵 - Wox激活熱鍵 - 自定義查詢熱鍵 - 刪除 - 編輯 - 增加 - 請選擇一項 - 你確定要刪除插件 {0} 的熱鍵嗎? - - - 代理 - 啟用代理 - 服務器 - 端口 - 用戶名 - 密碼 - 測試代理 - 保存 - 服務器不能為空 - 端口不能為空 - 非法的端口格式 - 保存代理設置成功 - 代理設置正確 - 代理連接失敗 - - - 關於 - 網站 - 版本 - 你已經激活了Wox {0} 次 - - - 舊觸發關鍵字 - 新觸發關鍵字 - 取消 - 確定 - 找不到指定的插件 - 新觸發關鍵字不能為空 - 新觸發關鍵字已經被指派給其他插件了,請重新選擇一個關鍵字 - 成功 - 如果你不想設置觸發關鍵字,可以使用*代替 - - - 預覽 - 熱鍵不可用,請選擇一個新的熱鍵 - 插件熱鍵不合法 - 更新 - - - 熱鍵不可用 - - - 版本 - 時間 - 請告訴我們如何重現此問題,以便我們進行修復 - 發送報告 - 取消 - 基本信息 - 異常信息 - 異常類型 - 異常源 - 堆棧信息 - 發送中 - 發送成功 - 發送失敗 - Wox出錯啦 - - - Wox更新 - Wox更新啦!{0}個文件會被添加和替換,並且在此過程中可能會重啟Wox。你確定需要更新嗎? - 更新Wox出錯 - + + + 註冊熱鍵:{0} 失敗 + 啟動命令 {0} 失敗 + 不是合法的Wox插件格式 + + + + Wox設置 + 通用 + 開機啟動 + 失去焦點時自動隱藏Wox + 不顯示新版本提示 + 語言 + + + 插件 + 瀏覽更多插件 + 禁用 + 觸發關鍵字 + 插件目錄 + 作者 + + + 主題 + 瀏覽更多主題 + 你好,Wox + 查詢框字體 + 結果項字體 + 窗口模式 + 透明度 + + + 熱鍵 + Wox激活熱鍵 + 自定義查詢熱鍵 + 刪除 + 編輯 + 增加 + 請選擇一項 + 你確定要刪除插件 {0} 的熱鍵嗎? + + + 代理 + 啟用代理 + 服務器 + 端口 + 用戶名 + 密碼 + 測試代理 + 保存 + 服務器不能為空 + 端口不能為空 + 非法的端口格式 + 保存代理設置成功 + 代理設置正確 + 代理連接失敗 + + + 關於 + 網站 + 版本 + 你已經激活了Wox {0} 次 + + + 舊觸發關鍵字 + 新觸發關鍵字 + 取消 + 確定 + 找不到指定的插件 + 新觸發關鍵字不能為空 + 新觸發關鍵字已經被指派給其他插件了,請重新選擇一個關鍵字 + 成功 + 如果你不想設置觸發關鍵字,可以使用*代替 + + + 預覽 + 熱鍵不可用,請選擇一個新的熱鍵 + 插件熱鍵不合法 + 更新 + + + 熱鍵不可用 + + + 版本 + 時間 + 請告訴我們如何重現此問題,以便我們進行修復 + 發送報告 + 取消 + 基本信息 + 異常信息 + 異常類型 + 異常源 + 堆棧信息 + 發送中 + 發送成功 + 發送失敗 + Wox出錯啦 + + + 發現Wox新版本 V{0} + 更新Wox出錯 + 更新 + 取消 + 此更新需要重啟Wox + 下列文件會被更新 + 更新文件 + 更新日誌 + \ No newline at end of file diff --git a/Wox/MainWindow.xaml.cs b/Wox/MainWindow.xaml.cs index c896f7b39f..1f408c20e4 100644 --- a/Wox/MainWindow.xaml.cs +++ b/Wox/MainWindow.xaml.cs @@ -238,9 +238,30 @@ namespace Wox InitProgressbarAnimation(); WindowIntelopHelper.DisableControlBox(this); + CheckUpdate(); + } + + private void CheckUpdate() + { + UpdaterManager.Instance.PrepareUpdateReady+=OnPrepareUpdateReady; + UpdaterManager.Instance.UpdateError += OnUpdateError; UpdaterManager.Instance.CheckUpdate(); } + void OnUpdateError(object sender, EventArgs e) + { + string updateError = InternationalizationManager.Instance.GetTranslation("update_wox_update_error"); + MessageBox.Show(updateError); + } + + private void OnPrepareUpdateReady(object sender, EventArgs e) + { + Dispatcher.Invoke(new Action(() => + { + new WoxUpdate().ShowDialog(); + })); + } + public void SetHotkey(string hotkeyStr, EventHandler action) { var hotkey = new HotkeyModel(hotkeyStr); diff --git a/Wox/Wox.csproj b/Wox/Wox.csproj index c6d7649a69..5102805cd0 100644 --- a/Wox/Wox.csproj +++ b/Wox/Wox.csproj @@ -66,6 +66,9 @@ False ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll + + ..\packages\MarkdownSharp.1.13.0.0\lib\35\MarkdownSharp.dll + False ..\packages\Newtonsoft.Json.6.0.8\lib\net35\Newtonsoft.Json.dll @@ -113,6 +116,9 @@ + + WoxUpdate.xaml + MSBuild:Compile Designer @@ -170,6 +176,9 @@ Designer PreserveNewest + + PreserveNewest + Designer MSBuild:Compile @@ -230,6 +239,10 @@ Designer PreserveNewest + + Designer + MSBuild:Compile + diff --git a/Wox/WoxUpdate.xaml b/Wox/WoxUpdate.xaml new file mode 100644 index 0000000000..648d196125 --- /dev/null +++ b/Wox/WoxUpdate.xaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wox/WoxUpdate.xaml.cs b/Wox/WoxUpdate.xaml.cs new file mode 100644 index 0000000000..3534bac0b2 --- /dev/null +++ b/Wox/WoxUpdate.xaml.cs @@ -0,0 +1,34 @@ +using System.Windows; +using MarkdownSharp; +using Wox.Core.i18n; +using Wox.Core.Updater; + +namespace Wox +{ + public partial class WoxUpdate : Window + { + public WoxUpdate() + { + InitializeComponent(); + + string newVersionAvailable = string.Format( + InternationalizationManager.Instance.GetTranslation("update_wox_update_new_version_available"), + UpdaterManager.Instance.NewRelease); + tbNewVersionAvailable.Text = newVersionAvailable; + Markdown markdown = new Markdown(); + wbDetails.NavigateToString(markdown.Transform(UpdaterManager.Instance.NewRelease.description)); + lbUpdatedFiles.ItemsSource = UpdaterManager.Instance.GetAvailableUpdateFiles(); + } + + private void btnUpdate_Click(object sender, RoutedEventArgs e) + { + UpdaterManager.Instance.ApplyUpdates(); + } + + private void btnCancel_Click(object sender, RoutedEventArgs e) + { + UpdaterManager.Instance.CleanUp(); + Close(); + } + } +} diff --git a/Wox/packages.config b/Wox/packages.config index 5e5610702f..9f1a6d32bb 100644 --- a/Wox/packages.config +++ b/Wox/packages.config @@ -1,6 +1,7 @@  +