Skip to content

Commit 2b61441

Browse files
committed
fix(connectivity_plus): use Windows list manager events
1 parent 6427bc6 commit 2b61441

2 files changed

Lines changed: 47 additions & 27 deletions

File tree

packages/connectivity_plus/connectivity_plus/windows/include/connectivity_plus/network_manager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class NetworkManager {
4545
IConnectionPointContainer *pCPContainer = NULL;
4646
IConnectionPoint *pConnectPoint = NULL;
4747
NetworkListener *pListener = NULL;
48+
HRESULT lastError = S_OK;
4849
};
4950

5051
#endif // NETWORK_MANAGER_H

packages/connectivity_plus/connectivity_plus/windows/network_manager.cpp

Lines changed: 46 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,26 @@
1818
#include <cassert>
1919
#include <set>
2020

21-
class NetworkListener final : public INetworkEvents {
21+
class NetworkListener final : public INetworkListManagerEvents {
2222
public:
2323
NetworkListener(NetworkCallback pCb) : pCallback(pCb) {}
2424

2525
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) {
26-
AddRef();
26+
if (!ppvObject) {
27+
return E_POINTER;
28+
}
2729

28-
HRESULT hr = S_OK;
2930
if (IsEqualIID(riid, IID_IUnknown)) {
30-
*ppvObject = (IUnknown *)this;
31-
} else if (IsEqualIID(riid, IID_INetworkEvents)) {
32-
*ppvObject = (INetworkEvents *)this;
31+
*ppvObject = static_cast<IUnknown *>(this);
32+
} else if (IsEqualIID(riid, IID_INetworkListManagerEvents)) {
33+
*ppvObject = static_cast<INetworkListManagerEvents *>(this);
3334
} else {
34-
hr = E_NOINTERFACE;
35+
*ppvObject = nullptr;
36+
return E_NOINTERFACE;
3537
}
36-
return hr;
38+
39+
AddRef();
40+
return S_OK;
3741
}
3842

3943
ULONG STDMETHODCALLTYPE AddRef() { return InterlockedIncrement(&lRef); }
@@ -46,24 +50,11 @@ class NetworkListener final : public INetworkEvents {
4650
return lAddend;
4751
}
4852

49-
HRESULT STDMETHODCALLTYPE NetworkAdded(GUID networkId) { return S_OK; }
50-
51-
HRESULT STDMETHODCALLTYPE
52-
NetworkConnectivityChanged(GUID networkId, NLM_CONNECTIVITY newConnectivity) {
53+
HRESULT STDMETHODCALLTYPE ConnectivityChanged(NLM_CONNECTIVITY) {
5354
Callback();
5455
return S_OK;
5556
}
5657

57-
HRESULT STDMETHODCALLTYPE NetworkDeleted(GUID networkId) { return S_OK; }
58-
59-
HRESULT STDMETHODCALLTYPE
60-
NetworkPropertyChanged(GUID networkId, NLM_NETWORK_PROPERTY_CHANGE flags) {
61-
if (flags & NLM_NETWORK_PROPERTY_CHANGE_CONNECTION) {
62-
Callback();
63-
}
64-
return S_OK;
65-
}
66-
6758
void Callback() {
6859
assert(pCallback);
6960
pCallback();
@@ -209,14 +200,25 @@ std::set<ConnectivityType> NetworkManager::GetConnectivityTypes() const {
209200
}
210201

211202
bool NetworkManager::StartListen(NetworkCallback pCallback) {
212-
if (!pCallback || pListener) {
203+
lastError = S_OK;
204+
if (!pCallback) {
205+
lastError = E_INVALIDARG;
206+
return false;
207+
}
208+
if (pListener) {
209+
lastError = HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS);
210+
return false;
211+
}
212+
if (!pNetworkListManager) {
213+
lastError = E_POINTER;
213214
return false;
214215
}
215216

216217
HRESULT hr = pNetworkListManager->QueryInterface(
217218
IID_IConnectionPointContainer, (void **)&pCPContainer);
218219
if (SUCCEEDED(hr)) {
219-
hr = pCPContainer->FindConnectionPoint(IID_INetworkEvents, &pConnectPoint);
220+
hr = pCPContainer->FindConnectionPoint(IID_INetworkListManagerEvents,
221+
&pConnectPoint);
220222
if (SUCCEEDED(hr)) {
221223
pListener = new NetworkListener(pCallback);
222224
hr = pConnectPoint->Advise((IUnknown *)pListener, &dwCookie);
@@ -225,12 +227,29 @@ bool NetworkManager::StartListen(NetworkCallback pCallback) {
225227
}
226228
}
227229
}
230+
231+
lastError = hr;
232+
if (pListener) {
233+
pListener->Release();
234+
pListener = NULL;
235+
}
236+
if (pConnectPoint) {
237+
pConnectPoint->Release();
238+
pConnectPoint = NULL;
239+
}
240+
if (pCPContainer) {
241+
pCPContainer->Release();
242+
pCPContainer = NULL;
243+
}
244+
dwCookie = 0;
228245
return false;
229246
}
230247

231248
void NetworkManager::StopListen() {
232249
if (pConnectPoint) {
233-
pConnectPoint->Unadvise(dwCookie);
250+
if (dwCookie != 0) {
251+
pConnectPoint->Unadvise(dwCookie);
252+
}
234253
pConnectPoint->Release();
235254
pConnectPoint = NULL;
236255
dwCookie = 0;
@@ -247,6 +266,6 @@ void NetworkManager::StopListen() {
247266
}
248267
}
249268

250-
bool NetworkManager::HasError() const { return GetLastError() != 0; }
269+
bool NetworkManager::HasError() const { return FAILED(lastError); }
251270

252-
int NetworkManager::GetError() const { return GetLastError(); }
271+
int NetworkManager::GetError() const { return static_cast<int>(lastError); }

0 commit comments

Comments
 (0)