mirror of https://github.com/PurpleI2P/i2pd.git
R4SAS
5 years ago
2 changed files with 162 additions and 135 deletions
@ -1,59 +1,78 @@
@@ -1,59 +1,78 @@
|
||||
#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
|
||||
#if WINVER != 0x0501 // supported since Vista
|
||||
#include "Win32NetState.h" |
||||
#include <windows.h> |
||||
#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
|
||||
|
@ -1,77 +1,85 @@
@@ -1,77 +1,85 @@
|
||||
#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
|
||||
#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) { |
||||
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 |
Loading…
Reference in new issue