1818#include < cassert>
1919#include < set>
2020
21- class NetworkListener final : public INetworkEvents {
21+ class NetworkListener final : public INetworkListManagerEvents {
2222public:
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
211202bool 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
231248void 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