189 lines
7.7 KiB
C++
189 lines
7.7 KiB
C++
#pragma once
|
|
|
|
#include "netconp.h"
|
|
#include "dispimpl2.h"
|
|
#include "upnphost.h"
|
|
#include "InternetGatewayDevice.h"
|
|
#include "api.h"
|
|
#include "hnetcfg.h"
|
|
|
|
class CWANConnectionBase :
|
|
public CComObjectRootEx<CComMultiThreadModel>,
|
|
public IUPnPEventSource,
|
|
public INetConnectionNotifySink,
|
|
public INATEventsSink,
|
|
public IDelegatingDispImpl<IWANIPConnectionService>
|
|
{
|
|
public:
|
|
|
|
CWANConnectionBase();
|
|
|
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
|
|
BEGIN_COM_MAP(CWANConnectionBase)
|
|
COM_INTERFACE_ENTRY(IWANIPConnectionService)
|
|
COM_INTERFACE_ENTRY(IDispatch)
|
|
COM_INTERFACE_ENTRY(IUPnPEventSource)
|
|
COM_INTERFACE_ENTRY(INetConnectionNotifySink)
|
|
END_COM_MAP()
|
|
|
|
|
|
|
|
|
|
HRESULT StopListening();
|
|
HRESULT Initialize(GUID* pGuid, IHNetConnection* pSharedConnection, IStatisticsProvider* pStatisticsProvider);
|
|
|
|
|
|
// IUPnPEventSource methods
|
|
STDMETHODIMP Advise(IUPnPEventSink *pesSubscriber);
|
|
STDMETHODIMP Unadvise(IUPnPEventSink *pesSubscriber);
|
|
|
|
// INetConnectionNotifySink
|
|
STDMETHODIMP ConnectionAdded(const NETCON_PROPERTIES_EX* pProps);
|
|
STDMETHODIMP ConnectionBandWidthChange(const GUID* pguidId);
|
|
STDMETHODIMP ConnectionDeleted(const GUID* pguidId);
|
|
STDMETHODIMP ConnectionModified(const NETCON_PROPERTIES_EX* pProps);
|
|
STDMETHODIMP ConnectionRenamed(const GUID* pguidId, LPCWSTR pszwNewName);
|
|
STDMETHODIMP ConnectionStatusChange(const GUID* pguidId, NETCON_STATUS Status);
|
|
STDMETHODIMP ConnectionAddressChange(const GUID* pguidId);
|
|
STDMETHODIMP ShowBalloon(const GUID* pguidId, const BSTR szCookie, const BSTR szBalloonText);
|
|
STDMETHODIMP RefreshAll();
|
|
STDMETHODIMP DisableEvents(const BOOL fDisable, const ULONG ulDisableTimeout);
|
|
|
|
// INATEventsSink
|
|
STDMETHODIMP PublicIPAddressChanged(void);
|
|
STDMETHODIMP PortMappingsChanged(void);
|
|
|
|
// IWANPPPConnection and IWANIPConnection
|
|
STDMETHODIMP get_ConnectionType(BSTR *pConnectionType);
|
|
STDMETHODIMP get_PossibleConnectionTypes(BSTR *pPossibleConnectionTypes);
|
|
STDMETHODIMP get_ConnectionStatus(BSTR *pConnectionStatus);
|
|
STDMETHODIMP get_Uptime(ULONG *pUptime);
|
|
STDMETHODIMP get_UpstreamMaxBitRate(ULONG *pUpstreamMaxBitRate);
|
|
STDMETHODIMP get_DownstreamMaxBitRate(ULONG *pDownstreamMaxBitRate);
|
|
STDMETHODIMP get_LastConnectionError(BSTR *pLastConnectionError) = 0;
|
|
STDMETHODIMP get_RSIPAvailable(VARIANT_BOOL *pRSIPAvailable);
|
|
STDMETHODIMP get_NATEnabled(VARIANT_BOOL *pNATEnabled);
|
|
STDMETHODIMP get_X_Name(BSTR* pName);
|
|
STDMETHODIMP get_ExternalIPAddress(BSTR *pExternalIPAddress);
|
|
STDMETHODIMP get_RemoteHost(BSTR *pRemoteHost);
|
|
STDMETHODIMP get_ExternalPort(USHORT *pExternalPort);
|
|
STDMETHODIMP get_InternalPort(USHORT *pInternalPort);
|
|
STDMETHODIMP get_PortMappingProtocol(BSTR *pProtocol);
|
|
STDMETHODIMP get_InternalClient(BSTR *pInternalClient);
|
|
STDMETHODIMP get_PortMappingDescription(BSTR *pDescription);
|
|
STDMETHODIMP get_PortMappingEnabled(VARIANT_BOOL *pEnabled);
|
|
STDMETHODIMP get_PortMappingLeaseDuration(ULONG *LeaseDuration);
|
|
STDMETHODIMP get_PortMappingNumberOfEntries(USHORT *pNumberOfEntries);
|
|
|
|
|
|
STDMETHODIMP SetConnectionType(BSTR NewConnectionType);
|
|
STDMETHODIMP GetConnectionTypeInfo(BSTR* pNewConnectionType, BSTR* pNewPossibleConnectionTypes);
|
|
STDMETHODIMP RequestConnection() = 0;
|
|
STDMETHODIMP ForceTermination() = 0;
|
|
STDMETHODIMP GetStatusInfo(BSTR* pNewConnectionStatus, BSTR* pNewLastConnectionError, ULONG* pNewUptime);
|
|
STDMETHODIMP GetNATRSIPStatus(VARIANT_BOOL* pNewRSIPAvailable, VARIANT_BOOL* pNewNATEnabled);
|
|
STDMETHODIMP GetLinkLayerMaxBitRates(ULONG* pNewUpstreamMaxBitRate, ULONG* pNewDownstreamMaxBitRate);
|
|
STDMETHODIMP GetGenericPortMappingEntry(USHORT uwIndex, BSTR* pRemoteHost, USHORT* puwExternalPort, BSTR* pProtocol, USHORT* puwInternalPort, BSTR* pInternalClient, VARIANT_BOOL* pbEnabled, BSTR* pDescription, ULONG* pulLeaseDuration);
|
|
STDMETHODIMP GetSpecificPortMappingEntry(BSTR RemoteHost, USHORT uwExternalPort, BSTR Protocol, USHORT* puwInternalPort, BSTR* pInternalClient, VARIANT_BOOL* pbEnabled, BSTR* pDescription, ULONG* pulLeaseDuration);
|
|
STDMETHODIMP AddPortMapping(BSTR RemoteHost, USHORT uwExternalPort, BSTR Protocol, USHORT uwInternalPort, BSTR InternalClient, VARIANT_BOOL bEnabled, BSTR Description, ULONG ulLeaseDuration);
|
|
STDMETHODIMP DeletePortMapping(BSTR RemoteHost, USHORT uwExternalPort, BSTR Protocol);
|
|
STDMETHODIMP GetExternalIPAddress(BSTR* pExternalIPAddress);
|
|
|
|
|
|
HRESULT FinalConstruct();
|
|
HRESULT FinalRelease();
|
|
protected:
|
|
|
|
HRESULT StartNetmanEvents(INetConnectionNotifySink* pSink);
|
|
HRESULT ControlEnabled(void);
|
|
HRESULT FireEvent(DISPID DispatchId);
|
|
|
|
HRESULT AddDynamicPortMapping(BSTR RemoteHost, USHORT uwExternalPort, BSTR Protocol, USHORT uwInternalPort, BSTR InternalClient, VARIANT_BOOL bEnabled, BSTR Description, ULONG ulLeaseDuration);
|
|
HRESULT AddStaticPortMapping(BSTR RemoteHost, USHORT uwExternalPort, BSTR Protocol, USHORT uwInternalPort, BSTR InternalClient, VARIANT_BOOL bEnabled, BSTR Description, ULONG ulLeaseDuration);
|
|
|
|
IHNetConnection* m_pHomenetConnection;
|
|
GUID m_SharedGuid;
|
|
IUPnPEventSink* m_pEventSink;
|
|
|
|
//
|
|
// Needed entries for the PortMappings
|
|
//
|
|
IHNetIcsSettings* m_IcsSettingsp;
|
|
|
|
private:
|
|
|
|
IConnectionPoint* m_pConnectionPoint;
|
|
DWORD m_dwConnectionManagerConnectionPointCookie;
|
|
IStatisticsProvider* m_pStatisticsProvider;
|
|
HRESULT m_hAdviseNATEventsResult;
|
|
|
|
};
|
|
|
|
//
|
|
// Utility Functions.
|
|
//
|
|
enum MAPPING_TYPE
|
|
{
|
|
ePortMappingInvalid = 0,
|
|
ePortMappingDynamic,
|
|
ePortMappingStatic
|
|
};
|
|
|
|
|
|
HRESULT
|
|
SearchPortMapping(
|
|
IN IHNetIcsSettings* IcsSettingsp,
|
|
IN OPTIONAL ULONG searchIndex,
|
|
IN OPTIONAL USHORT searchPort,
|
|
IN OPTIONAL UCHAR searchProtocol,
|
|
OUT IHNetPortMappingProtocol **Protocolpp
|
|
);
|
|
|
|
HRESULT
|
|
FillStaticMappingInformation(
|
|
IN IHNetPortMappingProtocol* MappingProtocolp,
|
|
IN OPTIONAL IHNetPortMappingBinding* Bindingp,
|
|
OUT PUSHORT uExternalPortp,
|
|
OUT BSTR* Protocolp,
|
|
OUT PUSHORT uInternalPortp,
|
|
OUT BSTR* InternalClientp,
|
|
OUT VARIANT_BOOL* bEnabledp,
|
|
OUT BSTR* Descriptionp
|
|
);
|
|
|
|
inline HRESULT
|
|
ValidatePortMappingParameters
|
|
(
|
|
IN BSTR RemoteHost,
|
|
IN USHORT uwExternalPort,
|
|
IN BSTR Protocol,
|
|
IN USHORT uwInternalPort,
|
|
IN BSTR InternalClient,
|
|
IN VARIANT_BOOL bEnabled,
|
|
IN BSTR Description,
|
|
IN ULONG ulLeaseDuration,
|
|
OUT MAPPING_TYPE* pMappingType
|
|
);
|
|
|
|
|
|
|
|
#define RESOLVE_PROTOCOL_TYPE( _X_ , _Y_ ) \
|
|
if ( !_wcsicmp( (_Y_), L"TCP") ) \
|
|
{ \
|
|
(_X_) = NAT_PROTOCOL_TCP; \
|
|
} \
|
|
else if ( !_wcsicmp((_Y_), L"UDP") ) \
|
|
{ \
|
|
(_X_) = NAT_PROTOCOL_UDP; \
|
|
} \
|
|
else \
|
|
{ \
|
|
_ASSERT( FALSE ); \
|
|
\
|
|
hr = E_INVALIDARG; \
|
|
\
|
|
break; \
|
|
}
|
|
|