diff -r 6b1d113cdff3 -r 6638e7f4bd8f telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmdtmftsy.cpp --- a/telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmdtmftsy.cpp Mon May 03 13:37:20 2010 +0300 +++ b/telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmdtmftsy.cpp Thu May 06 15:10:38 2010 +0100 @@ -1,785 +1,785 @@ -// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// - - - -//INCLUDE FILES -#include "cmmdtmftsy.h" -#include -#include - -// include internal Tsy classes -#include "cmmphonetsy.h" -#include "cmmtsyreqhandlestore.h" -#include "cmmcalltsy.h" -#include "cmmcalllist.h" -#include - -// ======== MEMBER FUNCTIONS ======== - -CMmDtmfTsy::CMmDtmfTsy() - { - } - -void CMmDtmfTsy::ConstructL() - { - iSendDTMFTonesCancelFlag = EFalse; - iDtmfType = EDtmfTypeUnknown; - - //register dtmf tsy in the message manager - iMmPhone->MessageManager()->RegisterTsyObject( - CMmMessageManagerBase::EDtmfTsy, this ); - } - -CMmDtmfTsy* CMmDtmfTsy::NewL( - CMmPhoneTsy* aPhoneTsy ) // Pointer to PhoneTsy - { - CMmDtmfTsy* self = new ( ELeave ) CMmDtmfTsy; - - // this cannot leave: - self->iMmPhone = aPhoneTsy; - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop(); - - return self; - } - -CMmDtmfTsy::~CMmDtmfTsy() - { - TFLOGSTRING("TSY: CMmDtmfTsy::~CMmDtmfTsy"); - if (iMmPhone ) - { - // deregister tsy object from message manager - iMmPhone->MessageManager()->DeregisterTsyObject(this); - } - iMmPhone = NULL; - iDTMFStringToContinue.Zero(); - iRetDtmfCaps = NULL; - } - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::DoExtFuncL -// DTMF-specific functionality of CMmPhoneTsy::DoExtFuncL -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -TInt CMmDtmfTsy::DoExtFuncL( - const TTsyReqHandle aTsyReqHandle, - const TInt aIpc, - const TDataPackage& aPackage ) - - { - TInt ret = KErrNone; - TAny* dataPtr = aPackage.Ptr1(); - TBool cont ( EFalse ); - - switch ( aIpc ) - { - // supported DTMF features - - // Get DTMF Caps - case EMobilePhoneGetDTMFCaps: - ret = GetDTMFCaps( aTsyReqHandle, - reinterpret_cast( dataPtr ) ); - break; - // Notify Change of DTMF Capabilities - case EMobilePhoneNotifyDTMFCapsChange: - ret = NotifyDTMFCapsChange( - reinterpret_cast( dataPtr ) ); - break; - // Send DTMF Tones - case EMobilePhoneSendDTMFTones: - ret = SendDTMFTonesL( aTsyReqHandle, aPackage.Des1u() ); - break; - // Start DTMF Tone - case EMobilePhoneStartDTMFTone: - ret = StartDTMFToneL( aTsyReqHandle, - reinterpret_cast( dataPtr ) ); - break; - // Stop DTMF Tone - case EMobilePhoneStopDTMFTone: - ret = StopDTMFToneL( aTsyReqHandle ); - break; - // Notify Stop in DTMF String - case EMobilePhoneNotifyStopInDTMFString: - ret = NotifyStopInDTMFString(); - break; - // Continue or Stop DTMF String Sending - case EMobilePhoneContinueDTMFStringSending: - cont = * ( reinterpret_cast( dataPtr ) ); - ret = ContinueDTMFStringSendingL( aTsyReqHandle, cont ); - break; - case EMobilePhoneNotifyDTMFEvent: - ret = NotifyDTMFEvent( reinterpret_cast( dataPtr ) ); - break; - // not supported DTMF features - case EMobilePhoneReadDTMFTones: - ret = KErrNotSupported; - break; - // error case - default: - // this method should only be called for DTMF cases - ret = KErrArgument; - break; - } - - return ret; - } - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::NotifyDtmfEvent -// Request for Notification of DTMF event received from client. -// --------------------------------------------------------------------------- -TInt CMmDtmfTsy::NotifyDTMFEvent( TInt* aInfo ) - { -TFLOGSTRING("TSY: CMmDtmfTsy::NotifyDTMFEvent"); - - iDtmfInfo = aInfo; // save pointer to client data - - // save handle type - iMmPhone->iReqHandleType = CMmPhoneTsy::EMultimodePhoneNotifyDtmfEvent; - - return KErrNone; - } - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::CompleteNotifyDtmfEvent -// Notifies client that a DTMF event has occurred. -// --------------------------------------------------------------------------- -// -void CMmDtmfTsy::CompleteNotifyDTMFEvent( TInt aInfo ) - { -TFLOGSTRING("TSY: CMmCustomTsy::CompleteNotifyDtmfEvent"); - // reset request handle. Returns the deleted req handle. - TTsyReqHandle reqHandle = - iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneNotifyDtmfEvent ); - - // check if request was called - if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle ) - { - *iDtmfInfo = aInfo; - iDtmfInfo=NULL; - iMmPhone->ReqCompleted( reqHandle, KErrNone ); - } - } - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::NotifyDTMFEventCancel -// Cancels a notification request. -// --------------------------------------------------------------------------- -TInt CMmDtmfTsy::NotifyDTMFEventCancel( const TTsyReqHandle aTsyReqHandle ) - { -TFLOGSTRING("TSY: CMmDtmfTsy::NotifyDtmfEventCancel"); - - iDtmfInfo = NULL; - TTsyReqHandle reqHandle = - iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneNotifyDtmfEvent ); - iMmPhone->ReqCompleted( aTsyReqHandle, KErrCancel ); - - return KErrNone; - } - - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::CancelService -// Cancels DTMF requests. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -TInt CMmDtmfTsy::CancelService( - const TInt aIpc, - const TTsyReqHandle aTsyReqHandle ) - { - TInt ret ( KErrNotSupported ); - TInt trapError = KErrNone; - switch ( aIpc ) - { - case EMobilePhoneNotifyDTMFCapsChange: - ret = NotifyDTMFCapsChangeCancel( aTsyReqHandle ); - break; - case EMobilePhoneNotifyStopInDTMFString: - ret = NotifyStopInDTMFStringCancel( aTsyReqHandle ); - break; - case EMobilePhoneSendDTMFTones: - // Note: it is silently ignored if SendDTMFTonesCancelL - // leaves here (it's just a cancellation) - TRAP( trapError, - ret = SendDTMFTonesCancelL(); - ); - if ( KErrNone != trapError ) - { - return trapError; - } - break; - case EMobilePhoneNotifyDTMFEvent: - ret = NotifyDTMFEventCancel(aTsyReqHandle); - break; - // error case - default: - // this method should only be called for DTMF cases - ret = KErrArgument; - break; - } - - return ret; - } -#ifndef USING_CTSY_DISPATCHER -// --------------------------------------------------------------------------- -// CMmDtmfTsy::Complete -// Completes the request due timer expiration. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -void CMmDtmfTsy::Complete( - TInt aReqHandleType, - TInt ) - { - switch( aReqHandleType ) - { - // there is only one DTMF case with a defined timeout - case CMmPhoneTsy::EMultimodePhoneSendDTMFTones: - CompleteSendDTMFTones( KErrTimedOut ); - break; - default: - // ignore - break; - } - } -#endif // USING_CTSY_DISPATCHER - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::GetDtmfType -// Returns value of internal attribute iDtmfType. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -CMmDtmfTsy::TDtmfType CMmDtmfTsy::GetDtmfType() - { - return iDtmfType; - } - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::GetDTMFCaps -// This function returns the DTMF capabilities of the phone in -// the aCaps parameter. The DTMF capabilities can change -// dynamically for example when the call becomes active or is -// closed. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -TInt CMmDtmfTsy::GetDTMFCaps( - const TTsyReqHandle aTsyReqHandle, // Tsy request handle - TUint32* aCaps ) // on return, contains the capabilities - { - //Set initial value for capabilities - *aCaps = 0; - //Get the number of active Calls in list of calls - TInt count = ActiveCalls(); - //Search the Calls in call list and check if at least one call is active - if(count > 0) - { - *aCaps = RMobilePhone::KCapsSendDTMFString | - RMobilePhone::KCapsSendDTMFSingleTone; - } - - // Complete the request - iMmPhone->ReqCompleted( aTsyReqHandle, KErrNone ); - - return KErrNone; - } - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::NotifyDTMFCapsChange -// This function is used to request notifications about changes -// in DTMF capabilities. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -TInt CMmDtmfTsy::NotifyDTMFCapsChange( - TUint32* aCaps ) - { - iRetDtmfCaps = aCaps; - iMmPhone->iReqHandleType = CMmPhoneTsy::EMultimodePhoneNotifyDTMFCaps; - - return KErrNone; - } - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::NotifyDTMFCapsChangeCancel -// Cancels DTMF capabilities notification request. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -TInt CMmDtmfTsy::NotifyDTMFCapsChangeCancel( - const TTsyReqHandle aTsyReqHandle ) - { - iRetDtmfCaps = NULL; - iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneNotifyDTMFCaps ); - iMmPhone->ReqCompleted( aTsyReqHandle, KErrCancel ); - - return KErrNone; - } - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::CompleteNotifyDTMFCaps -// Notifies client about changes in DTMF capabilities if the -// client has requested DTMF change notifications. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -void CMmDtmfTsy::CompleteNotifyDTMFCaps() - { - //reset req handle. Returns the deleted req handle - TTsyReqHandle reqHandle - = iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneNotifyDTMFCaps ); - - if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle ) - { - GetDTMFCaps( reqHandle, iRetDtmfCaps ); - iRetDtmfCaps = NULL; - iMmPhone->ReqCompleted( reqHandle, KErrNone ); - } - - } -#ifndef USING_CTSY_DISPATCHER -// --------------------------------------------------------------------------- -// CMmDtmfTsy::SendDTMFTonesL -// Sends burst DTMF tones. The DTMF tones to be sent are given -// in the parameter and the DTMF string can contain one or more DTMF -// characters. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -TInt CMmDtmfTsy::SendDTMFTonesL( - const TTsyReqHandle aTsyReqHandle, // Request handle - const TDesC* aTones ) // DTMF tone string to be sent - { - if( aTones->Length() == 0 ) - { - return KErrArgument; - } - if( aTones->Length() > KDtmfStringMaxLength) - { - return KErrArgument; - } - //check if handle is not in use already - TTsyReqHandle sendDTMFTonesHandle = iMmPhone->iTsyReqHandleStore - ->GetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); - - if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown == sendDTMFTonesHandle ) - { - // packed parameter for DOS call: tones - // Check if there is an active call - if(ActiveCalls() == 0) - { - return KErrEtelCallNotActive; - } - CMmDataPackage dataPackage; - dataPackage.PackData( const_cast( aTones ) ); - TInt ret = iMmPhone->MessageManager()->HandleRequestL( - EMobilePhoneSendDTMFTones, - &dataPackage - ); - // Save the type of the DTMF - iDtmfType = EDtmfTypeString; - - if ( KErrNone != ret ) - { - // DTMF string sending has failed - iMmPhone->ReqCompleted( aTsyReqHandle, ret ); - } - else - { - iMmPhone->iReqHandleType = - CMmPhoneTsy::EMultimodePhoneSendDTMFTones; - } - - return KErrNone; - } - else - { - return KErrServerBusy; - } - - } -#endif // #ifndef USING_CTSY_DISPATCHER -// --------------------------------------------------------------------------- -// CMmDtmfTsy::CompleteSendDTMFTones -// This function should be called when DTMF string has been sent to -// the network. The function completes SendDTMFTones request to the -// client. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -void CMmDtmfTsy::CompleteSendDTMFTones( - TInt aResult ) // error code - { - // Get req handle. - TTsyReqHandle reqHandle = iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); - - if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle ) - { - iDTMFStringToContinue.Zero(); - iMmPhone->ReqCompleted( reqHandle, aResult ); - } - - } - -#ifndef USING_CTSY_DISPATCHER -// --------------------------------------------------------------------------- -// CMmDtmfTsy::SendDTMFTonesCancelL -// Cancels DTMF tone sending. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -TInt CMmDtmfTsy::SendDTMFTonesCancelL() - { -TFLOGSTRING("TSY: CMmDtmfTsy::SendDTMFTonesCancel"); - - TTsyReqHandle sendDTMFTonesHandle = - iMmPhone->iTsyReqHandleStore->GetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); - - if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != sendDTMFTonesHandle ) - { - // no packed parameter for DOS call - CMmDataPackage dummyPackage; - TInt ret = iMmPhone->MessageManager()->HandleRequestL( - EMobilePhoneSendDTMFTonesCancel, - &dummyPackage - ); - if ( KErrNone == ret ) - { - // Set the DTMFTonesCancelFlag - iSendDTMFTonesCancelFlag = ETrue; - } - } - - return KErrNone; - } -#endif // USING_CTSY_DISPATCHER - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::CompleteSendDTMFTonesCancel -// Complete cancel of sending DTMF tones. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -void CMmDtmfTsy::CompleteSendDTMFTonesCancel( - TInt aResult ) - { -TFLOGSTRING("TSY: CMmDtmfTsy::CompleteSendDTMFTonesCancel"); - - // Get req handle. - TTsyReqHandle reqHandle = iMmPhone->iTsyReqHandleStore->GetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); - - if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle ) - { - // If cancel has not succeeded, just discard the message. - if ( iSendDTMFTonesCancelFlag ) - { - // Cancel has succeeded. Complete original request and - // reset handle - iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); - - iMmPhone->ReqCompleted( reqHandle, KErrCancel ); - } - else - { - CompleteSendDTMFTones( aResult ); - } - } - } -#ifndef USING_CTSY_DISPATCHER -// --------------------------------------------------------------------------- -// CMmDtmfTsy::StartDTMFToneL -// This function starts a single DTMF tone sending. The tone -// is played until it is stopped using StopDTMFTone method. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -TInt CMmDtmfTsy::StartDTMFToneL( - const TTsyReqHandle aTsyReqHandle, - TChar* aTone ) - { - TInt ret = KErrServerBusy; - - // Check if request handle already exists - TTsyReqHandle startDtmftoneHandle = - iMmPhone->iTsyReqHandleStore->GetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneStartDTMFTone ); - - if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != startDtmftoneHandle ) - { - iMmPhone->ReqCompleted( aTsyReqHandle, ret ); - } - else - { - - ret = KErrUnknown; - // packed parameter for DOS call: tone - CMmDataPackage dataPackage; - dataPackage.PackData( aTone ); - ret = iMmPhone->MessageManager()->HandleRequestL( - EMobilePhoneStartDTMFTone, - &dataPackage - ); - - if ( KErrNone == ret ) - { - // Save the type of the DTMF - iDtmfType = EDtmfTypeDigit; - } - - iMmPhone->ReqCompleted( aTsyReqHandle, ret ); - - } - - return KErrNone; - } - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::StopDTMFToneL -// Stops playing of a single DTMF tone. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -TInt CMmDtmfTsy::StopDTMFToneL( - const TTsyReqHandle aTsyReqHandle ) - { - TInt ret = KErrServerBusy; - - // Check if request handle already exists - TTsyReqHandle stopDtmftoneHandle = - iMmPhone->iTsyReqHandleStore->GetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneStopDTMFTone ); - - if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != stopDtmftoneHandle ) - { - iMmPhone->ReqCompleted( aTsyReqHandle, ret ); - } - else - { - // no packed parameter for DOS call - CMmDataPackage dummyPackage; - ret = iMmPhone->MessageManager()->HandleRequestL( - EMobilePhoneStopDTMFTone, - &dummyPackage - ); - - if ( KErrNone == ret ) - { - // Save the type of the DTMF - iDtmfType = EDtmfTypeDigit; - } - - iMmPhone->ReqCompleted( aTsyReqHandle, ret ); - } - - return KErrNone; - } -#endif //USING_CTSY_DISPATCHER -// --------------------------------------------------------------------------- -// CMmDtmfTsy::NotifyStopInDTMFString -// Notifies the client when the phone has encountered a "w" char -// during the sending of a DTMF string. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -TInt CMmDtmfTsy::NotifyStopInDTMFString() - { -TFLOGSTRING("TSY: CMmDtmfTsy::NotifyStopInDTMFString"); - //Set TSY request handle type - iMmPhone->iReqHandleType = - CMmPhoneTsy::EMultimodePhoneNotifyStopInDTMFString; - - return KErrNone; - } - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::NotifyStopInDTMFStringCancel -// Cancel NotifyStopInDTMFString request. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -TInt CMmDtmfTsy::NotifyStopInDTMFStringCancel( - const TTsyReqHandle aTsyReqHandle ) - { - iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneNotifyStopInDTMFString ); - - iMmPhone->ReqCompleted( aTsyReqHandle, KErrCancel ); - - return KErrNone; - } - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::CompleteNotifyStopInDTMFString -// Complete notify 'w' in DTMF string. This means that DTMF -// string sending is stopped until client calls ContinueDTMFStringSendingL. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -void CMmDtmfTsy::CompleteNotifyStopInDTMFString( - CMmDataPackage* aDataPackage ) - { -TFLOGSTRING("TSY: CMmDtmfTsy::CompleteNotifyStopInDTMFString"); - // Reset req handle. Returns the deleted req handle - TTsyReqHandle reqHandle = iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneNotifyStopInDTMFString ); - - if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle ) - { - iDTMFStringToContinue.Zero(); - //Unpack data - aDataPackage->UnPackData( iDTMFStringToContinue ); - - // Complete the client request - iMmPhone->ReqCompleted( reqHandle, KErrNone ); - } - } - -// --------------------------------------------------------------------------- -// CMmDtmfTsy::ContinueDTMFStringSendingL -// Continues or cancels the stopped DTMF string sending. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -TInt CMmDtmfTsy::ContinueDTMFStringSendingL( - const TTsyReqHandle aTsyReqHandle, - TBool aContinue ) - - { -TFLOGSTRING2("TSY: CMmDtmfTsy::ContinueDTMFStringSendingL aContinue:%d",aContinue); - TInt ret( KErrNone ); - - TTsyReqHandle sendDTMFTonesHandle = - iMmPhone->iTsyReqHandleStore->GetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); - - if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != sendDTMFTonesHandle ) - { - if ( 0 < iDTMFStringToContinue.Length() ) - { - // Continue or cancel sending depending on the boolean value - if ( aContinue ) - { - - // Continue DTMF string sending - CMmDataPackage dataPackage; - // packed parameter for DOS call: tones to continue - dataPackage.PackData( &iDTMFStringToContinue ); - ret = iMmPhone->MessageManager()->HandleRequestL( - EMobilePhoneContinueDTMFStringSending, - &dataPackage - ); - } - else // Cancel sending - { - ret = KErrAbort; - } - } - else if ( 0 == iDTMFStringToContinue.Length() ) - { - // Last character was a 'w' so do the cleanup and complete requ - CompleteSendDTMFTones( KErrNone ); - } - else - { - // iDTMFStringToContinue is NULL - ret = KErrGeneral; - } - } - else - { - // DTMF sending not going on. Complete request - ret = KErrNotReady; - } - - //Complete ContinueDTMFStringSending request - if ( KErrNone == ret || KErrAbort == ret ) - { - // Complete continue request with KErrNone - iMmPhone->ReqCompleted( aTsyReqHandle, KErrNone ); - } - else - { - // Complete continue request with error value - iMmPhone->ReqCompleted( aTsyReqHandle, ret ); - } - - //Error occurred or DTMF sending aborted - if ( KErrNone != ret ) - { - iDTMFStringToContinue.Zero(); - - // Complete SendDTMFTones request if user cancelled DTMF sending - // or DTMF string sending failed, - if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown - != sendDTMFTonesHandle ) - { - // Reset SendDTMFTones request handle - iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( - CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); - - // Client has cancelled DTMF sending or sending failed. - iMmPhone->ReqCompleted( sendDTMFTonesHandle, ret ); - } - } - - return KErrNone; - } - - -TInt CMmDtmfTsy::ActiveCalls() const - { - TInt ret = 0; - CMmCallList* list = iMmPhone->CallList(); - //Get the number of Calls in list of calls - TInt count = list->GetNumberOfObjects(); - for ( TInt i = 0; i < count; i++ ) - { - CMmCallTsy* mmCall = list->GetMmCallByIndex( i ); - if ( mmCall ) - { - // get call status - RCall::TStatus callStatus = mmCall->Status(); - if ( RCall::EStatusConnected == callStatus) - { - // get service type of call - RMobileCall::TMobileCallInfoV1 info; - RMobileCall::TMobileCallInfoV1Pckg infoPckg(info); - mmCall->FillMobileCallInfo(&infoPckg); - RMobilePhone::TMobileService callService = info.iService; - //If the call is a voice call - if ( (RMobilePhone::EVoiceService == callService) || (RMobilePhone::EAuxVoiceService == callService)) - { - ++ret; - } - } - } - } - return ret; - - } -// End of File +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + + +//INCLUDE FILES +#include "cmmdtmftsy.h" +#include +#include + +// include internal Tsy classes +#include "cmmphonetsy.h" +#include "cmmtsyreqhandlestore.h" +#include "cmmcalltsy.h" +#include "cmmcalllist.h" +#include + +// ======== MEMBER FUNCTIONS ======== + +CMmDtmfTsy::CMmDtmfTsy() + { + } + +void CMmDtmfTsy::ConstructL() + { + iSendDTMFTonesCancelFlag = EFalse; + iDtmfType = EDtmfTypeUnknown; + + //register dtmf tsy in the message manager + iMmPhone->MessageManager()->RegisterTsyObject( + CMmMessageManagerBase::EDtmfTsy, this ); + } + +CMmDtmfTsy* CMmDtmfTsy::NewL( + CMmPhoneTsy* aPhoneTsy ) // Pointer to PhoneTsy + { + CMmDtmfTsy* self = new ( ELeave ) CMmDtmfTsy; + + // this cannot leave: + self->iMmPhone = aPhoneTsy; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + +CMmDtmfTsy::~CMmDtmfTsy() + { + TFLOGSTRING("TSY: CMmDtmfTsy::~CMmDtmfTsy"); + if (iMmPhone ) + { + // deregister tsy object from message manager + iMmPhone->MessageManager()->DeregisterTsyObject(this); + } + iMmPhone = NULL; + iDTMFStringToContinue.Zero(); + iRetDtmfCaps = NULL; + } + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::DoExtFuncL +// DTMF-specific functionality of CMmPhoneTsy::DoExtFuncL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmDtmfTsy::DoExtFuncL( + const TTsyReqHandle aTsyReqHandle, + const TInt aIpc, + const TDataPackage& aPackage ) + + { + TInt ret = KErrNone; + TAny* dataPtr = aPackage.Ptr1(); + TBool cont ( EFalse ); + + switch ( aIpc ) + { + // supported DTMF features + + // Get DTMF Caps + case EMobilePhoneGetDTMFCaps: + ret = GetDTMFCaps( aTsyReqHandle, + reinterpret_cast( dataPtr ) ); + break; + // Notify Change of DTMF Capabilities + case EMobilePhoneNotifyDTMFCapsChange: + ret = NotifyDTMFCapsChange( + reinterpret_cast( dataPtr ) ); + break; + // Send DTMF Tones + case EMobilePhoneSendDTMFTones: + ret = SendDTMFTonesL( aTsyReqHandle, aPackage.Des1u() ); + break; + // Start DTMF Tone + case EMobilePhoneStartDTMFTone: + ret = StartDTMFToneL( aTsyReqHandle, + reinterpret_cast( dataPtr ) ); + break; + // Stop DTMF Tone + case EMobilePhoneStopDTMFTone: + ret = StopDTMFToneL( aTsyReqHandle ); + break; + // Notify Stop in DTMF String + case EMobilePhoneNotifyStopInDTMFString: + ret = NotifyStopInDTMFString(); + break; + // Continue or Stop DTMF String Sending + case EMobilePhoneContinueDTMFStringSending: + cont = * ( reinterpret_cast( dataPtr ) ); + ret = ContinueDTMFStringSendingL( aTsyReqHandle, cont ); + break; + case EMobilePhoneNotifyDTMFEvent: + ret = NotifyDTMFEvent( reinterpret_cast( dataPtr ) ); + break; + // not supported DTMF features + case EMobilePhoneReadDTMFTones: + ret = KErrNotSupported; + break; + // error case + default: + // this method should only be called for DTMF cases + ret = KErrArgument; + break; + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::NotifyDtmfEvent +// Request for Notification of DTMF event received from client. +// --------------------------------------------------------------------------- +TInt CMmDtmfTsy::NotifyDTMFEvent( TInt* aInfo ) + { +TFLOGSTRING("TSY: CMmDtmfTsy::NotifyDTMFEvent"); + + iDtmfInfo = aInfo; // save pointer to client data + + // save handle type + iMmPhone->iReqHandleType = CMmPhoneTsy::EMultimodePhoneNotifyDtmfEvent; + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::CompleteNotifyDtmfEvent +// Notifies client that a DTMF event has occurred. +// --------------------------------------------------------------------------- +// +void CMmDtmfTsy::CompleteNotifyDTMFEvent( TInt aInfo ) + { +TFLOGSTRING("TSY: CMmCustomTsy::CompleteNotifyDtmfEvent"); + // reset request handle. Returns the deleted req handle. + TTsyReqHandle reqHandle = + iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneNotifyDtmfEvent ); + + // check if request was called + if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle ) + { + *iDtmfInfo = aInfo; + iDtmfInfo=NULL; + iMmPhone->ReqCompleted( reqHandle, KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::NotifyDTMFEventCancel +// Cancels a notification request. +// --------------------------------------------------------------------------- +TInt CMmDtmfTsy::NotifyDTMFEventCancel( const TTsyReqHandle aTsyReqHandle ) + { +TFLOGSTRING("TSY: CMmDtmfTsy::NotifyDtmfEventCancel"); + + iDtmfInfo = NULL; + TTsyReqHandle reqHandle = + iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneNotifyDtmfEvent ); + iMmPhone->ReqCompleted( aTsyReqHandle, KErrCancel ); + + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::CancelService +// Cancels DTMF requests. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmDtmfTsy::CancelService( + const TInt aIpc, + const TTsyReqHandle aTsyReqHandle ) + { + TInt ret ( KErrNotSupported ); + TInt trapError = KErrNone; + switch ( aIpc ) + { + case EMobilePhoneNotifyDTMFCapsChange: + ret = NotifyDTMFCapsChangeCancel( aTsyReqHandle ); + break; + case EMobilePhoneNotifyStopInDTMFString: + ret = NotifyStopInDTMFStringCancel( aTsyReqHandle ); + break; + case EMobilePhoneSendDTMFTones: + // Note: it is silently ignored if SendDTMFTonesCancelL + // leaves here (it's just a cancellation) + TRAP( trapError, + ret = SendDTMFTonesCancelL(); + ); + if ( KErrNone != trapError ) + { + return trapError; + } + break; + case EMobilePhoneNotifyDTMFEvent: + ret = NotifyDTMFEventCancel(aTsyReqHandle); + break; + // error case + default: + // this method should only be called for DTMF cases + ret = KErrArgument; + break; + } + + return ret; + } +#ifndef USING_CTSY_DISPATCHER +// --------------------------------------------------------------------------- +// CMmDtmfTsy::Complete +// Completes the request due timer expiration. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CMmDtmfTsy::Complete( + TInt aReqHandleType, + TInt ) + { + switch( aReqHandleType ) + { + // there is only one DTMF case with a defined timeout + case CMmPhoneTsy::EMultimodePhoneSendDTMFTones: + CompleteSendDTMFTones( KErrTimedOut ); + break; + default: + // ignore + break; + } + } +#endif // USING_CTSY_DISPATCHER + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::GetDtmfType +// Returns value of internal attribute iDtmfType. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +CMmDtmfTsy::TDtmfType CMmDtmfTsy::GetDtmfType() + { + return iDtmfType; + } + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::GetDTMFCaps +// This function returns the DTMF capabilities of the phone in +// the aCaps parameter. The DTMF capabilities can change +// dynamically for example when the call becomes active or is +// closed. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmDtmfTsy::GetDTMFCaps( + const TTsyReqHandle aTsyReqHandle, // Tsy request handle + TUint32* aCaps ) // on return, contains the capabilities + { + //Set initial value for capabilities + *aCaps = 0; + //Get the number of active Calls in list of calls + TInt count = ActiveCalls(); + //Search the Calls in call list and check if at least one call is active + if(count > 0) + { + *aCaps = RMobilePhone::KCapsSendDTMFString | + RMobilePhone::KCapsSendDTMFSingleTone; + } + + // Complete the request + iMmPhone->ReqCompleted( aTsyReqHandle, KErrNone ); + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::NotifyDTMFCapsChange +// This function is used to request notifications about changes +// in DTMF capabilities. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmDtmfTsy::NotifyDTMFCapsChange( + TUint32* aCaps ) + { + iRetDtmfCaps = aCaps; + iMmPhone->iReqHandleType = CMmPhoneTsy::EMultimodePhoneNotifyDTMFCaps; + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::NotifyDTMFCapsChangeCancel +// Cancels DTMF capabilities notification request. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmDtmfTsy::NotifyDTMFCapsChangeCancel( + const TTsyReqHandle aTsyReqHandle ) + { + iRetDtmfCaps = NULL; + iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneNotifyDTMFCaps ); + iMmPhone->ReqCompleted( aTsyReqHandle, KErrCancel ); + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::CompleteNotifyDTMFCaps +// Notifies client about changes in DTMF capabilities if the +// client has requested DTMF change notifications. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CMmDtmfTsy::CompleteNotifyDTMFCaps() + { + //reset req handle. Returns the deleted req handle + TTsyReqHandle reqHandle + = iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneNotifyDTMFCaps ); + + if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle ) + { + GetDTMFCaps( reqHandle, iRetDtmfCaps ); + iRetDtmfCaps = NULL; + iMmPhone->ReqCompleted( reqHandle, KErrNone ); + } + + } +#ifndef USING_CTSY_DISPATCHER +// --------------------------------------------------------------------------- +// CMmDtmfTsy::SendDTMFTonesL +// Sends burst DTMF tones. The DTMF tones to be sent are given +// in the parameter and the DTMF string can contain one or more DTMF +// characters. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmDtmfTsy::SendDTMFTonesL( + const TTsyReqHandle aTsyReqHandle, // Request handle + const TDesC* aTones ) // DTMF tone string to be sent + { + if( aTones->Length() == 0 ) + { + return KErrArgument; + } + if( aTones->Length() > KDtmfStringMaxLength) + { + return KErrArgument; + } + //check if handle is not in use already + TTsyReqHandle sendDTMFTonesHandle = iMmPhone->iTsyReqHandleStore + ->GetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); + + if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown == sendDTMFTonesHandle ) + { + // packed parameter for DOS call: tones + // Check if there is an active call + if(ActiveCalls() == 0) + { + return KErrEtelCallNotActive; + } + CMmDataPackage dataPackage; + dataPackage.PackData( const_cast( aTones ) ); + TInt ret = iMmPhone->MessageManager()->HandleRequestL( + EMobilePhoneSendDTMFTones, + &dataPackage + ); + // Save the type of the DTMF + iDtmfType = EDtmfTypeString; + + if ( KErrNone != ret ) + { + // DTMF string sending has failed + iMmPhone->ReqCompleted( aTsyReqHandle, ret ); + } + else + { + iMmPhone->iReqHandleType = + CMmPhoneTsy::EMultimodePhoneSendDTMFTones; + } + + return KErrNone; + } + else + { + return KErrServerBusy; + } + + } +#endif // #ifndef USING_CTSY_DISPATCHER +// --------------------------------------------------------------------------- +// CMmDtmfTsy::CompleteSendDTMFTones +// This function should be called when DTMF string has been sent to +// the network. The function completes SendDTMFTones request to the +// client. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CMmDtmfTsy::CompleteSendDTMFTones( + TInt aResult ) // error code + { + // Get req handle. + TTsyReqHandle reqHandle = iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); + + if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle ) + { + iDTMFStringToContinue.Zero(); + iMmPhone->ReqCompleted( reqHandle, aResult ); + } + + } + +#ifndef USING_CTSY_DISPATCHER +// --------------------------------------------------------------------------- +// CMmDtmfTsy::SendDTMFTonesCancelL +// Cancels DTMF tone sending. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmDtmfTsy::SendDTMFTonesCancelL() + { +TFLOGSTRING("TSY: CMmDtmfTsy::SendDTMFTonesCancel"); + + TTsyReqHandle sendDTMFTonesHandle = + iMmPhone->iTsyReqHandleStore->GetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); + + if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != sendDTMFTonesHandle ) + { + // no packed parameter for DOS call + CMmDataPackage dummyPackage; + TInt ret = iMmPhone->MessageManager()->HandleRequestL( + EMobilePhoneSendDTMFTonesCancel, + &dummyPackage + ); + if ( KErrNone == ret ) + { + // Set the DTMFTonesCancelFlag + iSendDTMFTonesCancelFlag = ETrue; + } + } + + return KErrNone; + } +#endif // USING_CTSY_DISPATCHER + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::CompleteSendDTMFTonesCancel +// Complete cancel of sending DTMF tones. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CMmDtmfTsy::CompleteSendDTMFTonesCancel( + TInt aResult ) + { +TFLOGSTRING("TSY: CMmDtmfTsy::CompleteSendDTMFTonesCancel"); + + // Get req handle. + TTsyReqHandle reqHandle = iMmPhone->iTsyReqHandleStore->GetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); + + if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle ) + { + // If cancel has not succeeded, just discard the message. + if ( iSendDTMFTonesCancelFlag ) + { + // Cancel has succeeded. Complete original request and + // reset handle + iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); + + iMmPhone->ReqCompleted( reqHandle, KErrCancel ); + } + else + { + CompleteSendDTMFTones( aResult ); + } + } + } +#ifndef USING_CTSY_DISPATCHER +// --------------------------------------------------------------------------- +// CMmDtmfTsy::StartDTMFToneL +// This function starts a single DTMF tone sending. The tone +// is played until it is stopped using StopDTMFTone method. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmDtmfTsy::StartDTMFToneL( + const TTsyReqHandle aTsyReqHandle, + TChar* aTone ) + { + TInt ret = KErrServerBusy; + + // Check if request handle already exists + TTsyReqHandle startDtmftoneHandle = + iMmPhone->iTsyReqHandleStore->GetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneStartDTMFTone ); + + if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != startDtmftoneHandle ) + { + iMmPhone->ReqCompleted( aTsyReqHandle, ret ); + } + else + { + + ret = KErrUnknown; + // packed parameter for DOS call: tone + CMmDataPackage dataPackage; + dataPackage.PackData( aTone ); + ret = iMmPhone->MessageManager()->HandleRequestL( + EMobilePhoneStartDTMFTone, + &dataPackage + ); + + if ( KErrNone == ret ) + { + // Save the type of the DTMF + iDtmfType = EDtmfTypeDigit; + } + + iMmPhone->ReqCompleted( aTsyReqHandle, ret ); + + } + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::StopDTMFToneL +// Stops playing of a single DTMF tone. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmDtmfTsy::StopDTMFToneL( + const TTsyReqHandle aTsyReqHandle ) + { + TInt ret = KErrServerBusy; + + // Check if request handle already exists + TTsyReqHandle stopDtmftoneHandle = + iMmPhone->iTsyReqHandleStore->GetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneStopDTMFTone ); + + if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != stopDtmftoneHandle ) + { + iMmPhone->ReqCompleted( aTsyReqHandle, ret ); + } + else + { + // no packed parameter for DOS call + CMmDataPackage dummyPackage; + ret = iMmPhone->MessageManager()->HandleRequestL( + EMobilePhoneStopDTMFTone, + &dummyPackage + ); + + if ( KErrNone == ret ) + { + // Save the type of the DTMF + iDtmfType = EDtmfTypeDigit; + } + + iMmPhone->ReqCompleted( aTsyReqHandle, ret ); + } + + return KErrNone; + } +#endif //USING_CTSY_DISPATCHER +// --------------------------------------------------------------------------- +// CMmDtmfTsy::NotifyStopInDTMFString +// Notifies the client when the phone has encountered a "w" char +// during the sending of a DTMF string. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmDtmfTsy::NotifyStopInDTMFString() + { +TFLOGSTRING("TSY: CMmDtmfTsy::NotifyStopInDTMFString"); + //Set TSY request handle type + iMmPhone->iReqHandleType = + CMmPhoneTsy::EMultimodePhoneNotifyStopInDTMFString; + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::NotifyStopInDTMFStringCancel +// Cancel NotifyStopInDTMFString request. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmDtmfTsy::NotifyStopInDTMFStringCancel( + const TTsyReqHandle aTsyReqHandle ) + { + iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneNotifyStopInDTMFString ); + + iMmPhone->ReqCompleted( aTsyReqHandle, KErrCancel ); + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::CompleteNotifyStopInDTMFString +// Complete notify 'w' in DTMF string. This means that DTMF +// string sending is stopped until client calls ContinueDTMFStringSendingL. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CMmDtmfTsy::CompleteNotifyStopInDTMFString( + CMmDataPackage* aDataPackage ) + { +TFLOGSTRING("TSY: CMmDtmfTsy::CompleteNotifyStopInDTMFString"); + // Reset req handle. Returns the deleted req handle + TTsyReqHandle reqHandle = iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneNotifyStopInDTMFString ); + + if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle ) + { + iDTMFStringToContinue.Zero(); + //Unpack data + aDataPackage->UnPackData( iDTMFStringToContinue ); + + // Complete the client request + iMmPhone->ReqCompleted( reqHandle, KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CMmDtmfTsy::ContinueDTMFStringSendingL +// Continues or cancels the stopped DTMF string sending. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmDtmfTsy::ContinueDTMFStringSendingL( + const TTsyReqHandle aTsyReqHandle, + TBool aContinue ) + + { +TFLOGSTRING2("TSY: CMmDtmfTsy::ContinueDTMFStringSendingL aContinue:%d",aContinue); + TInt ret( KErrNone ); + + TTsyReqHandle sendDTMFTonesHandle = + iMmPhone->iTsyReqHandleStore->GetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); + + if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != sendDTMFTonesHandle ) + { + if ( 0 < iDTMFStringToContinue.Length() ) + { + // Continue or cancel sending depending on the boolean value + if ( aContinue ) + { + + // Continue DTMF string sending + CMmDataPackage dataPackage; + // packed parameter for DOS call: tones to continue + dataPackage.PackData( &iDTMFStringToContinue ); + ret = iMmPhone->MessageManager()->HandleRequestL( + EMobilePhoneContinueDTMFStringSending, + &dataPackage + ); + } + else // Cancel sending + { + ret = KErrAbort; + } + } + else if ( 0 == iDTMFStringToContinue.Length() ) + { + // Last character was a 'w' so do the cleanup and complete requ + CompleteSendDTMFTones( KErrNone ); + } + else + { + // iDTMFStringToContinue is NULL + ret = KErrGeneral; + } + } + else + { + // DTMF sending not going on. Complete request + ret = KErrNotReady; + } + + //Complete ContinueDTMFStringSending request + if ( KErrNone == ret || KErrAbort == ret ) + { + // Complete continue request with KErrNone + iMmPhone->ReqCompleted( aTsyReqHandle, KErrNone ); + } + else + { + // Complete continue request with error value + iMmPhone->ReqCompleted( aTsyReqHandle, ret ); + } + + //Error occurred or DTMF sending aborted + if ( KErrNone != ret ) + { + iDTMFStringToContinue.Zero(); + + // Complete SendDTMFTones request if user cancelled DTMF sending + // or DTMF string sending failed, + if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown + != sendDTMFTonesHandle ) + { + // Reset SendDTMFTones request handle + iMmPhone->iTsyReqHandleStore->ResetTsyReqHandle( + CMmPhoneTsy::EMultimodePhoneSendDTMFTones ); + + // Client has cancelled DTMF sending or sending failed. + iMmPhone->ReqCompleted( sendDTMFTonesHandle, ret ); + } + } + + return KErrNone; + } + + +TInt CMmDtmfTsy::ActiveCalls() const + { + TInt ret = 0; + CMmCallList* list = iMmPhone->CallList(); + //Get the number of Calls in list of calls + TInt count = list->GetNumberOfObjects(); + for ( TInt i = 0; i < count; i++ ) + { + CMmCallTsy* mmCall = list->GetMmCallByIndex( i ); + if ( mmCall ) + { + // get call status + RCall::TStatus callStatus = mmCall->Status(); + if ( RCall::EStatusConnected == callStatus) + { + // get service type of call + RMobileCall::TMobileCallInfoV1 info; + RMobileCall::TMobileCallInfoV1Pckg infoPckg(info); + mmCall->FillMobileCallInfo(&infoPckg); + RMobilePhone::TMobileService callService = info.iService; + //If the call is a voice call + if ( (RMobilePhone::EVoiceService == callService) || (RMobilePhone::EAuxVoiceService == callService)) + { + ++ret; + } + } + } + } + return ret; + + } +// End of File