Skip to content

Commit 5394cbf

Browse files
author
Yizhao Han
committed
Support Checking for updates.
Because of HTTPS connection problem, .Net Framework is update to 4.6.1
1 parent b5f959d commit 5394cbf

18 files changed

+11234
-44
lines changed

NetSpeedMonitor/App.xaml.cs

+60-4
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ public void FreeMutex()
4747

4848
private void Application_Startup(object sender, StartupEventArgs e)
4949
{
50-
5150
InitLanguage();
5251
if (e.Args.Length > 0)
5352
{
@@ -170,6 +169,34 @@ private void InitViewAndNeedCloseResourcees()
170169
SystemParameters.StaticPropertyChanged += SystemParameters_StaticPropertyChanged;
171170
timer.Elapsed += Timer_Elapsed;
172171
timer.Enabled = true;
172+
if(Settings.Default.AutoUpdate)
173+
{
174+
System.Timers.Timer myTimer = new System.Timers.Timer
175+
{
176+
AutoReset = false,
177+
Interval = 2000
178+
};
179+
myTimer.Elapsed += MyTimer_Elapsed_AutoCheckUpdate;
180+
myTimer.Enabled = true;
181+
}
182+
}
183+
184+
private void MyTimer_Elapsed_AutoCheckUpdate(object sender, ElapsedEventArgs e)
185+
{
186+
try
187+
{
188+
System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
189+
System.Net.NetworkInformation.PingReply pr = ping.Send("www.baidu.com", 12000);
190+
if (pr.Status == System.Net.NetworkInformation.IPStatus.Success)
191+
{
192+
checkUpdateManager.CheckForUpdates(false);
193+
}
194+
}
195+
catch(Exception e2)
196+
{
197+
Console.WriteLine(e2.ToString());
198+
}
199+
173200
}
174201

175202
private void SystemParameters_StaticPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
@@ -256,8 +283,15 @@ private void InitializeTray()
256283
{
257284
menuDefault.Checked = true;
258285
}
259-
260-
System.Windows.Forms.ContextMenu menu = new System.Windows.Forms.ContextMenu(new System.Windows.Forms.MenuItem[] { menuStartOnBoot, menuEdgeHide, menuLanguage, menuExit });
286+
menuAutoUpdate = new System.Windows.Forms.MenuItem(FindResource("CheckForUpdatesAutomatically").ToString(), TrayMenu_Click)
287+
{
288+
Checked = Settings.Default.AutoUpdate
289+
};
290+
menuCheckUpdate = new System.Windows.Forms.MenuItem(FindResource("CheckForUpdates").ToString(), TrayMenu_Click);
291+
System.Windows.Forms.MenuItem menuUpdate = new System.Windows.Forms.MenuItem(FindResource("Update").ToString());
292+
menuUpdate.MenuItems.Add(menuAutoUpdate);
293+
menuUpdate.MenuItems.Add(menuCheckUpdate);
294+
System.Windows.Forms.ContextMenu menu = new System.Windows.Forms.ContextMenu(new System.Windows.Forms.MenuItem[] { menuStartOnBoot, menuEdgeHide, menuLanguage,menuUpdate, menuExit });
261295

262296
notifyIcon = new System.Windows.Forms.NotifyIcon
263297
{
@@ -298,6 +332,17 @@ public void TryToSetLanguage(String path)
298332
}
299333
}
300334

335+
public void TryToSetAutoUpdate(bool autoUpdate)
336+
{
337+
Settings.Default.AutoUpdate = autoUpdate;
338+
Settings.Default.Save();
339+
}
340+
341+
public void TryToCheckUpdate()
342+
{
343+
checkUpdateManager.CheckForUpdates(true);
344+
}
345+
301346
public void TryToSetStartOnBoot(bool startOnBoot)
302347
{
303348
Settings.Default.startOnBoot = startOnBoot;
@@ -350,6 +395,16 @@ private void TrayMenu_Click(object sender, EventArgs e)
350395
mainWindow.WindowMenuEdgeHide.IsChecked = menuEdgeHide.Checked;
351396
TryToSetEdgeHide(menuEdgeHide.Checked);
352397
}
398+
else if(sender == menuAutoUpdate)
399+
{
400+
menuAutoUpdate.Checked = !menuAutoUpdate.Checked;
401+
mainWindow.WindowMenuAutoUpdate.IsChecked = menuAutoUpdate.Checked;
402+
TryToSetAutoUpdate(menuAutoUpdate.Checked);
403+
}
404+
else if(sender == menuCheckUpdate)
405+
{
406+
TryToCheckUpdate();
407+
}
353408
}
354409

