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.
2050 lines
46 KiB
2050 lines
46 KiB
/*++
|
|
|
|
Copyright (c) 1997-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
callevnt.cpp
|
|
|
|
Abstract:
|
|
|
|
Implementation of the Call events for TAPI 3.0.
|
|
|
|
Author:
|
|
|
|
mquinton - 9/4/98
|
|
|
|
Notes:
|
|
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// CCallStateEvent -
|
|
// implementation of the ITCallStateEvent interface
|
|
// This object is given to applications for call state events
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// CCallStateEvent::FireEvent
|
|
// static function to create and fire a new CCallStateEvent
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CCallStateEvent::FireEvent(
|
|
ITCallInfo * pCall,
|
|
CALL_STATE state,
|
|
CALL_STATE_EVENT_CAUSE cause,
|
|
CTAPI * pTapi,
|
|
long lCallbackInstance
|
|
)
|
|
{
|
|
CComObject< CCallStateEvent > * p;
|
|
IDispatch * pDisp;
|
|
HRESULT hr;
|
|
CCall * pCCall;
|
|
|
|
|
|
STATICLOG((TL_TRACE, "Create - enter" ));
|
|
STATICLOG((TL_INFO, " CallState -------------> %d", state ));
|
|
STATICLOG((TL_INFO, " CallStateEventCause ---> %d", cause ));
|
|
|
|
pCCall = dynamic_cast<CComObject<CCall>*>(pCall);
|
|
|
|
if (NULL == pCCall)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - bad call pointer" ));
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( pCCall->DontExpose())
|
|
{
|
|
STATICLOG((TL_INFO, "FireEvent - Don't expose this call %p", pCCall));
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// Check the event filter mask
|
|
// This event is not filtered by TapiSrv because is
|
|
// related with TE_CALLSTATE.
|
|
//
|
|
|
|
DWORD dwEventFilterMask = 0;
|
|
dwEventFilterMask = pCCall->GetSubEventsMask( TE_CALLSTATE );
|
|
STATICLOG((TL_INFO, " CallStateEventMask ---> %ld", dwEventFilterMask ));
|
|
|
|
if( !( dwEventFilterMask & GET_SUBEVENT_FLAG(state)))
|
|
{
|
|
STATICLOG((TL_WARN, "FireEvent - filtering out this event [%lx]", cause));
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// create the event object
|
|
//
|
|
CComObject< CCallStateEvent >::CreateInstance( &p );
|
|
|
|
if (NULL == p)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - could not createinstance" ));
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
//
|
|
// save info
|
|
//
|
|
p->m_pCall = pCall;
|
|
pCall->AddRef();
|
|
p->m_CallState = state;
|
|
p->m_CallStateEventCause = cause;
|
|
p->m_lCallbackInstance = lCallbackInstance;
|
|
#if DBG
|
|
p->m_pDebug = (PWSTR) ClientAlloc( 1 );
|
|
#endif
|
|
|
|
//
|
|
// get the dispatch interface
|
|
//
|
|
hr = p->_InternalQueryInterface( IID_IDispatch, (void **)&pDisp );
|
|
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
delete p;
|
|
STATICLOG((TL_ERROR, "CallStateEvent - could not get IDispatch %lx", hr));
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// fire the event
|
|
//
|
|
pTapi->Event(
|
|
TE_CALLSTATE,
|
|
pDisp
|
|
);
|
|
|
|
//
|
|
// release our reference
|
|
//
|
|
pDisp->Release();
|
|
|
|
STATICLOG((TL_TRACE, "FireEvent - exit - returing SUCCESS" ));
|
|
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// FinalRelease
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
void
|
|
CCallStateEvent::FinalRelease()
|
|
{
|
|
m_pCall->Release();
|
|
|
|
#if DBG
|
|
ClientFree( m_pDebug );
|
|
#endif
|
|
}
|
|
|
|
|
|
// ITCallStateEvent methods
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_Call
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CCallStateEvent::get_Call(
|
|
ITCallInfo ** ppCallInfo
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LOG((TL_TRACE, "get_Call - enter" ));
|
|
LOG((TL_TRACE, " ppCallInfo ---> %p", ppCallInfo ));
|
|
|
|
if (TAPIIsBadWritePtr( ppCallInfo, sizeof( ITCallInfo * ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Call - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*ppCallInfo = m_pCall;
|
|
|
|
m_pCall->AddRef();
|
|
|
|
LOG((TL_TRACE, "get_Call - exit - returing %lx", hr ));
|
|
|
|
return hr;
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_State
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CCallStateEvent::get_State(
|
|
CALL_STATE * pCallState
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LOG((TL_TRACE, "get_State - enter" ));
|
|
LOG((TL_TRACE, " pCallState ---> %p", pCallState ));
|
|
|
|
if (TAPIIsBadWritePtr( pCallState, sizeof(CALL_STATE) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_State - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*pCallState = m_CallState;
|
|
|
|
LOG((TL_TRACE, "get_State - exit - returing %lx", hr ));
|
|
|
|
return hr;
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_Cause
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CCallStateEvent::get_Cause(
|
|
CALL_STATE_EVENT_CAUSE * pCEC
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LOG((TL_TRACE, "get_Cause - enter" ));
|
|
LOG((TL_TRACE, " pCEC ---> %p", pCEC ));
|
|
|
|
if (TAPIIsBadWritePtr( pCEC, sizeof( CALL_STATE_EVENT_CAUSE ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Cause - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*pCEC = m_CallStateEventCause;
|
|
|
|
LOG((TL_TRACE, "get_Cause - exit - returning %lx", hr ));
|
|
|
|
return hr;
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_callbackinstance
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CCallStateEvent::get_CallbackInstance(
|
|
long * plCallbackInstance
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (TAPIIsBadWritePtr( plCallbackInstance, sizeof(long) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_CallbackInstance - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plCallbackInstance = m_lCallbackInstance;
|
|
|
|
return hr;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// CCallNotificationEvent
|
|
// Implements the ITCallNotificationEvent interface
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// FireEvent
|
|
//
|
|
// Creates and fires a ITCallNotificationEvent object
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
HRESULT
|
|
CCallNotificationEvent::FireEvent(
|
|
ITCallInfo * pCall,
|
|
CALL_NOTIFICATION_EVENT CallNotificationEvent,
|
|
CTAPI * pTapi,
|
|
long lCallbackInstance
|
|
)
|
|
{
|
|
CComObject< CCallNotificationEvent > * p;
|
|
IDispatch * pDisp;
|
|
HRESULT hr;
|
|
CCall * pCCall;
|
|
|
|
|
|
STATICLOG((TL_TRACE, "FireEvent - enter" ));
|
|
STATICLOG((TL_INFO, " CallNotification -------------> %d", CallNotificationEvent ));
|
|
|
|
pCCall = dynamic_cast<CComObject<CCall>*>(pCall);
|
|
if (NULL == pCCall)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - bad call pointer" ));
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( pCCall->DontExpose())
|
|
{
|
|
STATICLOG((TL_INFO, "FireEvent - Don't expose this call %p", pCCall));
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// Check the event filter mask
|
|
// This event is not filtered by TapiSrv because is
|
|
// related with TE_CALLSTATE.
|
|
//
|
|
|
|
DWORD dwEventFilterMask = 0;
|
|
dwEventFilterMask = pCCall->GetSubEventsMask( TE_CALLNOTIFICATION );
|
|
if( !( dwEventFilterMask & GET_SUBEVENT_FLAG(CallNotificationEvent)))
|
|
{
|
|
STATICLOG((TL_WARN, "FireEvent - filtering out this event [%lx]", CallNotificationEvent));
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//
|
|
// create the event object
|
|
//
|
|
CComObject< CCallNotificationEvent >::CreateInstance( &p );
|
|
|
|
if (NULL == p)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - could not createinstance" ));
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
//
|
|
// save info
|
|
//
|
|
p->m_pCall = pCall;
|
|
pCall->AddRef();
|
|
p->m_CallNotificationEvent = CallNotificationEvent;
|
|
p->m_lCallbackInstance = lCallbackInstance;
|
|
#if DBG
|
|
p->m_pDebug = (PWSTR) ClientAlloc( 1 );
|
|
#endif
|
|
|
|
//
|
|
// get the dispatch interface
|
|
//
|
|
hr = p->_InternalQueryInterface( IID_IDispatch, (void **)&pDisp );
|
|
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
delete p;
|
|
STATICLOG((TL_ERROR, "CallNotificationEvent - could not get IDispatch %lx", hr));
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// fire the event
|
|
//
|
|
pTapi->Event(
|
|
TE_CALLNOTIFICATION,
|
|
pDisp
|
|
);
|
|
|
|
|
|
//
|
|
// release our reference
|
|
//
|
|
pDisp->Release();
|
|
|
|
STATICLOG((TL_TRACE, "FireEvent - exit - returing SUCCESS" ));
|
|
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// finalrelease
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
void
|
|
CCallNotificationEvent::FinalRelease()
|
|
{
|
|
LOG((TL_INFO, "CallNotificationEvent - FinalRelease"));
|
|
m_pCall->Release();
|
|
|
|
#if DBG
|
|
ClientFree( m_pDebug );
|
|
#endif
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_call
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CCallNotificationEvent::get_Call(
|
|
ITCallInfo ** ppCall
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (TAPIIsBadWritePtr( ppCall, sizeof( ITCallInfo *) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Call - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*ppCall = m_pCall;
|
|
(*ppCall)->AddRef();
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_Event
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CCallNotificationEvent::get_Event(
|
|
CALL_NOTIFICATION_EVENT * pCallNotificationEvent
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (TAPIIsBadWritePtr(pCallNotificationEvent, sizeof(CALL_NOTIFICATION_EVENT) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Event - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*pCallNotificationEvent = m_CallNotificationEvent;
|
|
|
|
return hr;
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_callbackinstance
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CCallNotificationEvent::get_CallbackInstance(
|
|
long * plCallbackInstance
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (TAPIIsBadWritePtr( plCallbackInstance, sizeof(long) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_CallbackInstance bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plCallbackInstance = m_lCallbackInstance;
|
|
|
|
return hr;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CQOSEvent::FireEvent
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
HRESULT
|
|
CQOSEvent::FireEvent(
|
|
ITCallInfo * pCall,
|
|
QOS_EVENT QosEvent,
|
|
long lMediaMode,
|
|
CTAPI * pTapi
|
|
)
|
|
{
|
|
CComObject<CQOSEvent> * p;
|
|
HRESULT hr = S_OK;
|
|
IDispatch * pDisp;
|
|
CCall * pCCall;
|
|
|
|
//
|
|
// We don't need to filter the event because it's already done
|
|
// by TapiSrv
|
|
//
|
|
|
|
pCCall = dynamic_cast<CComObject<CCall>*>(pCall);
|
|
|
|
if (NULL == pCCall)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - bad call pointer" ));
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( pCCall->DontExpose())
|
|
{
|
|
STATICLOG((TL_INFO, "FireEvent - Don't expose this call %p", pCCall));
|
|
return S_OK;
|
|
}
|
|
|
|
CComObject< CQOSEvent >::CreateInstance( &p );
|
|
|
|
if (NULL == p)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - could not createinstance" ));
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
//
|
|
// save info
|
|
//
|
|
p->m_pCall = pCall;
|
|
pCall->AddRef();
|
|
|
|
p->m_QosEvent = QosEvent;
|
|
p->m_lMediaMode = lMediaMode;
|
|
|
|
//
|
|
// get the dispatch interface
|
|
//
|
|
hr = p->_InternalQueryInterface( IID_IDispatch, (void **)&pDisp );
|
|
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
delete p;
|
|
STATICLOG((TL_ERROR, "CallStateEvent - could not get IDispatch %lx", hr));
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// fire the event
|
|
//
|
|
pTapi->Event(
|
|
TE_QOSEVENT,
|
|
pDisp
|
|
);
|
|
|
|
//
|
|
// release our reference
|
|
//
|
|
pDisp->Release();
|
|
|
|
STATICLOG((TL_TRACE, "FireEvent - exit - returing SUCCESS" ));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CQOSEvent::get_Call
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CQOSEvent::get_Call(
|
|
ITCallInfo ** ppCall
|
|
)
|
|
{
|
|
if ( TAPIIsBadWritePtr( ppCall, sizeof (ITCallInfo *) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Call - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*ppCall = m_pCall;
|
|
|
|
m_pCall->AddRef();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CQOSEvent::get_Event
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CQOSEvent::get_Event(
|
|
QOS_EVENT * pQosEvent
|
|
)
|
|
{
|
|
if ( TAPIIsBadWritePtr( pQosEvent, sizeof( QOS_EVENT ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Event - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*pQosEvent = m_QosEvent;
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CQOSEvent::get_MediaType
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CQOSEvent::get_MediaType(
|
|
long * plMediaMode
|
|
)
|
|
{
|
|
if ( TAPIIsBadWritePtr( plMediaMode, sizeof( long ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_MediaMode - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plMediaMode = m_lMediaMode;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CQOSEvent::FinalRelease
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
void
|
|
CQOSEvent::FinalRelease()
|
|
{
|
|
m_pCall->Release();
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CCall::CallInfoChangeEvent
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
HRESULT
|
|
CCall::CallInfoChangeEvent( CALLINFOCHANGE_CAUSE cic )
|
|
{
|
|
if ( DontExpose() )
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
if (NULL != m_pAddress)
|
|
{
|
|
return CCallInfoChangeEvent::FireEvent(
|
|
this,
|
|
cic,
|
|
m_pAddress->GetTapi(),
|
|
(m_pAddressLine)?(m_pAddressLine->lCallbackInstance):0
|
|
);
|
|
}
|
|
else
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CCallInfoChangeEvent::FireEvent
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
HRESULT
|
|
CCallInfoChangeEvent::FireEvent(
|
|
ITCallInfo * pCall,
|
|
CALLINFOCHANGE_CAUSE Cause,
|
|
CTAPI * pTapi,
|
|
long lCallbackInstance
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
CComObject<CCallInfoChangeEvent> * p;
|
|
IDispatch * pDisp;
|
|
CCall * pCCall;
|
|
|
|
|
|
pCCall = dynamic_cast<CComObject<CCall>*>(pCall);
|
|
|
|
if (NULL == pCCall)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - bad call pointer" ));
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( pCCall->DontExpose())
|
|
{
|
|
STATICLOG((TL_INFO, "FireEvent - Don't expose this call %p", pCCall));
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// Check the event filter mask
|
|
// This event is not filtered by TapiSrv because is
|
|
// related with TE_CALLSTATE.
|
|
//
|
|
|
|
DWORD dwEventFilterMask = 0;
|
|
dwEventFilterMask = pCCall->GetSubEventsMask( TE_CALLINFOCHANGE );
|
|
STATICLOG((TL_INFO, " CallInfochangeEventMask ---> %ld", dwEventFilterMask ));
|
|
|
|
if( !( dwEventFilterMask & GET_SUBEVENT_FLAG(Cause)))
|
|
{
|
|
STATICLOG((TL_WARN, "FireEvent - filtering out this event [%lx]", Cause));
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// create event
|
|
//
|
|
hr = CComObject<CCallInfoChangeEvent>::CreateInstance( &p );
|
|
|
|
if ( !SUCCEEDED(hr) )
|
|
{
|
|
STATICLOG((TL_ERROR, "Could not create CallInfoStateChange object - %lx", hr));
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// initialize
|
|
//
|
|
p->m_Cause = Cause;
|
|
p->m_pCall = pCall;
|
|
p->m_pCall->AddRef();
|
|
p->m_lCallbackInstance = lCallbackInstance;
|
|
|
|
#if DBG
|
|
p->m_pDebug = (PWSTR) ClientAlloc( 1 );
|
|
#endif
|
|
|
|
//
|
|
// get idisp interface
|
|
//
|
|
hr = p->QueryInterface(
|
|
IID_IDispatch,
|
|
(void **)&pDisp
|
|
);
|
|
|
|
if ( !SUCCEEDED(hr) )
|
|
{
|
|
STATICLOG((TL_ERROR, "Could not get disp interface of CallInfoStateChange object %lx", hr));
|
|
|
|
delete p;
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// fire event
|
|
//
|
|
pTapi->Event(
|
|
TE_CALLINFOCHANGE,
|
|
pDisp
|
|
);
|
|
|
|
//
|
|
// release stuff
|
|
//
|
|
pDisp->Release();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CCallInfoChangeEvent::FinalRelease
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
void
|
|
CCallInfoChangeEvent::FinalRelease()
|
|
{
|
|
m_pCall->Release();
|
|
|
|
#if DBG
|
|
ClientFree( m_pDebug );
|
|
#endif
|
|
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CCallInfoChangeEvent::get_Call
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CCallInfoChangeEvent::get_Call( ITCallInfo ** ppCallInfo)
|
|
{
|
|
if ( TAPIIsBadWritePtr( ppCallInfo, sizeof (ITCallInfo *) ) )
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
|
|
m_pCall->QueryInterface(
|
|
IID_ITCallInfo,
|
|
(void **) ppCallInfo
|
|
);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CCallInfoChangeEvent::get_Cause
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CCallInfoChangeEvent::get_Cause( CALLINFOCHANGE_CAUSE * pCallInfoChangeCause )
|
|
{
|
|
if ( TAPIIsBadWritePtr( pCallInfoChangeCause, sizeof (CALLINFOCHANGE_CAUSE) ) )
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
|
|
*pCallInfoChangeCause = m_Cause;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CCallInfoChangeEvent::get_CallbackInstance
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CCallInfoChangeEvent::get_CallbackInstance( long * plCallbackInstance )
|
|
{
|
|
if ( TAPIIsBadWritePtr( plCallbackInstance, sizeof(long) ) )
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plCallbackInstance = m_lCallbackInstance;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
HRESULT
|
|
CCallMediaEvent::FireEvent(
|
|
ITCallInfo * pCall,
|
|
CALL_MEDIA_EVENT Event,
|
|
CALL_MEDIA_EVENT_CAUSE Cause,
|
|
CTAPI * pTapi,
|
|
ITTerminal * pTerminal,
|
|
ITStream * pStream,
|
|
HRESULT hrEvent
|
|
)
|
|
{
|
|
CComObject< CCallMediaEvent > * p;
|
|
IDispatch * pDisp;
|
|
HRESULT hr;
|
|
CCall * pCCall;
|
|
|
|
|
|
STATICLOG((TL_TRACE, "FireEvent - enter" ));
|
|
|
|
pCCall = dynamic_cast<CComObject<CCall>*>(pCall);
|
|
|
|
if (NULL == pCCall)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - bad call pointer" ));
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( pCCall->DontExpose())
|
|
{
|
|
STATICLOG((TL_INFO, "FireEvent - Don't expose this call %p", pCCall));
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// Check the event filter mask
|
|
// These is a MSP event and it is not filter
|
|
// by TapiSrv
|
|
//
|
|
|
|
DWORD dwEventFilterMask = 0;
|
|
dwEventFilterMask = pCCall->GetSubEventsMask( TE_CALLMEDIA );
|
|
if( !( dwEventFilterMask & GET_SUBEVENT_FLAG(Event)))
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent exit - "
|
|
"This event is filtered - %lx", Event));
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// create the event object
|
|
//
|
|
CComObject< CCallMediaEvent >::CreateInstance( &p );
|
|
|
|
if (NULL == p)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - could not createinstance" ));
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
//
|
|
// save info
|
|
//
|
|
p->m_pCall = pCall;
|
|
p->m_Event = Event;
|
|
p->m_Cause = Cause;
|
|
p->m_hr = hrEvent;
|
|
p->m_pTerminal = pTerminal;
|
|
p->m_pStream = pStream;
|
|
|
|
if ( NULL != pCall )
|
|
{
|
|
pCall->AddRef();
|
|
}
|
|
|
|
if ( NULL != pTerminal )
|
|
{
|
|
pTerminal->AddRef();
|
|
}
|
|
|
|
if ( NULL != pStream )
|
|
{
|
|
pStream->AddRef();
|
|
}
|
|
|
|
#if DBG
|
|
p->m_pDebug = (PWSTR) ClientAlloc( 1 );
|
|
#endif
|
|
|
|
//
|
|
// get the dispatch interface
|
|
//
|
|
hr = p->_InternalQueryInterface( IID_IDispatch, (void **)&pDisp );
|
|
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
STATICLOG((TL_ERROR, "CallMediaEvent - could not get IDispatch %lx", hr));
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// fire the event
|
|
//
|
|
pTapi->Event(
|
|
TE_CALLMEDIA,
|
|
pDisp
|
|
);
|
|
|
|
|
|
//
|
|
// release our reference
|
|
//
|
|
pDisp->Release();
|
|
|
|
STATICLOG((TL_TRACE, "FireEvent - exit - returing SUCCESS" ));
|
|
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_Call
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
STDMETHODIMP
|
|
CCallMediaEvent::get_Call(ITCallInfo ** ppCallInfo)
|
|
{
|
|
if ( TAPIIsBadWritePtr( ppCallInfo, sizeof( ITCallInfo *) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Call - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*ppCallInfo = m_pCall;
|
|
|
|
if ( NULL != m_pCall )
|
|
{
|
|
m_pCall->AddRef();
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_Event
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
STDMETHODIMP
|
|
CCallMediaEvent::get_Event(CALL_MEDIA_EVENT * pCallMediaEvent)
|
|
{
|
|
if ( TAPIIsBadWritePtr( pCallMediaEvent, sizeof( CALL_MEDIA_EVENT ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Event - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*pCallMediaEvent = m_Event;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_Cause
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
STDMETHODIMP
|
|
CCallMediaEvent::get_Cause(CALL_MEDIA_EVENT_CAUSE * pCause)
|
|
{
|
|
if ( TAPIIsBadWritePtr( pCause, sizeof( CALL_MEDIA_EVENT_CAUSE ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Cause - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*pCause = m_Cause;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_Error
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
STDMETHODIMP
|
|
CCallMediaEvent::get_Error(HRESULT * phrError)
|
|
{
|
|
if ( TAPIIsBadWritePtr( phrError, sizeof( HRESULT ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Error - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*phrError = m_hr;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_Terminal
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
STDMETHODIMP
|
|
CCallMediaEvent::get_Terminal(ITTerminal ** ppTerminal)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if ( TAPIIsBadWritePtr( ppTerminal, sizeof( ITTerminal *) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Terminal - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*ppTerminal = m_pTerminal;
|
|
|
|
if ( NULL != m_pTerminal )
|
|
{
|
|
m_pTerminal->AddRef();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_Stream
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
STDMETHODIMP
|
|
CCallMediaEvent::get_Stream(ITStream ** ppStream)
|
|
{
|
|
if ( TAPIIsBadWritePtr( ppStream, sizeof( ITStream *) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Stream - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*ppStream = m_pStream;
|
|
|
|
if ( NULL != m_pStream )
|
|
{
|
|
m_pStream->AddRef();
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// FinalRelease
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
void
|
|
CCallMediaEvent::FinalRelease()
|
|
{
|
|
if ( NULL != m_pCall )
|
|
{
|
|
m_pCall->Release();
|
|
}
|
|
|
|
if ( NULL != m_pTerminal )
|
|
{
|
|
m_pTerminal->Release();
|
|
}
|
|
|
|
if ( NULL != m_pStream )
|
|
{
|
|
m_pStream->Release();
|
|
}
|
|
|
|
#if DBG
|
|
ClientFree( m_pDebug );
|
|
#endif
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitDetectionEvent::FireEvent
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
HRESULT
|
|
CDigitDetectionEvent::FireEvent(
|
|
ITCallInfo * pCall,
|
|
unsigned char ucDigit,
|
|
TAPI_DIGITMODE DigitMode,
|
|
long lTickCount,
|
|
CTAPI * pTapi,
|
|
long lCallbackInstance
|
|
)
|
|
{
|
|
CComObject< CDigitDetectionEvent > * p;
|
|
IDispatch * pDisp;
|
|
HRESULT hr;
|
|
CCall * pCCall;
|
|
|
|
pCCall = dynamic_cast<CComObject<CCall>*>(pCall);
|
|
|
|
if (NULL == pCCall)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - bad call pointer" ));
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( pCCall->DontExpose())
|
|
{
|
|
STATICLOG((TL_INFO, "FireEvent - Don't expose this call %p", pCCall));
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// create the event object
|
|
//
|
|
CComObject< CDigitDetectionEvent >::CreateInstance( &p );
|
|
|
|
if (NULL == p)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - could not createinstance" ));
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
//
|
|
// save info
|
|
//
|
|
p->m_pCall = pCall;
|
|
pCall->AddRef();
|
|
p->m_Digit = ucDigit;
|
|
p->m_DigitMode = DigitMode;
|
|
p->m_lTickCount = lTickCount;
|
|
p->m_lCallbackInstance = lCallbackInstance;
|
|
#if DBG
|
|
p->m_pDebug = (PWSTR) ClientAlloc( 1 );
|
|
#endif
|
|
|
|
//
|
|
// get the dispatch interface
|
|
//
|
|
hr = p->_InternalQueryInterface( IID_IDispatch, (void **)&pDisp );
|
|
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
STATICLOG((TL_ERROR, "DigitDetectionEvent - could not get IDispatch %lx", hr));
|
|
|
|
delete p;
|
|
|
|
pCall->Release();
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// fire the event
|
|
//
|
|
pTapi->Event(
|
|
TE_DIGITEVENT,
|
|
pDisp
|
|
);
|
|
|
|
|
|
//
|
|
// release our reference
|
|
//
|
|
pDisp->Release();
|
|
|
|
STATICLOG((TL_TRACE, "FireEvent - exit - returing SUCCESS" ));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitDetectionEvent::FinalRelease
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
void
|
|
CDigitDetectionEvent::FinalRelease()
|
|
{
|
|
if ( NULL != m_pCall )
|
|
{
|
|
m_pCall->Release();
|
|
}
|
|
|
|
#if DBG
|
|
ClientFree( m_pDebug );
|
|
#endif
|
|
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitDetectionEvent::get_Call
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitDetectionEvent::get_Call( ITCallInfo ** ppCallInfo )
|
|
{
|
|
LOG((TL_TRACE, "get_Call - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( ppCallInfo, sizeof( ITCallInfo * ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Call - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*ppCallInfo = m_pCall;
|
|
|
|
m_pCall->AddRef();
|
|
|
|
LOG((TL_TRACE, "get_Call - exit - return SUCCESS"));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitDetectionEvent::get_Digit
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitDetectionEvent::get_Digit( unsigned char * pucDigit )
|
|
{
|
|
LOG((TL_TRACE, "get_Digit - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( pucDigit, sizeof( unsigned char ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Digit - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*pucDigit = m_Digit;
|
|
|
|
LOG((TL_TRACE, "get_Digit - exit - return SUCCESS"));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitDetectionEvent::get_DigitMode
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitDetectionEvent::get_DigitMode( TAPI_DIGITMODE * pDigitMode )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LOG((TL_TRACE, "get_DigitMode - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( pDigitMode, sizeof( TAPI_DIGITMODE ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_DigitMode - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*pDigitMode = m_DigitMode;
|
|
|
|
LOG((TL_TRACE, "get_DigitMode - exit - return %lx", hr));
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitDetectionEvent::get_TickCount
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitDetectionEvent::get_TickCount( long * plTickCount )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LOG((TL_TRACE, "get_TickCount - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( plTickCount, sizeof( long ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_DigitMode - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plTickCount = m_lTickCount;
|
|
|
|
LOG((TL_TRACE, "get_TickCount - exit - return %lx", hr));
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitDetectionEvent::get_CallbackInstance
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitDetectionEvent::get_CallbackInstance( long * plCallbackInstance )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LOG((TL_TRACE, "get_CallbackInstance - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( plCallbackInstance, sizeof( long ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_DigitMode - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plCallbackInstance = m_lCallbackInstance;
|
|
|
|
LOG((TL_TRACE, "get_CallbackInstance - exit - return %lx", hr));
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitGenerationEvent::FireEvent
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
HRESULT
|
|
CDigitGenerationEvent::FireEvent(
|
|
ITCallInfo * pCall,
|
|
long lGenerationTermination,
|
|
long lTickCount,
|
|
long lCallbackInstance,
|
|
CTAPI * pTapi
|
|
)
|
|
{
|
|
CComObject< CDigitGenerationEvent > * p;
|
|
IDispatch * pDisp;
|
|
HRESULT hr;
|
|
CCall * pCCall;
|
|
|
|
pCCall = dynamic_cast<CComObject<CCall>*>(pCall);
|
|
|
|
if (NULL == pCCall)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - bad call pointer" ));
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( pCCall->DontExpose())
|
|
{
|
|
STATICLOG((TL_INFO, "FireEvent - Don't expose this call %p", pCCall));
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// create the event object
|
|
//
|
|
CComObject< CDigitGenerationEvent >::CreateInstance( &p );
|
|
|
|
if (NULL == p)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - could not createinstance" ));
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
//
|
|
// get the dispatch interface
|
|
//
|
|
hr = p->_InternalQueryInterface( IID_IDispatch, (void **)&pDisp );
|
|
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - could not get IDispatch %lx", hr));
|
|
|
|
delete p;
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// save info
|
|
//
|
|
p->m_pCall = pCall;
|
|
pCall->AddRef();
|
|
p->m_lGenerationTermination = lGenerationTermination;
|
|
p->m_lTickCount = lTickCount;
|
|
p->m_lCallbackInstance = lCallbackInstance;
|
|
#if DBG
|
|
p->m_pDebug = (PWSTR) ClientAlloc( 1 );
|
|
#endif
|
|
|
|
//
|
|
// fire the event
|
|
//
|
|
pTapi->Event(
|
|
TE_GENERATEEVENT,
|
|
pDisp
|
|
);
|
|
|
|
//
|
|
// release our reference
|
|
//
|
|
pDisp->Release();
|
|
|
|
STATICLOG((TL_TRACE, "FireEvent - exit - returing SUCCESS" ));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitGenerationEvent::FinalRelease
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
void
|
|
CDigitGenerationEvent::FinalRelease()
|
|
{
|
|
if ( NULL != m_pCall )
|
|
{
|
|
m_pCall->Release();
|
|
}
|
|
|
|
#if DBG
|
|
ClientFree( m_pDebug );
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitGenerationEvent::get_Call
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitGenerationEvent::get_Call( ITCallInfo ** ppCallInfo )
|
|
{
|
|
LOG((TL_TRACE, "get_Call - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( ppCallInfo, sizeof( ITCallInfo * ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Call - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*ppCallInfo = m_pCall;
|
|
|
|
m_pCall->AddRef();
|
|
|
|
LOG((TL_TRACE, "get_Call - exit - return SUCCESS"));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitGenerationEvent::get_GenerationTermination
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitGenerationEvent::get_GenerationTermination( long * plGenerationTermination )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LOG((TL_TRACE, "get_GenerationTermination - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( plGenerationTermination, sizeof( long ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_DigitMode - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plGenerationTermination = m_lGenerationTermination;
|
|
|
|
LOG((TL_TRACE, "get_GenerationTermination - exit - return %lx", hr));
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitGenerationEvent::get_TickCount
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitGenerationEvent::get_TickCount( long * plTickCount )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LOG((TL_TRACE, "get_TickCount - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( plTickCount, sizeof( long ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_DigitMode - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plTickCount = m_lTickCount;
|
|
|
|
LOG((TL_TRACE, "get_TickCount - exit - return %lx", hr));
|
|
|
|
return hr;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitGenerationEvent::get_CallbackInstance
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitGenerationEvent::get_CallbackInstance( long * plCallbackInstance )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LOG((TL_TRACE, "get_CallbackInstance - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( plCallbackInstance, sizeof( long ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_DigitMode - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plCallbackInstance = m_lCallbackInstance;
|
|
|
|
LOG((TL_TRACE, "get_CallbackInstance - exit - return %lx", hr));
|
|
|
|
return hr;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitsGatheredEvent::FireEvent
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
HRESULT
|
|
CDigitsGatheredEvent::FireEvent(
|
|
ITCallInfo * pCall,
|
|
BSTR pDigits,
|
|
TAPI_GATHERTERM GatherTermination,
|
|
long lTickCount,
|
|
long lCallbackInstance,
|
|
CTAPI * pTapi
|
|
)
|
|
{
|
|
CComObject< CDigitsGatheredEvent > * p;
|
|
IDispatch * pDisp;
|
|
HRESULT hr;
|
|
CCall * pCCall;
|
|
|
|
pCCall = dynamic_cast<CComObject<CCall>*>(pCall);
|
|
|
|
if (NULL == pCCall)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - bad call pointer" ));
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( pCCall->DontExpose())
|
|
{
|
|
STATICLOG((TL_INFO, "FireEvent - Don't expose this call %p", pCCall));
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// create the event object
|
|
//
|
|
CComObject< CDigitsGatheredEvent >::CreateInstance( &p );
|
|
|
|
if (NULL == p)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - could not createinstance" ));
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
//
|
|
// get the dispatch interface
|
|
//
|
|
hr = p->_InternalQueryInterface( IID_IDispatch, (void **)&pDisp );
|
|
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
STATICLOG((TL_ERROR, "CDigitsGatheredEvent - could not get IDispatch %lx", hr));
|
|
|
|
delete p;
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// save info
|
|
//
|
|
p->m_pCall = pCall;
|
|
pCall->AddRef();
|
|
p->m_pDigits = pDigits;
|
|
p->m_GatherTermination = GatherTermination;
|
|
p->m_lTickCount = lTickCount;
|
|
p->m_lCallbackInstance = lCallbackInstance;
|
|
#if DBG
|
|
p->m_pDebug = (PWSTR) ClientAlloc( 1 );
|
|
#endif
|
|
|
|
//
|
|
// fire the event
|
|
//
|
|
pTapi->Event(
|
|
TE_GATHERDIGITS,
|
|
pDisp
|
|
);
|
|
|
|
|
|
//
|
|
// release our reference
|
|
//
|
|
pDisp->Release();
|
|
|
|
STATICLOG((TL_TRACE, "FireEvent - exit - returing SUCCESS" ));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitsGatheredEvent::FinalRelease
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
void
|
|
CDigitsGatheredEvent::FinalRelease()
|
|
{
|
|
if ( NULL != m_pCall )
|
|
{
|
|
m_pCall->Release();
|
|
}
|
|
|
|
#if DBG
|
|
ClientFree( m_pDebug );
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitsGatheredEvent::get_Call
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitsGatheredEvent::get_Call( ITCallInfo ** ppCallInfo )
|
|
{
|
|
LOG((TL_TRACE, "get_Call - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( ppCallInfo, sizeof( ITCallInfo * ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Call - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*ppCallInfo = m_pCall;
|
|
|
|
m_pCall->AddRef();
|
|
|
|
LOG((TL_TRACE, "get_Call - exit - return SUCCESS"));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitsGatheredEvent::get_Digits
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitsGatheredEvent::get_Digits( BSTR * ppDigits )
|
|
{
|
|
LOG((TL_TRACE, "get_Digits - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( ppDigits, sizeof( BSTR ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Digits - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*ppDigits = m_pDigits;
|
|
|
|
LOG((TL_TRACE, "get_Digits - exit - return SUCCESS"));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitsGatheredEvent::get_GatherTermination
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitsGatheredEvent::get_GatherTermination( TAPI_GATHERTERM *pGatherTermination )
|
|
{
|
|
LOG((TL_TRACE, "get_GatherTermination - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( pGatherTermination, sizeof( TAPI_GATHERTERM ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_GatherTermination - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*pGatherTermination = m_GatherTermination;
|
|
|
|
LOG((TL_TRACE, "get_GatherTermination - exit - return SUCCESS"));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitsGatheredEvent::get_TickCount
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitsGatheredEvent::get_TickCount( long * plTickCount )
|
|
{
|
|
LOG((TL_TRACE, "get_TickCount - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( plTickCount, sizeof( long ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_TickCount - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plTickCount = m_lTickCount;
|
|
|
|
LOG((TL_TRACE, "get_TickCount - exit - return SUCCESS"));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CDigitsGatheredEvent::get_CallbackInstance
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CDigitsGatheredEvent::get_CallbackInstance( long * plCallbackInstance )
|
|
{
|
|
LOG((TL_TRACE, "get_CallbackInstance - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( plCallbackInstance, sizeof( long ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_CallbackInstance - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plCallbackInstance = m_lCallbackInstance;
|
|
|
|
LOG((TL_TRACE, "get_CallbackInstance - exit - return SUCCESS"));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CToneDetectionEvent::FireEvent
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
HRESULT
|
|
CToneDetectionEvent::FireEvent(
|
|
ITCallInfo * pCall,
|
|
long lAppSpecific,
|
|
long lTickCount,
|
|
long lCallbackInstance,
|
|
CTAPI * pTapi
|
|
)
|
|
{
|
|
CComObject< CToneDetectionEvent > * p;
|
|
IDispatch * pDisp;
|
|
HRESULT hr;
|
|
CCall * pCCall;
|
|
|
|
pCCall = dynamic_cast<CComObject<CCall>*>(pCall);
|
|
|
|
if (NULL == pCCall)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - bad call pointer" ));
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( pCCall->DontExpose())
|
|
{
|
|
STATICLOG((TL_INFO, "FireEvent - Don't expose this call %p", pCCall));
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// create the event object
|
|
//
|
|
CComObject< CToneDetectionEvent >::CreateInstance( &p );
|
|
|
|
if (NULL == p)
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - could not createinstance" ));
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
//
|
|
// get the dispatch interface
|
|
//
|
|
hr = p->_InternalQueryInterface( IID_IDispatch, (void **)&pDisp );
|
|
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
STATICLOG((TL_ERROR, "CToneDetectionEvent - could not get IDispatch %lx", hr));
|
|
|
|
delete p;
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// save info
|
|
//
|
|
p->m_pCall = pCall;
|
|
pCall->AddRef();
|
|
p->m_lAppSpecific = lAppSpecific;
|
|
p->m_lTickCount = lTickCount;
|
|
p->m_lCallbackInstance = lCallbackInstance;
|
|
#if DBG
|
|
p->m_pDebug = (PWSTR) ClientAlloc( 1 );
|
|
#endif
|
|
|
|
//
|
|
// fire the event
|
|
//
|
|
pTapi->Event(
|
|
TE_TONEEVENT,
|
|
pDisp
|
|
);
|
|
|
|
|
|
//
|
|
// release our reference
|
|
//
|
|
pDisp->Release();
|
|
|
|
STATICLOG((TL_TRACE, "FireEvent - exit - returing SUCCESS" ));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CToneDetectionEvent::FinalRelease
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
void
|
|
CToneDetectionEvent::FinalRelease()
|
|
{
|
|
if ( NULL != m_pCall )
|
|
{
|
|
m_pCall->Release();
|
|
}
|
|
|
|
#if DBG
|
|
ClientFree( m_pDebug );
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CToneDetectionEvent::get_Call
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CToneDetectionEvent::get_Call( ITCallInfo ** ppCallInfo )
|
|
{
|
|
LOG((TL_TRACE, "get_Call - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( ppCallInfo, sizeof( ITCallInfo * ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Call - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*ppCallInfo = m_pCall;
|
|
|
|
m_pCall->AddRef();
|
|
|
|
LOG((TL_TRACE, "get_Call - exit - return SUCCESS"));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CToneDetectionEvent::get_AppSpecific
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CToneDetectionEvent::get_AppSpecific( long * plAppSpecific )
|
|
{
|
|
LOG((TL_TRACE, "get_AppSpecific - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( plAppSpecific, sizeof( long ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_AppSpecific - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plAppSpecific = m_lAppSpecific;
|
|
|
|
LOG((TL_TRACE, "get_AppSpecific - exit - return SUCCESS"));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CToneDetectionEvent::get_TickCount
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CToneDetectionEvent::get_TickCount( long * plTickCount )
|
|
{
|
|
LOG((TL_TRACE, "get_TickCount - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( plTickCount, sizeof( long ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_TickCount - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plTickCount = m_lTickCount;
|
|
|
|
LOG((TL_TRACE, "get_TickCount - exit - return SUCCESS"));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// CToneDetectionEvent::get_CallbackInstance
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
STDMETHODIMP
|
|
CToneDetectionEvent::get_CallbackInstance( long * plCallbackInstance )
|
|
{
|
|
LOG((TL_TRACE, "get_CallbackInstance - enter"));
|
|
|
|
if ( TAPIIsBadWritePtr( plCallbackInstance, sizeof( long ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_CallbackInstance - bad pointer"));
|
|
|
|
return E_POINTER;
|
|
}
|
|
|
|
*plCallbackInstance = m_lCallbackInstance;
|
|
|
|
LOG((TL_TRACE, "get_CallbackInstance - exit - return SUCCESS"));
|
|
|
|
return S_OK;
|
|
}
|
|
|