// // 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( 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; }