windows-nt/Source/XPSP1/NT/net/tapi/skywalker/h323msp/h323addr.cpp
2020-09-26 16:20:57 +08:00

286 lines
6 KiB
C++

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
H323addr.cpp
Abstract:
This module contains implementation of CH323MSP.
Author:
Mu Han (muhan) 5-September-1997
--*/
#include "stdafx.h"
#include "common.h"
STDMETHODIMP CH323MSP::CreateTerminal(
IN BSTR pTerminalClass,
IN long lMediaType,
IN TERMINAL_DIRECTION Direction,
OUT ITTerminal ** ppTerminal
)
/*++
Routine Description:
This method is called by TAPI3 to create a dynamic terminal. It asks the
terminal manager to create a dynamic terminal.
Arguments:
iidTerminalClass
IID of the terminal class to be created.
dwMediaType
TAPI media type of the terminal to be created.
Direction
Terminal direction of the terminal to be created.
ppTerminal
Returned created terminal object
Return Value:
S_OK
E_OUTOFMEMORY
TAPI_E_INVALIDMEDIATYPE
TAPI_E_INVALIDTERMINALDIRECTION
TAPI_E_INVALIDTERMINALCLASS
--*/
{
LOG((MSP_TRACE,
"CH323MSP::CreateTerminal - enter"));
//
// Check if initialized.
//
// lock the event related data
m_EventDataLock.Lock();
if ( m_htEvent == NULL )
{
// unlock the event related data
m_EventDataLock.Unlock();
LOG((MSP_ERROR,
"CH323MSP::CreateTerminal - "
"not initialized - returning E_UNEXPECTED"));
return E_UNEXPECTED;
}
// unlock the event related data
m_EventDataLock.Unlock();
//
// Get the IID from the BSTR representation.
//
HRESULT hr;
IID iidTerminalClass;
hr = CLSIDFromString(pTerminalClass, &iidTerminalClass);
if ( FAILED(hr) )
{
LOG((MSP_ERROR, "CH323MSP::CreateTerminal - "
"bad CLSID string - returning E_INVALIDARG"));
return E_INVALIDARG;
}
//
// we don't have any specific req's to terminal's media type.
// termmgr will check if the media type is valid at all.
//
//
// The terminal manager checks the terminal class, terminal direction,
// and return pointer.
//
//
// Use the terminal manager to create the dynamic terminal.
//
_ASSERTE( m_pITTerminalManager != NULL );
hr = m_pITTerminalManager->CreateDynamicTerminal(NULL,
iidTerminalClass,
(DWORD) lMediaType,
Direction,
(MSP_HANDLE) this,
ppTerminal);
if ( FAILED(hr) )
{
LOG((MSP_ERROR, "CH323MSP::CreateTerminal - "
"create dynamic terminal failed - returning 0x%08x", hr));
return hr;
}
if ((iidTerminalClass == CLSID_MediaStreamTerminal)
&& (lMediaType == TAPIMEDIATYPE_AUDIO))
{
// Set the format of the audio to 8KHZ, 16Bit/Sample, MONO.
hr = ::SetAudioFormat(
*ppTerminal,
g_wAudioCaptureBitPerSample,
g_dwAudioSampleRate
);
if (FAILED(hr))
{
LOG((MSP_WARN, "can't set audio format, %x", hr));
}
}
LOG((MSP_TRACE, "CH323MSP::CreateTerminal - exit S_OK"));
return S_OK;
}
STDMETHODIMP CH323MSP::CreateMSPCall(
IN MSP_HANDLE htCall,
IN DWORD dwReserved,
IN DWORD dwMediaType,
IN IUnknown * pOuterUnknown,
OUT IUnknown ** ppMSPCall
)
/*++
Routine Description:
This method is called by TAPI3 before a call is made or answered. It creates
a aggregated MSPCall object and returns the IUnknown pointer. It calls the
helper template function defined in mspaddress.h to handle the real creation.
Arguments:
htCall
TAPI 3.0's identifier for this call. Returned in events passed back
to TAPI.
dwReserved
Reserved parameter. Not currently used.
dwMediaType
Media type of the call being created. These are TAPIMEDIATYPES and more
than one mediatype can be selected (bitwise).
pOuterUnknown
pointer to the IUnknown interface of the containing object.
ppMSPCall
Returned MSP call that the MSP fills on on success.
Return Value:
S_OK
E_OUTOFMEMORY
E_POINTER
TAPI_E_INVALIDMEDIATYPE
--*/
{
LOG((MSP_TRACE,
"CreateMSPCall entered. htCall:%x, dwMediaType:%x, ppMSPCall:%x",
htCall, dwMediaType, ppMSPCall
));
CH323MSPCall * pMSPCall = NULL;
// This function does all the parameter checkings.
HRESULT hr = ::CreateMSPCallHelper(
this,
htCall,
dwReserved,
dwMediaType,
pOuterUnknown,
ppMSPCall,
&pMSPCall
);
if (FAILED(hr))
{
LOG((MSP_ERROR, "CreateMSPCallHelper failed:%x", hr));
return hr;
}
return hr;
}
STDMETHODIMP CH323MSP::ShutdownMSPCall(
IN IUnknown * pUnknown
)
/*++
Routine Description:
This method is called by TAPI3 to shutdown a MSPCall. It calls the helper
function defined in MSPAddress to to the real job.
Arguments:
pUnknown
pointer to the IUnknown interface of the contained object. It is a
CComAggObject that contains our call object.
Return Value:
S_OK
E_POINTER
TAPI_E_INVALIDMEDIATYPE
--*/
{
LOG((MSP_TRACE, "ShutDownMSPCall entered. pUnknown:%x", pUnknown));
if (IsBadReadPtr(pUnknown, sizeof(VOID *) * 3))
{
LOG((MSP_ERROR, "ERROR:pUnknow is a bad pointer"));
return E_POINTER;
}
CH323MSPCall * pMSPCall = NULL;
HRESULT hr = ::ShutdownMSPCallHelper(pUnknown, &pMSPCall);
if (FAILED(hr))
{
LOG((MSP_ERROR, "ShutDownMSPCallhelper failed:: %x", hr));
return hr;
}
return hr;
}
DWORD CH323MSP::GetCallMediaTypes(void)
{
return H323CALLMEDIATYPES;
}
ULONG CH323MSP::MSPAddressAddRef(void)
{
return MSPAddRefHelper(this);
}
ULONG CH323MSP::MSPAddressRelease(void)
{
return MSPReleaseHelper(this);
}