/ Win32 / Win32NetState.cpp
Win32NetState.cpp
  1  /*
  2  * Copyright (c) 2013-2024, The PurpleI2P Project
  3  *
  4  * This file is part of Purple i2pd project and licensed under BSD3
  5  *
  6  * See full license text in LICENSE file at top of project tree
  7  */
  8  
  9  #if WINVER != 0x0501 // supported since Vista
 10  #include "Win32NetState.h"
 11  #include <windows.h>
 12  #include "Log.h"
 13  
 14  IUnknown *pUnknown = nullptr;
 15  INetworkListManager *pNetworkListManager = nullptr;
 16  IConnectionPointContainer *pCPContainer = nullptr;
 17  IConnectionPoint *pConnectPoint = nullptr;
 18  CNetworkListManagerEvent *pNetEvent = nullptr;
 19  DWORD Cookie = 0;
 20  
 21  void SubscribeToEvents()
 22  {
 23  	LogPrint(eLogInfo, "NetState: Trying to subscribe to NetworkListManagerEvents");
 24  	CoInitialize(NULL);
 25  
 26  	HRESULT Result = CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, IID_IUnknown, (void **)&pUnknown);
 27  	if (SUCCEEDED(Result))
 28  	{
 29  		Result = pUnknown->QueryInterface(IID_INetworkListManager, (void **)&pNetworkListManager);
 30  		if (SUCCEEDED(Result))
 31  		{
 32  			VARIANT_BOOL IsConnect = VARIANT_FALSE;
 33  #if defined(_MSC_VER)
 34  			Result = pNetworkListManager->get_IsConnectedToInternet(&IsConnect);
 35  #else
 36  			Result = pNetworkListManager->IsConnectedToInternet(&IsConnect);
 37  #endif
 38  			if (SUCCEEDED(Result)) {
 39  				i2p::transport::transports.SetOnline (true);
 40  				LogPrint(eLogInfo, "NetState: Current state: ", IsConnect == VARIANT_TRUE ? "connected" : "disconnected");
 41  			}
 42  
 43  			Result = pNetworkListManager->QueryInterface(IID_IConnectionPointContainer, (void **)&pCPContainer);
 44  			if (SUCCEEDED(Result))
 45  			{
 46  				Result = pCPContainer->FindConnectionPoint(IID_INetworkListManagerEvents, &pConnectPoint);
 47  				if(SUCCEEDED(Result))
 48  				{
 49  					pNetEvent = new CNetworkListManagerEvent;
 50  					Result = pConnectPoint->Advise((IUnknown *)pNetEvent, &Cookie);
 51  					if (SUCCEEDED(Result))
 52  						LogPrint(eLogInfo, "NetState: Successfully subscribed to NetworkListManagerEvent messages");
 53  					else
 54  						LogPrint(eLogError, "NetState: Unable to subscribe to NetworkListManagerEvent messages");
 55  				} else
 56  					LogPrint(eLogError, "NetState: Unable to find interface connection point");
 57  			} else
 58  				LogPrint(eLogError, "NetState: Unable to query NetworkListManager interface");
 59  		} else
 60  			LogPrint(eLogError, "NetState: Unable to query global interface");
 61  	} else
 62  		LogPrint(eLogError, "NetState: Unable to create INetworkListManager interface");
 63  }
 64  
 65  void UnSubscribeFromEvents()
 66  {
 67  	LogPrint(eLogInfo, "NetState: Unsubscribing from NetworkListManagerEvents");
 68  	try
 69  	{
 70  		if (pConnectPoint) {
 71  			pConnectPoint->Unadvise(Cookie);
 72  			pConnectPoint->Release();
 73  		}
 74  
 75  		if (pNetEvent)
 76  		{
 77  			pNetEvent->Release();
 78  		}
 79  
 80  		if (pCPContainer)
 81  		{
 82  			pCPContainer->Release();
 83  		}
 84  
 85  		if (pNetworkListManager)
 86  		{
 87  			pNetworkListManager->Release();
 88  		}
 89  
 90  		if (pUnknown)
 91  		{
 92  			pUnknown->Release();
 93  		}
 94  
 95  		CoUninitialize();
 96  	}
 97  	catch (std::exception& ex)
 98  	{
 99  		LogPrint (eLogError, "NetState: Received exception: ", ex.what ());
100  	}
101  }
102  
103  #endif // WINVER