355410
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
@@ -366,7 +421,7 @@ private void Timer_Elapsed(object sender, ElapsedEventArgs e)
366421
}));
367422
}
368423

369-
public System.Windows.Forms.MenuItem menuExit, menuEdgeHide, menuStartOnBoot;
424+
public System.Windows.Forms.MenuItem menuExit, menuEdgeHide, menuStartOnBoot, menuAutoUpdate, menuCheckUpdate;
370425

371426
private System.Windows.Forms.NotifyIcon notifyIcon;
372427
private MainWindow mainWindow;
@@ -375,6 +430,7 @@ private void Timer_Elapsed(object sender, ElapsedEventArgs e)
375430
private CaptureManager captureManager;
376431
private UDMap udMap = new UDMap();
377432
private PortProcessMap portProcessMap = PortProcessMap.GetInstance();
433+
private CheckUpdateManager checkUpdateManager = new CheckUpdateManager();
378434

379435
private System.Timers.Timer timer = new System.Timers.Timer
380436
{

NetSpeedMonitor/CheckUpdateManager.cs

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
using Newtonsoft.Json;
2+
using Newtonsoft.Json.Linq;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.IO;
6+
using System.Linq;
7+
using System.Net;
8+
using System.Net.Security;
9+
using System.Security.Cryptography.X509Certificates;
10+
using System.Text;
11+
using System.Threading;
12+
using System.Threading.Tasks;
13+
using System.Windows;
14+
using System.Windows.Threading;
15+
16+
namespace USTC.Software.hanyizhao.NetSpeedMonitor
17+
{
18+
class CheckUpdateManager
19+
{
20+
public void CheckForUpdates(bool showNoUpdateWindow)
21+
{
22+
lock(lockCheck)
23+
{
24+
if(!isChecking)
25+
{
26+
isChecking = true;
27+
this.showNoUpdateWindow = showNoUpdateWindow;
28+
Thread thread = new Thread(DoCheckUpdate);
29+
thread.Start();
30+
}
31+
else
32+
{
33+
if(!this.showNoUpdateWindow)
34+
{
35+
this.showNoUpdateWindow = showNoUpdateWindow;
36+
}
37+
}
38+
}
39+
}
40+
41+
private void DoCheckUpdate()
42+
{
43+
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://api.github.com/repos/hanyizhao/NetSpeedMonitor/releases/latest");
44+
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.2; AskTbPTV/5.17.0.25589; Alexa Toolbar)";
45+
try
46+
{
47+
if (request.GetResponse() is HttpWebResponse response)
48+
{
49+
if (response.StatusCode == HttpStatusCode.OK)
50+
{
51+
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
52+
{
53+
String value = reader.ReadToEnd();
54+
JObject jo = (JObject)JsonConvert.DeserializeObject(value);
55+
String tag_name = jo["tag_name"].ToString();
56+
String nowVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
57+
int lastDot = nowVersion.LastIndexOf('.');
58+
nowVersion = nowVersion.Substring(0, lastDot) + nowVersion.Substring(lastDot + 1);
59+
String appName = Application.Current.FindResource("AppName").ToString();
60+
if (Tool.compareTwoVersionString(tag_name, nowVersion) > 0)
61+
{
62+
MessageBoxResult result = MessageBox.Show(Application.Current.FindResource("FindNewVersion").ToString()
63+
+ tag_name + "\n" + Application.Current.FindResource("UpgradeToNewVersion").ToString(),
64+
appName, MessageBoxButton.OKCancel, MessageBoxImage.Question);
65+
if(result == MessageBoxResult.OK)
66+
{
67+
System.Diagnostics.Process.Start("https://github.com/hanyizhao/NetSpeedMonitor/releases/latest");
68+
}
69+
}
70+
else
71+
{
72+
if (showNoUpdateWindow)
73+
{
74+
MessageBox.Show(appName + " " + Application.Current.FindResource("IsUpToDate").ToString(), appName);
75+
}
76+
}
77+
}
78+
}
79+
response.Close();
80+
}
81+
}
82+
catch (Exception e)
83+
{
84+
Application.Current.Dispatcher.Invoke(new Action(() =>
85+
{
86+
MessageBox.Show(e.ToString(), Application.Current.FindResource("CheckForUpdates").ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
87+
}));
88+
}
89+
lock (lockCheck)
90+
{
91+
isChecking = false;
92+
showNoUpdateWindow = false;
93+
}
94+
95+
96+
}
97+
98+
private readonly object lockCheck = new object();
99+
private bool isChecking = false;
100+
private bool showNoUpdateWindow = false;
101+
}
102+
}

NetSpeedMonitor/MainWindow.xaml

+4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
<MenuItem Name="WindowMenuLanguage" Header="{DynamicResource Language}">
2525
<MenuItem Name="WindowMenuUserDefault" Header="{DynamicResource UserDefault}" IsCheckable="True" Click="MenuItem_ChangeLanguageClick"/>
2626
</MenuItem>
27+
<MenuItem Header="{DynamicResource Update}">
28+
<MenuItem Name="WindowMenuAutoUpdate" Header="{DynamicResource CheckForUpdatesAutomatically}" IsCheckable="True" Click="MenuItem_Click"/>
29+
<MenuItem Name="WindowMenuCheckUpdate" Header="{DynamicResource CheckForUpdates}" Click="MenuItem_Click"/>
30+
</MenuItem>
2731
<MenuItem Name="WindowMenuExit" Header="{DynamicResource Exit}" Click="MenuItem_Click" />
2832
</ContextMenu>
2933
</Window.ContextMenu>

NetSpeedMonitor/MainWindow.xaml.cs

+18-13
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ private void InitializeWindowMenu()
5757
WindowMenuUserDefault.IsChecked = true;
5858
}
5959
WindowMenuUserDefault.Tag = "";
60+
WindowMenuAutoUpdate.IsChecked = Settings.Default.AutoUpdate;
6061
}
6162

