mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
3.4 KiB
142 lines
3.4 KiB
//
|
|
// 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;
|
|
}
|