Skip to content

Commit f45b785

Browse files
kevinvangelderrozele
authored andcommitted
implement C++ COM Interop NetInfo Module (microsoft#1169)
* implement C++ COM Interop NetInfo Module * remove NuGet package dependency * updated NetInfo tests * minor improvements per @pre10der89 feedback * update tests to reflect changes
1 parent aaf9b2a commit f45b785

File tree

6 files changed

+81
-40
lines changed

6 files changed

+81
-40
lines changed

ReactWindows/ReactNative.Net46.Tests/Modules/NetInfo/NetInfoModuleTests.cs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
using Newtonsoft.Json.Linq;
1+
using NETWORKLIST;
2+
using Newtonsoft.Json.Linq;
23
using NUnit.Framework;
34
using ReactNative.Bridge;
45
using ReactNative.Modules.Core;
56
using ReactNative.Modules.NetInfo;
67
using System;
7-
using System.Net.NetworkInformation;
88
using System.Threading;
99
using System.Windows.Threading;
1010

@@ -16,7 +16,7 @@ public class NetInfoModuleTests
1616
[Test]
1717
public void NetInfoModule_JsonResponse()
1818
{
19-
var networkInterface = new MockNetworkInterface("None");
19+
var networkInterface = new MockNetworkListManager("None");
2020
var networkInfo = new MockNetworkInformation(networkInterface);
2121
var context = CreateReactContext();
2222
var netInfo = new NetInfoModule(networkInfo, context);
@@ -27,7 +27,7 @@ public void NetInfoModule_JsonResponse()
2727
netInfo.getCurrentConnectivity(promise);
2828
Assert.AreEqual(CreateNetworkInfo("None"), state);
2929

30-
networkInfo.NetworkInterface = new MockNetworkInterface("InternetAccess");
30+
networkInfo.networkListManager = new MockNetworkListManager("InternetAccess");
3131
netInfo.getCurrentConnectivity(promise);
3232
Assert.AreEqual(CreateNetworkInfo("InternetAccess"), state);
3333
}
@@ -38,7 +38,7 @@ public void NetInfoModule_Event()
3838
{
3939
SetDispatcherForTest();
4040

41-
var networkInterface = new MockNetworkInterface("None");
41+
var networkInterface = new MockNetworkListManager("None");
4242
var networkInfo = new MockNetworkInformation(networkInterface);
4343

4444
var emitted = new AutoResetEvent(false);
@@ -56,8 +56,8 @@ public void NetInfoModule_Event()
5656
netInfo.Initialize();
5757
context.OnResume();
5858

59-
networkInfo.NetworkInterface = new MockNetworkInterface("InternetAccess");
60-
networkInfo.OnNetworkAvailabilityChanged(new object(), (NetworkAvailabilityEventArgs)null);
59+
networkInfo.networkListManager = new MockNetworkListManager("InternetAccess");
60+
networkInfo.OnNetworkAvailabilityChanged(new Guid(), NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV4_INTERNET);
6161
Assert.IsTrue(emitted.WaitOne());
6262
Assert.AreEqual(CreateNetworkInfo("InternetAccess"), state);
6363
}
@@ -141,12 +141,12 @@ class MockNetworkInformation : INetworkInformation
141141
private readonly Action _onStart;
142142
private readonly Action _onStop;
143143

144-
public MockNetworkInterface NetworkInterface { get; set; }
144+
public MockNetworkListManager networkListManager { get; set; }
145145

146-
public MockNetworkInformation(MockNetworkInterface NetworkInterface)
146+
public MockNetworkInformation(MockNetworkListManager networkListManager)
147147
: this(() => { }, () => { })
148148
{
149-
this.NetworkInterface = NetworkInterface;
149+
this.networkListManager = networkListManager;
150150
}
151151

152152
public MockNetworkInformation(Action onStart, Action onStop)
@@ -155,11 +155,11 @@ public MockNetworkInformation(Action onStart, Action onStop)
155155
_onStop = onStop;
156156
}
157157

158-
public event NetworkAvailabilityChangedEventHandler NetworkAvailabilityChanged;
158+
public event EventHandler<NetworkConnectivityChangedEventArgs> NetworkConnectivityChanged;
159159

160160
public string GetInternetStatus()
161161
{
162-
return NetworkInterface.GetIsNetworkAvailable();
162+
return networkListManager.IsConnectedToInternet ? "InternetAccess" : "None";
163163
}
164164

