mirror of https://github.com/PurpleI2P/i2pd.git
R4SAS
5 years ago
5 changed files with 149 additions and 8 deletions
@ -0,0 +1,59 @@ |
|||||||
|
#if WINVER != 0x0501 // supported since Vista
|
||||||
|
#include "Win32NetState.h" |
||||||
|
#include <windows.h> |
||||||
|
#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
|
@ -0,0 +1,77 @@ |
|||||||
|
#ifndef WIN_32_NETSTATE_H__ |
||||||
|
#define WIN_32_NETSTATE_H__ |
||||||
|
|
||||||
|
#if WINVER != 0x0501 // supported since Vista
|
||||||
|
#include <netlistmgr.h> |
||||||
|
#include <ocidl.h> |
||||||
|
#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
|
||||||
|
#endif |
Loading…
Reference in new issue