286 lines
6 KiB
C++
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);
|
|
}
|
|
|