// 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, public CComCoClass, 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 };