/*++ Copyright (c) 1997-1999 Microsoft Corporation Module Name: callint.cpp Abstract: Implements all the methods on call interfaces. Author: mquinton - 9/4/98 Notes: Revision History: --*/ #include "stdafx.h" HRESULT mapTAPIErrorCode(long lErrorCode); HRESULT MakeBufferFromVariant( VARIANT var, DWORD * pdwSize, BYTE ** ppBuffer ); HRESULT FillVariantFromBuffer( DWORD dw, BYTE * pBuffer, VARIANT * pVar ); /////////////////////////////////////////////////////////////////////////////// // // BSTRFromUnalingedData // // this is a helper function that takes unalinged data and returns a BSTR // allocated around it // BSTR BSTRFromUnalingedData( IN BYTE *pbUnalignedData, IN DWORD dwDataSize) { LOG((TL_TRACE, "BSTRFromUnalingedData - enter")); BSTR bstrResult = NULL; #ifdef _WIN64 // // allocate aligned memory big enough to fit our string data // DWORD dwOleCharArraySize = ( (dwDataSize) / ( sizeof(OLECHAR) / sizeof(BYTE) ) ) + 1; LOG((TL_TRACE, "BSTRFromUnalingedData - allocating aligned memory of size[%ld]", dwOleCharArraySize)); OLECHAR *pbAlignedData = new OLECHAR[dwOleCharArraySize]; if (NULL == pbAlignedData) { LOG((TL_ERROR, "BSTRFromUnalingedData - failed to allocate aligned memory")); return NULL; } _ASSERTE( (dwOleCharArraySize/sizeof(OLECHAR) ) >= dwDataSize ); // // copy data to the aligned memory // CopyMemory( (BYTE*)(pbAlignedData ), (BYTE*)pbUnalignedData, dwDataSize ); // // allocate bstr from the aligned data // bstrResult = SysAllocString(pbAlignedData); // // no longer need the allocated buffer // delete pbAlignedData; pbAlignedData = NULL; #else bstrResult = SysAllocString((PWSTR)pbUnalignedData); #endif LOG((TL_TRACE, "BSTRFromUnalingedData - exit. bstrResult[%p]", bstrResult)); return bstrResult; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // Finish // // this method is used to finish a two step call operation // (conference or transfer) // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::Finish( FINISH_MODE finishMode ) { HRESULT hr = S_OK; CCall * pConferenceControllerCall = NULL; HCALL hConfContCall; HCALL hRelatedCall; CCallHub * pRelatedCallHub = NULL; ITAddress * pAddress; CAddress * pCAddress; LOG((TL_TRACE, "Finish - enter")); // // are we a tranfer? // if (m_dwCallFlags & CALLFLAG_TRANSFCONSULT) { if( ( FM_ASCONFERENCE != finishMode ) && ( FM_ASTRANSFER != finishMode ) ) { hr = E_INVALIDARG; LOG((TL_ERROR, "Wrong value passed for finish mode" )); } else { T3CALL t3ConfCall; // // get the related calls hCall // hRelatedCall = m_pRelatedCall->GetHCall(); // // Finish a Transfer // Lock(); hr = LineCompleteTransfer( hRelatedCall, m_t3Call.hCall, ( FM_ASCONFERENCE == finishMode )?&t3ConfCall:NULL, ( FM_ASCONFERENCE == finishMode )? LINETRANSFERMODE_CONFERENCE:LINETRANSFERMODE_TRANSFER ); Unlock(); if ( SUCCEEDED(hr) ) { // wait for async reply hr = WaitForReply( hr ); if ( SUCCEEDED(hr) ) { Lock(); // Reset Transfer - Consultation Flag m_dwCallFlags &= ~CALLFLAG_TRANSFCONSULT; Unlock(); } else { LOG((TL_ERROR, "Finish - LineCompleteTransfer failed async" )); } } else // LineCompleteTransfer failed { LOG((TL_ERROR, "Finish - LineCompleteTransferr failed" )); } if( FM_ASCONFERENCE == finishMode ) { // // Store the confcontroller in the callhub object // Lock(); pRelatedCallHub = m_pRelatedCall->GetCallHub(); m_pRelatedCall->get_Address( &pAddress ); pCAddress = dynamic_cast(pAddress); if(pRelatedCallHub != NULL) { pRelatedCallHub->CreateConferenceControllerCall( t3ConfCall.hCall, pCAddress ); } else { LOG((TL_INFO, "CreateConference - No CallHub")); } Unlock(); } // Finished with relatedCall ResetRelatedCall(); } } // // are we a conference? // else if (m_dwCallFlags & CALLFLAG_CONFCONSULT) { if( FM_ASCONFERENCE != finishMode ) { hr = E_INVALIDARG; LOG((TL_ERROR, "A conference can't be finished as a transfer" )); } else { // Finish a Conference // // get the related calls callhub // pRelatedCallHub = m_pRelatedCall->GetCallHub(); if (pRelatedCallHub != NULL) { // // Get the conference controller handle from the callhub // pConferenceControllerCall = pRelatedCallHub->GetConferenceControllerCall(); if (pConferenceControllerCall != NULL) { hConfContCall = pConferenceControllerCall->GetHCall(); // // Finished with relatedCall // ResetRelatedCall(); Lock(); hr = LineAddToConference( hConfContCall, m_t3Call.hCall ); Unlock(); if ( SUCCEEDED(hr) ) { // wait for async reply hr = WaitForReply( hr ); if ( SUCCEEDED(hr) ) { // // Reset Conference - Consultation Flag // Lock(); m_dwCallFlags &= ~CALLFLAG_CONFCONSULT; Unlock(); } else { LOG((TL_ERROR, "Finish - LineAddToConference failed async" )); } } else // LineAddToConference failed { LOG((TL_ERROR, "Finish - LineAddToConference failed" )); } } else // GetConferenceControllerCall failed { LOG((TL_ERROR, "Finish - GetConferenceControllerCall failed" )); } } else // GetCallHub failed { LOG((TL_ERROR, "Finish - GetCallHub failed" )); } } } else // Not flagged as transfer OR conference !!!! { LOG((TL_ERROR, "Finish - Not flagged as transfer OR conference")); hr = TAPI_E_INVALCALLSTATE; } LOG((TL_TRACE,hr, "Finish - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // RemoveFromConference // // this method is called to remove this call from a conference // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::RemoveFromConference(void) { HRESULT hr = S_OK; LOG((TL_TRACE, "RemoveFromConference - enter")); Lock(); hr = LineRemoveFromConference( m_t3Call.hCall ); Unlock(); if ( SUCCEEDED(hr) ) { // wait for async reply hr = WaitForReply( hr ); if ( SUCCEEDED(hr) ) { // OK } else { LOG((TL_ERROR, "RemoveFromConference - LineRemoveFromConference failed async" )); } } else // LineAddToConference failed { LOG((TL_ERROR, "RemoveFromConference - LineRemoveFromConference failed" )); } LOG((TL_TRACE, hr, "RemoveFromConference - exit")); return hr; } // ITCallInfo methods //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_Address // // retrieves the address object // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::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 - invalid pointer")); return E_POINTER; } // // gets correct interface // and addrefs // hr = m_pAddress->QueryInterface( IID_ITAddress, (void **)ppAddress ); LOG((TL_TRACE, "get_Address - exit - return %lx", hr )); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_CallState // // retrieves the current callstate // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::get_CallState( CALL_STATE * pCallState ) { LOG((TL_TRACE, "get_CallState - enter")); LOG((TL_TRACE, " pCallState ---> %p", pCallState )); if ( TAPIIsBadWritePtr( pCallState, sizeof( CALL_STATE ) ) ) { LOG((TL_ERROR, "get_CallState - invalid pointer")); return E_POINTER; } Lock(); *pCallState = m_CallState; Unlock(); LOG((TL_TRACE, "get_CallState - exit - return success" )); return S_OK; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_Privilege // // get the privilege // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::get_Privilege( CALL_PRIVILEGE * pPrivilege ) { LOG((TL_TRACE, "get_Privilege - enter")); LOG((TL_TRACE, " pPrivilege ---> %p", pPrivilege )); if ( TAPIIsBadWritePtr( pPrivilege, sizeof( CALL_PRIVILEGE ) ) ) { LOG((TL_ERROR, "get_Privilege - bad pointer")); return E_POINTER; } Lock(); *pPrivilege = m_CallPrivilege; Unlock(); LOG((TL_TRACE, "get_Privilege - exit - return SUCCESS" )); return S_OK; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_MediaTypesAvailable // // gets the media types on the call. // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_MediaTypesAvailable( long * plMediaTypesAvail ) { LOG((TL_TRACE, "get_MediaTypesAvailable enter")); LOG((TL_TRACE, " plMediaTypesAvail ------->%p", plMediaTypesAvail )); // // check pointer // if ( TAPIIsBadWritePtr( plMediaTypesAvail, sizeof(long) ) ) { LOG((TL_ERROR, "get_MediaTypesAvailable - bad pointer")); return E_POINTER; } Lock(); DWORD dwHold = 0; // // ask address for types // if (ISHOULDUSECALLPARAMS()) { dwHold = m_pAddress->GetMediaModes(); } // // or types currently on call // else { if ( SUCCEEDED(RefreshCallInfo()) ) { dwHold = m_pCallInfo->dwMediaMode; } else { dwHold = m_pAddress->GetMediaModes(); } } // // fix up tapi2 media modes // if (dwHold & AUDIOMEDIAMODES) { dwHold |= LINEMEDIAMODE_AUTOMATEDVOICE; } dwHold &= ALLMEDIAMODES; *plMediaTypesAvail = dwHold; Unlock(); return S_OK; } // ITBasicCallControl methods //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // Connect // // connect the call - call linemakecall // // bsync tells tapi if it should wait for the call to get to connected // or not before returning. // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::Connect( VARIANT_BOOL bSync ) { HRESULT hr = S_OK; HANDLE hEvent; HCALL hCall; LOG((TL_TRACE, "Connect - enter" )); LOG((TL_TRACE, " bSync ---> %d", bSync )); Lock(); if (m_CallState != CS_IDLE) { Unlock(); LOG((TL_ERROR,"Connect - call is not in IDLE state - cannot call connect")); return TAPI_E_INVALCALLSTATE; } // // get an hline to use // hr = m_pAddress->FindOrOpenALine( m_dwMediaMode, &m_pAddressLine ); if (S_OK != hr) { Unlock(); LOG((TL_ERROR, "Connect - FindOrOpenALine failed - %lx", hr )); return hr; } // // set up the callparams structure // FinishCallParams(); // // make the call // hr = LineMakeCall( &(m_pAddressLine->t3Line), &hCall, m_szDestAddress, m_dwCountryCode, m_pCallParams ); if (((LONG)hr) > 0) { if (bSync) { // // this must be created inside the same // Lock() as the call to tapisrv // otherwise, the connected message // may appear before the event // exists // hEvent = CreateConnectedEvent(); } // // wait for an async reply // Unlock(); hr = WaitForReply( hr ); Lock(); } if ( S_OK != hr ) { HRESULT hr2; LOG((TL_ERROR, "Connect - LineMakeCall failed - %lx", hr )); ClearConnectedEvent(); // post an event in the callback thread for LINE_CALLSTATE hr2 = CCallStateEvent::FireEvent( (ITCallInfo *)this, CS_DISCONNECTED, CEC_DISCONNECT_BADADDRESS, /*there should be something called CEC_DISCONNECT_BADADDRESSTYPE*/ m_pAddress->GetTapi(), NULL ); if (!SUCCEEDED(hr2)) { LOG((TL_ERROR, "CallStateEvent - fire event failed %lx", hr)); } m_CallState = CS_DISCONNECTED; m_pAddress->MaybeCloseALine( &m_pAddressLine ); // // Go through the phones and call our event hooks // ITPhone * pPhone; CPhone * pCPhone; int iPhoneCount; PhoneArray PhoneArray; // // Get a copy of the phone array from tapi. This copy will contain // references to all the phone objects. // m_pAddress->GetTapi()->GetPhoneArray( &PhoneArray ); // // Unlock before we mess with the phone objects, otherwise we risk deadlock // if a phone object would try to access call methods. // Unlock(); for(iPhoneCount = 0; iPhoneCount < PhoneArray.GetSize(); iPhoneCount++) { pPhone = PhoneArray[iPhoneCount]; pCPhone = dynamic_cast(pPhone); pCPhone->Automation_CallState( (ITCallInfo *)this, CS_DISCONNECTED, CEC_DISCONNECT_BADADDRESS ); } // // Release all the phone objects. // PhoneArray.Shutdown(); } else //hr is S_OK { FinishSettingUpCall( hCall ); Unlock(); if (bSync) { return SyncWait( hEvent ); } LOG((TL_TRACE, "Connect - exit - return SUCCESS")); } return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // Answer // // Answer an offering call. // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::Answer( void ) { HRESULT hr; LOG((TL_TRACE, "Answer - enter" )); Lock(); // // make sure we are in the correct call state // if (CS_OFFERING != m_CallState) { LOG((TL_ERROR, "Answer - call not in offering state" )); Unlock(); return TAPI_E_INVALCALLSTATE; } // // answer // hr = LineAnswer( m_t3Call.hCall ); Unlock(); if ( ((LONG)hr) < 0 ) { LOG((TL_ERROR, "Answer - LineAnswer failed %lx", hr )); return hr; } // // wait for reply // hr = WaitForReply( hr ); LOG((TL_TRACE, "Answer - exit - return %lx", hr )); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // Disconnect // // called to disconnect the call // the disconnected_code is ignored // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::Disconnect( DISCONNECT_CODE code ) { HRESULT hr = S_OK; LONG lResult; HCALL hCall, hAdditionalCall; LOG((TL_TRACE, "Disconnect - enter" )); LOG((TL_TRACE, " DisconnectCode ---> %d", code )); Lock(); if (m_CallState == CS_IDLE) { Unlock(); LOG((TL_ERROR, "Disconnect - invalid state")); return S_FALSE; } if (NULL == m_t3Call.hCall) { Unlock(); LOG((TL_ERROR, "Disconnect - invalid hCall")); return S_FALSE; } hCall = m_t3Call.hCall; hAdditionalCall = m_hAdditionalCall; // // special case for wavemsp // tell it to stop streaming // if ( OnWaveMSPCall() ) { StopWaveMSPStream(); } Unlock(); // // Check extra t3call used in conference legs // if (NULL != hAdditionalCall) { lResult = LineDrop( hAdditionalCall, NULL, 0 ); if ( lResult < 0 ) { LOG((TL_ERROR, "Disconnect - AdditionalCall - LineDrop failed %lx", lResult )); } else { hr = WaitForReply( (DWORD) lResult ); if (S_OK != hr) { LOG((TL_ERROR, "Disconnect - AdditionalCall - WaitForReply failed %lx", hr )); } } } lResult = LineDrop( hCall, NULL, 0 ); if ( lResult < 0 ) { LOG((TL_ERROR, "Disconnect - LineDrop failed %lx", lResult )); return mapTAPIErrorCode( lResult ); } hr = WaitForReply( (DWORD) lResult ); if (S_OK != hr) { LOG((TL_ERROR, "Disconnect - WaitForReply failed %lx", hr )); return hr; } LOG((TL_TRACE, "Disconnect - exit - return %lx", hr )); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CCall // Interface : ITBasicCallControl // Method : Hold // // If bHold == TRUE, the call should be put on hold. // If bHold == FALSE, the call should unheld // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::Hold( VARIANT_BOOL bHold ) { HRESULT hr = S_OK; HCALL hCall; LOG((TL_TRACE, "Hold - enter")); LOG((TL_TRACE, " bHold ---> %d", bHold)); Lock(); hCall = m_t3Call.hCall; Unlock(); if ( NULL == hCall ) { return TAPI_E_INVALCALLSTATE; } if (bHold) { hr = LineHold(hCall); if ( SUCCEEDED(hr) ) { // // wait for async reply // hr = WaitForReply( hr ); if ( FAILED(hr) ) { LOG((TL_ERROR, "Hold - lineHold failed async" )); } } else // lineHold failed { LOG((TL_ERROR, "Hold - lineHold failed" )); } } else // want to unhold, so we should be held { hr = LineUnhold(hCall); if ( SUCCEEDED(hr) ) { // // wait for async reply // hr = WaitForReply( hr ); if ( FAILED(hr) ) { LOG((TL_ERROR, "Hold - lineUnhold failed async" )); } } else // lineUnhold failed { LOG((TL_ERROR, "Hold - lineUnhold failed" )); } } LOG((TL_TRACE, hr, "Hold - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CCall // Interface : ITBasicCallControl // Method : Handoff // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::HandoffDirect( BSTR pApplicationName ) { HRESULT hr = S_OK; HCALL hCall; LOG((TL_TRACE, "HandoffDirect - enter")); LOG((TL_TRACE, " pApplicationName ---> %p", pApplicationName)); if ( IsBadStringPtrW( pApplicationName, -1 ) ) { LOG((TL_ERROR, "HandoffDirect - AppName pointer invalid")); return E_POINTER; } Lock(); hCall = m_t3Call.hCall; Unlock(); hr = LineHandoff(hCall, pApplicationName, 0); if (FAILED(hr)) { LOG((TL_ERROR, "HandoffDirect - LineHandoff failed")); } LOG((TL_TRACE, hr, "HandoffDirect - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CCall // Interface : ITBasicCallControl // Method : Handoff // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::HandoffIndirect( long lMediaType ) { HRESULT hr = S_OK; DWORD dwMediaMode = 0; HCALL hCall; LOG((TL_TRACE, "HandoffIndirect - enter")); LOG((TL_TRACE, " lMediaType ---> %d", lMediaType)); if (!(m_pAddress->GetMediaMode( lMediaType, &dwMediaMode ) ) ) { LOG((TL_ERROR, "HandoffIndirect - invalid mediatype")); return E_INVALIDARG; } Lock(); hCall = m_t3Call.hCall; Unlock(); hr = LineHandoff(hCall, NULL, dwMediaMode); if (FAILED(hr)) { LOG((TL_ERROR, "HandoffIndirect - LineHandoff failed")); } LOG((TL_TRACE, hr, "HandoffIndirect - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CCall // Interface : ITBasicCallControl // Method : Conference // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::Conference( ITBasicCallControl * pCall, VARIANT_BOOL bSync ) { HRESULT hr = S_OK; CCall * pConferenceControllerCall = NULL; CCall * pConsultationCall = NULL; LOG((TL_TRACE, "Conference - enter")); LOG((TL_TRACE, " pCall ---> %p", pCall)); LOG((TL_TRACE, " bSync ---> %hd",bSync)); if ( IsBadReadPtr( pCall, sizeof (ITBasicCallControl) ) ) { LOG((TL_ERROR, "Conference - bad call pointer")); return E_POINTER; } // // Get CCall pointer to our consultation call object // pConsultationCall = dynamic_cast*>(pCall); if (pConsultationCall != NULL) { Lock(); if (pConsultationCall->GetHCall() == GetHCall()) { Unlock(); hr = E_INVALIDARG; LOG((TL_INFO, "Conference - invalid Call pointer (same call & consult call)")); } else if (m_pCallHub != NULL) { // // Get the conference controller handle from the callhub // pConferenceControllerCall = m_pCallHub->GetConferenceControllerCall(); Unlock(); // // Do we have an existing Conference ?? // if (pConferenceControllerCall == NULL) { // // No existing conference, so create one // hr = CreateConference(pConsultationCall, bSync ); } else { // // Add to an existing conference // hr = AddToConference(pConsultationCall, bSync ); } } else { Unlock(); hr = E_UNEXPECTED; LOG((TL_INFO, "Conference - No Call Hub" )); } } else { hr = E_INVALIDARG; LOG((TL_INFO, "Conference - invalid Call pointer")); LOG((TL_ERROR, hr, "Conference - exit")); } return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CCall // Interface : ITBasicCallControl // Method : Transfer // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::Transfer( ITBasicCallControl * pCall, VARIANT_BOOL bSync ) { HRESULT hr = S_OK; LPLINECALLSTATUS pCallStatus = NULL; CCall * pConsultationCall = NULL; DWORD dwCallFeatures; DWORD dwCallFeatures2; CALL_STATE consultationCallState = CS_IDLE; LOG((TL_TRACE, "Transfer - enter")); LOG((TL_TRACE, " pCall ---> %p", pCall)); LOG((TL_TRACE, " bSync ---> %hd",bSync)); try { // // Get CCall pointer to our consultation call object // pConsultationCall = dynamic_cast*>(pCall); if (pConsultationCall != NULL) { } else { hr = E_INVALIDARG; LOG((TL_INFO, "Transfer - invalid Call pointer")); LOG((TL_ERROR, hr, "Transfer - exit")); return(hr); } } catch(...) { hr = E_INVALIDARG; LOG((TL_INFO, "Transfer - invalid Call pointer")); LOG((TL_ERROR, hr, "Transfer - exit")); return(hr); } if (pConsultationCall->GetHCall() == GetHCall()) { hr = E_INVALIDARG; LOG((TL_INFO, "Transfer - invalid Call pointer (same call & consult call)")); LOG((TL_ERROR, hr, "Transfer - exit")); return(hr); } // Pointer seems Ok, so carry on Lock(); // // Get Call Status to determine what features we can use // hr = LineGetCallStatus( m_t3Call.hCall, &pCallStatus ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "Transfer - LineGetCallStatus failed - %lx", hr)); Unlock(); return hr; } dwCallFeatures = pCallStatus->dwCallFeatures; if ( m_pAddress->GetAPIVersion() >= TAPI_VERSION2_0 ) { dwCallFeatures2 = pCallStatus->dwCallFeatures2; } ClientFree( pCallStatus ); #if CHECKCALLSTATUS if ( (dwCallFeatures & LINECALLFEATURE_SETUPTRANSFER) && (dwCallFeatures & LINECALLFEATURE_COMPLETETRANSF) ) { #endif // // we support it, so try the transfer // Can we do a one step transfer ??? // if ( dwCallFeatures2 & LINECALLFEATURE2_ONESTEPTRANSFER ) { Unlock(); hr = OneStepTransfer(pConsultationCall, bSync); return hr; } HCALL hConsultationCall; // // Setup & dial the consultation Call // LOG((TL_INFO, "Transfer - Trying Two Step Transfer" )); hr = LineSetupTransfer( m_t3Call.hCall, &hConsultationCall, NULL ); Unlock(); if ( SUCCEEDED(hr) ) { // // wait for async reply // hr = WaitForReply( hr ); if ( SUCCEEDED(hr) ) { // // we support it, so try the Conference // pConsultationCall->get_CallState (&consultationCallState); if ( (consultationCallState == CS_CONNECTED) || (consultationCallState == CS_HOLD) ) { // // the existing call is in a connected stae so we just need to to do a finish() // to call down to LineAddToConference() // pConsultationCall->SetRelatedCall( this, CALLFLAG_TRANSFCONSULT|CALLFLAG_CONSULTCALL ); return S_OK; } LONG lCap; LOG((TL_INFO, "Transfer - LineSetupTransfer completed OK")); pConsultationCall->Lock(); pConsultationCall->FinishSettingUpCall( hConsultationCall ); pConsultationCall->Unlock(); hr = pConsultationCall->DialAsConsultationCall( this, dwCallFeatures, FALSE, bSync ); } else // LineSetupTransfer async reply failed { LOG((TL_ERROR, "Transfer - LineSetupTransfer failed async" )); } } else // LineSetupTransfer failed { LOG((TL_ERROR, "Transfer - LineSetupTransfer failed" )); } #if CHECKCALLSTATUS } else // don't support transfer features { LOG((TL_ERROR, "Transfer - LineGetCallStatus reports Transfer not supported")); hr = E_FAIL; } #endif LOG((TL_TRACE, hr, "Transfer - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CCall // Interface : ITBasicCallControl // Method : BlindTransfer // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::BlindTransfer( BSTR pDestAddress ) { HRESULT hr = S_OK; DWORD dwCallFeatures; LOG((TL_TRACE, "BlindTransfer - enter")); LOG((TL_TRACE, " pDestAddress ---> %p", pDestAddress)); if ( IsBadStringPtrW( pDestAddress, -1 ) ) { LOG((TL_ERROR, "BlindTransfer - bad pDestAddress")); return E_POINTER; } Lock(); #if CHECKCALLSTATUS LPLINECALLSTATUS pCallStatus = NULL; hr = LineGetCallStatus( m_t3Call.hCall, &pCallStatus ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "BlindTransfer - LineGetCallStatus failed - %lx", hr)); Unlock(); return hr; } dwCallFeatures = pCallStatus->dwCallFeatures; ClientFree( pCallStatus ); if (!(dwCallFeatures & LINECALLFEATURE_BLINDTRANSFER )) { LOG((TL_ERROR, "BlindTransfer - not supported" )); Unlock(); return E_FAIL; } #endif // If the calls in the offering state we can't blindtransfer, so redirect. if (m_CallState == CS_OFFERING) { hr = lineRedirectW( m_t3Call.hCall, pDestAddress, m_dwCountryCode ); } else { // // we support it, so try the transfer // hr = LineBlindTransfer( m_t3Call.hCall, pDestAddress, m_dwCountryCode ); } Unlock(); if ( SUCCEEDED(hr) ) { // // wait for async reply // hr = WaitForReply( hr ); if ( FAILED(hr) ) { LOG((TL_ERROR, "BlindTransfer - lineBlindTransfer failed async" )); } } else // LineBlindTransfer failed { LOG((TL_ERROR, "BlindTransfer - lineBlindTransfer failed" )); } LOG((TL_TRACE, hr, "BlindTransfer - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CCall // Interface : ITBasicCallControl // Method : Park // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::ParkDirect( BSTR pParkAddress ) { HRESULT hr = S_OK; HCALL hCall; LOG((TL_TRACE, "ParkDirect - enter")); if ( IsBadStringPtrW( pParkAddress, -1 ) ) { LOG((TL_ERROR, "ParkDirect - bad pParkAddress")); return E_POINTER; } Lock(); hCall = m_t3Call.hCall; Unlock(); #if CHECKCALLSTATUS LPLINECALLSTATUS pCallStatus = NULL; hr = LineGetCallStatus( hCall, &pCallStatus ); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "ParkDirect - LineGetCallStatus failed - %lx", hr)); return hr; } if (!(pCallStatus->dwCallFeatures & LINECALLFEATURE_PARK )) { LOG((TL_ERROR, "ParkDirect - this call doesn't support park")); ClientFree( pCallStatus ); return E_FAIL; } ClientFree( pCallStatus ); #endif hr = LinePark( hCall, LINEPARKMODE_DIRECTED, pParkAddress, NULL ); if ( SUCCEEDED(hr) ) { // // wait for async reply // hr = WaitForReply( hr ); } LOG((TL_TRACE, hr, "Park - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CCall // Interface : ITBasicCallControl // Method : Park // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::ParkIndirect( BSTR * ppNonDirAddress ) { HRESULT hr = S_OK; LPVARSTRING pCallParkedAtThisAddress = NULL; PWSTR pszParkedHere; HCALL hCall; LOG((TL_TRACE, "ParkIndirect - enter")); if ( TAPIIsBadWritePtr( ppNonDirAddress, sizeof(BSTR) ) ) { LOG((TL_ERROR, "Park - Bad return Pointer" )); return E_POINTER; } Lock(); hCall = m_t3Call.hCall; Unlock(); #if CHECKCALLSTATUS LPLINECALLSTATUS pCallStatus = NULL; hr = LineGetCallStatus( hCall, &pCallStatus ); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "ParkDirect - LineGetCallStatus failed %lx",hr)); return hr; } if ( !(pCallStatus->dwCallFeatures & LINECALLFEATURE_PARK )) { LOG((TL_ERROR, "ParkIndirect - call doesn't support park")); ClientFree( pCallStatus ); return E_FAIL; } ClientFree( pCallStatus ); #endif // // we support it, so try to park // hr = LinePark( hCall, LINEPARKMODE_NONDIRECTED, NULL, &pCallParkedAtThisAddress ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "LineParkIndirect - failed sync - %lx", hr)); return hr; } // // wait for async reply // hr = WaitForReply( hr ); if ( SUCCEEDED(hr) && (NULL != pCallParkedAtThisAddress) ) { // // Get the string from the VARSTRING structure // pszParkedHere = (PWSTR) ((BYTE*)(pCallParkedAtThisAddress) + pCallParkedAtThisAddress->dwStringOffset); *ppNonDirAddress = BSTRFromUnalingedData( (BYTE*)pszParkedHere, pCallParkedAtThisAddress->dwStringSize); if ( NULL == *ppNonDirAddress ) { LOG((TL_ERROR, "ParkIndirect - BSTRFromUnalingedData Failed" )); hr = E_OUTOFMEMORY; } ClientFree( pCallParkedAtThisAddress ); } else // LinePark failed async { LOG((TL_ERROR, "ParkIndirect - LinePark failed async" )); } LOG((TL_TRACE, hr, "ParkIndirect - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CCall // Interface : ITBasicCallControl // Method : SwapHold // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT STDMETHODCALLTYPE CCall::SwapHold(ITBasicCallControl * pCall) { HRESULT hr = S_OK; CCall *pHeldCall; HCALL hHeldCall; HCALL hCall; CCall *pConfContCall; ITCallHub *pCallHub; LOG((TL_TRACE, "SwapHold - enter")); try { // // Get CCall pointer to our other call object // pHeldCall = dynamic_cast*>(pCall); if (pHeldCall != NULL) { // // Get held call objects T3CALL // hHeldCall = pHeldCall->GetHCall(); // //If the call has a conference controller associated with it then //the conference controller is swapheld instead of the call itself. // pConfContCall = pHeldCall->GetConfControlCall(); if (pConfContCall != NULL) { hHeldCall = pConfContCall->GetHCall(); } } else { hr = E_INVALIDARG; LOG((TL_INFO, "SwapHold - invalid Call pointer")); LOG((TL_ERROR, hr, "Transfer - exit")); return(hr); } } catch(...) { hr = E_INVALIDARG; LOG((TL_INFO, "SwapHold - invalid Call pointer")); LOG((TL_ERROR, hr, "Transfer - exit")); return(hr); } // //Get the swap call handle. //Look for the conference controller call first. // pConfContCall = GetConfControlCall(); if (pConfContCall != NULL) { hCall = pConfContCall->GetHCall(); } else { hCall = GetHCall(); } // // Pointer seems Ok, so carry on // #if CHECKCALLSTATUS LPLINECALLSTATUS pCallStatus = NULL; hr = LineGetCallStatus( hCall, &pCallStatus ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "SwapHold - LineGetCallStatus failed")); } if (pCallStatus->dwCallFeatures & LINECALLFEATURE_SWAPHOLD ) { #endif // // we support it, so try to swap hold // hr = LineSwapHold(hCall, hHeldCall); if ( SUCCEEDED(hr) ) { // // wait for async reply // hr = WaitForReply( hr ); if ( FAILED(hr) ) { LOG((TL_ERROR, "SwapHold - LineSwapHold failed async" )); } } else // LineSwapHold failed { LOG((TL_ERROR, "SwapHold - LineSwapHold failed" )); } #if CHECKCALLSTATUS } else // don't support LineSwapHold { LOG((TL_ERROR, "SwapHold - LineGetCallStatus reports LineSwapHold not supported")); hr = E_FAIL; } ClientFree( pCallStatus ); #endif LOG((TL_TRACE, hr, "SwapHold - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CCall // Interface : ITBasicCallControl // Method : Unpark // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::Unpark() { HRESULT hr = E_FAIL; HCALL hCall; LOG((TL_TRACE, "Unpark - enter")); Lock(); if (m_CallState != CS_IDLE) { Unlock(); LOG((TL_ERROR,"Unpark - call is not in IDLE state - cannot call Unpark")); return TAPI_E_INVALCALLSTATE; } // // Do we have a line open ? // if ( NULL == m_pAddressLine ) { hr = m_pAddress->FindOrOpenALine( m_dwMediaMode, &m_pAddressLine ); if ( FAILED(hr) ) { Unlock(); LOG((TL_ERROR, "Unpark - couldn't open a line")); LOG((TL_TRACE, hr, "Unpark - exit")); return hr; } } hr = LineUnpark( m_pAddressLine->t3Line.hLine, m_pAddress->GetAddressID(), &hCall, m_szDestAddress ); Unlock(); // // Check sync return // if ( SUCCEEDED(hr) ) { // Wait for the async reply & map it's tapi2 code T3 hr = WaitForReply( hr ); if ( SUCCEEDED(hr) ) { FinishSettingUpCall( hCall ); } else // async reply failed { LOG((TL_ERROR, "Unpark - LineUnpark failed async")); Lock(); m_pAddress->MaybeCloseALine( &m_pAddressLine ); Unlock(); } } else // LineUnpark failed { LOG((TL_ERROR, "Unpark - LineUnpark failed sync" )); Lock(); m_pAddress->MaybeCloseALine( &m_pAddressLine ); Unlock(); } LOG((TL_TRACE, hr, "Unpark - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_CallHub // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::get_CallHub( ITCallHub ** ppCallHub ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_CallHub - enter")); if ( TAPIIsBadWritePtr( ppCallHub, sizeof(ITCallHub *) ) ) { LOG((TL_ERROR, "get_CallHub - bad pointer")); return E_POINTER; } *ppCallHub = NULL; // // do we have a callhub yet? // Lock(); if (NULL == m_pCallHub) { hr = CheckAndCreateFakeCallHub(); } if ( SUCCEEDED(hr) ) { hr = m_pCallHub->QueryInterface( IID_ITCallHub, (void**)ppCallHub ); } Unlock(); LOG((TL_TRACE, "get_CallHub - exit - return %lx", hr)); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // Pickup // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::Pickup( BSTR pGroupID ) { HRESULT hr = E_FAIL; HCALL hCall; LOG((TL_TRACE, "Pickup - enter")); // // Pickup should accept NULL value in pGroupID argument // if ( (pGroupID != NULL) && IsBadStringPtrW( pGroupID, -1 ) ) { LOG((TL_TRACE, "Pickup - bad pGroupID")); return E_POINTER; } Lock(); // // If we already have a call handle, don't pickup this call as it will // overwrite that handle // if ( NULL != m_t3Call.hCall ) { Unlock(); LOG((TL_ERROR, "Pickup - we already have a call handle")); LOG((TL_TRACE, hr, "Pickup - exit")); return TAPI_E_INVALCALLSTATE; } // // Do we have a line open ? // if ( NULL == m_pAddressLine ) { hr = m_pAddress->FindOrOpenALine( m_dwMediaMode, &m_pAddressLine ); if ( FAILED(hr) ) { Unlock(); LOG((TL_ERROR, "Pickup - couldn't open a line")); LOG((TL_TRACE, hr, "Pickup - exit")); return hr; } } hr = LinePickup( m_pAddressLine->t3Line.hLine, m_pAddress->GetAddressID(), &hCall, m_szDestAddress, pGroupID ); Unlock(); // // Check sync return // if ( SUCCEEDED(hr) ) { // // wait for async reply // hr = WaitForReply( hr ); if ( SUCCEEDED(hr) ) { FinishSettingUpCall( hCall ); //UpdateStateAndPrivilege(); } else // async reply failed { LOG((TL_ERROR, "Pickup - LinePickup failed async")); Lock(); m_pAddress->MaybeCloseALine( &m_pAddressLine ); Unlock(); } } else // LinePickup failed { LOG((TL_ERROR, "Pickup - LinePickup failed sync" )); Lock(); m_pAddress->MaybeCloseALine( &m_pAddressLine ); Unlock(); } LOG((TL_TRACE, hr, "Pickup - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // Dial // // simply call LineDial // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::Dial( BSTR pDestAddress ) { HRESULT hr; LOG((TL_TRACE, "Dial - enter")); LOG((TL_TRACE, "Dial - pDestAddress %ls", pDestAddress)); if ( IsBadStringPtrW( pDestAddress, -1 ) ) { LOG((TL_ERROR, "Dial - bad pDestAddress")); return E_POINTER; } Lock(); hr = LineDial( m_t3Call.hCall, pDestAddress, m_dwCountryCode ); Unlock(); if ( SUCCEEDED(hr) ) { hr = WaitForReply( hr ); } else { LOG((TL_ERROR, "Dial - fail sync - %lx", hr)); } LOG((TL_TRACE, "Dial - exit - return %lx", hr)); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_AddressType // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifndef NEWCALLINFO STDMETHODIMP CCall::get_AddressType( long * plAddressType ) { HRESULT hr = S_OK; DWORD dwAPI; LOG((TL_TRACE, "get_AddressType - enter")); if ( TAPIIsBadWritePtr( plAddressType, sizeof (long) ) ) { LOG((TL_ERROR, "get_AddressType - bad pointer")); return E_POINTER; } dwAPI = m_pAddress->GetAPIVersion(); if ( TAPI_VERSION3_0 > dwAPI ) { *plAddressType = LINEADDRESSTYPE_PHONENUMBER; LOG((TL_INFO, "get_AddressType - addresstype %lx", *plAddressType)); LOG((TL_TRACE, "get_AddressType - exit")); return S_OK; } Lock(); if (ISHOULDUSECALLPARAMS()) { *plAddressType = m_pCallParams->dwAddressType; hr = S_OK; } else { hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { *plAddressType = m_pCallInfo->dwAddressType; LOG((TL_INFO, "get_AddressType - addresstype %lx", m_pCallInfo->dwAddressType)); } } Unlock(); LOG((TL_TRACE, "get_AddressType - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_AddressType // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= STDMETHODIMP CCall::put_AddressType(long lType) { HRESULT hr = S_OK; LOG((TL_TRACE, "put_AddressType - enter")); Lock(); if ( ISHOULDUSECALLPARAMS() ) { if( m_pAddress->GetAPIVersion() < TAPI_VERSION3_0 ) { if ( LINEADDRESSTYPE_PHONENUMBER != lType ) { LOG((TL_ERROR, "put_AddressType - tsp < ver 3.0 only support phonenumber")); hr = E_INVALIDARG; } } else { // // address types get validate in tapisrv // when callparams is used // m_pCallParams->dwAddressType = lType; } } else { LOG((TL_ERROR, "put_AddressType - cannot save in this callstate")); hr = TAPI_E_INVALCALLSTATE; } Unlock(); LOG((TL_TRACE, "put_AddressType - exit")); return hr; } #endif #ifdef NEWCALLINFO //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::get_CallerIDAddressType(long * plAddressType ) { HRESULT hr = S_OK; DWORD dwAPI; LOG((TL_TRACE, "get_CallerIDAddressType - enter")); if ( TAPIIsBadWritePtr( plAddressType, sizeof (long) ) ) { LOG((TL_ERROR, "get_CallerIDAddressType - bad pointer")); return E_POINTER; } dwAPI = m_pAddress->GetAPIVersion(); Lock(); if (ISHOULDUSECALLPARAMS()) { LOG((TL_INFO, "get_CallerIDAddressType - invalid call state")); hr = TAPI_E_INVALCALLSTATE; } else { hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { if ( m_pCallInfo->dwCallerIDFlags & LINECALLPARTYID_ADDRESS ) { if ( TAPI_VERSION3_0 > dwAPI ) { *plAddressType = LINEADDRESSTYPE_PHONENUMBER; LOG((TL_INFO, "get_CallerIDAddressType - addresstype %lx", *plAddressType)); LOG((TL_TRACE, "get_CallerIDAddressType - exit")); } else { *plAddressType = m_pCallInfo->dwCallerIDAddressType; LOG((TL_INFO, "get_CallerIDAddressType - addresstype %lx", m_pCallInfo->dwCallerIDAddressType)); } hr = S_OK; } else { hr = E_FAIL; } } } Unlock(); LOG((TL_TRACE, "get_CallerIDAddressType - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::get_CalledIDAddressType(long * plAddressType ) { HRESULT hr = S_OK; DWORD dwAPI; LOG((TL_TRACE, "get_CalledIDAddressType - enter")); if ( TAPIIsBadWritePtr( plAddressType, sizeof (long) ) ) { LOG((TL_ERROR, "get_CalledIDAddressType - bad pointer")); return E_POINTER; } dwAPI = m_pAddress->GetAPIVersion(); Lock(); if (ISHOULDUSECALLPARAMS()) { LOG((TL_INFO, "get_CalledIDAddressType - invalid call state")); hr = TAPI_E_INVALCALLSTATE; } else { hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { if ( m_pCallInfo->dwCalledIDFlags & LINECALLPARTYID_ADDRESS ) { if ( TAPI_VERSION3_0 > dwAPI ) { *plAddressType = LINEADDRESSTYPE_PHONENUMBER; LOG((TL_INFO, "get_CalledIDAddressType - addresstype %lx", *plAddressType)); LOG((TL_TRACE, "get_CalledIDAddressType - exit")); } else { *plAddressType = m_pCallInfo->dwCalledIDAddressType; LOG((TL_INFO, "get_CalledIDAddressType - addresstype %lx", m_pCallInfo->dwCalledIDAddressType)); } hr = S_OK; } else { hr = E_FAIL; } } } Unlock(); LOG((TL_TRACE, "get_CalledIDAddressType - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::get_ConnectedIDAddressType(long * plAddressType ) { HRESULT hr = S_OK; DWORD dwAPI; LOG((TL_TRACE, "get_ConnectedIDAddressType - enter")); if ( TAPIIsBadWritePtr( plAddressType, sizeof (long) ) ) { LOG((TL_ERROR, "get_ConnectedIDAddressType - bad pointer")); return E_POINTER; } dwAPI = m_pAddress->GetAPIVersion(); Lock(); if (ISHOULDUSECALLPARAMS()) { LOG((TL_INFO, "get_ConnectedIDAddressType - invalid call state")); hr = TAPI_E_INVALCALLSTATE; } else { hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { if ( m_pCallInfo->dwConnectedIDFlags & LINECALLPARTYID_ADDRESS ) { if ( TAPI_VERSION3_0 > dwAPI ) { *plAddressType = LINEADDRESSTYPE_PHONENUMBER; LOG((TL_INFO, "get_ConnectedIDAddressType - addresstype %lx", *plAddressType)); LOG((TL_TRACE, "get_ConnectedIDAddressType - exit")); } else { *plAddressType = m_pCallInfo->dwConnectedIDAddressType; LOG((TL_INFO, "get_ConnectedIDAddressType - addresstype %lx", m_pCallInfo->dwConnectedIDAddressType)); } hr = S_OK; } else { hr = E_FAIL; } } } Unlock(); LOG((TL_TRACE, "get_ConnectedIDAddressType - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::get_RedirectionIDAddressType(long * plAddressType ) { HRESULT hr = S_OK; DWORD dwAPI; LOG((TL_TRACE, "get_RedirectionIDAddressType - enter")); if ( TAPIIsBadWritePtr( plAddressType, sizeof (long) ) ) { LOG((TL_ERROR, "get_RedirectionIDAddressType - bad pointer")); return E_POINTER; } dwAPI = m_pAddress->GetAPIVersion(); Lock(); if (ISHOULDUSECALLPARAMS()) { LOG((TL_INFO, "get_RedirectionIDAddressType - invalid call state")); hr = TAPI_E_INVALCALLSTATE; } else { hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { if ( m_pCallInfo->dwRedirectionIDFlags & LINECALLPARTYID_ADDRESS ) { if ( TAPI_VERSION3_0 > dwAPI ) { *plAddressType = LINEADDRESSTYPE_PHONENUMBER; LOG((TL_INFO, "get_RedirectionIDAddressType - addresstype %lx", *plAddressType)); LOG((TL_TRACE, "get_RedirectionIDAddressType - exit")); } else { *plAddressType = m_pCallInfo->dwRedirectionIDAddressType; LOG((TL_INFO, "get_RedirectionIDAddressType - addresstype %lx", m_pCallInfo->dwRedirectionIDAddressType)); } hr = S_OK; } else { hr = E_FAIL; } } } Unlock(); LOG((TL_TRACE, "get_RedirectionIDAddressType - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::get_RedirectingIDAddressType(long * plAddressType ) { HRESULT hr = S_OK; DWORD dwAPI; LOG((TL_TRACE, "get_RedirectingIDAddressType - enter")); if ( TAPIIsBadWritePtr( plAddressType, sizeof (long) ) ) { LOG((TL_ERROR, "get_RedirectingIDAddressType - bad pointer")); return E_POINTER; } dwAPI = m_pAddress->GetAPIVersion(); Lock(); if (ISHOULDUSECALLPARAMS()) { LOG((TL_INFO, "get_RedirectingIDAddressType - invalid call state")); hr = TAPI_E_INVALCALLSTATE; } else { hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { if ( m_pCallInfo->dwRedirectingIDFlags & LINECALLPARTYID_ADDRESS ) { if ( TAPI_VERSION3_0 > dwAPI ) { *plAddressType = LINEADDRESSTYPE_PHONENUMBER; LOG((TL_INFO, "get_RedirectingIDAddressType - addresstype %lx", *plAddressType)); LOG((TL_TRACE, "get_RedirectingIDAddressType - exit")); } else { *plAddressType = m_pCallInfo->dwRedirectingIDAddressType; LOG((TL_INFO, "get_RedirectingIDAddressType - addresstype %lx", m_pCallInfo->dwRedirectingIDAddressType)); } hr = S_OK; } else { hr = E_FAIL; } } } Unlock(); LOG((TL_TRACE, "get_RedirectingIDAddressType - exit")); return hr; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_BearerMode // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_BearerMode(long * plBearerMode) { LOG((TL_TRACE, "get_BearerMode - enter")); if ( TAPIIsBadWritePtr( plBearerMode, sizeof(long) ) ) { LOG((TL_ERROR, "get_BearerMode - bad pointer")); return E_POINTER; } Lock(); HRESULT hr = S_OK; if ( ISHOULDUSECALLPARAMS() ) { *plBearerMode = m_pCallParams->dwBearerMode; } else { hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { *plBearerMode = m_pCallInfo->dwBearerMode; } else { LOG((TL_TRACE, "get_BearerMode - not available")); } } Unlock(); LOG((TL_TRACE, "get_BearerMode - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // put_BearerMode // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_BearerMode(long lBearerMode) { HRESULT hr = S_OK; HCALL hCall; long lMinRate = 0; long lMaxRate = 0; LOG((TL_TRACE, "put_BearerMode - enter")); Lock(); if ( ISHOULDUSECALLPARAMS() ) { // // type is checked in tapisrv // m_pCallParams->dwBearerMode = lBearerMode; Unlock(); } else // call in progress ( not idle) { hCall = m_t3Call.hCall; Unlock(); get_MinRate(&lMinRate); get_MaxRate(&lMaxRate); hr = LineSetCallParams(hCall, lBearerMode, lMinRate, lMaxRate, NULL ); if ( SUCCEEDED(hr) ) { hr = WaitForReply( hr ); if ( FAILED(hr) ) { LOG((TL_ERROR, "put_BearerMode - failed async")); } } else { LOG((TL_ERROR, "put_BearerMode - failed sync")); } } LOG((TL_TRACE, hr, "put_BearerMode - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_Origin // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_Origin(long * plOrigin ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_Origin - enter")); if (TAPIIsBadWritePtr(plOrigin, sizeof(long) ) ) { LOG((TL_ERROR, "get_Origin - bad pointer")); return E_POINTER; } Lock(); hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_Origin - RefreshCallInfo failed - %lx", hr)); } else { *plOrigin = m_pCallInfo->dwOrigin; } Unlock(); LOG((TL_TRACE, "get_Origin - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_Reason // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_Reason(long * plReason ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_Reason - enter")); if ( TAPIIsBadWritePtr( plReason , sizeof( plReason ) ) ) { LOG((TL_ERROR, "get_Reason - bad pointer")); return E_POINTER; } Lock(); hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { *plReason = m_pCallInfo->dwReason; } else { LOG((TL_ERROR, "get_Reason - linegetcallinfo failed - %lx", hr)); } LOG((TL_TRACE, "get_Reason - exit")); Unlock(); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_CallerIDName // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_CallerIDName(BSTR * ppCallerIDName ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_CallerIDName - enter")); // // validate pointer // if ( TAPIIsBadWritePtr( ppCallerIDName, sizeof(BSTR) ) ) { LOG((TL_ERROR, "get_CallerIDName - bad pointer")); return E_POINTER; } *ppCallerIDName = NULL; Lock(); hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_CallerIDName - could not get callinfo")); Unlock(); return hr; } // // if info is available // if ( m_pCallInfo->dwCallerIDFlags & LINECALLPARTYID_NAME ) { // // return it // *ppCallerIDName = BSTRFromUnalingedData( (((PBYTE)m_pCallInfo) + m_pCallInfo->dwCallerIDNameOffset), m_pCallInfo->dwCallerIDNameSize); if ( NULL == *ppCallerIDName ) { LOG((TL_ERROR, "get_CallerIDName - out of memory")); Unlock(); return E_OUTOFMEMORY; } } else { LOG((TL_INFO, "get_CallerIDName - no info avail")); Unlock(); return E_FAIL; } Unlock(); LOG((TL_TRACE, "get_CallerIDName - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_CallerIDNumber // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_CallerIDNumber(BSTR * ppCallerIDNumber ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_CallerIDNumber - enter")); // // validate pointer // if ( TAPIIsBadWritePtr( ppCallerIDNumber, sizeof(BSTR) ) ) { LOG((TL_ERROR, "get_CallerIDNumber - bad pointer")); return E_POINTER; } *ppCallerIDNumber = NULL; Lock(); hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_CallerIDNumber - could not get callinfo")); Unlock(); return hr; } // // if info is available // if ( m_pCallInfo->dwCallerIDFlags & LINECALLPARTYID_ADDRESS ) { // // return it // *ppCallerIDNumber = BSTRFromUnalingedData( (((PBYTE)m_pCallInfo) + m_pCallInfo->dwCallerIDOffset), m_pCallInfo->dwCallerIDSize); if ( NULL == *ppCallerIDNumber ) { LOG((TL_ERROR, "get_CallerIDNumber - out of memory")); Unlock(); return E_OUTOFMEMORY; } } else { LOG((TL_INFO, "get_CallerIDNumber - no info avail")); Unlock(); return E_FAIL; } Unlock(); LOG((TL_TRACE, "get_CallerIDNumber - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_CalledIDName // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_CalledIDName(BSTR * ppCalledIDName ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_CalledIDName - enter")); // // validate pointer // if ( TAPIIsBadWritePtr( ppCalledIDName, sizeof(BSTR) ) ) { LOG((TL_ERROR, "get_CalledIDName - bad pointer")); return E_POINTER; } *ppCalledIDName = NULL; Lock(); hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_CalledIDName - could not get callinfo")); Unlock(); return hr; } // // if info is available // if ( m_pCallInfo->dwCalledIDFlags & LINECALLPARTYID_NAME ) { // // return it // *ppCalledIDName = BSTRFromUnalingedData( (((PBYTE)m_pCallInfo) + m_pCallInfo->dwCalledIDNameOffset), m_pCallInfo->dwCalledIDNameSize ); if ( NULL == *ppCalledIDName ) { LOG((TL_ERROR, "get_CalledIDName - out of memory")); Unlock(); return E_OUTOFMEMORY; } } else { LOG((TL_INFO, "get_CalledIDName - no info avail")); Unlock(); return E_FAIL; } Unlock(); LOG((TL_TRACE, "get_CalledIDName - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_CalledIDNumber // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_CalledIDNumber(BSTR * ppCalledIDNumber ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_CalledIDNumber - enter")); // // validate pointer // if ( TAPIIsBadWritePtr( ppCalledIDNumber, sizeof(BSTR) ) ) { LOG((TL_ERROR, "get_CalledIDNumber - bad pointer")); return E_POINTER; } *ppCalledIDNumber = NULL; Lock(); hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_CalledIDNumber - could not get callinfo")); Unlock(); return hr; } // // if info is available // if ( m_pCallInfo->dwCalledIDFlags & LINECALLPARTYID_ADDRESS ) { // // return it // *ppCalledIDNumber = BSTRFromUnalingedData( (((PBYTE)m_pCallInfo) + m_pCallInfo->dwCalledIDOffset), m_pCallInfo->dwCalledIDSize); if ( NULL == *ppCalledIDNumber ) { LOG((TL_ERROR, "get_CalledIDNumber - out of memory")); Unlock(); return E_OUTOFMEMORY; } } else { LOG((TL_INFO, "get_CalledIDNumber - no info avail")); Unlock(); return E_FAIL; } Unlock(); LOG((TL_TRACE, "get_CalledIDNumber - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_ConnectedIDName // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_ConnectedIDName(BSTR * ppConnectedIDName ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_ConnectedIDName - enter")); // // validate pointer // if ( TAPIIsBadWritePtr( ppConnectedIDName, sizeof(BSTR) ) ) { LOG((TL_ERROR, "get_ConnectedIDName - bad pointer")); return E_POINTER; } *ppConnectedIDName = NULL; Lock(); hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_ConnectedIDName - could not get callinfo")); Unlock(); return hr; } // // if info is available // if ( m_pCallInfo->dwConnectedIDFlags & LINECALLPARTYID_NAME ) { // // return it // *ppConnectedIDName = BSTRFromUnalingedData( (((PBYTE)m_pCallInfo) + m_pCallInfo->dwConnectedIDNameOffset), m_pCallInfo->dwConnectedIDNameSize ); if ( NULL == *ppConnectedIDName ) { LOG((TL_ERROR, "get_ConnectedIDName - out of memory")); Unlock(); return E_OUTOFMEMORY; } } else { LOG((TL_INFO, "get_ConnectedIDName - no info avail")); Unlock(); return E_FAIL; } Unlock(); LOG((TL_TRACE, "get_ConnectedIDName - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_ConnectedIDNumber // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_ConnectedIDNumber(BSTR * ppConnectedIDNumber ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_ConnectedIDNumber - enter")); // // validate pointer // if ( TAPIIsBadWritePtr( ppConnectedIDNumber, sizeof(BSTR) ) ) { LOG((TL_ERROR, "get_ConnectedIDNumber - bad pointer")); return E_POINTER; } *ppConnectedIDNumber = NULL; Lock(); hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_ConnectedIDNumber - could not get callinfo")); Unlock(); return hr; } // // if info is available // if ( m_pCallInfo->dwConnectedIDFlags & LINECALLPARTYID_ADDRESS ) { // // return it // *ppConnectedIDNumber = BSTRFromUnalingedData( (((PBYTE)m_pCallInfo) + m_pCallInfo->dwConnectedIDOffset), m_pCallInfo->dwConnectedIDSize ); if ( NULL == *ppConnectedIDNumber ) { LOG((TL_ERROR, "get_ConnectedIDNumber - out of memory")); Unlock(); return E_OUTOFMEMORY; } } else { LOG((TL_INFO, "get_ConnectedIDNumber - no info avail")); Unlock(); return E_FAIL; } Unlock(); LOG((TL_TRACE, "get_ConnectedIDNumber - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_RedirectionIDName // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_RedirectionIDName(BSTR * ppRedirectionIDName ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_RedirectionIDName - enter")); // // validate pointer // if ( TAPIIsBadWritePtr( ppRedirectionIDName, sizeof(BSTR) ) ) { LOG((TL_ERROR, "get_RedirectionIDName - bad pointer")); return E_POINTER; } *ppRedirectionIDName = NULL; Lock(); hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_RedirectionIDName - could not get callinfo")); Unlock(); return hr; } // // if info is available // if ( m_pCallInfo->dwRedirectionIDFlags & LINECALLPARTYID_NAME ) { // // return it // *ppRedirectionIDName = BSTRFromUnalingedData( (((PBYTE)m_pCallInfo) + m_pCallInfo->dwRedirectionIDNameOffset), m_pCallInfo->dwRedirectionIDNameSize); if ( NULL == *ppRedirectionIDName ) { LOG((TL_ERROR, "get_RedirectionIDName - out of memory")); Unlock(); return E_OUTOFMEMORY; } } else { LOG((TL_INFO, "get_RedirectionIDName - no info avail")); Unlock(); return E_FAIL; } Unlock(); LOG((TL_TRACE, "get_RedirectionIDName - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_RedirectionIDNumber // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_RedirectionIDNumber(BSTR * ppRedirectionIDNumber ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_RedirectionIDNumber - enter")); // // validate pointer // if ( TAPIIsBadWritePtr( ppRedirectionIDNumber, sizeof(BSTR) ) ) { LOG((TL_ERROR, "get_RedirectionIDNumber - bad pointer")); return E_POINTER; } *ppRedirectionIDNumber = NULL; Lock(); hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_RedirectionIDNumber - could not get callinfo")); Unlock(); return hr; } // // if info is available // if ( m_pCallInfo->dwRedirectionIDFlags & LINECALLPARTYID_ADDRESS ) { // // return it // *ppRedirectionIDNumber = BSTRFromUnalingedData( (((PBYTE)m_pCallInfo) + m_pCallInfo->dwRedirectionIDOffset), m_pCallInfo->dwRedirectionIDSize); if ( NULL == *ppRedirectionIDNumber ) { LOG((TL_ERROR, "get_RedirectionIDNumber - out of memory")); Unlock(); return E_OUTOFMEMORY; } } else { LOG((TL_INFO, "get_RedirectionIDNumber - no info avail")); Unlock(); return E_FAIL; } Unlock(); LOG((TL_TRACE, "get_RedirectionIDNumber - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_RedirectingIDName // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_RedirectingIDName(BSTR * ppRedirectingIDName ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_RedirectingIDName - enter")); // // validate pointer // if ( TAPIIsBadWritePtr( ppRedirectingIDName, sizeof(BSTR) ) ) { LOG((TL_ERROR, "get_RedirectingIDName - bad pointer")); return E_POINTER; } *ppRedirectingIDName = NULL; Lock(); hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_RedirectingIDName - could not get callinfo")); Unlock(); return hr; } // // if info is available // if ( m_pCallInfo->dwRedirectingIDFlags & LINECALLPARTYID_NAME ) { // // return it // *ppRedirectingIDName = BSTRFromUnalingedData( (((PBYTE)m_pCallInfo) + m_pCallInfo->dwRedirectingIDNameOffset), m_pCallInfo->dwRedirectingIDNameSize); if ( NULL == *ppRedirectingIDName ) { LOG((TL_ERROR, "get_RedirectingIDName - out of memory")); Unlock(); return E_OUTOFMEMORY; } } else { LOG((TL_INFO, "get_RedirectingIDName - no info avail")); Unlock(); return E_FAIL; } Unlock(); LOG((TL_TRACE, "get_RedirectingIDName - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_RedirectingIDNumber // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_RedirectingIDNumber(BSTR * ppRedirectingIDNumber ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_RedirectingIDNumber - enter")); // // validate pointer // if ( TAPIIsBadWritePtr( ppRedirectingIDNumber, sizeof(BSTR) ) ) { LOG((TL_ERROR, "get_RedirectingIDNumber - bad pointer")); return E_POINTER; } *ppRedirectingIDNumber = NULL; Lock(); hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_RedirectingIDNumber - could not get callinfo")); Unlock(); return hr; } // // if info is available // if ( m_pCallInfo->dwRedirectingIDFlags & LINECALLPARTYID_ADDRESS ) { // // return it // *ppRedirectingIDNumber = BSTRFromUnalingedData( (((PBYTE)m_pCallInfo) + m_pCallInfo->dwRedirectingIDOffset), m_pCallInfo->dwRedirectingIDSize ); if ( NULL == *ppRedirectingIDNumber ) { LOG((TL_ERROR, "get_RedirectingIDNumber - out of memory")); Unlock(); return E_OUTOFMEMORY; } } else { LOG((TL_INFO, "get_RedirectingIDNumber - no info avail")); Unlock(); return E_FAIL; } Unlock(); LOG((TL_TRACE, "get_RedirectingIDNumber - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_CalledPartyFriendlyName // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_CalledPartyFriendlyName(BSTR * ppCalledPartyFriendlyName ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_CalledPartyFriendlyName - enter")); if ( TAPIIsBadWritePtr( ppCalledPartyFriendlyName, sizeof (BSTR) ) ) { LOG((TL_ERROR, "get_CalledPartyFriendlyName - badpointer")); return E_POINTER; } *ppCalledPartyFriendlyName = NULL; Lock(); if ( ISHOULDUSECALLPARAMS() ) { if ( 0 != m_pCallParams->dwCalledPartyOffset ) { *ppCalledPartyFriendlyName = BSTRFromUnalingedData( (((PBYTE)m_pCallParams) + m_pCallParams->dwCalledPartyOffset), m_pCallParams->dwCalledPartySize ); if ( NULL == *ppCalledPartyFriendlyName ) { Unlock(); LOG((TL_ERROR, "get_CalledPartyFriendlyName - out of memory 1")); return E_OUTOFMEMORY; } Unlock(); return S_OK; } else { LOG((TL_ERROR, "get_CalledPartyFriendlyName - not available")); Unlock(); return S_FALSE; } } hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_CalledPartyFriendlyName - can't get callinfo - %lx", hr)); Unlock(); return hr; } if ( ( 0 != m_pCallInfo->dwCalledPartyOffset ) && ( 0 != m_pCallInfo->dwCalledPartySize ) ) { // // allocated bstr from the data // *ppCalledPartyFriendlyName = BSTRFromUnalingedData( (((PBYTE)m_pCallInfo) + m_pCallInfo->dwCalledPartyOffset), m_pCallInfo->dwCalledPartySize); if ( NULL == *ppCalledPartyFriendlyName ) { LOG((TL_ERROR, "get_CalledPartyFriendlyName - out of memory")); Unlock(); return E_OUTOFMEMORY; } } else { LOG((TL_ERROR, "get_CalledPartyFriendlyName2 - not available")); Unlock(); return S_FALSE; } Unlock(); LOG((TL_TRACE, "get_CalledPartyFriendlyName - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_CalledPartyFriendlyName // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_CalledPartyFriendlyName( BSTR pCalledPartyFriendlyName ) { HRESULT hr; DWORD dw; if ( IsBadStringPtrW( pCalledPartyFriendlyName, -1 ) ) { LOG((TL_ERROR, "put_CalledPartyFriendlyName - bad pointer")); return E_POINTER; } dw = ( lstrlenW( pCalledPartyFriendlyName ) + 1 ) * sizeof (WCHAR) ; Lock(); if ( !ISHOULDUSECALLPARAMS() ) { LOG((TL_ERROR, "put_CalledPartyFriendlyName - can only be called before connect")); Unlock(); return TAPI_E_INVALCALLSTATE; } hr = ResizeCallParams( dw ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "put_CalledPartyFriendlyName - can't resize cp - %lx", hr)); Unlock(); return hr; } // // copy string (as bytes to avoid alignment faults under 64 bit) // CopyMemory( (BYTE*) m_pCallParams + m_dwCallParamsUsedSize, pCalledPartyFriendlyName, dw ); m_pCallParams->dwCalledPartySize = dw; m_pCallParams->dwCalledPartyOffset = m_dwCallParamsUsedSize; m_dwCallParamsUsedSize += dw; Unlock(); return S_OK; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_Comment // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_Comment( BSTR * ppComment ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_Comment - enter")); if ( TAPIIsBadWritePtr( ppComment, sizeof (BSTR) ) ) { LOG((TL_ERROR, "get_Comment - badpointer")); return E_POINTER; } *ppComment = NULL; Lock(); if ( ISHOULDUSECALLPARAMS() ) { if ( 0 != m_pCallParams->dwCommentOffset ) { *ppComment = BSTRFromUnalingedData( (((LPBYTE)m_pCallParams) + m_pCallParams->dwCommentOffset), m_pCallParams->dwCommentSize ); if ( NULL == *ppComment ) { Unlock(); LOG((TL_ERROR, "get_Comment - out of memory 1")); return E_OUTOFMEMORY; } Unlock(); return S_OK; } else { LOG((TL_ERROR, "get_Comment1 - not available")); Unlock(); return S_FALSE; } } hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_Comment - can't get callinfo - %lx", hr)); Unlock(); return hr; } if ( ( 0 != m_pCallInfo->dwCommentSize ) && ( 0 != m_pCallInfo->dwCommentOffset ) ) { *ppComment = BSTRFromUnalingedData( (((PBYTE)m_pCallInfo) + m_pCallInfo->dwCommentOffset), m_pCallInfo->dwCommentSize ); if ( NULL == *ppComment ) { LOG((TL_ERROR, "get_Comment - out of memory")); Unlock(); return E_OUTOFMEMORY; } } else { LOG((TL_ERROR, "get_Comment - not available")); Unlock(); return S_FALSE; } Unlock(); LOG((TL_TRACE, "get_Comment - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_Comment // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_Comment( BSTR pComment ) { HRESULT hr; DWORD dw; if ( IsBadStringPtrW( pComment, -1 ) ) { LOG((TL_ERROR, "put_Comment - bad pointer")); return E_POINTER; } dw = ( lstrlenW( pComment ) + 1 ) * sizeof (WCHAR) ; Lock(); if ( !ISHOULDUSECALLPARAMS() ) { LOG((TL_ERROR, "put_Comment - can only be called before connect")); Unlock(); return TAPI_E_INVALCALLSTATE; } hr = ResizeCallParams( dw ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "put_Comment - can't resize cp - %lx", hr)); Unlock(); return hr; } // // do a byte-wise copy to avoid alignment faults under 64 bit platform // CopyMemory( (BYTE*) m_pCallParams + m_dwCallParamsUsedSize, pComment, dw ); m_pCallParams->dwCommentSize = dw; m_pCallParams->dwCommentOffset = m_dwCallParamsUsedSize; m_dwCallParamsUsedSize += dw; Unlock(); return S_OK; } #ifndef NEWCALLINFO //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // GetUserUserInfoSize // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::GetUserUserInfoSize(long * plSize ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_UserUserInfoSize - enter")); if ( TAPIIsBadWritePtr( plSize, sizeof( long ) ) ) { LOG((TL_ERROR, "get_UserUserInfoSize - bad pointer")); return E_POINTER; } Lock(); if ( ISHOULDUSECALLPARAMS() ) { *plSize = m_pCallParams->dwUserUserInfoSize; Unlock(); return S_OK; } hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_UserUserInfoSize - can't get callinfo - %lx", hr)); Unlock(); return hr; } *plSize = m_pCallInfo->dwUserUserInfoSize; Unlock(); LOG((TL_TRACE, "get_UserUserInfoSize - exit")); return hr; } #endif #ifndef NEWCALLINFO //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // GetUserUserInfo // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::GetUserUserInfo( long lSize, BYTE * pBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetUserUserInfo - enter")); if (lSize == 0) { LOG((TL_ERROR, "GetUserUserInfo - lSize = 0")); return S_FALSE; } if (TAPIIsBadWritePtr( pBuffer, lSize ) ) { LOG((TL_ERROR, "GetUserUserInfo - bad pointer")); return E_POINTER; } Lock(); if ( ISHOULDUSECALLPARAMS() ) { if ( 0 == m_pCallParams->dwUserUserInfoSize ) { *pBuffer = NULL; } else { if ( lSize < m_pCallParams->dwUserUserInfoSize ) { LOG((TL_ERROR, "GetUserUserInfo - lSize not big enough")); Unlock(); return E_INVALIDARG; } CopyMemory( pBuffer, ((PBYTE)m_pCallParams) + m_pCallParams->dwUserUserInfoOffset, m_pCallParams->dwUserUserInfoSize ); } Unlock(); return hr; } hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "GetUserUserInfo - can't get callinfo - %lx", hr)); Unlock(); return hr; } if ( lSize < m_pCallInfo->dwUserUserInfoSize ) { Unlock(); LOG((TL_ERROR, "GetUserUserInfo - buffer not big enough")); return E_INVALIDARG; } CopyMemory( pBuffer, ( (PBYTE)m_pCallInfo ) + m_pCallInfo->dwUserUserInfoOffset, m_pCallInfo->dwUserUserInfoSize ); Unlock(); LOG((TL_TRACE, "GetUserUserInfo - exit")); return S_OK; } #endif //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // GetUserUserInfo // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT CCall::GetUserUserInfo( DWORD * pdwSize, BYTE ** ppBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetUserUserInfo - enter")); if (TAPIIsBadWritePtr(pdwSize, sizeof(DWORD))) { LOG((TL_ERROR, "GetUserUserInfo - bad size pointer")); return E_POINTER; } if (TAPIIsBadWritePtr(ppBuffer,sizeof(BYTE*) ) ) { LOG((TL_ERROR, "GetUserUserInfo - bad buffer pointer")); return E_POINTER; } *ppBuffer = NULL; *pdwSize = 0; Lock(); if ( ISHOULDUSECALLPARAMS() ) { if ( m_pCallParams->dwUserUserInfoSize != 0 ) { BYTE * pTemp; pTemp = (BYTE *)CoTaskMemAlloc( m_pCallParams->dwUserUserInfoSize ); if ( NULL == pTemp ) { LOG((TL_ERROR, "GetUserUserInfo - out of memory")); hr = E_OUTOFMEMORY; } else { CopyMemory( pTemp, ((PBYTE)m_pCallParams) + m_pCallParams->dwUserUserInfoOffset, m_pCallParams->dwUserUserInfoSize ); *ppBuffer = pTemp; *pdwSize = m_pCallParams->dwUserUserInfoSize; } } Unlock(); return S_OK; } hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "GetUserUserInfo - can't get callinfo - %lx", hr)); Unlock(); return hr; } hr = S_OK; if ( m_pCallInfo->dwUserUserInfoSize != 0 ) { BYTE * pTemp; pTemp = (BYTE *)CoTaskMemAlloc( m_pCallInfo->dwUserUserInfoSize ); if ( NULL == pTemp ) { LOG((TL_ERROR, "GetUserUserInfo - out of memory")); hr = E_OUTOFMEMORY; } else { CopyMemory( pTemp, ( (PBYTE)m_pCallInfo ) + m_pCallInfo->dwUserUserInfoOffset, m_pCallInfo->dwUserUserInfoSize ); *ppBuffer = pTemp; *pdwSize = m_pCallInfo->dwUserUserInfoSize; } } Unlock(); LOG((TL_TRACE, "GetUserUserInfo - exit")); return hr; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // SetUserUserInfo // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::SetUserUserInfo( long lSize, BYTE * pBuffer ) { HRESULT hr; HCALL hCall; CALL_STATE cs; LOG((TL_TRACE, "SetUserUserInfo - enter")); Lock(); cs = m_CallState; hCall = m_t3Call.hCall; if ( CS_IDLE != cs ) { Unlock(); hr = SendUserUserInfo( hCall, lSize, pBuffer ); } else { hr = SaveUserUserInfo( lSize, pBuffer ); Unlock(); } LOG((TL_TRACE, "SetUserUserInfo - exit - return %lx", hr)); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_UserUserInfo // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_UserUserInfo( VARIANT UUI ) { HRESULT hr; DWORD dwSize; PBYTE pBuffer; LOG((TL_TRACE, "put_UserUserInfo - enter")); hr = MakeBufferFromVariant( UUI, &dwSize, &pBuffer ); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "put_UUI - MakeBuffer failed - %lx", hr)); return hr; } hr = SetUserUserInfo( dwSize, pBuffer ); ClientFree( pBuffer ); LOG((TL_TRACE, "put_UserUserInfo - exit - return %lx", hr)); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_UserUserInfo // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT CCall::get_UserUserInfo( VARIANT * pUUI ) { HRESULT hr; DWORD dw = 0; BYTE * pBuffer = NULL; LOG((TL_TRACE, "get_UserUserInfo - enter")); if ( TAPIIsBadWritePtr( pUUI, sizeof( VARIANT ) ) ) { LOG((TL_ERROR, "get_UserUserInfo - bad pointer")); return E_POINTER; } pUUI->vt = VT_EMPTY; hr = GetUserUserInfo( &dw, &pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_UUI - GetUUI failed %lx", hr)); ClientFree( pBuffer ); return hr; } hr = FillVariantFromBuffer( dw, pBuffer, pUUI ); if ( 0 != dw ) { CoTaskMemFree( pBuffer ); } LOG((TL_TRACE, "get_UserUserInfo - exit - return %lx", hr)); return hr; } #else //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_UserUserInfo // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= STDMETHODIMP CCall::get_UserUserInfo( VARIANT * pUUI ) { HRESULT hr; DWORD dw; BYTE * pBuffer; LOG((TL_TRACE, "get_UserUserInfo - enter")); if ( TAPIIsBadWritePtr( pUUI, sizeof( VARIANT ) ) ) { LOG((TL_ERROR, "get_UserUserInfo - bad pointer")); return E_POINTER; } pUUI->vt = VT_EMPTY; hr = GetUserUserInfoSize( (long *)&dw ); if ( !SUCCEEDED(hr) ) { LOG((TL_TRACE, "get_UserUserInfo - GetUUISize failed %lx", hr)); return hr; } if ( 0 != dw ) { pBuffer = (PBYTE)ClientAlloc( dw ); if ( NULL == pBuffer ) { LOG((TL_ERROR, "get_useruserinfo - alloc failed")); return E_OUTOFMEMORY; } hr = GetUserUserInfo( dw, pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_UUI - GetUUI failed %lx", hr)); ClientFree( pBuffer ); return hr; } } hr = FillVariantFromBuffer( dw, pBuffer, pUUI ); if ( 0 != dw ) { ClientFree( pBuffer ); } LOG((TL_TRACE, "get_UserUserInfo - exit - return %lx", hr)); return hr; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // ReleaseUserUserInfo // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= STDMETHODIMP CCall::ReleaseUserUserInfo() { HRESULT hr; HCALL hCall; LOG((TL_TRACE, "ReleaseUserUserInfo - enter")); Lock(); hCall = m_t3Call.hCall; Unlock(); hr = LineReleaseUserUserInfo( hCall ); if (((LONG)hr) < 0) { LOG((TL_ERROR, "LineReleaseUserUserInfo failed - %lx", hr)); return hr; } hr = WaitForReply( hr ); LOG((TL_TRACE, "ReleaseUserUserInfo - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_AppSpecific // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_AppSpecific(long * plAppSpecific ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_AppSpecific - enter")); if ( TAPIIsBadWritePtr( plAppSpecific, sizeof( long ) ) ) { LOG((TL_ERROR, "get_AppSpecific - bad pointer")); return E_POINTER; } Lock(); hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { Unlock(); LOG((TL_ERROR, "get_AppSpecific - can't get callinf - %lx", hr)); return hr; } *plAppSpecific = m_pCallInfo->dwAppSpecific; Unlock(); LOG((TL_TRACE, "get_AppSpecific - exit")); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_AppSpecific // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_AppSpecific( long lAppSpecific ) { HRESULT hr = S_OK; HCALL hCall; LOG((TL_TRACE, "put_AppSpecific - enter")); Lock(); // // this can only be done if we own the call. // if (CP_OWNER != m_CallPrivilege) { Unlock(); LOG((TL_ERROR, "put_AppSpecific - not call's owner. returning TAPI_E_NOTOWNER")); return TAPI_E_NOTOWNER; } hCall = m_t3Call.hCall; Unlock(); // // we also need to have a call handle before we can linesetappspecific // if ( hCall != NULL ) { hr = LineSetAppSpecific( hCall, lAppSpecific ); } else { LOG((TL_ERROR, "put_AppSpecific - Can't set app specific until call is made")); hr = TAPI_E_INVALCALLSTATE; } LOG((TL_TRACE, "put_AppSpecific - exit. hr = %lx", hr)); return hr; } #ifdef NEWCALLINFO //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // GetDevSpecificBuffer // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT CCall::GetDevSpecificBuffer( DWORD * pdwSize, BYTE ** ppDevSpecificBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetDevSpecificBuffer - enter")); if (TAPIIsBadWritePtr( pdwSize, sizeof(DWORD) ) ) { LOG((TL_ERROR, "GetDevSpecificBuffer - bad dword pointer")); return E_POINTER; } if ( TAPIIsBadWritePtr ( ppDevSpecificBuffer, sizeof(BYTE*) ) ) { LOG((TL_ERROR, "GetDevSpecificBuffer - bad pointer")); return E_POINTER; } *pdwSize = 0; *ppDevSpecificBuffer = NULL; Lock(); if ( ISHOULDUSECALLPARAMS() ) { if ( 0 != m_pCallParams->dwDevSpecificSize ) { BYTE * pTemp; pTemp = (BYTE *)CoTaskMemAlloc( m_pCallParams->dwDevSpecificSize ); if ( NULL == pTemp ) { LOG((TL_ERROR, "GetDevSpecificBuffer - out of memory")); hr = E_OUTOFMEMORY; } else { CopyMemory( pTemp, ((PBYTE)m_pCallParams) + m_pCallParams->dwDevSpecificOffset, m_pCallParams->dwDevSpecificSize ); *ppDevSpecificBuffer = pTemp; *pdwSize = m_pCallParams->dwDevSpecificSize; } } Unlock(); return hr; } hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "GetDevSpecificBuffer - can't get callinf - %lx", hr)); Unlock(); return hr; } hr = S_OK; if ( 0 != m_pCallInfo->dwDevSpecificSize ) { BYTE * pTemp; pTemp = (BYTE *)CoTaskMemAlloc( m_pCallInfo->dwDevSpecificSize ); if ( NULL == pTemp ) { LOG((TL_ERROR, "GetDevSpecificBuffer - out of memory")); hr = E_OUTOFMEMORY; } else { CopyMemory( pTemp, ( (PBYTE) m_pCallInfo ) + m_pCallInfo->dwDevSpecificOffset, m_pCallInfo->dwDevSpecificSize ); *ppDevSpecificBuffer = pTemp; *pdwSize = m_pCallInfo->dwDevSpecificSize; } } Unlock(); LOG((TL_TRACE, "get_DevSpecificBuffer - exit")); return hr; } #endif #ifndef NEWCALLINFO //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // GetDevSpecificBuffer // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::GetDevSpecificBuffer( long lSize, BYTE * pDevSpecificBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetDevSpecificBuffer - enter")); if (lSize == 0) { LOG((TL_ERROR, "GetDevSpecificBuffer - lSize = 0")); return S_FALSE; } if ( TAPIIsBadWritePtr ( pDevSpecificBuffer, lSize ) ) { LOG((TL_ERROR, "GetDevSpecificBuffer - bad pointer")); return E_POINTER; } Lock(); if ( ISHOULDUSECALLPARAMS() ) { if ( 0 != m_pCallParams->dwDevSpecificSize ) { if ( lSize < m_pCallParams->dwDevSpecificSize ) { LOG((TL_ERROR, "GetDevSpecificBuffer - too small")); hr = E_INVALIDARG; } else { CopyMemory( pDevSpecificBuffer, ((PBYTE)m_pCallParams) + m_pCallParams->dwDevSpecificOffset, m_pCallParams->dwDevSpecificSize ); } } else { *pDevSpecificBuffer = 0; } Unlock(); return hr; } hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "GetDevSpecificBuffer - can't get callinf - %lx", hr)); Unlock(); return hr; } if ( m_pCallInfo->dwDevSpecificSize > lSize ) { LOG((TL_ERROR, "get_DevSpecificBuffer - size not big enough ")); Unlock(); return E_INVALIDARG; } CopyMemory( pDevSpecificBuffer, ( (PBYTE) m_pCallInfo ) + m_pCallInfo->dwDevSpecificOffset, m_pCallInfo->dwDevSpecificSize ); Unlock(); LOG((TL_TRACE, "get_DevSpecificBuffer - exit")); return S_OK; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // SetDevSpecificBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::SetDevSpecificBuffer( long lSize, BYTE * pBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "SetDevSpecificBuffer - enter")); if (IsBadReadPtr( pBuffer, lSize) ) { LOG((TL_ERROR, "SetDevSpecificBuffer - bad pointer")); return E_POINTER; } Lock(); if ( !ISHOULDUSECALLPARAMS() ) { LOG((TL_ERROR, "SetDevSpecificBuffer - only when call is idle")); Unlock(); return TAPI_E_INVALCALLSTATE; } hr = ResizeCallParams( lSize ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "SetDevSpecificBuffer - can't resize callparams - %lx", hr)); Unlock(); return hr; } CopyMemory( ((LPBYTE)m_pCallParams) + m_dwCallParamsUsedSize, pBuffer, lSize ); m_pCallParams->dwDevSpecificOffset = m_dwCallParamsUsedSize; m_pCallParams->dwDevSpecificSize = lSize; m_dwCallParamsUsedSize += lSize; Unlock(); LOG((TL_TRACE, "SetDevSpecificBuffer - exit")); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_DevSpecificBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT CCall::get_DevSpecificBuffer( VARIANT * pBuffer ) { HRESULT hr = S_OK; BYTE * p; DWORD dwSize = 0; LOG((TL_TRACE, "get_DevSpecificBuffer - enter")); if ( TAPIIsBadWritePtr( pBuffer, sizeof( VARIANT ) ) ) { LOG((TL_ERROR, "get_DevSpecificBuffer - bad pointer")); return E_POINTER; } pBuffer->vt = VT_EMPTY; hr = GetDevSpecificBuffer( &dwSize, &p ); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_DevSpecificBuffer - GetDevSpecificBuffer failed - %lx", hr)); return hr; } hr = FillVariantFromBuffer( dwSize, p, pBuffer ); if ( 0 != dwSize ) { CoTaskMemFree( p ); } if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_DevSpecificBuffer - fillvariant failed -%lx", hr)); return hr; } LOG((TL_TRACE, "get_DevSpecificBuffer - exit")); return S_OK; } #else //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_DevSpecificBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= STDMETHODIMP CCall::get_DevSpecificBuffer( VARIANT * pBuffer ) { HRESULT hr = S_OK; BYTE * p; DWORD dwSize; LOG((TL_TRACE, "get_DevSpecificBuffer - enter")); if ( TAPIIsBadWritePtr( pBuffer, sizeof( VARIANT ) ) ) { LOG((TL_ERROR, "get_DevSpecificBuffer - bad pointer")); return E_POINTER; } pBuffer->vt = VT_EMPTY; hr = GetDevSpecificBufferSize( (long*)&dwSize ); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_DevSpecificBuffer - getsize failed")); return hr; } if ( 0 != dwSize ) { p = (PBYTE) ClientAlloc( dwSize ); if ( NULL == p ) { LOG((TL_ERROR, "get_DevSpecificBuffer - alloc failed")); return E_OUTOFMEMORY; } hr = GetDevSpecificBuffer( dwSize, p ); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_DevSpecificBuffer - GetDevSpecificBuffer failed - %lx", hr)); ClientFree( p ); return hr; } } hr = FillVariantFromBuffer( dwSize, p, pBuffer ); if ( 0 != dwSize ) { ClientFree( p ); } if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_DevSpecificBuffer - fillvariant failed -%lx", hr)); return hr; } LOG((TL_TRACE, "get_DevSpecificBuffer - exit")); return S_OK; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_DevSpecificBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_DevSpecificBuffer( VARIANT Buffer ) { HRESULT hr = S_OK; DWORD dwSize; BYTE * pBuffer; LOG((TL_TRACE, "put_DevSpecificBuffer - enter")); hr = MakeBufferFromVariant( Buffer, &dwSize, &pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "put_DevSpecificBuffer - can't make buffer - %lx", hr)); return hr; } hr = SetDevSpecificBuffer( dwSize, pBuffer ); ClientFree( pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "put_DevSpecificBuffer - Set failed - %lx", hr)); return hr; } LOG((TL_TRACE, "put_DevSpecificBuffer - exit")); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // SetCallParamsFlags // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::SetCallParamsFlags( long lFlags ) { HRESULT hr = S_OK; LOG((TL_TRACE, "SetCallParamsFlags - enter")); Lock(); if (ISHOULDUSECALLPARAMS()) { // // validation in tapisrv // m_pCallParams->dwCallParamFlags = lFlags; } else { LOG((TL_ERROR, "Can't set callparams flags")); hr = TAPI_E_INVALCALLSTATE; } LOG((TL_TRACE, "SetCallParamsFlags - exit")); Unlock(); return hr; } #ifdef NEWCALLINFO //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // GetCallParamsFlags // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::GetCallParamsFlags( long * plFlags ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetCallParamsFlags - enter")); if ( TAPIIsBadWritePtr( plFlags, sizeof (long) ) ) { LOG((TL_ERROR, "GetCallParamsFlags - bad pointer")); return E_POINTER; } Lock(); if (ISHOULDUSECALLPARAMS()) { *plFlags = m_pCallParams->dwCallParamFlags; } else { hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "GetCallParamsFlags - can't get callinfo - %lx", hr)); Unlock(); return hr; } *plFlags = m_pCallInfo->dwCallParamFlags; } LOG((TL_TRACE, "GetCallParamsFlags - exit")); Unlock(); return hr; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_DisplayableAddress // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_DisplayableAddress( BSTR pDisplayableAddress ) { HRESULT hr = S_OK; DWORD dwSize; LOG((TL_TRACE, "put_DisplayableAddress - enter")); if (IsBadStringPtrW( pDisplayableAddress, -1 )) { LOG((TL_ERROR, "put_DisplayableAddress - invalid pointer")); return E_POINTER; } Lock(); if (!ISHOULDUSECALLPARAMS()) { LOG((TL_ERROR, "Displayable address can only be set before call is made")); Unlock(); return TAPI_E_INVALCALLSTATE; } dwSize = (lstrlenW( pDisplayableAddress ) + 1) * sizeof(WCHAR); hr = ResizeCallParams( dwSize ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "put_DisplayableAddress - resize failed - %lx", hr)); Unlock(); return hr; } // // do a byte-wise memory copy (byte-wise to avoid alignment faults under 64 // bit) // CopyMemory( (BYTE*) m_pCallParams + m_dwCallParamsUsedSize, pDisplayableAddress, dwSize ); m_pCallParams->dwDisplayableAddressSize = dwSize; m_pCallParams->dwDisplayableAddressOffset = m_dwCallParamsUsedSize; m_dwCallParamsUsedSize += dwSize; Unlock(); LOG((TL_TRACE, "put_DisplayableAddress - exit")); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_DisplayableAddress // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_DisplayableAddress( BSTR * ppDisplayableAddress ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_DisplayableAddress - enter")); if ( TAPIIsBadWritePtr( ppDisplayableAddress, sizeof (BSTR) ) ) { LOG((TL_ERROR, "get_DisplayableAddress - badpointer")); return E_POINTER; } *ppDisplayableAddress = NULL; Lock(); if ( ISHOULDUSECALLPARAMS() ) { if ( 0 != m_pCallParams->dwDisplayableAddressOffset ) { *ppDisplayableAddress = BSTRFromUnalingedData( (((LPBYTE)m_pCallParams) + m_pCallParams->dwDisplayableAddressOffset), m_pCallParams->dwDisplayableAddressSize ); if ( NULL == *ppDisplayableAddress ) { LOG((TL_ERROR, "get_DisplayableAddress - out of memory 1")); hr = E_OUTOFMEMORY; } hr = S_OK; } else { *ppDisplayableAddress = NULL; hr = S_FALSE; } Unlock(); return S_OK; } hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_DisplayableAddress - can't get callinfo - %lx", hr)); Unlock(); return hr; } if ( ( 0 != m_pCallInfo->dwDisplayableAddressSize ) && ( 0 != m_pCallInfo->dwDisplayableAddressOffset ) ) { *ppDisplayableAddress = BSTRFromUnalingedData( (((PBYTE)m_pCallInfo) + m_pCallInfo->dwDisplayableAddressOffset), m_pCallInfo->dwDisplayableAddressSize ); if ( NULL == *ppDisplayableAddress ) { LOG((TL_ERROR, "get_DisplayableAddress - out of memory")); Unlock(); return E_OUTOFMEMORY; } } else { LOG((TL_ERROR, "get_DisplayableAddress - not available")); Unlock(); return S_FALSE; } Unlock(); LOG((TL_TRACE, "get_DisplayableAddress - exit")); return hr; } #ifdef NEWCALLINFO //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // GetCallDataBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::GetCallDataBuffer( DWORD * pdwSize, BYTE ** ppBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetCallDataBuffer - enter")); if (TAPIIsBadWritePtr(pdwSize, sizeof(DWORD))) { LOG((TL_ERROR, "GetCallDataBuffer - bad size pointer")); return E_POINTER; } if (TAPIIsBadWritePtr(ppBuffer,sizeof(BYTE*) ) ) { LOG((TL_ERROR, "GetCallDataBuffer - bad buffer pointer")); return E_POINTER; } *ppBuffer = NULL; *pdwSize = 0; Lock(); DWORD dwVersionNumber = m_pAddress->GetAPIVersion(); if ( dwVersionNumber < TAPI_VERSION2_0 ) { LOG((TL_ERROR, "GetCallDataBuffer - version # [0x%lx] less than TAPI_VERSION2_0", dwVersionNumber)); Unlock(); return TAPI_E_NOTSUPPORTED; } if ( ISHOULDUSECALLPARAMS() ) { if ( m_pCallParams->dwCallDataSize != 0 ) { BYTE * pTemp; pTemp = (BYTE *)CoTaskMemAlloc( m_pCallParams->dwCallDataSize ); if ( NULL == pTemp ) { LOG((TL_ERROR, "GetCallDataBuffer - out of memory")); hr = E_OUTOFMEMORY; } else { CopyMemory( pTemp, ((PBYTE)m_pCallParams) + m_pCallParams->dwCallDataOffset, m_pCallParams->dwCallDataSize ); *ppBuffer = pTemp; *pdwSize = m_pCallParams->dwCallDataSize; } } Unlock(); return hr; } hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "GetCallDataBuffer - can't get callinfo - %lx", hr)); Unlock(); return hr; } hr = S_OK; if ( m_pCallInfo->dwCallDataSize != 0 ) { BYTE * pTemp; pTemp = (BYTE *)CoTaskMemAlloc( m_pCallInfo->dwCallDataSize ); if ( NULL == pTemp ) { LOG((TL_ERROR, "GetCallDataBuffer - out of memory")); hr = E_OUTOFMEMORY; } else { CopyMemory( pTemp, ( (PBYTE)m_pCallInfo ) + m_pCallInfo->dwCallDataOffset, m_pCallInfo->dwCallDataSize ); *ppBuffer = pTemp; *pdwSize = m_pCallInfo->dwCallDataSize; } } Unlock(); LOG((TL_TRACE, "GetCallDataBuffer - exit")); return hr; } #endif #ifndef NEWCALLINFO //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // GetCallDataBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= STDMETHODIMP CCall::GetCallDataBuffer( long lSize, BYTE * pBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetCallDataBuffer - enter")); if (lSize == 0) { LOG((TL_ERROR, "GetCallDataBuffer - lSize = 0")); return S_FALSE; } if ( TAPIIsBadWritePtr ( pBuffer, lSize ) ) { LOG((TL_ERROR, "GetCallDataBuffer - bad pointer")); return E_POINTER; } Lock(); if ( m_pAddress->GetAPIVersion() < TAPI_VERSION2_0 ) { Unlock(); return TAPI_E_NOTSUPPORTED; } if ( ISHOULDUSECALLPARAMS() ) { if ( 0 != m_pCallParams->dwCallDataSize ) { if ( lSize < m_pCallParams->dwCallDataSize ) { LOG((TL_ERROR, "GetCallDataBuffer - too small")); hr = E_INVALIDARG; } else { CopyMemory( pBuffer, ((PBYTE)m_pCallParams) + m_pCallParams->dwCallDataOffset, m_pCallParams->dwCallDataSize ); } } else { *pBuffer = 0; } Unlock(); return hr; } hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "GetCallDataBuffer - can't get callinf - %lx", hr)); Unlock(); return hr; } if ( m_pCallInfo->dwCallDataSize > lSize ) { LOG((TL_ERROR, "GetCallDataBuffer - size not big enough ")); Unlock(); return E_INVALIDARG; } CopyMemory( pBuffer, ( (PBYTE) m_pCallInfo ) + m_pCallInfo->dwCallDataOffset, m_pCallInfo->dwCallDataSize ); Unlock(); LOG((TL_TRACE, "GetCallDataBuffer - exit")); return S_OK; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // SetCallDataBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::SetCallDataBuffer( long lSize, BYTE * pBuffer ) { HRESULT hr = S_OK; HCALL hCall; LOG((TL_TRACE, "SetCallDataBuffer - enter")); if (IsBadReadPtr( pBuffer, lSize) ) { LOG((TL_ERROR, "SetCallDataBuffer - bad pointer")); return E_POINTER; } Lock(); if ( m_pAddress->GetAPIVersion() < TAPI_VERSION2_0 ) { Unlock(); LOG((TL_ERROR, "SetCallDataBuffer - unsupported api version")); return TAPI_E_NOTSUPPORTED; } if ( !ISHOULDUSECALLPARAMS() ) // call in progess (not idle) { hCall = m_t3Call.hCall; Unlock(); hr = LineSetCallData(hCall, pBuffer, lSize ); if ( SUCCEEDED(hr) ) { hr = WaitForReply( hr ); if ( FAILED(hr) ) { LOG((TL_ERROR, "SetCallDataBuffer - failed async")); } } else { LOG((TL_ERROR, "SetCallDataBuffer - failed sync")); } LOG((TL_TRACE, "SetCallDataBuffer - exit")); return hr; } hr = ResizeCallParams( lSize ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "SetCallDataBuffer - can't resize callparams - %lx", hr)); Unlock(); return hr; } CopyMemory( ((LPBYTE)m_pCallParams) + m_dwCallParamsUsedSize, pBuffer, lSize ); m_pCallParams->dwCallDataOffset = m_dwCallParamsUsedSize; m_pCallParams->dwCallDataSize = lSize; m_dwCallParamsUsedSize += lSize; Unlock(); LOG((TL_TRACE, "SetCallDataBuffer - exit")); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_CallDataBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT CCall::get_CallDataBuffer( VARIANT * pBuffer ) { HRESULT hr = S_OK; BYTE * p; DWORD dwSize = 0; LOG((TL_TRACE, "get_CallDataBuffer - enter")); if ( TAPIIsBadWritePtr( pBuffer, sizeof( VARIANT ) ) ) { LOG((TL_ERROR, "get_CallDataBuffer - bad pointer")); return E_POINTER; } pBuffer->vt = VT_EMPTY; hr = GetCallDataBuffer( &dwSize, &p ); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_CallDataBuffer - failed - %lx", hr)); return hr; } hr = FillVariantFromBuffer( dwSize, p, pBuffer ); if ( 0 != dwSize ) { CoTaskMemFree( p ); } if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_CallDataBuffer - fillvariant failed -%lx", hr)); return hr; } LOG((TL_TRACE, "get_CallDataBuffer - exit")); return S_OK; } #else //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_CallDataBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= STDMETHODIMP CCall::get_CallDataBuffer( VARIANT * pBuffer ) { HRESULT hr = S_OK; BYTE * p; DWORD dwSize; LOG((TL_TRACE, "get_CallDataBuffer - enter")); if ( TAPIIsBadWritePtr( pBuffer, sizeof( VARIANT ) ) ) { LOG((TL_ERROR, "get_CallDataBuffer - bad pointer")); return E_POINTER; } pBuffer->vt = VT_EMPTY; hr = GetCallDataBufferSize( (long*)&dwSize ); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_CallDataBuffer - getsize failed")); return hr; } if ( 0 != dwSize ) { p = (PBYTE) ClientAlloc( dwSize ); if ( NULL == p ) { LOG((TL_ERROR, "get_CallDataBuffer - alloc failed")); return E_OUTOFMEMORY; } hr = GetCallDataBuffer( dwSize, p ); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_CallDataBuffer - failed - %lx", hr)); ClientFree( p ); return hr; } } hr = FillVariantFromBuffer( dwSize, p, pBuffer ); if ( 0 != dwSize ) { ClientFree( p ); } if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_CallDataBuffer - fillvariant failed -%lx", hr)); return hr; } LOG((TL_TRACE, "get_CallDataBuffer - exit")); return S_OK; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_CallDataBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_CallDataBuffer( VARIANT Buffer ) { HRESULT hr = S_OK; DWORD dwSize; BYTE * pBuffer; LOG((TL_TRACE, "put_CallDataBuffer - enter")); hr = MakeBufferFromVariant( Buffer, &dwSize, &pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "put_CallDataBuffer - can't make buffer - %lx", hr)); return hr; } hr = SetCallDataBuffer( dwSize, pBuffer ); ClientFree( pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "put_CallDataBuffer - Set failed - %lx", hr)); return hr; } LOG((TL_TRACE, "put_CallDataBuffer - exit")); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_CallingPartyID // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_CallingPartyID( BSTR * ppCallingPartyID ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_CallingPartyID - enter")); if ( TAPIIsBadWritePtr( ppCallingPartyID, sizeof (BSTR) ) ) { LOG((TL_ERROR, "get_CallingPartyID - badpointer")); return E_POINTER; } *ppCallingPartyID = NULL; Lock(); if ( !ISHOULDUSECALLPARAMS() ) { LOG((TL_ERROR, "get_CallingPartyID - call must be idle")); Unlock(); return TAPI_E_INVALCALLSTATE; } if ( ( m_pAddress->GetAPIVersion() >= TAPI_VERSION2_0 ) && ( 0 != m_pCallParams->dwCallingPartyIDOffset ) ) { *ppCallingPartyID = BSTRFromUnalingedData( (((LPBYTE)m_pCallParams) + m_pCallParams->dwCallingPartyIDOffset), m_pCallParams->dwCallingPartyIDSize ); if ( NULL == *ppCallingPartyID ) { LOG((TL_ERROR, "get_CallingPartyID - out of memory 1")); hr = E_OUTOFMEMORY; } else { hr = S_OK; } } else { *ppCallingPartyID = NULL; hr = S_OK; } Unlock(); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_CallingPartyID // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_CallingPartyID( BSTR pCallingPartyID ) { HRESULT hr = S_OK; DWORD dwSize; LOG((TL_TRACE, "put_CallingPartyID - enter")); if (IsBadStringPtrW( pCallingPartyID, -1 )) { LOG((TL_ERROR, "put_CallingPartyID - invalid pointer")); return E_POINTER; } Lock(); if ( m_pAddress->GetAPIVersion() < TAPI_VERSION2_0 ) { Unlock(); return TAPI_E_NOTSUPPORTED; } if (!ISHOULDUSECALLPARAMS()) { LOG((TL_ERROR, "callingpartyid can only be set before call is made")); Unlock(); return TAPI_E_INVALCALLSTATE; } dwSize = (lstrlenW( pCallingPartyID ) + 1) * sizeof(WCHAR); hr = ResizeCallParams( dwSize ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "put_CallingPartyID - resize failed - %lx", hr)); Unlock(); return hr; } // // do a byte-wise memory copy (byte-wise to avoid alignment faults under 64 // bit) // CopyMemory( (BYTE*) m_pCallParams + m_dwCallParamsUsedSize, pCallingPartyID, dwSize); m_pCallParams->dwCallingPartyIDSize = dwSize; m_pCallParams->dwCallingPartyIDOffset = m_dwCallParamsUsedSize; m_dwCallParamsUsedSize += dwSize; Unlock(); LOG((TL_TRACE, "put_CallingPartyID - exit")); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_CallTreatment // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_CallTreatment( long * plTreatment ) { HRESULT hr; if ( TAPIIsBadWritePtr( plTreatment, sizeof(long) ) ) { LOG((TL_ERROR, "get_CallTreatement - invalid pointer")); return E_POINTER; } Lock(); if ( m_pAddress->GetAPIVersion() < TAPI_VERSION2_0 ) { Unlock(); return TAPI_E_NOTSUPPORTED; } if ( CS_IDLE == m_CallState ) { LOG((TL_ERROR, "get_CallTreatment - must be on call")); Unlock(); return TAPI_E_INVALCALLSTATE; } hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_CallTreatment - can't get callinfo - %lx", hr)); Unlock(); return hr; } *plTreatment = m_pCallInfo->dwCallTreatment; Unlock(); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_CallTreatment // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_CallTreatment( long lTreatment ) { HRESULT hr = S_OK; HCALL hCall; LOG((TL_TRACE, "put_CallTreatment - enter")); Lock(); if ( CS_IDLE == m_CallState ) { LOG((TL_ERROR, "put_CallTreatment - must make call first")); Unlock(); return TAPI_E_INVALCALLSTATE; } hCall = m_t3Call.hCall; Unlock(); hr = LineSetCallTreatment( hCall, lTreatment ); if (((LONG)hr) < 0) { LOG((TL_ERROR, "put_CallTreatment failed - %lx", hr)); return hr; } hr = WaitForReply( hr ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "put_CallTreatment - failed - %lx", hr)); } LOG((TL_TRACE, "put_CallTreatment - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_MinRate // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_MinRate(long lMinRate) { HRESULT hr; LOG((TL_TRACE, "put_MinRate - enter")); if (!(ISHOULDUSECALLPARAMS())) { LOG((TL_ERROR, "put_MinRate - invalid call state")); return TAPI_E_INVALCALLSTATE; } m_pCallParams->dwMinRate = lMinRate; m_dwMinRate = lMinRate; LOG((TL_TRACE, "put_MinRate - exit")); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_MinRate // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_MinRate(long * plMinRate) { HRESULT hr; LOG((TL_TRACE, "get_MinRate - enter")); if (TAPIIsBadWritePtr( plMinRate, sizeof( long ) ) ) { LOG((TL_ERROR, "get_MinRate - bad pointer")); return E_POINTER; } *plMinRate = m_dwMinRate; LOG((TL_TRACE, "get_MinRate - exit")); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_MaxRate // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_MaxRate(long lMaxRate) { HRESULT hr; LOG((TL_TRACE, "put_MaxRate - enter")); if (!(ISHOULDUSECALLPARAMS())) { LOG((TL_ERROR, "put_MaxRate - invalid call state")); return TAPI_E_INVALCALLSTATE; } m_pCallParams->dwMaxRate = lMaxRate; m_dwMaxRate = lMaxRate; LOG((TL_TRACE, "put_MaxRate - exit")); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_MaxRate // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_MaxRate(long * plMaxRate) { HRESULT hr; if (TAPIIsBadWritePtr( plMaxRate, sizeof(long) ) ) { LOG((TL_ERROR, "get_MaxRate - bad pointer")); return E_POINTER; } LOG((TL_TRACE, "get_MaxRate - enter")); *plMaxRate = m_dwMaxRate; LOG((TL_TRACE, "get_MaxRate - exit")); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_CountryCode // // simply save country code to be used if necessary in lineMakeCall // and other places // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_CountryCode(long lCountryCode) { LOG((TL_TRACE, "put_CountryCode - enter")); // // simply save - will be validated if/when used // Lock(); m_dwCountryCode = (DWORD)lCountryCode; Unlock(); LOG((TL_TRACE, "put_CountryCode - exit - success")); return S_OK; } #ifdef NEWCALLINFO //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_CountryCode // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::get_CountryCode(long * plCountryCode) { HRESULT hr; if (TAPIIsBadWritePtr( plCountryCode, sizeof(long) ) ) { LOG((TL_ERROR, "get_CountryCode - bad pointer")); return E_POINTER; } LOG((TL_TRACE, "get_CountryCode - enter")); *plCountryCode = m_dwCountryCode; LOG((TL_TRACE, "get_CountryCode - exit")); return S_OK; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // SetQOS // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= STDMETHODIMP CCall::SetQOS( long lMediaType, QOS_SERVICE_LEVEL ServiceLevel ) { HRESULT hr = S_OK; DWORD dwMediaMode; if (!(m_pAddress->GetMediaMode( lMediaType, &dwMediaMode ) ) ) { LOG((TL_ERROR, "SetQOS - invalid pMediaType")); return E_INVALIDARG; } Lock(); if (ISHOULDUSECALLPARAMS()) { LINECALLQOSINFO * plci; if ( m_pAddress->GetAPIVersion() < TAPI_VERSION2_0 ) { Unlock(); return TAPI_E_NOTSUPPORTED; } if ( 0 != m_pCallParams->dwReceivingFlowspecSize ) { DWORD dwCount; DWORD dwSize; LINECALLQOSINFO * plciOld; plciOld = (LINECALLQOSINFO*)(((LPBYTE)m_pCallParams) + m_pCallParams->dwReceivingFlowspecOffset); dwSize = plciOld->dwTotalSize + sizeof(LINEQOSSERVICELEVEL); ResizeCallParams( dwSize ); plci = (LINECALLQOSINFO*)(((LPBYTE)m_pCallParams) + m_dwCallParamsUsedSize); CopyMemory( plci, plciOld, plciOld->dwTotalSize ); dwCount = plci->SetQOSServiceLevel.dwNumServiceLevelEntries; plci->SetQOSServiceLevel.LineQOSServiceLevel[dwCount]. dwMediaMode = dwMediaMode; plci->SetQOSServiceLevel.LineQOSServiceLevel[dwCount]. dwQOSServiceLevel = ServiceLevel; plci->SetQOSServiceLevel.dwNumServiceLevelEntries++; m_dwCallParamsUsedSize += dwSize; Unlock(); return S_OK; } else { ResizeCallParams( sizeof(LINECALLQOSINFO) ); plci = (LINECALLQOSINFO*)(((LPBYTE)m_pCallParams) + m_dwCallParamsUsedSize); m_pCallParams->dwReceivingFlowspecSize = sizeof( LINECALLQOSINFO ); m_pCallParams->dwReceivingFlowspecOffset = m_dwCallParamsUsedSize; plci->dwKey = LINEQOSSTRUCT_KEY; plci->dwTotalSize = sizeof(LINECALLQOSINFO); plci->dwQOSRequestType = LINEQOSREQUESTTYPE_SERVICELEVEL; plci->SetQOSServiceLevel.dwNumServiceLevelEntries = 1; plci->SetQOSServiceLevel.LineQOSServiceLevel[0]. dwMediaMode = dwMediaMode; plci->SetQOSServiceLevel.LineQOSServiceLevel[0]. dwQOSServiceLevel = ServiceLevel; m_dwCallParamsUsedSize += sizeof(LINECALLQOSINFO); Unlock(); return S_OK; } } else { HCALL hCall; hCall = m_t3Call.hCall; Unlock(); hr = LineSetCallQualityOfService( hCall, ServiceLevel, dwMediaMode ); return hr; } return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_CallId // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_CallId(long * plCallId ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_CallId - enter")); if (TAPIIsBadWritePtr(plCallId, sizeof(long) ) ) { LOG((TL_ERROR, "get_CallId - bad pointer")); return E_POINTER; } Lock(); hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_CallId - RefreshCallInfo failed - %lx", hr)); } else { *plCallId = m_pCallInfo->dwCallID; } Unlock(); LOG((TL_TRACE, "get_CallId - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_RelatedCallId // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_RelatedCallId(long * plCallId ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_RelatedCallId - enter")); if (TAPIIsBadWritePtr(plCallId, sizeof(long) ) ) { LOG((TL_ERROR, "get_RelatedCallId - bad pointer")); return E_POINTER; } Lock(); hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_RelatedCallId - RefreshCallInfo failed - %lx", hr)); } else { *plCallId = m_pCallInfo->dwRelatedCallID; } Unlock(); LOG((TL_TRACE, "get_RelatedCallId - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_CompletionId // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_CompletionId(long * plCompletionId ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_CompletionId - enter")); if (TAPIIsBadWritePtr(plCompletionId, sizeof(long) ) ) { LOG((TL_ERROR, "get_CompletionId - bad pointer")); return E_POINTER; } Lock(); hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_CompletionId - RefreshCallInfo failed - %lx", hr)); } else { *plCompletionId = m_pCallInfo->dwCompletionID; } Unlock(); LOG((TL_TRACE, "get_CompletionId - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_NumberOfOwners // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_NumberOfOwners(long * plNumberOfOwners ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_NumberOfOwners - enter")); if (TAPIIsBadWritePtr(plNumberOfOwners, sizeof(long) ) ) { LOG((TL_ERROR, "get_NumberOfOwners - bad pointer")); return E_POINTER; } Lock(); hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_NumberOfOwners - RefreshCallInfo failed - %lx", hr)); } else { *plNumberOfOwners = m_pCallInfo->dwNumOwners; } Unlock(); LOG((TL_TRACE, "get_NumberOfOwners - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_NumberOfMonitors // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_NumberOfMonitors(long * plNumberOfMonitors ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_NumberOfMonitors - enter")); if (TAPIIsBadWritePtr(plNumberOfMonitors, sizeof(long) ) ) { LOG((TL_ERROR, "get_NumberOfMonitors - bad pointer")); return E_POINTER; } Lock(); hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_NumberOfMonitors - RefreshCallInfo failed - %lx", hr)); } else { *plNumberOfMonitors = m_pCallInfo->dwNumMonitors; } Unlock(); LOG((TL_TRACE, "get_NumberOfMonitors - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_NumberOfMonitors // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_Trunk(long * plTrunk ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_Trunk - enter")); if (TAPIIsBadWritePtr(plTrunk, sizeof(long) ) ) { LOG((TL_ERROR, "get_Trunk - bad pointer")); return E_POINTER; } Lock(); hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_Trunk - RefreshCallInfo failed - %lx", hr)); } else { *plTrunk = m_pCallInfo->dwTrunk; } Unlock(); LOG((TL_TRACE, "get_Trunk - exit")); return hr; } #ifdef NEWCALLINFO //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // GetHighLevelCompatibilityBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::GetHighLevelCompatibilityBuffer( DWORD * pdwSize, BYTE ** ppBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetHighLevelCompatibilityBuffer - enter")); if (TAPIIsBadWritePtr(pdwSize, sizeof(DWORD))) { LOG((TL_ERROR, "GetHighLevelCompatibilityBuffer - bad size pointer")); return E_POINTER; } if (TAPIIsBadWritePtr(ppBuffer,sizeof(BYTE*) ) ) { LOG((TL_ERROR, "GetHighLevelCompatibilityBuffer - bad buffer pointer")); return E_POINTER; } *ppBuffer = NULL; *pdwSize = 0; Lock(); if ( ISHOULDUSECALLPARAMS() ) { if ( m_pCallParams->dwHighLevelCompSize != 0 ) { BYTE * pTemp; pTemp = (BYTE *)CoTaskMemAlloc( m_pCallParams->dwHighLevelCompSize ); if ( NULL == pTemp ) { LOG((TL_ERROR, "GetHighLevelCompatibilityBuffer - out of memory")); hr = E_OUTOFMEMORY; } else { CopyMemory( pTemp, ((PBYTE)m_pCallParams) + m_pCallParams->dwHighLevelCompOffset, m_pCallParams->dwHighLevelCompSize ); *ppBuffer = pTemp; *pdwSize = m_pCallParams->dwHighLevelCompSize; } } Unlock(); return hr; } hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "GetHighLevelCompatibilityBuffer - can't get callinfo - %lx", hr)); Unlock(); return hr; } hr = S_OK; if ( m_pCallInfo->dwHighLevelCompSize != 0 ) { BYTE * pTemp; pTemp = (BYTE *)CoTaskMemAlloc( m_pCallInfo->dwHighLevelCompSize ); if ( NULL == pTemp ) { LOG((TL_ERROR, "GetHighLevelCompatibilityBuffer - out of memory")); hr = E_OUTOFMEMORY; } else { CopyMemory( pTemp, ( (PBYTE)m_pCallInfo ) + m_pCallInfo->dwHighLevelCompOffset, m_pCallInfo->dwHighLevelCompSize ); *ppBuffer = pTemp; *pdwSize = m_pCallInfo->dwHighLevelCompSize; } } Unlock(); LOG((TL_TRACE, "GetHighLevelCompatibilityBuffer - exit")); return hr; } #endif #ifndef NEWCALLINFO //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // GetHighLevelCompatibilityBuffer // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::GetHighLevelCompatibilityBuffer( long lSize, BYTE * pBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetHighLevelCompatibilityBuffer - enter")); if (lSize == 0) { LOG((TL_ERROR, "GetHighLevelCompatibilityBuffer - lSize = 0")); return S_FALSE; } if ( TAPIIsBadWritePtr ( pBuffer, lSize ) ) { LOG((TL_ERROR, "GetHighLevelCompatibilityBuffer - bad pointer")); return E_POINTER; } Lock(); if ( ISHOULDUSECALLPARAMS() ) { if ( 0 != m_pCallParams->dwHighLevelCompSize ) { if ( lSize < m_pCallParams->dwHighLevelCompSize ) { LOG((TL_ERROR, "GetHighLevelCompatibilityBuffer - too small")); hr = E_INVALIDARG; } else { CopyMemory(pBuffer, ((PBYTE)m_pCallParams) + m_pCallParams->dwHighLevelCompOffset, m_pCallParams->dwHighLevelCompSize ); } } else { *pBuffer = 0; } } else { hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { if ( m_pCallInfo->dwHighLevelCompSize > lSize ) { LOG((TL_ERROR, "GetHighLevelCompatibilityBuffer - size not big enough ")); return E_INVALIDARG; } else { CopyMemory(pBuffer, ( (PBYTE) m_pCallInfo ) + m_pCallInfo->dwHighLevelCompOffset, m_pCallInfo->dwHighLevelCompSize ); } } else { LOG((TL_ERROR, "GetHighLevelCompatibilityBuffer - can't get callinfo - %lx", hr)); } } Unlock(); LOG((TL_TRACE, hr, "GetHighLevelCompatibilityBuffer - exit")); return hr; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // SetHighLevelCompatibilityBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::SetHighLevelCompatibilityBuffer( long lSize, BYTE * pBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "SetHighLevelCompatibilityBuffer - enter")); if (IsBadReadPtr( pBuffer, lSize) ) { LOG((TL_ERROR, "SetHighLevelCompatibilityBuffer - bad pointer")); return E_POINTER; } Lock(); if ( !ISHOULDUSECALLPARAMS() ) { LOG((TL_ERROR, "SetHighLevelCompatibilityBuffer - only when call is idle")); hr = TAPI_E_INVALCALLSTATE; } else { hr = ResizeCallParams( lSize ); if ( SUCCEEDED(hr) ) { CopyMemory( ((LPBYTE)m_pCallParams) + m_dwCallParamsUsedSize, pBuffer, lSize ); m_pCallParams->dwHighLevelCompOffset = m_dwCallParamsUsedSize; m_pCallParams->dwHighLevelCompSize = lSize; m_dwCallParamsUsedSize += lSize; } else { LOG((TL_ERROR, "SetHighLevelCompatibilityBuffer - can't resize callparams - %lx", hr)); } } Unlock(); LOG((TL_TRACE, hr, "SetHighLevelCompatibilityBuffer - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_HighLevelCompatibilityBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT CCall::get_HighLevelCompatibilityBuffer( VARIANT * pBuffer ) { HRESULT hr = S_OK; BYTE * p = NULL; DWORD dwSize = 0; LOG((TL_TRACE, "get_HighLevelCompatibilityBuffer - enter")); if ( TAPIIsBadWritePtr( pBuffer, sizeof( VARIANT ) ) ) { LOG((TL_ERROR, "get_HighLevelCompatibilityBuffer - bad pointer")); return E_POINTER; } pBuffer->vt = VT_EMPTY; hr = GetHighLevelCompatibilityBuffer(&dwSize, &p); if (SUCCEEDED(hr)) { hr = FillVariantFromBuffer( dwSize, p, pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_HighLevelCompatibilityBuffer - fillvariant failed -%lx", hr)); } } if ( p != NULL ) { CoTaskMemFree( p ); } LOG((TL_TRACE, hr, "get_HighLevelCompatibilityBuffer - exit")); return hr; } #else //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_HighLevelCompatibilityBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= STDMETHODIMP CCall::get_HighLevelCompatibilityBuffer( VARIANT * pBuffer ) { HRESULT hr = S_OK; BYTE * p; DWORD dwSize = 0; LOG((TL_TRACE, "get_HighLevelCompatibilityBuffer - enter")); if ( TAPIIsBadWritePtr( pBuffer, sizeof( VARIANT ) ) ) { LOG((TL_ERROR, "get_HighLevelCompatibilityBuffer - bad pointer")); return E_POINTER; } pBuffer->vt = VT_EMPTY; hr = GetHighLevelCompatibilityBufferSize( (long*)&dwSize ); if (SUCCEEDED(hr)) { if ( 0 != dwSize ) { p = (PBYTE) ClientAlloc( dwSize ); if ( p != NULL ) { hr = GetHighLevelCompatibilityBuffer(dwSize, p); if (SUCCEEDED(hr)) { hr = FillVariantFromBuffer( dwSize, p, pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_HighLevelCompatibilityBuffer - fillvariant failed -%lx", hr)); } } else { LOG((TL_ERROR, "get_HighLevelCompatibilityBuffer - GetHighLevelCompatibilityBuffer failed")); } } else { LOG((TL_ERROR, "get_HighLevelCompatibilityBuffer - alloc failed")); hr = E_OUTOFMEMORY; } } else { LOG((TL_INFO, "get_HighLevelCompatibilityBuffer - dwSize = 0")); } } else { LOG((TL_ERROR, "get_HighLevelCompatibilityBuffer - getsize failed")); } if ( p != NULL ) { ClientFree( p ); } LOG((TL_TRACE, hr, "get_HighLevelCompatibilityBuffer - exit")); return hr; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_HighLevelCompatibilityBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_HighLevelCompatibilityBuffer( VARIANT Buffer ) { HRESULT hr = S_OK; DWORD dwSize; BYTE * pBuffer; LOG((TL_TRACE, "put_HighLevelCompatibilityBuffer - enter")); hr = MakeBufferFromVariant( Buffer, &dwSize, &pBuffer ); if ( SUCCEEDED(hr) ) { hr = SetHighLevelCompatibilityBuffer( dwSize, pBuffer ); ClientFree( pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "put_HighLevelCompatibilityBuffer - Set failed - %lx", hr)); return hr; } } else { LOG((TL_ERROR, "put_HighLevelCompatibilityBuffer - can't make buffer - %lx", hr)); } LOG((TL_TRACE, "put_HighLevelCompatibilityBuffer - exit")); return S_OK; } #ifdef NEWCALLINFO //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // GetLowLevelCompatibilityBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::GetLowLevelCompatibilityBuffer( DWORD * pdwSize, BYTE ** ppBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetLowLevelCompatibilityBuffer - enter")); if (TAPIIsBadWritePtr(pdwSize, sizeof(DWORD))) { LOG((TL_ERROR, "GetLowLevelCompatibilityBuffer - bad size pointer")); return E_POINTER; } if (TAPIIsBadWritePtr(ppBuffer,sizeof(BYTE*) ) ) { LOG((TL_ERROR, "GetLowLevelCompatibilityBuffer - bad buffer pointer")); return E_POINTER; } *ppBuffer = NULL; *pdwSize = 0; Lock(); if ( ISHOULDUSECALLPARAMS() ) { if ( m_pCallParams->dwLowLevelCompSize != 0 ) { BYTE * pTemp; pTemp = (BYTE *)CoTaskMemAlloc( m_pCallParams->dwLowLevelCompSize ); if ( NULL == pTemp ) { LOG((TL_ERROR, "GetLowLevelCompatibilityBuffer - out of memory")); hr = E_OUTOFMEMORY; } else { CopyMemory( pTemp, ((PBYTE)m_pCallParams) + m_pCallParams->dwLowLevelCompOffset, m_pCallParams->dwLowLevelCompSize ); *ppBuffer = pTemp; *pdwSize = m_pCallParams->dwLowLevelCompSize; } } Unlock(); return hr; } hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "GetLowLevelCompatibilityBuffer - can't get callinfo - %lx", hr)); Unlock(); return hr; } hr = S_OK; if ( m_pCallInfo->dwLowLevelCompSize != 0 ) { BYTE * pTemp; pTemp = (BYTE *)CoTaskMemAlloc( m_pCallInfo->dwLowLevelCompSize ); if ( NULL == pTemp ) { LOG((TL_ERROR, "GetLowLevelCompatibilityBuffer - out of memory")); hr = E_OUTOFMEMORY; } else { CopyMemory( pTemp, ( (PBYTE)m_pCallInfo ) + m_pCallInfo->dwLowLevelCompOffset, m_pCallInfo->dwLowLevelCompSize ); *ppBuffer = pTemp; *pdwSize = m_pCallInfo->dwLowLevelCompSize; } } Unlock(); LOG((TL_TRACE, "GetLowLevelCompatibilityBuffer - exit")); return hr; } #endif #ifndef NEWCALLINFO //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // GetLowLevelCompatibilityBuffer // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::GetLowLevelCompatibilityBuffer( long lSize, BYTE * pBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetLowLevelCompatibilityBuffer - enter")); if (lSize == 0) { LOG((TL_ERROR, "GetLowLevelCompatibilityBuffer - lSize = 0")); return S_FALSE; } if ( TAPIIsBadWritePtr ( pBuffer, lSize ) ) { LOG((TL_ERROR, "GetLowLevelCompatibilityBuffer - bad pointer")); return E_POINTER; } Lock(); if ( ISHOULDUSECALLPARAMS() ) { if ( 0 != m_pCallParams->dwLowLevelCompSize ) { if ( lSize < m_pCallParams->dwLowLevelCompSize ) { LOG((TL_ERROR, "GetLowLevelCompatibilityBuffer - too small")); hr = E_INVALIDARG; } else { CopyMemory(pBuffer, ((PBYTE)m_pCallParams) + m_pCallParams->dwLowLevelCompOffset, m_pCallParams->dwLowLevelCompSize ); } } else { *pBuffer = 0; } } else { hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { if ( m_pCallInfo->dwLowLevelCompSize > lSize ) { LOG((TL_ERROR, "GetLowLevelCompatibilityBuffer - size not big enough ")); return E_INVALIDARG; } else { CopyMemory(pBuffer, ( (PBYTE) m_pCallInfo ) + m_pCallInfo->dwLowLevelCompOffset, m_pCallInfo->dwLowLevelCompSize ); } } else { LOG((TL_ERROR, "GetLowLevelCompatibilityBuffer - can't get callinfo - %lx", hr)); } } Unlock(); LOG((TL_TRACE, hr, "GetLowLevelCompatibilityBuffer - exit")); return hr; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // SetLowLevelCompatibilityBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::SetLowLevelCompatibilityBuffer( long lSize, BYTE * pBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "SetLowLevelCompatibilityBuffer - enter")); if (IsBadReadPtr( pBuffer, lSize) ) { LOG((TL_ERROR, "SetLowLevelCompatibilityBuffer - bad pointer")); return E_POINTER; } Lock(); if ( !ISHOULDUSECALLPARAMS() ) { LOG((TL_ERROR, "SetLowLevelCompatibilityBuffer - only when call is idle")); hr = TAPI_E_INVALCALLSTATE; } else { hr = ResizeCallParams( lSize ); if ( SUCCEEDED(hr) ) { CopyMemory( ((LPBYTE)m_pCallParams) + m_dwCallParamsUsedSize, pBuffer, lSize ); m_pCallParams->dwLowLevelCompOffset = m_dwCallParamsUsedSize; m_pCallParams->dwLowLevelCompSize = lSize; m_dwCallParamsUsedSize += lSize; } else { LOG((TL_ERROR, "SetLowLevelCompatibilityBuffer - can't resize callparams - %lx", hr)); } } Unlock(); LOG((TL_TRACE, hr, "SetLowLevelCompatibilityBuffer - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_LowLevelCompatibilityBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT CCall::get_LowLevelCompatibilityBuffer( VARIANT * pBuffer ) { HRESULT hr = S_OK; BYTE * p = NULL; DWORD dwSize = 0; LOG((TL_TRACE, "get_LowLevelCompatibilityBuffer - enter")); if ( TAPIIsBadWritePtr( pBuffer, sizeof( VARIANT ) ) ) { LOG((TL_ERROR, "get_LowLevelCompatibilityBuffer - bad pointer")); return E_POINTER; } pBuffer->vt = VT_EMPTY; hr = GetLowLevelCompatibilityBuffer(&dwSize, &p); if (SUCCEEDED(hr)) { hr = FillVariantFromBuffer( dwSize, p, pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_LowLevelCompatibilityBuffer - fillvariant failed -%lx", hr)); } } if ( p != NULL ) { CoTaskMemFree( p ); } LOG((TL_TRACE, hr, "get_LowLevelCompatibilityBuffer - exit")); return hr; } #else //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_LowLevelCompatibilityBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= STDMETHODIMP CCall::get_LowLevelCompatibilityBuffer( VARIANT * pBuffer ) { HRESULT hr = S_OK; BYTE * p; DWORD dwSize = 0; LOG((TL_TRACE, "get_LowLevelCompatibilityBuffer - enter")); if ( TAPIIsBadWritePtr( pBuffer, sizeof( VARIANT ) ) ) { LOG((TL_ERROR, "get_LowLevelCompatibilityBuffer - bad pointer")); return E_POINTER; } pBuffer->vt = VT_EMPTY; hr = GetLowLevelCompatibilityBufferSize( (long*)&dwSize ); if (SUCCEEDED(hr)) { if ( 0 != dwSize ) { p = (PBYTE) ClientAlloc( dwSize ); if ( p != NULL ) { hr = GetLowLevelCompatibilityBuffer(dwSize, p); if (SUCCEEDED(hr)) { hr = FillVariantFromBuffer( dwSize, p, pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_LowLevelCompatibilityBuffer - fillvariant failed -%lx", hr)); } } else { LOG((TL_ERROR, "get_LowLevelCompatibilityBuffer - Get failed")); } } else { LOG((TL_ERROR, "get_LowLevelCompatibilityBuffer - alloc failed")); hr = E_OUTOFMEMORY; } } else { LOG((TL_INFO, "get_LowLevelCompatibilityBuffer - dwSize = 0")); } } else { LOG((TL_ERROR, "get_LowLevelCompatibilityBuffer - getsize failed")); } if ( p != NULL ) { ClientFree( p ); } LOG((TL_TRACE, hr, "get_LowLevelCompatibilityBuffer - exit")); return hr; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_LowLevelCompatibilityBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::put_LowLevelCompatibilityBuffer( VARIANT Buffer ) { HRESULT hr = S_OK; DWORD dwSize; BYTE * pBuffer; LOG((TL_TRACE, "put_LowLevelCompatibilityBuffer - enter")); hr = MakeBufferFromVariant( Buffer, &dwSize, &pBuffer ); if ( SUCCEEDED(hr) ) { hr = SetLowLevelCompatibilityBuffer( dwSize, pBuffer ); ClientFree( pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "put_LowLevelCompatibilityBuffer - Set failed - %lx", hr)); return hr; } } else { LOG((TL_ERROR, "put_LowLevelCompatibilityBuffer - can't make buffer - %lx", hr)); } LOG((TL_TRACE, "put_LowLevelCompatibilityBuffer - exit")); return S_OK; } #ifdef NEWCALLINFO //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // GetChargingInfoBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::GetChargingInfoBuffer( DWORD * pdwSize, BYTE ** ppBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetChargingInfoBuffer - enter")); if (TAPIIsBadWritePtr(pdwSize, sizeof(DWORD))) { LOG((TL_ERROR, "GetChargingInfoBuffer - bad size pointer")); return E_POINTER; } if (TAPIIsBadWritePtr(ppBuffer,sizeof(BYTE*) ) ) { LOG((TL_ERROR, "GetChargingInfoBuffer - bad buffer pointer")); return E_POINTER; } *ppBuffer = NULL; *pdwSize = 0; Lock(); hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "GetChargingInfoBuffer - can't get callinfo - %lx", hr)); Unlock(); return hr; } hr = S_OK; if ( m_pCallInfo->dwChargingInfoSize != 0 ) { BYTE * pTemp; pTemp = (BYTE *)CoTaskMemAlloc( m_pCallInfo->dwChargingInfoSize ); if ( NULL == pTemp ) { LOG((TL_ERROR, "GetChargingInfoBuffer - out of memory")); hr = E_OUTOFMEMORY; } else { CopyMemory( pTemp, ( (PBYTE)m_pCallInfo ) + m_pCallInfo->dwChargingInfoOffset, m_pCallInfo->dwChargingInfoSize ); *ppBuffer = pTemp; *pdwSize = m_pCallInfo->dwChargingInfoSize; } } Unlock(); LOG((TL_TRACE, "GetChargingInfoBuffer - exit")); return hr; } #endif #ifndef NEWCALLINFO //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // GetChargingInfoBuffer // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::GetChargingInfoBuffer( long lSize, BYTE * pBuffer ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetChargingInfoBuffer - enter")); if (lSize == 0) { LOG((TL_ERROR, "GetChargingInfoBuffer - lSize = 0")); return S_FALSE; } if ( TAPIIsBadWritePtr ( pBuffer, lSize ) ) { LOG((TL_ERROR, "GetChargingInfoBuffer - bad pointer")); return E_POINTER; } Lock(); hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { if ( m_pCallInfo->dwChargingInfoSize > lSize ) { LOG((TL_ERROR, "GetChargingInfoBuffer - size not big enough ")); return E_INVALIDARG; } else { CopyMemory(pBuffer, ( (PBYTE) m_pCallInfo ) + m_pCallInfo->dwChargingInfoOffset, m_pCallInfo->dwChargingInfoSize ); } } else { LOG((TL_ERROR, "GetChargingInfoBuffer - can't get callinfo - %lx", hr)); } Unlock(); LOG((TL_TRACE, hr, "GetChargingInfoBuffer - exit")); return hr; } #endif //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_ChargingInfoBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= #ifdef NEWCALLINFO HRESULT CCall::get_ChargingInfoBuffer( VARIANT * pBuffer ) { HRESULT hr = S_OK; BYTE * p = NULL; DWORD dwSize = 0; LOG((TL_TRACE, "get_ChargingInfoBuffer - enter")); if ( TAPIIsBadWritePtr( pBuffer, sizeof( VARIANT ) ) ) { LOG((TL_ERROR, "get_ChargingInfoBuffer - bad pointer")); return E_POINTER; } pBuffer->vt = VT_EMPTY; hr = GetChargingInfoBuffer(&dwSize, &p); if (SUCCEEDED(hr)) { hr = FillVariantFromBuffer( dwSize, p, pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_ChargingInfoBuffer - fillvariant failed -%lx", hr)); } } if ( p != NULL ) { CoTaskMemFree( p ); } LOG((TL_TRACE, hr, "get_ChargingInfoBuffer - exit")); return hr; } #else //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_ChargingInfoBuffer // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= STDMETHODIMP CCall::get_ChargingInfoBuffer( VARIANT * pBuffer ) { HRESULT hr = S_OK; BYTE * p; DWORD dwSize = 0; LOG((TL_TRACE, "get_ChargingInfoBuffer - enter")); if ( TAPIIsBadWritePtr( pBuffer, sizeof( VARIANT ) ) ) { LOG((TL_ERROR, "get_ChargingInfoBuffer - bad pointer")); return E_POINTER; } pBuffer->vt = VT_EMPTY; hr = GetChargingInfoBufferSize( (long*)&dwSize ); if (SUCCEEDED(hr)) { if ( 0 != dwSize ) { p = (PBYTE) ClientAlloc( dwSize ); if ( p != NULL ) { hr = GetChargingInfoBuffer(dwSize, p); if (SUCCEEDED(hr)) { hr = FillVariantFromBuffer( dwSize, p, pBuffer ); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_ChargingInfoBuffer - fillvariant failed -%lx", hr)); } } else { LOG((TL_ERROR, "get_ChargingInfoBuffer - GetDevSpecificBuffer")); } } else { LOG((TL_ERROR, "get_ChargingInfoBuffer - alloc failed")); hr = E_OUTOFMEMORY; } } else { LOG((TL_INFO, "get_ChargingInfoBuffer - dwSize = 0")); } } else { LOG((TL_ERROR, "get_ChargingInfoBuffer - getsize failed")); } if ( p != NULL ) { ClientFree( p ); } LOG((TL_TRACE, hr, "get_ChargingInfoBuffer - exit")); return hr; } #endif //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // get_Rate // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifdef NEWCALLINFO HRESULT #else STDMETHODIMP #endif CCall::get_Rate(long * plRate ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_Rate - enter")); if (TAPIIsBadWritePtr(plRate, sizeof(long) ) ) { LOG((TL_ERROR, "get_Rate - bad pointer")); return E_POINTER; } Lock(); hr = RefreshCallInfo(); if (!SUCCEEDED(hr)) { LOG((TL_ERROR, "get_Rate - RefreshCallInfo failed - %lx", hr)); } else { *plRate = m_pCallInfo->dwRate; } Unlock(); LOG((TL_TRACE, hr, "get_Rate - exit")); return hr; } #ifdef NEWCALLINFO //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::get_CallInfoLong( CALLINFO_LONG CallInfoLongType, long * plCallInfoLongVal ) { HRESULT hr = E_FAIL; LOG((TL_TRACE, "get_CallInfoLong - enter")); switch( CallInfoLongType ) { case CIL_MEDIATYPESAVAILABLE: hr = get_MediaTypesAvailable( plCallInfoLongVal ); break; case CIL_BEARERMODE: hr = get_BearerMode( plCallInfoLongVal ); break; case CIL_CALLERIDADDRESSTYPE: hr = get_CallerIDAddressType( plCallInfoLongVal ); break; case CIL_CALLEDIDADDRESSTYPE: hr = get_CalledIDAddressType( plCallInfoLongVal ); break; case CIL_CONNECTEDIDADDRESSTYPE: hr = get_ConnectedIDAddressType( plCallInfoLongVal ); break; case CIL_REDIRECTIONIDADDRESSTYPE: hr = get_RedirectionIDAddressType( plCallInfoLongVal ); break; case CIL_REDIRECTINGIDADDRESSTYPE: hr = get_RedirectingIDAddressType( plCallInfoLongVal ); break; case CIL_ORIGIN: hr = get_Origin( plCallInfoLongVal ); break; case CIL_REASON: hr = get_Reason( plCallInfoLongVal ); break; case CIL_APPSPECIFIC: hr = get_AppSpecific( plCallInfoLongVal ); break; case CIL_CALLTREATMENT: hr = get_CallTreatment( plCallInfoLongVal ); break; case CIL_MINRATE: hr = get_MinRate( plCallInfoLongVal ); break; case CIL_MAXRATE: hr = get_MaxRate( plCallInfoLongVal ); break; case CIL_CALLID: hr = get_CallId( plCallInfoLongVal ); break; case CIL_RELATEDCALLID: hr = get_RelatedCallId( plCallInfoLongVal ); break; case CIL_COMPLETIONID: hr = get_CompletionId( plCallInfoLongVal ); break; case CIL_NUMBEROFOWNERS: hr = get_NumberOfOwners( plCallInfoLongVal ); break; case CIL_NUMBEROFMONITORS: hr = get_NumberOfMonitors( plCallInfoLongVal ); break; case CIL_TRUNK: hr = get_Trunk( plCallInfoLongVal ); break; case CIL_RATE: hr = get_Rate( plCallInfoLongVal ); break; case CIL_COUNTRYCODE: hr = get_CountryCode( plCallInfoLongVal ); break; case CIL_CALLPARAMSFLAGS: hr = GetCallParamsFlags( plCallInfoLongVal ); break; case CIL_GENERATEDIGITDURATION: hr = get_GenerateDigitDuration( plCallInfoLongVal ); break; case CIL_MONITORDIGITMODES: hr = get_MonitorDigitModes( plCallInfoLongVal ); break; case CIL_MONITORMEDIAMODES: hr = get_MonitorMediaModes( plCallInfoLongVal ); break; default: hr = E_INVALIDARG; break; } LOG((TL_TRACE, "get_CallInfoLong - exit - return %lx", hr)); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::put_CallInfoLong( CALLINFO_LONG CallInfoLongType, long lCallInfoLongVal ) { HRESULT hr = E_FAIL; LOG((TL_TRACE, "put_CallInfoLong - enter")); switch( CallInfoLongType ) { case CIL_MEDIATYPESAVAILABLE: LOG((TL_ERROR, "Cannot set MEDIATYPESAVAILABLE")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_BEARERMODE: hr = put_BearerMode( lCallInfoLongVal ); break; case CIL_CALLERIDADDRESSTYPE: LOG((TL_ERROR, "Cannot set CALLERIDIADDRESSTYPE")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_CALLEDIDADDRESSTYPE: LOG((TL_ERROR, "Cannot set CALLEDIDIADDRESSTYPE")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_CONNECTEDIDADDRESSTYPE: LOG((TL_ERROR, "Cannot set CONNECTEDIDIADDRESSTYPE")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_REDIRECTIONIDADDRESSTYPE: LOG((TL_ERROR, "Cannot set REDIRECTIONIDIADDRESSTYPE")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_REDIRECTINGIDADDRESSTYPE: LOG((TL_ERROR, "Cannot set REDIRECTINGIDIADDRESSTYPE")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_ORIGIN: LOG((TL_ERROR, "Cannot set ORIGIN")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_REASON: LOG((TL_ERROR, "Cannot set REASON")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_APPSPECIFIC: hr = put_AppSpecific( lCallInfoLongVal ); break; case CIL_CALLTREATMENT: hr = put_CallTreatment( lCallInfoLongVal ); break; case CIL_MINRATE: hr = put_MinRate( lCallInfoLongVal ); break; case CIL_MAXRATE: hr = put_MaxRate( lCallInfoLongVal ); break; case CIL_CALLID: LOG((TL_ERROR, "Cannot set CALLID")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_RELATEDCALLID: LOG((TL_ERROR, "Cannot set RELATEDCALLID")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_COMPLETIONID: LOG((TL_ERROR, "Cannot set COMPLETIONID")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_NUMBEROFOWNERS: LOG((TL_ERROR, "Cannot set NUMBEROFOWNERS")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_NUMBEROFMONITORS: LOG((TL_ERROR, "Cannot set NUMBEROFMONITORS")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_TRUNK: LOG((TL_ERROR, "Cannot set TRUNK")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_RATE: LOG((TL_ERROR, "Cannot set RATE")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_COUNTRYCODE: hr = put_CountryCode( lCallInfoLongVal ); break; case CIL_CALLPARAMSFLAGS: hr = SetCallParamsFlags( lCallInfoLongVal ); break; case CIL_GENERATEDIGITDURATION: hr = put_GenerateDigitDuration( lCallInfoLongVal ); break; case CIL_MONITORDIGITMODES: LOG((TL_ERROR, "Cannot set MONITORDIGITMODES")); hr = TAPI_E_NOTSUPPORTED; break; case CIL_MONITORMEDIAMODES: LOG((TL_ERROR, "Cannot set MONITORMEDIAMODES")); hr = TAPI_E_NOTSUPPORTED; break; default: hr = E_INVALIDARG; break; } LOG((TL_TRACE, "put_CallInfoLong - exit - return %lx", hr)); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::get_CallInfoString( CALLINFO_STRING CallInfoStringType, BSTR * ppCallInfoString ) { HRESULT hr = E_FAIL; LOG((TL_TRACE, "get_CallInfoString - enter")); switch(CallInfoStringType) { case CIS_CALLERIDNAME: hr = get_CallerIDName(ppCallInfoString); break; case CIS_CALLERIDNUMBER: hr = get_CallerIDNumber(ppCallInfoString); break; case CIS_CALLEDIDNAME: hr = get_CalledIDName(ppCallInfoString); break; case CIS_CALLEDIDNUMBER: hr = get_CalledIDNumber(ppCallInfoString); break; case CIS_CONNECTEDIDNAME: hr = get_ConnectedIDName(ppCallInfoString); break; case CIS_CONNECTEDIDNUMBER: hr = get_ConnectedIDNumber(ppCallInfoString); break; case CIS_REDIRECTIONIDNAME: hr = get_RedirectionIDName(ppCallInfoString); break; case CIS_REDIRECTIONIDNUMBER: hr = get_RedirectionIDNumber(ppCallInfoString); break; case CIS_REDIRECTINGIDNAME: hr = get_RedirectingIDName(ppCallInfoString); break; case CIS_REDIRECTINGIDNUMBER: hr = get_RedirectingIDNumber(ppCallInfoString); break; case CIS_CALLEDPARTYFRIENDLYNAME: hr = get_CalledPartyFriendlyName(ppCallInfoString); break; case CIS_COMMENT: hr = get_Comment(ppCallInfoString); break; case CIS_DISPLAYABLEADDRESS: hr = get_DisplayableAddress(ppCallInfoString); break; case CIS_CALLINGPARTYID: hr = get_CallingPartyID(ppCallInfoString); break; default: LOG((TL_ERROR, "get_CallInfoString - invalid type")); hr = E_INVALIDARG; break; } LOG((TL_TRACE, "get_CallInfoString - exit - return %lx", hr)); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::put_CallInfoString( CALLINFO_STRING CallInfoStringType, BSTR pCallInfoString ) { HRESULT hr = E_FAIL; LOG((TL_TRACE, "put_CallInfoString - enter")); switch( CallInfoStringType ) { case CIS_CALLERIDNAME: case CIS_CALLERIDNUMBER: case CIS_CALLEDIDNAME: case CIS_CALLEDIDNUMBER: case CIS_CONNECTEDIDNAME: case CIS_CONNECTEDIDNUMBER: case CIS_REDIRECTIONIDNAME: case CIS_REDIRECTIONIDNUMBER: case CIS_REDIRECTINGIDNAME: case CIS_REDIRECTINGIDNUMBER: LOG((TL_TRACE,"put_CallInfoString - unsupported CALLINFO_STRING constant - %lx", CallInfoStringType)); hr = TAPI_E_NOTSUPPORTED; break; case CIS_CALLEDPARTYFRIENDLYNAME: hr = put_CalledPartyFriendlyName(pCallInfoString); break; case CIS_COMMENT: hr = put_Comment(pCallInfoString); break; case CIS_DISPLAYABLEADDRESS: hr = put_DisplayableAddress(pCallInfoString); break; case CIS_CALLINGPARTYID: hr = put_CallingPartyID(pCallInfoString); break; default: LOG((TL_ERROR, "put_CallInfoString - invalid type")); hr = E_INVALIDARG; break; } LOG((TL_TRACE, "put_CallInfoString - exit - return %lx", hr)); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::get_CallInfoBuffer( CALLINFO_BUFFER CallInfoBufferType, VARIANT * ppCallInfoBuffer ) { HRESULT hr = E_FAIL; LOG((TL_TRACE, "get_CallInfoBuffer - enter")); switch( CallInfoBufferType ) { case CIB_USERUSERINFO: hr = get_UserUserInfo( ppCallInfoBuffer ); break; case CIB_DEVSPECIFICBUFFER: hr = get_DevSpecificBuffer( ppCallInfoBuffer ); break; case CIB_CALLDATABUFFER: hr = get_CallDataBuffer( ppCallInfoBuffer ); break; case CIB_CHARGINGINFOBUFFER: hr = get_ChargingInfoBuffer( ppCallInfoBuffer ); break; case CIB_HIGHLEVELCOMPATIBILITYBUFFER: hr = get_HighLevelCompatibilityBuffer( ppCallInfoBuffer ); break; case CIB_LOWLEVELCOMPATIBILITYBUFFER: hr = get_LowLevelCompatibilityBuffer( ppCallInfoBuffer ); break; default: LOG((TL_ERROR, "get_CallInfoBuffer - invalid type")); hr = E_INVALIDARG; } LOG((TL_TRACE, "get_CallInfoBuffer - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::put_CallInfoBuffer( CALLINFO_BUFFER CallInfoBufferType, VARIANT pCallInfoBuffer ) { HRESULT hr = E_FAIL; LOG((TL_TRACE, "put_CallInfoBuffer - enter")); switch( CallInfoBufferType ) { case CIB_USERUSERINFO: hr = put_UserUserInfo( pCallInfoBuffer ); break; case CIB_DEVSPECIFICBUFFER: hr = put_DevSpecificBuffer( pCallInfoBuffer ); break; case CIB_CALLDATABUFFER: hr = put_CallDataBuffer( pCallInfoBuffer ); break; case CIB_CHARGINGINFOBUFFER: LOG((TL_ERROR, "put_CallInfoBuffer - CHARGINGINFOBUFFER not supported")); hr = TAPI_E_NOTSUPPORTED; break; case CIB_HIGHLEVELCOMPATIBILITYBUFFER: hr = put_HighLevelCompatibilityBuffer( pCallInfoBuffer ); break; case CIB_LOWLEVELCOMPATIBILITYBUFFER: hr = put_LowLevelCompatibilityBuffer( pCallInfoBuffer ); break; default: LOG((TL_ERROR, "put_CallInfoBuffer - invalid type")); hr = E_INVALIDARG; } LOG((TL_TRACE, "put_CallInfoBuffer - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::GetCallInfoBuffer( CALLINFO_BUFFER CallInfoBufferType, DWORD * pdwSize, BYTE ** ppCallInfoBuffer ) { HRESULT hr = E_FAIL; LOG((TL_TRACE, "GetCallInfoBuffer - enter")); switch( CallInfoBufferType ) { case CIB_USERUSERINFO: hr = GetUserUserInfo( pdwSize, ppCallInfoBuffer ); break; case CIB_DEVSPECIFICBUFFER: hr = GetDevSpecificBuffer( pdwSize, ppCallInfoBuffer ); break; case CIB_CALLDATABUFFER: hr = GetCallDataBuffer( pdwSize, ppCallInfoBuffer ); break; case CIB_CHARGINGINFOBUFFER: hr = GetChargingInfoBuffer( pdwSize, ppCallInfoBuffer ); break; case CIB_HIGHLEVELCOMPATIBILITYBUFFER: hr = GetHighLevelCompatibilityBuffer( pdwSize, ppCallInfoBuffer ); break; case CIB_LOWLEVELCOMPATIBILITYBUFFER: hr = GetLowLevelCompatibilityBuffer( pdwSize, ppCallInfoBuffer ); break; default: LOG((TL_ERROR, "GetCallInfoBuffer - invalid type")); hr = E_INVALIDARG; } LOG((TL_TRACE, "GetCallInfoBuffer - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::SetCallInfoBuffer( CALLINFO_BUFFER CallInfoBufferType, DWORD dwSize, BYTE * pCallInfoBuffer ) { HRESULT hr = E_FAIL; LOG((TL_TRACE, "SetCallInfoBuffer - enter")); switch( CallInfoBufferType ) { case CIB_USERUSERINFO: hr = SetUserUserInfo( dwSize, pCallInfoBuffer ); break; case CIB_DEVSPECIFICBUFFER: hr = SetDevSpecificBuffer( dwSize, pCallInfoBuffer ); break; case CIB_CALLDATABUFFER: hr = SetCallDataBuffer( dwSize, pCallInfoBuffer ); break; case CIB_CHARGINGINFOBUFFER: LOG((TL_ERROR, "SetCallInfoBuffer - CHARGINGINFOBUFFER not supported")); hr = TAPI_E_NOTSUPPORTED; break; case CIB_HIGHLEVELCOMPATIBILITYBUFFER: hr = SetHighLevelCompatibilityBuffer( dwSize, pCallInfoBuffer ); break; case CIB_LOWLEVELCOMPATIBILITYBUFFER: hr = SetLowLevelCompatibilityBuffer( dwSize, pCallInfoBuffer ); break; default: LOG((TL_ERROR, "SetCallInfoBuffer - invalid type")); hr = E_INVALIDARG; } LOG((TL_TRACE, "SetCallInfoBuffer - exit")); return hr; } #endif #ifndef NEWCALLINFO //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // GetDevSpecificSize // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::GetDevSpecificBufferSize(long * plDevSpecificSize ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_DevSpecificSize - enter")); if ( TAPIIsBadWritePtr( plDevSpecificSize, sizeof(long) ) ) { LOG((TL_ERROR, "get_DevSpecificSize - bad pointer")); return E_POINTER; } Lock(); if ( ISHOULDUSECALLPARAMS() ) { *plDevSpecificSize = m_pCallParams->dwDevSpecificSize; Unlock(); return S_OK; } hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_DevSpecificSize - can't get callinfo - %lx", hr)); Unlock(); return hr; } *plDevSpecificSize = m_pCallInfo->dwDevSpecificSize; Unlock(); LOG((TL_TRACE, "get_DevSpecificSize - exit")); return S_OK; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // GetCallDataBufferSize // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= STDMETHODIMP CCall::GetCallDataBufferSize( long * plSize ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_CallDataSize - enter")); if ( TAPIIsBadWritePtr( plSize, sizeof(long) ) ) { LOG((TL_ERROR, "get_CallDataSize - bad pointer")); return E_POINTER; } Lock(); if ( m_pAddress->GetAPIVersion() < TAPI_VERSION2_0 ) { Unlock(); return TAPI_E_NOTSUPPORTED; } if ( ISHOULDUSECALLPARAMS() ) { *plSize = m_pCallParams->dwCallDataSize; Unlock(); return S_OK; } hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_CallDataSize - can't get callinfo - %lx", hr)); Unlock(); return hr; } *plSize = m_pCallInfo->dwCallDataSize; Unlock(); LOG((TL_TRACE, "get_CallDataSize - exit")); return S_OK; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // GetHighLevelCompatibilityBufferSize // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::GetHighLevelCompatibilityBufferSize(long * plSize ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetHighLevelCompatibilityBufferSize - enter")); if ( TAPIIsBadWritePtr( plSize, sizeof(long) ) ) { LOG((TL_ERROR, "GetHighLevelCompatibilityBufferSize - bad pointer")); return E_POINTER; } Lock(); if ( ISHOULDUSECALLPARAMS() ) { *plSize = m_pCallParams->dwHighLevelCompSize; hr = S_OK; } else { hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { *plSize = m_pCallInfo->dwHighLevelCompSize; } else { *plSize = 0; LOG((TL_ERROR, "GetHighLevelCompatibilityBufferSize - can't get callinfo - %lx", hr)); } } Unlock(); LOG((TL_TRACE, hr, "GetHighLevelCompatibilityBufferSize - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // GetLowLevelCompatibilityBufferSize // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::GetLowLevelCompatibilityBufferSize(long * plSize ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetLowLevelCompatibilityBufferSize - enter")); if ( TAPIIsBadWritePtr( plSize, sizeof(long) ) ) { LOG((TL_ERROR, "GetLowLevelCompatibilityBufferSize - bad pointer")); return E_POINTER; } Lock(); if ( ISHOULDUSECALLPARAMS() ) { *plSize = m_pCallParams->dwLowLevelCompSize; hr = S_OK; } else { hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { *plSize = m_pCallInfo->dwLowLevelCompSize; } else { *plSize = 0; LOG((TL_ERROR, "GetLowLevelCompatibilityBufferSize - can't get callinfo - %lx", hr)); } } Unlock(); LOG((TL_TRACE, hr, "GetLowLevelCompatibilityBufferSize - exit")); return hr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // GetChargingInfoBufferSize // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CCall::GetChargingInfoBufferSize(long * plSize ) { HRESULT hr = S_OK; LOG((TL_TRACE, "GetChargingInfoBufferSize - enter")); if ( TAPIIsBadWritePtr( plSize, sizeof(long) ) ) { LOG((TL_ERROR, "GetChargingInfoBufferSize - bad pointer")); return E_POINTER; } Lock(); hr = RefreshCallInfo(); if ( SUCCEEDED(hr) ) { *plSize = m_pCallInfo->dwChargingInfoSize; } else { *plSize = 0; LOG((TL_ERROR, "GetChargingInfoBufferSize - can't get callinfo - %lx", hr)); } Unlock(); LOG((TL_TRACE, hr, "GetChargingInfoBufferSize - exit")); return hr; } #endif #ifdef NEWCALLINFO //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // put_GenerateDigitDuration // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::put_GenerateDigitDuration( long lGenerateDigitDuration ) { HRESULT hr = S_OK; LOG((TL_TRACE, "put_GenerateDigitDuration - enter")); Lock(); if (ISHOULDUSECALLPARAMS()) { // // validation in tapisrv // m_pCallParams->DialParams.dwDigitDuration = lGenerateDigitDuration; } else { LOG((TL_ERROR, "Can't set generate digit duration")); hr = TAPI_E_INVALCALLSTATE; } LOG((TL_TRACE, "put_GenerateDigitDuration - exit")); Unlock(); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_GenerateDigitDuration // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::get_GenerateDigitDuration( long * plGenerateDigitDuration ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_GenerateDigitDuration - enter")); if ( TAPIIsBadWritePtr( plGenerateDigitDuration, sizeof (long) ) ) { LOG((TL_ERROR, "get_GenerateDigitDuration - bad pointer")); return E_POINTER; } Lock(); if (ISHOULDUSECALLPARAMS()) { *plGenerateDigitDuration = m_pCallParams->DialParams.dwDigitDuration; } else { hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_GenerateDigitDuration - can't get callinfo - %lx", hr)); Unlock(); return hr; } *plGenerateDigitDuration = m_pCallInfo->DialParams.dwDigitDuration; } LOG((TL_TRACE, "get_GenerateDigitDuration - exit")); Unlock(); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_MonitorDigitModes // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::get_MonitorDigitModes( long * plMonitorDigitModes ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_MonitorDigitModes - enter")); if ( TAPIIsBadWritePtr( plMonitorDigitModes, sizeof (long) ) ) { LOG((TL_ERROR, "get_MonitorDigitModes - bad pointer")); return E_POINTER; } Lock(); if (ISHOULDUSECALLPARAMS()) { LOG((TL_ERROR, "get_MonitorDigitModes - invalid call state")); return TAPI_E_INVALCALLSTATE; } else { hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_MonitorDigitModes - can't get callinfo - %lx", hr)); Unlock(); return hr; } *plMonitorDigitModes = m_pCallInfo->dwMonitorDigitModes; } LOG((TL_TRACE, "get_MonitorDigitModes - exit")); Unlock(); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= // // get_MonitorMediaModes // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= HRESULT CCall::get_MonitorMediaModes( long * plMonitorMediaModes ) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_MonitorMediaModes - enter")); if ( TAPIIsBadWritePtr( plMonitorMediaModes, sizeof (long) ) ) { LOG((TL_ERROR, "get_MonitorMediaModes - bad pointer")); return E_POINTER; } Lock(); if (ISHOULDUSECALLPARAMS()) { LOG((TL_ERROR, "get_MonitorMediaModes - invalid call state")); return TAPI_E_INVALCALLSTATE; } else { hr = RefreshCallInfo(); if ( !SUCCEEDED(hr) ) { LOG((TL_ERROR, "get_MonitorMediaModes - can't get callinfo - %lx", hr)); Unlock(); return hr; } *plMonitorMediaModes = m_pCallInfo->dwMonitorMediaModes; } LOG((TL_TRACE, "get_MonitorMediaModes - exit")); Unlock(); return hr; } #endif