From 152e579f7eb851c1e85a734b53ebf592bbd4870d Mon Sep 17 00:00:00 2001 From: R4SAS Date: Sun, 12 Apr 2020 06:00:06 +0300 Subject: [PATCH] [windows] update flag on connectivity state changes, CRLF > LF Signed-off-by: R4SAS --- Win32/Win32NetState.cpp | 137 +++++++++++++++++++--------------- Win32/Win32NetState.h | 160 +++++++++++++++++++++------------------- 2 files changed, 162 insertions(+), 135 deletions(-) diff --git a/Win32/Win32NetState.cpp b/Win32/Win32NetState.cpp index f6843ebc..9a650179 100644 --- a/Win32/Win32NetState.cpp +++ b/Win32/Win32NetState.cpp @@ -1,59 +1,78 @@ -#if WINVER != 0x0501 // supported since Vista -#include "Win32NetState.h" -#include -#include "Log.h" - -IUnknown *pUnknown = NULL; -INetworkListManager *pNetworkListManager = NULL; -IConnectionPointContainer *pCPContainer = NULL; -DWORD Cookie = 0; -IConnectionPoint *pConnectPoint = NULL; - -void SubscribeToEvents() -{ - LogPrint(eLogInfo, "NetState: Trying to subscribe to NetworkListManagerEvents"); - CoInitialize(NULL); - - HRESULT Result = CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, IID_IUnknown, (void **)&pUnknown); - if (SUCCEEDED(Result)) - { - Result = pUnknown->QueryInterface(IID_INetworkListManager, (void **)&pNetworkListManager); - if (SUCCEEDED(Result)) - { - /* VARIANT_BOOL IsConnect = VARIANT_FALSE; - Result = pNetworkListManager->IsConnectedToInternet(&IsConnect); - if (SUCCEEDED(Result)) - LogPrint(eLogInfo, "NetState: IsConnect Result:", IsConnect == VARIANT_TRUE ? "TRUE" : "FALSE"); */ - - Result = pNetworkListManager->QueryInterface(IID_IConnectionPointContainer, (void **)&pCPContainer); - if (SUCCEEDED(Result)) - { - Result = pCPContainer->FindConnectionPoint(IID_INetworkListManagerEvents, &pConnectPoint); - if(SUCCEEDED(Result)) - { - CNetworkListManagerEvent *NetEvent = new CNetworkListManagerEvent; - Result = pConnectPoint->Advise((IUnknown *)NetEvent, &Cookie); - if (SUCCEEDED(Result)) - LogPrint(eLogInfo, "NetState: Successfully subscribed to NetworkListManagerEvent messages"); - } else - LogPrint(eLogError, "NetState: Unable to find interface connection point"); - } else - LogPrint(eLogError, "NetState: Unable to query NetworkListManager interface"); - } else - LogPrint(eLogError, "NetState: Unable to query global interface"); - } else - LogPrint(eLogError, "NetState: Unable to create INetworkListManager interface"); -} - -void UnSubscribeFromEvents() -{ - // TODO - DETECT EVERY STAGE STATE and call functions depending it !!! - pConnectPoint->Unadvise(Cookie); - pConnectPoint->Release(); - pCPContainer->Release(); - pNetworkListManager->Release(); - pUnknown->Release(); - CoUninitialize(); -} - -#endif // WINVER +#if WINVER != 0x0501 // supported since Vista +#include "Win32NetState.h" +#include +#include "Log.h" + +IUnknown *pUnknown = nullptr; +INetworkListManager *pNetworkListManager = nullptr; +IConnectionPointContainer *pCPContainer = nullptr; +IConnectionPoint *pConnectPoint = nullptr; +DWORD Cookie = 0; + +void SubscribeToEvents() +{ + LogPrint(eLogInfo, "NetState: Trying to subscribe to NetworkListManagerEvents"); + CoInitialize(NULL); + + HRESULT Result = CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, IID_IUnknown, (void **)&pUnknown); + if (SUCCEEDED(Result)) + { + Result = pUnknown->QueryInterface(IID_INetworkListManager, (void **)&pNetworkListManager); + if (SUCCEEDED(Result)) + { + VARIANT_BOOL IsConnect = VARIANT_FALSE; + Result = pNetworkListManager->IsConnectedToInternet(&IsConnect); + if (SUCCEEDED(Result)) { + i2p::transport::transports.SetOnline (true); + LogPrint(eLogInfo, "NetState: current state: ", IsConnect == VARIANT_TRUE ? "connected" : "disconnected"); + } + + Result = pNetworkListManager->QueryInterface(IID_IConnectionPointContainer, (void **)&pCPContainer); + if (SUCCEEDED(Result)) + { + Result = pCPContainer->FindConnectionPoint(IID_INetworkListManagerEvents, &pConnectPoint); + if(SUCCEEDED(Result)) + { + CNetworkListManagerEvent *NetEvent = new CNetworkListManagerEvent; + Result = pConnectPoint->Advise((IUnknown *)NetEvent, &Cookie); + if (SUCCEEDED(Result)) + LogPrint(eLogInfo, "NetState: Successfully subscribed to NetworkListManagerEvent messages"); + else + LogPrint(eLogError, "NetState: Unable to subscribe to NetworkListManagerEvent messages"); + } else + LogPrint(eLogError, "NetState: Unable to find interface connection point"); + } else + LogPrint(eLogError, "NetState: Unable to query NetworkListManager interface"); + } else + LogPrint(eLogError, "NetState: Unable to query global interface"); + } else + LogPrint(eLogError, "NetState: Unable to create INetworkListManager interface"); +} + +void UnSubscribeFromEvents() +{ + try + { + if (pConnectPoint) { + pConnectPoint->Unadvise(Cookie); + pConnectPoint->Release(); + } + + if (pCPContainer) + pCPContainer->Release(); + + if (pNetworkListManager) + pNetworkListManager->Release(); + + if (pUnknown) + pUnknown->Release(); + + CoUninitialize(); + } + catch (std::exception& ex) + { + LogPrint (eLogError, "NetState: received exception: ", ex.what ()); + } +} + +#endif // WINVER diff --git a/Win32/Win32NetState.h b/Win32/Win32NetState.h index 3e82aa5e..f043b171 100644 --- a/Win32/Win32NetState.h +++ b/Win32/Win32NetState.h @@ -1,77 +1,85 @@ -#ifndef WIN_32_NETSTATE_H__ -#define WIN_32_NETSTATE_H__ - -#if WINVER != 0x0501 // supported since Vista -#include -#include -#include "Log.h" -#include "Transports.h" - -class CNetworkListManagerEvent : public INetworkListManagerEvents -{ -public: - CNetworkListManagerEvent() : m_ref(1) { } - ~CNetworkListManagerEvent() { } - - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) - { - HRESULT Result = S_OK; - if (IsEqualIID(riid, IID_IUnknown)) { - *ppvObject = (IUnknown *)this; - } else if (IsEqualIID(riid ,IID_INetworkListManagerEvents)) { - *ppvObject = (INetworkListManagerEvents *)this; - } else { - Result = E_NOINTERFACE; - } - - return Result; - } - - ULONG STDMETHODCALLTYPE AddRef() - { - return (ULONG)InterlockedIncrement(&m_ref); - } - - ULONG STDMETHODCALLTYPE Release() - { - LONG Result = InterlockedDecrement(&m_ref); - if (Result == 0) - delete this; - return (ULONG)Result; - } - - virtual HRESULT STDMETHODCALLTYPE ConnectivityChanged(NLM_CONNECTIVITY newConnectivity) - { - if (newConnectivity == NLM_CONNECTIVITY_DISCONNECTED) - LogPrint(eLogInfo, "NetState: disconnected from network"); - - if (((int)newConnectivity & (int)NLM_CONNECTIVITY_IPV4_INTERNET) != 0) - LogPrint(eLogInfo, "NetState: connected to internet with IPv4 capability"); - - if (((int)newConnectivity & (int)NLM_CONNECTIVITY_IPV6_INTERNET) != 0) - LogPrint(eLogInfo, "NetState: connected to internet with IPv6 capability"); - - if ( - (((int)newConnectivity & (int)NLM_CONNECTIVITY_IPV4_INTERNET) == 0) && - (((int)newConnectivity & (int)NLM_CONNECTIVITY_IPV6_INTERNET) == 0) - ) - LogPrint(eLogInfo, "NetState: connected without internet access"); - - return S_OK; - } - -private: - - LONG m_ref; -}; - -void SubscribeToEvents(); -void UnSubscribeFromEvents(); - -#else // WINVER == 0x0501 - -void SubscribeToEvents() { } -void UnSubscribeFromEvents() { } - -#endif // WINVER +#ifndef WIN_32_NETSTATE_H__ +#define WIN_32_NETSTATE_H__ + +#if WINVER != 0x0501 // supported since Vista +#include +#include +#include "Log.h" +#include "Transports.h" + +class CNetworkListManagerEvent : public INetworkListManagerEvents +{ +public: + CNetworkListManagerEvent() : m_ref(1) { } + ~CNetworkListManagerEvent() { } + + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) + { + HRESULT Result = S_OK; + if (IsEqualIID(riid, IID_IUnknown)) { + *ppvObject = (IUnknown *)this; + } else if (IsEqualIID(riid ,IID_INetworkListManagerEvents)) { + *ppvObject = (INetworkListManagerEvents *)this; + } else { + Result = E_NOINTERFACE; + } + + return Result; + } + + ULONG STDMETHODCALLTYPE AddRef() + { + return (ULONG)InterlockedIncrement(&m_ref); + } + + ULONG STDMETHODCALLTYPE Release() + { + LONG Result = InterlockedDecrement(&m_ref); + if (Result == 0) + delete this; + return (ULONG)Result; + } + + virtual HRESULT STDMETHODCALLTYPE ConnectivityChanged(NLM_CONNECTIVITY newConnectivity) + { + if (newConnectivity == NLM_CONNECTIVITY_DISCONNECTED) { + i2p::transport::transports.SetOnline (false); + LogPrint(eLogInfo, "NetState: disconnected from network"); + } + + if (((int)newConnectivity & (int)NLM_CONNECTIVITY_IPV4_INTERNET) != 0) { + i2p::transport::transports.SetOnline (true); + LogPrint(eLogInfo, "NetState: connected to internet with IPv4 capability"); + } + + if (((int)newConnectivity & (int)NLM_CONNECTIVITY_IPV6_INTERNET) != 0) { + i2p::transport::transports.SetOnline (true); + LogPrint(eLogInfo, "NetState: connected to internet with IPv6 capability"); + } + + if ( + (((int)newConnectivity & (int)NLM_CONNECTIVITY_IPV4_INTERNET) == 0) && + (((int)newConnectivity & (int)NLM_CONNECTIVITY_IPV6_INTERNET) == 0) + ) { + i2p::transport::transports.SetOnline (false); + LogPrint(eLogInfo, "NetState: connected without internet access"); + } + + return S_OK; + } + +private: + + LONG m_ref; +}; + +void SubscribeToEvents(); +void UnSubscribeFromEvents(); + +#else // WINVER == 0x0501 + +void SubscribeToEvents() { } +void UnSubscribeFromEvents() { } + +#endif // WINVER #endif \ No newline at end of file