165165
public void Start()
@@ -172,25 +172,25 @@ public void Stop()
172172
_onStop();
173173
}
174174

175-
public void OnNetworkAvailabilityChanged(object source, NetworkAvailabilityEventArgs e)
175+
public void OnNetworkAvailabilityChanged(Guid guid, NLM_CONNECTIVITY connectivity)
176176
{
177-
NetworkAvailabilityChanged?.Invoke(source, e);
177+
NetworkConnectivityChangedEventArgs e = new NetworkConnectivityChangedEventArgs()
178+
{
179+
IsAvailable = networkListManager.IsConnectedToInternet,
180+
ConnectionStatus = GetInternetStatus()
181+
};
182+
NetworkConnectivityChanged?.Invoke(new object(), e);
178183
}
179184
}
180185

181-
class MockNetworkInterface
186+
class MockNetworkListManager
182187
{
183-
public MockNetworkInterface(string status)
188+
public MockNetworkListManager(string status)
184189
{
185-
_status = status;
190+
IsConnectedToInternet = status == "InternetAccess";
186191
}
187192

188-
private string _status;
189-
190-
public string GetIsNetworkAvailable()
191-
{
192-
return _status;
193-
}
193+
public bool IsConnectedToInternet { get; set; }
194194
}
195195
}
196196
}

ReactWindows/ReactNative.Net46.Tests/ReactNative.Net46.Tests.csproj

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,17 @@
146146
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
147147
</EmbeddedResource>
148148
</ItemGroup>
149+
<ItemGroup>
150+
<COMReference Include="NETWORKLIST">
151+
<Guid>{DCB00D01-570F-4A9B-8D69-199FDBA5723B}</Guid>
152+
<VersionMajor>1</VersionMajor>
153+
<VersionMinor>0</VersionMinor>
154+
<Lcid>0</Lcid>
155+
<WrapperTool>tlbimp</WrapperTool>
156+
<Isolated>False</Isolated>
157+
<EmbedInteropTypes>False</EmbedInteropTypes>
158+
</COMReference>
159+
</ItemGroup>
149160
<Import Project="..\ReactNative.Shared.Tests\ReactNative.Shared.Tests.projitems" Label="Shared" />
150161
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
151162
<Import Project="$(SolutionDir)\packages\Facebook.Yoga.1.2.0-pre1\build\net45\Facebook.Yoga.targets" Condition="Exists('..\packages\Facebook.Yoga.1.2.0-pre1\build\net45\Facebook.Yoga.targets')" />
Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,38 @@
1-
using System.Net.NetworkInformation;
1+
using NETWORKLIST;
2+
using System;
23

34
namespace ReactNative.Modules.NetInfo
45
{
56
class DefaultNetworkInformation : INetworkInformation
67
{
7-
public event NetworkAvailabilityChangedEventHandler NetworkAvailabilityChanged;
8+
public event EventHandler<NetworkConnectivityChangedEventArgs> NetworkConnectivityChanged;
9+
private NetworkListManager _networkListManager;
810

911
public void Start()
1012
{
11-
NetworkChange.NetworkAvailabilityChanged += OnNetworkAvailabilityChanged;
13+
_networkListManager = new NetworkListManager();
14+
_networkListManager.NetworkConnectivityChanged += OnNetworkConnectivityChanged;
1215
}
1316

1417
public void Stop()
1518
{
16-
NetworkChange.NetworkAvailabilityChanged -= OnNetworkAvailabilityChanged;
19+
_networkListManager.NetworkConnectivityChanged -= OnNetworkConnectivityChanged;
20+
_networkListManager = null;
1721
}
1822

1923
public string GetInternetStatus()
2024
{
21-
return NetworkInterface.GetIsNetworkAvailable() ? "InternetAccess" : "None";
25+
return _networkListManager.IsConnectedToInternet ? "InternetAccess" : "None";
2226
}
2327

24-
private void OnNetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
28+
private void OnNetworkConnectivityChanged(Guid guid, NLM_CONNECTIVITY connectivity)
2529
{
26-
NetworkAvailabilityChanged?.Invoke(sender, e);
30+
NetworkConnectivityChangedEventArgs e = new NetworkConnectivityChangedEventArgs()
31+
{
32+
IsAvailable = _networkListManager.IsConnectedToInternet,
33+
ConnectionStatus = GetInternetStatus()
34+
};
35+
NetworkConnectivityChanged?.Invoke(new object(), e);
2736
}
2837
}
2938
}

