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