6263
private void MenuItem_ChangeLanguageClick(object sender, RoutedEventArgs e)
@@ -79,32 +80,36 @@ private void MenuItem_ChangeLanguageClick(object sender, RoutedEventArgs e)
7980

8081
private void MenuItem_Click(object sender, RoutedEventArgs e)
8182
{
82-
if (sender == WindowMenuExit)
83+
if (Application.Current is App app)
8384
{
84-
if (Application.Current is App app)
85+
if (sender == WindowMenuExit)
8586
{
8687
app.TryToExit();
8788
}
88-
}
89-
else if (sender == WindowMenuStartOnBoot)
90-
{
91-
bool startOnBoot = WindowMenuStartOnBoot.IsChecked;
92-
if (Application.Current is App app)
89+
else if (sender == WindowMenuStartOnBoot)
9390
{
91+
bool startOnBoot = WindowMenuStartOnBoot.IsChecked;
9492
app.menuStartOnBoot.Checked = startOnBoot;
9593
app.TryToSetStartOnBoot(startOnBoot);
9694
}
97-
}
98-
else if (sender == WindowMenuEdgeHide)
99-
{
100-
bool edgeHide = WindowMenuEdgeHide.IsChecked;
101-
if (Application.Current is App app)
95+
else if (sender == WindowMenuEdgeHide)
10296
{
97+
bool edgeHide = WindowMenuEdgeHide.IsChecked;
10398
app.menuEdgeHide.Checked = edgeHide;
10499
app.TryToSetEdgeHide(edgeHide);
105100
}
106-
101+
else if (sender == WindowMenuAutoUpdate)
102+
{
103+
bool autoUpdate = WindowMenuAutoUpdate.IsChecked;
104+
app.menuAutoUpdate.Checked = autoUpdate;
105+
app.TryToSetAutoUpdate(autoUpdate);
106+
}
107+
else if(sender == WindowMenuCheckUpdate)
108+
{
109+
app.TryToCheckUpdate();
110+
}
107111
}
112+
108113
}
109114

110115
private void Window_MouseEnter(object sender, MouseEventArgs e)

NetSpeedMonitor/NetSpeedMonitor.csproj

