393 lines
8.4 KiB
C++
393 lines
8.4 KiB
C++
/*++
|
|
|
|
Copyright (c) 1997-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
privobj.cpp
|
|
|
|
Abstract:
|
|
|
|
|
|
Author:
|
|
|
|
mquinton - 11/13/97
|
|
|
|
Notes:
|
|
|
|
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "stdafx.h"
|
|
|
|
extern CHashTable * gpCallHubHashTable;
|
|
extern CHashTable * gpLineHashTable;
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// CPrivateEvent -
|
|
// implementation of the ITPrivateEvent interface
|
|
// This object is given to applications for Private events
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// CPrivateEvent::FireEvent
|
|
// static function to create and fire a new CPrivateEvent
|
|
//
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CPrivateEvent::FireEvent(
|
|
CTAPI * pTapi,
|
|
ITCallInfo * pCall,
|
|
ITAddress * pAddress,
|
|
ITCallHub * pCallHub,
|
|
IDispatch * pEventInterface,
|
|
long lEventCode
|
|
)
|
|
{
|
|
CComObject< CPrivateEvent > * p;
|
|
IDispatch * pDisp;
|
|
HRESULT hr = S_OK;
|
|
|
|
|
|
STATICLOG((TL_TRACE, "FireEvent - enter" ));
|
|
STATICLOG((TL_INFO, " pCall -----------> %p", pCall ));
|
|
STATICLOG((TL_INFO, " pAddress --------> %p", pAddress ));
|
|
STATICLOG((TL_INFO, " pCallHub --------> %p", pCallHub ));
|
|
STATICLOG((TL_INFO, " pEventInterface -> %p", pEventInterface ));
|
|
STATICLOG((TL_INFO, " EventCode -------> %lX", lEventCode ));
|
|
|
|
//
|
|
// Check the event filter mask
|
|
// These events are MSP events and are filter by
|
|
// TapiSrv
|
|
//
|
|
|
|
DWORD dwEventFilterMask = 0;
|
|
CAddress* pCAddress = (CAddress*)pAddress;
|
|
if( pCAddress )
|
|
{
|
|
dwEventFilterMask = pCAddress->GetSubEventsMask( TE_PRIVATE );
|
|
if( dwEventFilterMask == 0)
|
|
{
|
|
STATICLOG((TL_ERROR, "This private event is filtered"));
|
|
return S_OK;
|
|
}
|
|
}
|
|
|
|
CCall* pCCall = (CCall*)pCall;
|
|
if( pCCall )
|
|
{
|
|
dwEventFilterMask = pCCall->GetSubEventsMask( TE_PRIVATE );
|
|
if( dwEventFilterMask == 0)
|
|
{
|
|
STATICLOG((TL_ERROR, "This private event is filtered"));
|
|
return S_OK;
|
|
}
|
|
}
|
|
|
|
//
|
|
// create the event object
|
|
//
|
|
hr = CComObject< CPrivateEvent >::CreateInstance( &p );
|
|
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
//
|
|
// save event info
|
|
//
|
|
p->m_pCall = pCall;
|
|
p->m_pAddress = pAddress;
|
|
p->m_pCallHub = pCallHub;
|
|
p->m_pEventInterface = pEventInterface;
|
|
p->m_lEventCode = lEventCode;
|
|
|
|
#if DBG
|
|
p->m_pDebug = (PWSTR) ClientAlloc( 1 );
|
|
#endif
|
|
|
|
|
|
// AddRef pointers
|
|
if(pCall)
|
|
{
|
|
pCall->AddRef();
|
|
}
|
|
if(pAddress)
|
|
{
|
|
pAddress->AddRef();
|
|
}
|
|
if(pEventInterface)
|
|
{
|
|
pEventInterface->AddRef();
|
|
}
|
|
if(pCallHub)
|
|
{
|
|
pCallHub->AddRef();
|
|
}
|
|
|
|
//
|
|
// get the dispatch interface
|
|
//
|
|
hr = p->_InternalQueryInterface( IID_IDispatch, (void **)&pDisp );
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
//
|
|
// fire the event
|
|
//
|
|
if(pTapi)
|
|
{
|
|
pTapi->Event(TE_PRIVATE, pDisp);
|
|
}
|
|
|
|
// release our reference
|
|
pDisp->Release();
|
|
|
|
}
|
|
else // couldn't get IDispatch
|
|
{
|
|
delete p;
|
|
STATICLOG((TL_ERROR, "FireEvent - could not get IDispatch "));
|
|
}
|
|
}
|
|
else // Couldn't create instance
|
|
{
|
|
STATICLOG((TL_ERROR, "FireEvent - could not createinstance" ));
|
|
}
|
|
|
|
|
|
STATICLOG((TL_TRACE, hr, "FireEvent - exit " ));
|
|
return hr;
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// FinalRelease
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
void
|
|
CPrivateEvent::FinalRelease()
|
|
{
|
|
if(m_pCall)
|
|
{
|
|
m_pCall->Release();
|
|
}
|
|
|
|
if(m_pAddress)
|
|
{
|
|
m_pAddress->Release();
|
|
}
|
|
|
|
if(m_pCallHub)
|
|
{
|
|
m_pCallHub->Release();
|
|
}
|
|
|
|
if(m_pEventInterface)
|
|
{
|
|
m_pEventInterface->Release();
|
|
}
|
|
|
|
#if DBG
|
|
ClientFree( m_pDebug );
|
|
#endif
|
|
}
|
|
|
|
|
|
// ITPrivateEvent methods
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_Address
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CPrivateEvent::get_Address(
|
|
ITAddress ** ppAddress
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LOG((TL_TRACE, "get_Address - enter" ));
|
|
LOG((TL_TRACE, " ppAddress ---> %p", ppAddress ));
|
|
|
|
if (TAPIIsBadWritePtr( ppAddress, sizeof( ITAddress * ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_Address - bad pointer"));
|
|
|
|
hr = E_POINTER;
|
|
}
|
|
else
|
|
{
|
|
*ppAddress = m_pAddress;
|
|
|
|
if(m_pAddress)
|
|
{
|
|
m_pAddress->AddRef();
|
|
}
|
|
}
|
|
|
|
LOG((TL_TRACE,hr, "get_Address - exit "));
|
|
return hr;
|
|
}
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_Call
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CPrivateEvent::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"));
|
|
|
|
hr = E_POINTER;
|
|
}
|
|
else
|
|
{
|
|
*ppCallInfo = m_pCall;
|
|
|
|
if(m_pCall)
|
|
{
|
|
m_pCall->AddRef();
|
|
}
|
|
}
|
|
|
|
LOG((TL_TRACE,hr, "get_Call - exit "));
|
|
return hr;
|
|
}
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_CallHub
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CPrivateEvent::get_CallHub(
|
|
ITCallHub ** ppCallHub
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LOG((TL_TRACE, "get_CallHub - enter" ));
|
|
LOG((TL_TRACE, " ppCallHub ---> %p", ppCallHub ));
|
|
|
|
if (TAPIIsBadWritePtr( ppCallHub, sizeof( ITCallHub * ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_CallHub - bad pointer"));
|
|
|
|
hr = E_POINTER;
|
|
}
|
|
else
|
|
{
|
|
*ppCallHub = m_pCallHub;
|
|
|
|
if(m_pCallHub)
|
|
{
|
|
m_pCallHub->AddRef();
|
|
}
|
|
else
|
|
{
|
|
|
|
LOG((TL_WARN, "get_CallHub - no callhub"));
|
|
|
|
hr = TAPI_E_WRONGEVENT;
|
|
}
|
|
|
|
}
|
|
|
|
LOG((TL_TRACE,hr, "get_CallHub - exit "));
|
|
return hr;
|
|
}
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_EventInterface
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CPrivateEvent::get_EventInterface(
|
|
IDispatch ** pEventInterface
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LOG((TL_TRACE, "get_EventInterface - enter" ));
|
|
LOG((TL_TRACE, " pEventInterface ---> %p", pEventInterface ));
|
|
|
|
if (TAPIIsBadWritePtr( pEventInterface, sizeof( IDispatch * ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_EventInterface - bad pointer"));
|
|
|
|
hr = E_POINTER;
|
|
}
|
|
else
|
|
{
|
|
*pEventInterface = m_pEventInterface;
|
|
|
|
if(m_pEventInterface)
|
|
{
|
|
m_pEventInterface->AddRef();
|
|
}
|
|
}
|
|
|
|
LOG((TL_TRACE,hr, "get_EventInterface - exit "));
|
|
return hr;
|
|
}
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// get_EventCode
|
|
//
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
HRESULT
|
|
CPrivateEvent::get_EventCode(
|
|
long * plEventCode
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
LOG((TL_TRACE, "get_EventCode - enter" ));
|
|
LOG((TL_TRACE, " pEventInterface ---> %p", plEventCode ));
|
|
|
|
if (TAPIIsBadWritePtr( plEventCode, sizeof( long ) ) )
|
|
{
|
|
LOG((TL_ERROR, "get_EventCode - bad pointer"));
|
|
|
|
hr = E_POINTER;
|
|
}
|
|
else
|
|
{
|
|
*plEventCode = m_lEventCode;
|
|
}
|
|
|
|
LOG((TL_TRACE,hr, "get_EventCode - exit "));
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|