windows-nt/Source/XPSP1/NT/net/homenet/alg/exe/applicationgatewayservices.h
2020-09-26 16:20:57 +08:00

270 lines
7.1 KiB
C++

// ApplicationGatewayServices.h : Declaration of the CApplicationGatewayServices
#pragma once
#include "resource.h" // main symbols
#include "CollectionChannels.h"
#include "CollectionAdapterNotifySinks.h"
/////////////////////////////////////////////////////////////////////////////
// CApplicationGatewayServices
class ATL_NO_VTABLE CApplicationGatewayServices :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CApplicationGatewayServices, &CLSID_ApplicationGatewayServices>,
public IApplicationGatewayServices
{
public:
CApplicationGatewayServices()
{
m_hTimerQueue = NULL;
}
~CApplicationGatewayServices()
{
MYTRACE_ENTER_NOSHOWEXIT("~CApplicationGatewayServices()");
if ( m_hTimerQueue )
{
MYTRACE("Deleting the TimerQueue");
DeleteTimerQueueEx(
m_hTimerQueue, // handle to timer queue
INVALID_HANDLE_VALUE // handle to completion event
);
}
}
HRESULT FinalConstruct()
{
MYTRACE_ENTER_NOSHOWEXIT("CApplicationGatewayServices()::FinalConstruct()");
m_hTimerQueue = CreateTimerQueue();
HRESULT hr = S_OK;
if ( m_hTimerQueue == NULL )
{
hr = HRESULT_FROM_WIN32( GetLastError() );
MYTRACE_ERROR("Could not CreateTimerQueue", hr);
}
return hr;
}
DECLARE_REGISTRY_RESOURCEID(IDR_APPLICATIONGATEWAYSERVICES)
DECLARE_NOT_AGGREGATABLE(CApplicationGatewayServices)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CApplicationGatewayServices)
COM_INTERFACE_ENTRY(IApplicationGatewayServices)
END_COM_MAP()
// IApplicationGatewayServices
public:
STDMETHODIMP CreatePrimaryControlChannel (
ALG_PROTOCOL eProtocol,
USHORT usPortToCapture,
ALG_CAPTURE eCaptureType,
BOOL fCaptureInbound,
ULONG ulListenAddress,
USHORT usListenPort,
IPrimaryControlChannel** ppIControlChannel
);
STDMETHODIMP CreateSecondaryControlChannel(
ALG_PROTOCOL eProtocol,
ULONG ulPrivateAddress,
USHORT usPrivatePort,
ULONG ulPublicAddress,
USHORT usPublicPort,
ULONG ulRemoteAddress,
USHORT usRemotePort,
ULONG ulListenAddress,
USHORT usListenPort,
ALG_DIRECTION eDirection,
BOOL fPersistent,
ISecondaryControlChannel ** ppControlChannel
);
STDMETHODIMP GetBestSourceAddressForDestinationAddress(
ULONG ulDstAddress,
BOOL fDemandDial,
ULONG * pulBestSrcAddress
);
STDMETHODIMP PrepareProxyConnection(
ALG_PROTOCOL eProtocol,
ULONG ulSrcAddress,
USHORT usSrcPort,
ULONG ulDstAddress,
USHORT usDstPort,
BOOL fNoTimeout,
IPendingProxyConnection ** ppPendingConnection
);
STDMETHODIMP PrepareSourceModifiedProxyConnection(
ALG_PROTOCOL eProtocol,
ULONG ulSrcAddress,
USHORT usSrcPort,
ULONG ulDstAddress,
USHORT usDstPort,
ULONG ulNewSrcAddress,
USHORT usNewSourcePort,
IPendingProxyConnection ** ppPendingConnection
);
STDMETHODIMP CreateDataChannel(
ALG_PROTOCOL eProtocol,
ULONG ulPrivateAddress,
USHORT usPrivatePort,
ULONG ulPublicAddress,
USHORT ulPublicPort,
ULONG ulRemoteAddress,
USHORT ulRemotePort,
ALG_DIRECTION eDirection,
ALG_NOTIFICATION eDesiredNotification,
BOOL fNoTimeout,
IDataChannel** ppDataChannel
);
STDMETHODIMP CreatePersistentDataChannel(
ALG_PROTOCOL eProtocol,
ULONG ulPrivateAddress,
USHORT usPrivatePort,
ULONG ulPublicAddress,
USHORT ulPublicPort,
ULONG ulRemoteAddress,
USHORT ulRemotePort,
ALG_DIRECTION eDirection,
IPersistentDataChannel** ppPersistentDataChannel
);
STDMETHODIMP ReservePort(
USHORT usPortCount,
USHORT* pusReservedPort
);
STDMETHODIMP ReleaseReservedPort(
USHORT usReservedPortBase,
USHORT usPortCount
);
STDMETHODIMP EnumerateAdapters(
IEnumAdapterInfo** ppEnumAdapterInfo
);
STDMETHODIMP StartAdapterNotifications(
IAdapterNotificationSink * pSink,
DWORD* pdwCookie
);
STDMETHODIMP StopAdapterNotifications(
DWORD dwCookieToRemove
);
//
// Properties
//
public:
HANDLE m_hTimerQueue;
//
// Methods
//
public:
static VOID CALLBACK
TimerCallbackReleasePort(
PVOID lpParameter, // thread data
BOOLEAN TimerOrWaitFired // reason
);
};
//
// Reserved port release delay
//
#define ALG_PORT_RELEASE_DELAY 240000
//
//
//
class CTimerQueueReleasePort
{
public:
CTimerQueueReleasePort(
IN HANDLE MainTimerQueue,
IN USHORT usPortBase, // Port to release
IN USHORT usPortCount
) :
m_hTimerQueue(MainTimerQueue),
m_usPortBase(usPortBase),
m_usPortCount(usPortCount)
{
MYTRACE_ENTER_NOSHOWEXIT("CTimerQueueReleasePort:NEW");
BOOL bRet = CreateTimerQueueTimer(
&m_hTimerThis,
m_hTimerQueue,
CApplicationGatewayServices::TimerCallbackReleasePort,
(PVOID)this,
ALG_PORT_RELEASE_DELAY,
0,
WT_EXECUTEDEFAULT
);
if ( bRet == FALSE )
{
MYTRACE_ERROR("Could not CreateTimerQueueTimer", GetLastError());
m_hTimerThis = NULL;
}
}
~CTimerQueueReleasePort()
{
if ( m_hTimerThis )
{
DeleteTimerQueueTimer(
m_hTimerQueue,
m_hTimerThis,
NULL
);
}
}
HANDLE m_hTimerQueue;
HANDLE m_hTimerThis;
USHORT m_usPortBase; // Port to release
USHORT m_usPortCount; // Number of port to release
};