+10-5
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<OutputType>WinExe</OutputType>
99
<RootNamespace>USTC.Software.hanyizhao.NetSpeedMonitor</RootNamespace>
1010
<AssemblyName>NetSpeedMonitor</AssemblyName>
11-
<TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
11+
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
1212
<FileAlignment>512</FileAlignment>
1313
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
1414
<WarningLevel>4</WarningLevel>
@@ -77,13 +77,17 @@
7777
<SignManifests>true</SignManifests>
7878
</PropertyGroup>
7979
<ItemGroup>
80-
<Reference Include="PacketDotNet, Version=0.13.0.0, Culture=neutral, processorArchitecture=MSIL">
80+
<Reference Include="Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
8181
<SpecificVersion>False</SpecificVersion>
82-
<HintPath>..\SharpPcap-4.2.0.bin\selfBuild\PacketDotNet.dll</HintPath>
82+
<HintPath>..\libs\newtonsoft.json\net45\Newtonsoft.Json.dll</HintPath>
8383
</Reference>
84-
<Reference Include="SharpPcap, Version=4.2.0.0, Culture=neutral, processorArchitecture=MSIL">
84+
<Reference Include="PacketDotNet, Version=0.16.0.0, Culture=neutral, processorArchitecture=MSIL">
8585
<SpecificVersion>False</SpecificVersion>
86-
<HintPath>..\SharpPcap-4.2.0.bin\selfBuild\SharpPcap.dll</HintPath>
86+
<HintPath>..\libs\SharpPcap-4.2.0.bin\selfBuild\PacketDotNet.dll</HintPath>
87+
</Reference>
88+
<Reference Include="SharpPcap, Version=4.4.0.0, Culture=neutral, processorArchitecture=MSIL">
89+
<SpecificVersion>False</SpecificVersion>
90+
<HintPath>..\libs\SharpPcap-4.2.0.bin\selfBuild\SharpPcap.dll</HintPath>
8791
</Reference>
8892
<Reference Include="System" />
8993
<Reference Include="System.Data" />
@@ -101,6 +105,7 @@
101105
<SubType>Designer</SubType>
102106
</ApplicationDefinition>
103107
<Compile Include="CaptureManager.cs" />
108+
<Compile Include="CheckUpdateManager.cs" />
104109
<Compile Include="DelayRunManager.cs" />
105110
<Compile Include="DetailWindow.xaml.cs">
106111
<DependentUpon>DetailWindow.xaml</DependentUpon>

NetSpeedMonitor/Properties/Settings.Designer.cs

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

NetSpeedMonitor/Properties/Settings.settings

+3
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,8 @@
1717
<Setting Name="language" Type="System.String" Scope="User">
1818
<Value Profile="(Default)" />
1919
</Setting>
20+
<Setting Name="AutoUpdate" Type="System.Boolean" Scope="User">
21+
<Value Profile="(Default)">True</Value>
22+
</Setting>
2023
</Settings>
2124
</SettingsFile>

NetSpeedMonitor/Resources/StringResource.xaml

+7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
xmlns:sys="clr-namespace:System;assembly=mscorlib"
44
xmlns:local="clr-namespace:USTC.Software.hanyizhao.NetSpeedMonitor">
55

6+
<sys:String x:Key="AppName">Net Speed Monitor</sys:String>
67
<sys:String x:Key="Exit">Exit</sys:String>
78
<sys:String x:Key="StartOnBoot">Start on boot</sys:String>
89
<sys:String x:Key="HideWhenCloseToEdge">Hide when close to edge</sys:String>
@@ -19,4 +20,10 @@
1920
<sys:String x:Key="CantGetInformationOfThisProcessMaybeItsNotRunningNow_">Can't get information of this process. Maybe it's not running now.</sys:String>
2021
<sys:String x:Key="Loading_">Loading...</sys:String>
2122
<sys:String x:Key="more">more</sys:String>
23+
<sys:String x:Key="Update">Update</sys:String>
24+
<sys:String x:Key="CheckForUpdates">Check for updates</sys:String>
25+
<sys:String x:Key="CheckForUpdatesAutomatically">Check for updates automatically</sys:String>
26+
<sys:String x:Key="IsUpToDate">is Up to date!</sys:String>
27+
<sys:String x:Key="FindNewVersion">Find new version:</sys:String>
28+
<sys:String x:Key="UpgradeToNewVersion">Upgrade to new version?</sys:String>
2229
</ResourceDictionary>

NetSpeedMonitor/Resources/StringResource.zh-CN.xaml

+6
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,10 @@
1919
<sys:String x:Key="CantGetInformationOfThisProcessMaybeItsNotRunningNow_">无法获取进程信息。可能该进程已经结束。</sys:String>
2020
<sys:String x:Key="Loading_">载入中...</sys:String>
2121
<sys:String x:Key="more">详情</sys:String>
22+
<sys:String x:Key="Update">更新</sys:String>
23+
<sys:String x:Key="CheckForUpdates">检查更新</sys:String>
24+
<sys:String x:Key="CheckForUpdatesAutomatically">自动检查更新</sys:String>
25+
<sys:String x:Key="IsUpToDate">已是最新版!</sys:String>
26+
<sys:String x:Key="FindNewVersion">发现新版本:</sys:String>
27+
<sys:String x:Key="UpgradeToNewVersion">升级到新版本?</sys:String>
2228
</ResourceDictionary>

0 commit comments

Comments
 (0)