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

143 lines
3.4 KiB
C++

//
// DataChannel.cpp : Implementation of CDataChannel
//
#include "PreComp.h"
#include "DataChannel.h"
#include "AlgController.h"
/////////////////////////////////////////////////////////////////////////////
// CDataChannel
STDMETHODIMP CDataChannel::Cancel()
{
MYTRACE_ENTER_NOSHOWEXIT("CDataChannel::Cancel()");
//
// Normal redirect cancel using original argument pass to CreateRedirect
//
HRESULT hr = g_pAlgController->GetNat()->CancelRedirect(
(UCHAR)m_Properties.eProtocol,
m_ulDestinationAddress,
m_usDestinationPort,
m_ulSourceAddress,
m_usSourcePort,
m_ulNewDestinationAddress,
m_usNewDestinationPort,
m_ulNewSourceAddress,
m_usNewSourcePort
);
return hr;
}
STDMETHODIMP CDataChannel::GetChannelProperties(ALG_DATA_CHANNEL_PROPERTIES** ppProperties)
{
HRESULT hr = S_OK;
if (NULL != ppProperties)
{
*ppProperties = reinterpret_cast<ALG_DATA_CHANNEL_PROPERTIES*>(
CoTaskMemAlloc(sizeof(ALG_DATA_CHANNEL_PROPERTIES))
);
if (NULL != *ppProperties)
{
CopyMemory(*ppProperties, &m_Properties, sizeof(ALG_DATA_CHANNEL_PROPERTIES));
}
else
{
hr = E_OUTOFMEMORY;
}
}
else
{
hr = E_POINTER;
}
return hr;
}
//
// Retrieve the requested event handle.
// The caller must call CloseHandle on this handle.
// This routine will fail if session creation notification was not requested.
//
// Notification will be triggered when the Channel is open (TCP)
// or when the first UDP packet are received
//
STDMETHODIMP CDataChannel::GetSessionCreationEventHandle(HANDLE* pHandle)
{
MYTRACE_ENTER("CDataChannel::GetSessionCreationEventHandle");
if ( pHandle == NULL )
return E_INVALIDARG;
if ( !m_hCreateEvent )
return E_FAIL;
if ( DuplicateHandle(
GetCurrentProcess(),
m_hCreateEvent,
GetCurrentProcess(),
pHandle,
0,
FALSE,
DUPLICATE_SAME_ACCESS
)
)
{
MYTRACE("Duplicated handle from %d to new %d", m_hCreateEvent, *pHandle);
}
else
{
MYTRACE_ERROR("Duplicating handle", 0);
return E_FAIL;
}
return S_OK;
}
//
// Retrieve the requested event handle.
// The caller must call CloseHandle on this handle.
// This routine will fail if session deletion notification was not requested.
//
// Notification will be triggered when the Channel is close
// or when UDP packet are now reveice for a period of time.
//
STDMETHODIMP CDataChannel::GetSessionDeletionEventHandle(HANDLE* pHandle)
{
MYTRACE_ENTER("CDataChannel::GetSessionDeletionEventHandle");
if ( pHandle == NULL )
return E_INVALIDARG;
if ( !m_hDeleteEvent )
return E_FAIL;
if ( DuplicateHandle(
GetCurrentProcess(),
m_hDeleteEvent,
GetCurrentProcess(),
pHandle,
0,
FALSE,
DUPLICATE_SAME_ACCESS
)
)
{
MYTRACE("Duplicated handle from %d to new %d", m_hDeleteEvent, *pHandle);
}
else
{
MYTRACE_ERROR("Duplicating handle", 0);
return E_FAIL;
}
return S_OK;
}