From 128453fad1ff29b1960717351cbb077aaf6d0114 Mon Sep 17 00:00:00 2001 From: qianlifeng Date: Sun, 14 Dec 2014 23:16:29 +0800 Subject: [PATCH] Add upgrade check. --- Wox.Infrastructure/HttpRequest.cs | 26 +++++ .../UserSettings/UserSettingStorage.cs | 4 + Wox/MainWindow.xaml.cs | 12 +++ Wox/SettingWindow.xaml | 3 + Wox/SettingWindow.xaml.cs | 33 +++++-- Wox/Update/Release.cs | 16 ++++ Wox/Update/UpdateChecker.cs | 96 +++++++++++++++++++ Wox/Wox.csproj | 3 + 8 files changed, 186 insertions(+), 7 deletions(-) create mode 100644 Wox/Update/Release.cs create mode 100644 Wox/Update/UpdateChecker.cs diff --git a/Wox.Infrastructure/HttpRequest.cs b/Wox.Infrastructure/HttpRequest.cs index e082d07525..c5592e87df 100644 --- a/Wox.Infrastructure/HttpRequest.cs +++ b/Wox.Infrastructure/HttpRequest.cs @@ -9,6 +9,8 @@ using System.Security.Cryptography.X509Certificates; using System.Text; //From:http://blog.csdn.net/zhoufoxcn/article/details/6404236 +using Wox.Plugin; + namespace Wox.Infrastructure { public class HttpRequest @@ -16,6 +18,30 @@ namespace Wox.Infrastructure private static readonly string DefaultUserAgent = "Wox/" + Assembly.GetEntryAssembly().GetName().Version.ToString() + " (+https://github.com/qianlifeng/Wox)"; + public static HttpWebResponse CreateGetHttpResponse(string url, IHttpProxy proxy) + { + if (string.IsNullOrEmpty(url)) + { + throw new ArgumentNullException("url"); + } + HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; + 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); + request.Proxy.Credentials = new NetworkCredential(proxy.UserName, proxy.Password); + } + } + request.Method = "GET"; + request.UserAgent = DefaultUserAgent; + return request.GetResponse() as HttpWebResponse; + } + public static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent, CookieCollection cookies) { if (string.IsNullOrEmpty(url)) diff --git a/Wox.Infrastructure/Storage/UserSettings/UserSettingStorage.cs b/Wox.Infrastructure/Storage/UserSettings/UserSettingStorage.cs index ec3b96813f..dbef1b084f 100644 --- a/Wox.Infrastructure/Storage/UserSettings/UserSettingStorage.cs +++ b/Wox.Infrastructure/Storage/UserSettings/UserSettingStorage.cs @@ -8,6 +8,9 @@ namespace Wox.Infrastructure.Storage.UserSettings { public class UserSettingStorage : BaseStorage { + [JsonProperty] + public bool DontPromptUpdateMsg { get; set; } + [JsonProperty] public string Hotkey { get; set; } @@ -145,6 +148,7 @@ namespace Wox.Infrastructure.Storage.UserSettings protected override UserSettingStorage LoadDefaultConfig() { + DontPromptUpdateMsg = false; Theme = "Dark"; ReplaceWinR = true; WebSearches = LoadDefaultWebSearches(); diff --git a/Wox/MainWindow.xaml.cs b/Wox/MainWindow.xaml.cs index 3ed2fbbeb0..3a51724ddc 100644 --- a/Wox/MainWindow.xaml.cs +++ b/Wox/MainWindow.xaml.cs @@ -21,6 +21,7 @@ using Wox.Infrastructure.Storage; using Wox.Infrastructure.Storage.UserSettings; using Wox.Plugin; using Wox.PluginLoader; +using Wox.Update; using Application = System.Windows.Application; using Brushes = System.Windows.Media.Brushes; using Color = System.Windows.Media.Color; @@ -188,6 +189,8 @@ namespace Wox //since MainWIndow implement IPublicAPI, so we need to finish ctor MainWindow object before //PublicAPI invoke in plugin init methods. E.g FolderPlugin ThreadPool.QueueUserWorkItem(o => Plugins.Init()); + + ThreadPool.QueueUserWorkItem(o => checkUpdate()); } void pnlResult_RightMouseClickEvent(Result result) @@ -195,6 +198,15 @@ namespace Wox ShowContextMenu(result); } + void checkUpdate() + { + Release release = new UpdateChecker().CheckUpgrade(); + if (release != null && !UserSettingStorage.Instance.DontPromptUpdateMsg) + { + ShowMsg(string.Format("New version {0} available!",release.version),string.Empty,string.Empty); + } + } + void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) { UserSettingStorage.Instance.WindowLeft = Left; diff --git a/Wox/SettingWindow.xaml b/Wox/SettingWindow.xaml index b547e57896..21e8fc252c 100644 --- a/Wox/SettingWindow.xaml +++ b/Wox/SettingWindow.xaml @@ -28,6 +28,9 @@ Hide Wox when loses focus + + Don't show upgrade msg if new version available + diff --git a/Wox/SettingWindow.xaml.cs b/Wox/SettingWindow.xaml.cs index 5e76e7dc24..adefc2c006 100644 --- a/Wox/SettingWindow.xaml.cs +++ b/Wox/SettingWindow.xaml.cs @@ -38,8 +38,7 @@ namespace Wox private void Setting_Loaded(object sender, RoutedEventArgs ev) { - ctlHotkey.OnHotkeyChanged += ctlHotkey_OnHotkeyChanged; - ctlHotkey.SetHotkey(UserSettingStorage.Instance.Hotkey, false); + #region General cbHideWhenDeactive.Checked += (o, e) => { @@ -53,11 +52,25 @@ namespace Wox UserSettingStorage.Instance.Save(); }; - lvCustomHotkey.ItemsSource = UserSettingStorage.Instance.CustomPluginHotkeys; + cbDontPromptUpdateMsg.Checked += (o, e) => + { + UserSettingStorage.Instance.DontPromptUpdateMsg = true; + UserSettingStorage.Instance.Save(); + }; + + cbDontPromptUpdateMsg.Unchecked += (o, e) => + { + UserSettingStorage.Instance.DontPromptUpdateMsg = false; + UserSettingStorage.Instance.Save(); + }; + cbStartWithWindows.IsChecked = File.Exists(woxLinkPath); cbHideWhenDeactive.IsChecked = UserSettingStorage.Instance.HideWhenDeactive; + cbDontPromptUpdateMsg.IsChecked = UserSettingStorage.Instance.DontPromptUpdateMsg; - #region Load Theme + #endregion + + #region Theme if (!string.IsNullOrEmpty(UserSettingStorage.Instance.QueryBoxFont) && Fonts.SystemFontFamilies.Count(o => o.FamilyNames.Values.Contains(UserSettingStorage.Instance.QueryBoxFont)) > 0) @@ -155,9 +168,17 @@ namespace Wox var wallpaperColor = WallpaperPathRetrieval.GetWallpaperColor(); PreviewPanel.Background = new SolidColorBrush(wallpaperColor); } + + //PreviewPanel + App.Window.SetTheme(UserSettingStorage.Instance.Theme); + #endregion - #region Load Plugin + #region Plugin + + ctlHotkey.OnHotkeyChanged += ctlHotkey_OnHotkeyChanged; + ctlHotkey.SetHotkey(UserSettingStorage.Instance.Hotkey, false); + lvCustomHotkey.ItemsSource = UserSettingStorage.Instance.CustomPluginHotkeys; var plugins = new CompositeCollection { @@ -200,9 +221,7 @@ namespace Wox #endregion - //PreviewPanel settingsLoaded = true; - App.Window.SetTheme(UserSettingStorage.Instance.Theme); } private void EnableProxy() diff --git a/Wox/Update/Release.cs b/Wox/Update/Release.cs new file mode 100644 index 0000000000..3664f5f2fa --- /dev/null +++ b/Wox/Update/Release.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Wox.Update +{ + public class Release + { + public string version { get; set; } + public string download_link { get; set; } + public string download_link1 { get; set; } + public string download_link2 { get; set; } + public string description { get; set; } + } +} diff --git a/Wox/Update/UpdateChecker.cs b/Wox/Update/UpdateChecker.cs new file mode 100644 index 0000000000..a66c6e50e1 --- /dev/null +++ b/Wox/Update/UpdateChecker.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using Newtonsoft.Json; +using Wox.Helper; +using Wox.Infrastructure; + +namespace Wox.Update +{ + public class UpdateChecker + { + private string updateURL = "https://api.getwox.com/release/latest/"; + + /// + /// If new release is available, then return the new release + /// otherwise, return null + /// + /// + public Release CheckUpgrade() + { + Release release = null; + HttpWebResponse response = HttpRequest.CreateGetHttpResponse(updateURL, HttpProxy.Instance); + Stream s = response.GetResponseStream(); + if (s != null) + { + StreamReader reader = new StreamReader(s, Encoding.UTF8); + string json = reader.ReadToEnd(); + try + { + release = JsonConvert.DeserializeObject(json); + } + catch + { + return null; + } + } + + if (!IsNewerThanCurrent(release)) + { + return null; + } + + return release; + } + + private bool IsNewerThanCurrent(Release release) + { + if (release == null) return false; + + string currentVersion = ConfigurationManager.AppSettings["version"]; + return CompareVersion(release.version, currentVersion) > 0; + } + + /// + /// if version1 > version2 return 1 + /// else -1 + /// + /// + /// + /// + private int CompareVersion(string version1, string version2) + { + if (version1 == version2) return 0; + if (string.IsNullOrEmpty(version1) || string.IsNullOrEmpty(version2)) return 0; + + //semantic version, e.g. 1.1.0 + List version1List = version1.Split('.').Select(int.Parse).ToList(); + List version2List = version2.Split('.').Select(int.Parse).ToList(); + + if (version1List[0] > version2List[0]) + { + return 1; + } + else if (version1List[0] == version2List[0]) + { + if (version1List[1] > version2List[1]) + { + return 1; + } + else if (version1List[1] == version2List[1]) + { + if (version1List[2] > version2List[2]) + { + return 1; + } + } + } + + return -1; + } + } +} diff --git a/Wox/Wox.csproj b/Wox/Wox.csproj index 0686453fea..c4f5faca5e 100644 --- a/Wox/Wox.csproj +++ b/Wox/Wox.csproj @@ -82,6 +82,7 @@ + @@ -103,6 +104,8 @@ + + MSBuild:Compile Designer