ReactWindows/ReactNative.Net46/Modules/NetInfo/INetworkInformation.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Net.NetworkInformation;
1+
using NETWORKLIST;
2+
using System;
23

34
namespace ReactNative.Modules.NetInfo
45
{
@@ -8,10 +9,9 @@ namespace ReactNative.Modules.NetInfo
89
public interface INetworkInformation
910
{
1011
/// <summary>
11-
/// An event that occurs whenever the network status changes.
12+
/// An event that occurs whenever the network connectivity changes.
1213
/// </summary>
13-
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1009:DeclareEventHandlersCorrectly", Justification = "API matches Windows.Networking.Connectivity.NetworkingInformation.")]
14-
event NetworkAvailabilityChangedEventHandler NetworkAvailabilityChanged;
14+
event EventHandler<NetworkConnectivityChangedEventArgs> NetworkConnectivityChanged;
1515

1616
/// <summary>
1717
/// Gets the internet status
@@ -31,4 +31,10 @@ public interface INetworkInformation
3131
/// </summary>
3232
void Stop();
3333
}
34+
35+
public class NetworkConnectivityChangedEventArgs : EventArgs
36+
{
37+
public bool IsAvailable { get; set; }
38+
public string ConnectionStatus { get; set; }
39+
}
3440
}

ReactWindows/ReactNative.Net46/Modules/NetInfo/NetInfoModule.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using Newtonsoft.Json.Linq;
22
using ReactNative.Bridge;
33
using ReactNative.Modules.Core;
4-
using System.Net.NetworkInformation;
54

65
namespace ReactNative.Modules.NetInfo
76
{
@@ -12,6 +11,7 @@ namespace ReactNative.Modules.NetInfo
1211
public class NetInfoModule : ReactContextNativeModuleBase, ILifecycleEventListener
1312
{
1413
private readonly INetworkInformation _networkInfo;
14+
private string _connected;
1515

1616
/// <summary>
1717
/// Instantiates the <see cref="NetInfoModule"/>.
@@ -67,15 +67,15 @@ public void OnDestroy()
6767
public void OnResume()
6868
{
6969
_networkInfo.Start();
70-
_networkInfo.NetworkAvailabilityChanged += OnAvailabilityChanged;
70+
_networkInfo.NetworkConnectivityChanged += OnNetworkConnectivityChanged;
7171
}
7272

7373
/// <summary>
7474
/// Called when the application host is suspended.
7575
/// </summary>
7676
public void OnSuspend()
7777
{
78-
_networkInfo.NetworkAvailabilityChanged -= OnAvailabilityChanged;
78+
_networkInfo.NetworkConnectivityChanged -= OnNetworkConnectivityChanged;
7979
_networkInfo.Stop();
8080
}
8181

@@ -95,10 +95,14 @@ private JObject CreateConnectivityEventMap()
9595
};
9696
}
9797

98-
private void OnAvailabilityChanged(object ignored, NetworkAvailabilityEventArgs e)
98+
private void OnNetworkConnectivityChanged(object ignored, NetworkConnectivityChangedEventArgs e)
9999
{
100-
Context.GetJavaScriptModule<RCTDeviceEventEmitter>()
101-
.emit("networkStatusDidChange", CreateConnectivityEventMap());
100+
if (e.ConnectionStatus != _connected)
101+
{
102+
_connected = e.ConnectionStatus;
103+
Context.GetJavaScriptModule<RCTDeviceEventEmitter>()
104+
.emit("networkStatusDidChange", CreateConnectivityEventMap());
105+
}
102106
}
103107
}
104108
}

ReactWindows/ReactNative.Net46/ReactNative.Net46.csproj

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,17 @@
211211
<Generator>MSBuild:Compile</Generator>
212212
</Page>
213213
</ItemGroup>
214+
<ItemGroup>
215+
<COMReference Include="NETWORKLIST">
216+
<Guid>{DCB00D01-570F-4A9B-8D69-199FDBA5723B}</Guid>
217+
<VersionMajor>1</VersionMajor>
218+
<VersionMinor>0</VersionMinor>
219+
<Lcid>0</Lcid>
220+
<WrapperTool>tlbimp</WrapperTool>
221+
<Isolated>False</Isolated>
222+
<EmbedInteropTypes>False</EmbedInteropTypes>
223+
</COMReference>
224+
</ItemGroup>
214225
<Import Project="..\ReactNative.Shared\ReactNative.Shared.projitems" Label="Shared" />
215226
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
216227
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

0 commit comments

Comments
 (0)