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

350 lines
7.7 KiB
C++

/*++
Copyright (c) 1998 - 1999 Microsoft Corporation
Module Name:
request.cpp
Abstract:
Implements all the methods on ITRequest interfaces.
Author:
mquinton - 6/3/98
Notes:
Revision History:
--*/
#include "stdafx.h"
#include "windows.h"
#include "wownt32.h"
#include "stdarg.h"
#include "stdio.h"
#include "shellapi.h"
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
//
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
STDMETHODIMP
CRequest::MakeCall(
BSTR pDestAddress,
#ifdef NEWREQUEST
long lAddressType,
#endif
BSTR pAppName,
BSTR pCalledParty,
BSTR pComment
)
{
return TapiMakeCall(
pDestAddress,
pAppName,
pCalledParty,
pComment
);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
//
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
STDMETHODIMP
CRequestEvent::get_RegistrationInstance(
long * plRegistrationInstance
)
{
if ( TAPIIsBadWritePtr( plRegistrationInstance, sizeof(long) ) )
{
LOG((TL_ERROR, "get_RegistrationInstance - bad pointer"));
return E_POINTER;
}
*plRegistrationInstance = m_lRegistrationInstance;
return S_OK;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
//
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
STDMETHODIMP
CRequestEvent::get_RequestMode(long * plRequestMode )
{
if ( TAPIIsBadWritePtr( plRequestMode, sizeof(long) ) )
{
LOG((TL_ERROR, "get_RequestMode - bad pointer"));
return E_POINTER;
}
Lock();
*plRequestMode = m_lRequestMode;
Unlock();
return S_OK;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
//
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
STDMETHODIMP
CRequestEvent::get_DestAddress(BSTR * ppDestAddress )
{
if ( TAPIIsBadWritePtr( ppDestAddress, sizeof (BSTR) ) )
{
LOG((TL_ERROR, "get_DestAddress - bad pointer"));
return E_POINTER;
}
Lock();
*ppDestAddress = SysAllocString( m_pReqMakeCall->szDestAddress );
Unlock();
if ( ( NULL == *ppDestAddress ) && ( NULL != m_pReqMakeCall->szDestAddress ) )
{
LOG((TL_ERROR, "get_DestAddress - SysAllocString Failed"));
return E_OUTOFMEMORY;
}
return S_OK;
}
#ifdef NEWREQUEST
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
//
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
STDMETHODIMP
CRequestEvent::get_AddressType(long * plAddressType )
{
return E_NOTIMPL;
}
#endif
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
//
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
STDMETHODIMP
CRequestEvent::get_AppName(BSTR * ppAppName )
{
if ( TAPIIsBadWritePtr( ppAppName, sizeof (BSTR) ) )
{
LOG((TL_ERROR, "get_AppName - bad pointer"));
return E_POINTER;
}
Lock();
*ppAppName = SysAllocString( m_pReqMakeCall->szAppName );
Unlock();
if ( ( NULL == *ppAppName ) && ( NULL != m_pReqMakeCall->szAppName ) )
{
LOG((TL_ERROR, "get_AppName - SysAllocString Failed"));
return E_OUTOFMEMORY;
}
return S_OK;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
//
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
STDMETHODIMP
CRequestEvent::get_CalledParty(BSTR * ppCalledParty )
{
if ( TAPIIsBadWritePtr( ppCalledParty, sizeof (BSTR) ) )
{
LOG((TL_ERROR, "get_CalledParty - bad pointer"));
return E_POINTER;
}
Lock();
*ppCalledParty = SysAllocString( m_pReqMakeCall->szCalledParty );
Unlock();
if ( ( NULL == *ppCalledParty ) && ( NULL != m_pReqMakeCall->szCalledParty ) )
{
LOG((TL_ERROR, "get_CalledParty - SysAllocString Failed"));
return E_OUTOFMEMORY;
}
return S_OK;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
//
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
STDMETHODIMP
CRequestEvent::get_Comment(BSTR * ppComment )
{
if ( TAPIIsBadWritePtr( ppComment, sizeof (BSTR) ) )
{
LOG((TL_ERROR, "get_Comment - bad pointer"));
return E_POINTER;
}
Lock();
*ppComment = SysAllocString( m_pReqMakeCall->szComment );
Unlock();
if ( ( NULL == *ppComment ) && ( NULL != m_pReqMakeCall->szComment ) )
{
LOG((TL_ERROR, "get_Comment - SysAllocString Failed"));
return E_OUTOFMEMORY;
}
return S_OK;
}
HRESULT
CRequestEvent::FireEvent(
CTAPI * pTapi,
DWORD dwReg,
LPLINEREQMAKECALLW pReqMakeCall
)
{
HRESULT hr;
IDispatch * pDisp;
CComObject< CRequestEvent > * p;
hr = CComObject< CRequestEvent >::CreateInstance( &p );
if ( NULL == p )
{
return E_OUTOFMEMORY;
}
p->m_lRegistrationInstance = dwReg;
p->m_lRequestMode = LINEREQUESTMODE_MAKECALL;
p->m_pReqMakeCall = pReqMakeCall;
#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, "RequestEvent - could not get IDispatch %lx", hr));
return hr;
}
//
// fire the event
//
pTapi->Event(
TE_REQUEST,
pDisp
);
//
// release our reference
//
pDisp->Release();
return S_OK;
}
void
CRequestEvent::FinalRelease()
{
if ( NULL != m_pReqMakeCall )
{
ClientFree( m_pReqMakeCall );
}
#if DBG
if ( NULL != m_pDebug )
{
ClientFree( m_pDebug );
}
#endif
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
//
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void HandleLineRequest( CTAPI * pTapi, PASYNCEVENTMSG pParams )
{
HRESULT hr;
LINEREQMAKECALLW * pReqMakeCall;
LOG((TL_TRACE, "HandleLineRequest - enter"));
if ( CTAPI::FindTapiObject( pTapi ) )
{
while( 1 )
{
hr = LineGetRequest( pTapi->GetHLineApp(), LINEREQUESTMODE_MAKECALL, &pReqMakeCall );
if ( !SUCCEEDED(hr) )
{
LOG((TL_ERROR, "LineGetRequest failed - %lx", hr));
//release the reference added by FindTapiObject.
pTapi->Release();
return;
}
LOG((TL_INFO, "HandleLineRequest - destAddress: %S", pReqMakeCall->szDestAddress));
LOG((TL_INFO, "HandleLineRequest - AppName : %S", pReqMakeCall->szAppName));
LOG((TL_INFO, "HandleLineRequest - CalledParty: %S", pReqMakeCall->szCalledParty));
LOG((TL_INFO, "HandleLineRequest - Comment : %S", pReqMakeCall->szComment));
LOG((TL_INFO, "HandleLineRequest - about to fire event"));
hr = CRequestEvent::FireEvent(
pTapi,
pParams->OpenContext,
pReqMakeCall
);
LOG((TL_INFO, "HandleLineRequest - fire event result %d", hr));
}
//release the reference added by FindTapiObject.
pTapi->Release();
}
LOG((TL_TRACE, "HandleLineRequest - exit"));
}