270 lines
7.1 KiB
C++
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
|
|
};
|
|
|
|
|