windows-nt/Source/XPSP1/NT/net/homenet/beacon/server/cwanconnectionbase.h
2020-09-26 16:20:57 +08:00

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; \
}