diff -r 17af172ffa5f -r 630d2f34d719 cbsref/telephonyrefplugins/atltsy/handler/src/cltsycallcontrolhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsref/telephonyrefplugins/atltsy/handler/src/cltsycallcontrolhandler.cpp Tue Aug 31 16:23:08 2010 +0300 @@ -0,0 +1,1155 @@ +// Copyright (c) 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: +// CLtsyCallControlHandler + +//system include +#include +#include +#include +//#include + +#include +#include +#include + +//user include +#include "cltsycallcontrolhandler.h" +#include "globalphonemanager.h" +#include "ltsycommondefine.h" +#include "mslogger.h" +#include "ltsymacros.h" +#include "tsyconfg.h" +#include "atwaitforcallhandler.h" +#include "atdialvoice.h" +#include "athangup.h" +#include "atanswer.h" +#include "atchld.h" +#include "unsolicitedcommandcallcontrolhandler.h" +#include "atdtmfvts.h" +#include "ltsycallinformationmanager.h" +#include "athangupcommandrecords.h" + + +//const define +_LIT16(KLtsyEmergencyCallNumber911, "911"); +_LIT16(KLtsyEmergencyCallNumber112, "112"); + +CLtsyCallControlHandler::CLtsyCallControlHandler( + CCtsyDispatcherCallback& aCtsyDispatcherCallback, CGlobalPhonemanager* aGloblePhone) + : iCtsyDispatcherCallback(aCtsyDispatcherCallback), iGloblePhone(aGloblePhone) + { + + } + + +CLtsyCallControlHandler::~CLtsyCallControlHandler() + { + delete iEmergencyCall; + iEmergencyCall = NULL; + + delete iUnsolicitedHandler; + iUnsolicitedHandler = NULL; + + delete iWaitForCall; + iWaitForCall = NULL; + } + + +CLtsyCallControlHandler* CLtsyCallControlHandler::NewLC( + CCtsyDispatcherCallback& aCtsyDispatcherCallback, + CGlobalPhonemanager* aGloblePhone) + { + TSYLOGENTRYEXIT; + CLtsyCallControlHandler* self = new (ELeave) CLtsyCallControlHandler(aCtsyDispatcherCallback,aGloblePhone); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + + +CLtsyCallControlHandler* CLtsyCallControlHandler::NewL(CCtsyDispatcherCallback& aCtsyDispatcherCallback, CGlobalPhonemanager* aGloblePhone) + { + TSYLOGENTRYEXIT; + CLtsyCallControlHandler* self= + CLtsyCallControlHandler::NewLC(aCtsyDispatcherCallback, aGloblePhone); + CleanupStack::Pop(self); + return self; + } + + +void CLtsyCallControlHandler::ConstructL() +/** + * Second phase constructor. + */ + { + //Emergency Call + iEmergencyCall = CATDialVoice::NewL((*iGloblePhone),iCtsyDispatcherCallback); + iEmergencyCall->SetEmergnecyCallFlag(ETrue); + + //Process unsolicited command + iUnsolicitedHandler = CUnsolicitedCommandCallControlHandler::NewL((*iGloblePhone), + iCtsyDispatcherCallback); + + //Monitor incoming call + iWaitForCall = CATWaitForCallHandler::NewL((*iGloblePhone), iCtsyDispatcherCallback); + iWaitForCall->StartToWaitForCall(); + + } // CLtsyCallControlHandler::ConstructL + +TBool CLtsyCallControlHandler::IsInterfaceSupported(TLtsyDispatchInterfaceApiId aDispatchApiId) +/** + * Returns whether a Dispatch Interface API is supported or not. + * + * @param aDispatchApiId Id of Dispatch interface being queried + * @return indication whether interface is supported or not + */ + { + TBool bFlag(EFalse); + switch(aDispatchApiId) + { + // Insert ApiIds when support is provided in LTSY + case MLtsyDispatchCallControlAnswer::KLtsyDispatchCallControlAnswerApiId : + bFlag = ETrue; + break; + case MLtsyDispatchCallControlHold::KLtsyDispatchCallControlHoldApiId: + bFlag = ETrue; + break; + case MLtsyDispatchCallControlHangUp::KLtsyDispatchCallControlHangUpApiId : + bFlag = ETrue; + break; + case MLtsyDispatchCallControlResume::KLtsyDispatchCallControlResumeApiId : + bFlag = ETrue; + break; + case MLtsyDispatchCallControlDialVoice::KLtsyDispatchCallControlDialVoiceApiId : + bFlag = ETrue; + break; + case MLtsyDispatchCallControlSwap::KLtsyDispatchCallControlSwapApiId : + bFlag = ETrue; + break; + case MLtsyDispatchCallControlTerminateErrorCall::KLtsyDispatchCallControlTerminateErrorCallApiId : + bFlag = ETrue; + break; + case MLtsyDispatchCallControlTerminateAllCalls::KLtsyDispatchCallControlTerminateAllCallsApiId : + bFlag = ETrue; + break; + case MLtsyDispatchCallControlSendDtmfTones::KLtsyDispatchCallControlSendDtmfTonesApiId : + bFlag = ETrue; + break; + case MLtsyDispatchCallControlStartDtmfTone::KLtsyDispatchCallControlStartDtmfToneApiId : + bFlag = ETrue; + break; + case MLtsyDispatchCallControlStopDtmfTone::KLtsyDispatchCallControlStopDtmfToneApiId : + bFlag = ETrue; + break; + case MLtsyDispatchCallControlSendDtmfTonesCancel::KLtsyDispatchCallControlSendDtmfTonesCancelApiId : + bFlag = ETrue; + break; + case MLtsyDispatchCallControlQueryIsEmergencyNumber::KLtsyDispatchCallControlQueryIsEmergencyNumberApiId : + bFlag = ETrue; + break; + case MLtsyDispatchCallControlDialEmergency::KLtsyDispatchCallControlDialEmergencyApiId : + bFlag = ETrue; + break; + default: + bFlag = EFalse; + break; + } + return bFlag; + } + +void CLtsyCallControlHandler::IsCallbackIndicatorSupported(TLtsyDispatchIndIdGroup aIdGroup, TUint32& aIndIdBitMask) +/** + * Returns the set of callback indicators that are supported. + * + * @param aIdGroup ID of group that is being queried e.g. aIdGroup=EIndIdGroup1 + * @param aIndIdBitMask [out] argument that should return a bitmask indicating which indicator callbacks are supported. + */ + { + + //Create bitmask with bitset for each indicator ID that is supported. E.g. + + if(aIdGroup == EIndIdGroup1) + aIndIdBitMask = KLtsyDispatchCallControlNotifyCallStatusChangeIndId | + KLtsyDispatchCallControlReceiveUuiIndId | + KLtsyDispatchCallControlNotifyDataCallCapsChangeIndId| + KLtsyDispatchCallControlNotifyIncomingCallIndId| + KLtsyDispatchCallControlNotifyHscsdInfoChangeIndId| + KLtsyDispatchCallControlNotifyCallEventIndId| + KLtsyDispatchCallControlGetCallInfoIndId| + KLtsyDispatchCallControlNotifyIccCallForwardingStatusChangeIndId; + else + aIndIdBitMask = 0; //no indicators from other groups supported + + } + +TInt CLtsyCallControlHandler::HandleAnswerReqL(TInt aCallId, TBool aIsIsvCall) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlAnswerComp() + * + * @param aCallId The Call ID of the call to answer. + * + * @param aIsIsvCall ETrue if the request to answer the call comes from a + * 3rd party application, EFalse otherwise. This parameter exists in case the + * LTSY wishes to perform special handling of ISV calls. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + LOGTEXT( _L8("[Ltsy CallControl] Starting CLtsyCallControlHandler::HandleAnswerReqL()")); + + TInt nEmergencyCallId = iGloblePhone->GetCallInfoManager().FindEmergencyCallId(); + if (nEmergencyCallId != KErrNotFound) + { + const TLtsyCallInformation& tCallInfo(iGloblePhone->GetCallInfoManager().GetCallInformationByCallId(nEmergencyCallId)); + if (TLtsyCallInformation::EHeldCall != tCallInfo.GetCallState()) + { + //Reset Ring state + iGloblePhone->GetCallInfoManager().SetIncomingCallFlag(EFalse); + return KErrNotSupported; + } + } + + TInt nRet = iGloblePhone->CheckGlobalPhoneStatus(); + if (nRet == KErrNone) + { + //Reset Ring state + iGloblePhone->GetCallInfoManager().SetIncomingCallFlag(EFalse); + + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + //Create answer call + CATAnswer* cAnswerCall = CATAnswer::NewL((*iGloblePhone), iCtsyDispatcherCallback); + iGloblePhone->SetActiveRequest(cAnswerCall); + cAnswerCall->SetAnswerCallId(aCallId); + cAnswerCall->SetIsIsvCall(aIsIsvCall); + //Start answer + cAnswerCall->StartRequest(); + } + + return nRet; + } // CLtsyCallControlHandler::HandleAnswerReqL + +TInt CLtsyCallControlHandler::HandleHoldReqL(TInt aCallId) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlHoldComp() + * + * @param aCallId The Call ID of the call to hold. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CLtsyCallControlHandler::HandleHoldReqL")); + LOGTEXT2(_L8("[Ltsy CallControl] aCallId = %d"), aCallId); + + TInt nRet = iGloblePhone->CheckGlobalPhoneStatus(); + if (nRet == KErrNone) + { + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + + //Create hold call + CATChld* cHoldCall = CATChld::NewL((*iGloblePhone), iCtsyDispatcherCallback); + iGloblePhone->SetActiveRequest(cHoldCall); + //Check call id is a hold call or not + if (cHoldCall->IsHoldCall(aCallId)) + { + LOGTEXT2(_L8("[Ltsy CallControl] aCallId = %d is a hold call so return KErrNone"), aCallId); + iGloblePhone->iEventSignalActive = EFalse; + return KErrNotSupported; + } + + cHoldCall->SetCallId(aCallId); + cHoldCall->SetIpcType(CATChld::ELtsyReqCallHold); + cHoldCall->SetChldType(CATChld::EHeldAllActiveCallAndAcceptHeldWaiting); + cHoldCall->StartRequest(); + } + + return nRet; + } // CLtsyCallControlHandler::HandleHoldReqL + + +TInt CLtsyCallControlHandler::HandleDialEmergencyReqL(const TDes& aEmergencyNumber) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlDialEmergencyComp() + * + * @param aEmergencyNumber The emergency phone number to dial. The descriptor + * should be of type RMobileENStore::TEmergencyNumber. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CLtsyCallControlHandler::HandleDialEmergencyReqL()")); + + //Checking is have emergency call + if (iGloblePhone->GetCallInfoManager().FindEmergencyCallId() != KErrNotFound) + { + return KErrNotSupported; + } + + TBuf8 tTelNum; + tTelNum.Copy(aEmergencyNumber.Left(tTelNum.MaxLength())); + + TInt nRet = iGloblePhone->CheckGlobalPhoneStatus(); + if (nRet == KErrNone) + { + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + + //Init call + iEmergencyCall->InitVariable(); + + //Set telnum + iEmergencyCall->SetTelephoneNumber(tTelNum); + iEmergencyCall->StartRequest(); + } + else // KErrInUse + { + if (iGloblePhone->GetCallInfoManager().FindDialingOrAlertingCallId() != KErrNotFound) + { + //Delete last call + iGloblePhone->DeleteLastActiveRequest(); + + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + + //Init call + iEmergencyCall->InitVariable(); + //Set telnum + iEmergencyCall->SetTelephoneNumber(tTelNum); + iEmergencyCall->StartRequest(); + nRet = KErrNone; + } + } + + return nRet; + } // CLtsyCallControlHandler::HandleDialEmergencyReqL + +TInt CLtsyCallControlHandler::HandleStopDtmfToneReqL(TInt aCallId) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlStopDtmfToneComp() + * + * @param aCallId Call ID of the connected call the stop request will be sent + * through. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CLtsyCallControlHandler::HandleStopDtmfToneReqL()")); + LOGTEXT2( _L8("[Ltsy CallControl] CallId = %d"), aCallId); + + TInt nRet = iGloblePhone->CheckGlobalPhoneStatus(); + if (nRet == KErrNone) + { + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + + //Create DTMF + CATDtmfVts* cDtmfVts = CATDtmfVts::NewL((*iGloblePhone), iCtsyDispatcherCallback); + iGloblePhone->SetActiveRequest(cDtmfVts); + + //Set CallId + nRet = cDtmfVts->SetCallId(aCallId); + if (nRet != KErrNone) + { + return nRet; + } + + //Set work type + cDtmfVts->SetDtmfWorkType(CATDtmfVts::EDtmfStopOneTone); + + //Start request + cDtmfVts->StartRequest(); + } + + return nRet; + } // CLtsyCallControlHandler::HandleStopDtmfToneReqL + + +TInt CLtsyCallControlHandler::HandleSetActiveAlsLineReqL(RMobilePhone::TMobilePhoneALSLine /*aAlsLine*/) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlSetActiveAlsLineComp() + * + * @param aAlsLine The new active ALS line. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TODO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleSetActiveAlsLineReqL + + +TInt CLtsyCallControlHandler::HandleSendDtmfTonesCancelReqL(TInt aCallId) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlSendDtmfTonesCancelComp() + * + * @param aCallId The Call ID through which the cancel request should be sent. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + + LOGTEXT(_L8("[Ltsy CallControl] Starting CLtsyCallControlHandler::HandleSendDtmfTonesCancelReqL()")); + LOGTEXT2( _L8("[Ltsy CallControl] CallId = %d"), aCallId); + + TInt nRet = iGloblePhone->CheckGlobalPhoneStatus(); + if (nRet == KErrNone) + { + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + + //Create DTMF + CATDtmfVts* cDtmfVts = CATDtmfVts::NewL((*iGloblePhone), iCtsyDispatcherCallback); + iGloblePhone->SetActiveRequest(cDtmfVts); + + //Set CallId + nRet = cDtmfVts->SetCallId(aCallId); + if (nRet != KErrNone) + { + return nRet; + } + + //Set work type + cDtmfVts->SetDtmfWorkType(CATDtmfVts::EDtmfCancelMoreTones); + + //Start request + cDtmfVts->StartRequest(); + } + + return nRet; + } // CLtsyCallControlHandler::HandleSendDtmfTonesCancelReqL + + +TInt CLtsyCallControlHandler::HandleHangUpReqL(TInt aCallId, TInt aHangupCause) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlHangUpComp() + * + * @param aCallId The Call ID of the call to hang up. + * + * @param aHangupCause The reason for the hang up request. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + LOGTEXT( _L8("[Ltsy CallControl] Starting CLtsyCallControlHandler::HandleHangUpReqL")); + LOGTEXT3(_L8("[Ltsy CallControl] aCallId = %d aHangupCause = %d"), aCallId, aHangupCause); + + TInt nRet = iGloblePhone->CheckGlobalPhoneStatus(); + if (nRet == KErrNone) + { + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + + //Reset Ring state + iGloblePhone->GetCallInfoManager().SetIncomingCallFlag(EFalse); + + //Set hang up active + iGloblePhone->GetCallInfoManager().GetHangupCommandRecords().SetHangupActiveFlag(ETrue); + + //Create Hang up + CATChld* cHangupCall = CATChld::NewL((*iGloblePhone), iCtsyDispatcherCallback); + iGloblePhone->SetActiveRequest(cHangupCall); + cHangupCall->SetCallId(aCallId); + cHangupCall->SetHangupCase(aHangupCause); + cHangupCall->SetIpcType(CATChld::ELtsyReqCallHangup); + cHangupCall->SetChldType(CATChld::ERleaseSpecificCall); + cHangupCall->StartRequest(); + } + else if (nRet == KErrInUse) + { + LOGTEXT( _L8("[Ltsy CallControl] Starting Hang up in process so add hangup information")); + + const TLtsyCallInformation& tCallInfo(iGloblePhone->GetCallInfoManager().GetCallInformationByCallId(aCallId)); + + if (iGloblePhone->GetCallInfoManager().GetHangupCommandRecords().GetHangupActiveFlag()) + { + //Hang up is processing so add its information to array + nRet = iGloblePhone->GetCallInfoManager().GetHangupCommandRecords().AddHangupCommandInfo(aCallId, aHangupCause); + } + else if (TLtsyCallInformation::EDialingCall == tCallInfo.GetCallState() || + TLtsyCallInformation::EAlertingCall == tCallInfo.GetCallState()) + { + + //Delete last call + iGloblePhone->DeleteLastActiveRequest(); + + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + + //Set hang up active + iGloblePhone->GetCallInfoManager().GetHangupCommandRecords().SetHangupActiveFlag(ETrue); + + //Create Hang up + CATChld* cHangupCall = CATChld::NewL((*iGloblePhone), iCtsyDispatcherCallback); + iGloblePhone->SetActiveRequest(cHangupCall); + cHangupCall->SetCallId(aCallId); + cHangupCall->SetHangupCase(aHangupCause); + cHangupCall->SetIpcType(CATChld::ELtsyReqCallHangup); + cHangupCall->SetChldType(CATChld::ERleaseSpecificCall); + cHangupCall->StartRequest(); + nRet = KErrNone; + } + } + + return nRet; + } // CLtsyCallControlHandler::HandleHangUpReqL + + +TInt CLtsyCallControlHandler::HandleResumeReqL(TInt aCallId) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlResumeComp() + * + * @param aCallId The Call ID of the call to resume. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CLtsyCallControlHandler::HandleResumeReqL")); + LOGTEXT2(_L8("[Ltsy CallControl] aCallId = %d"), aCallId); + + TInt nRet = iGloblePhone->CheckGlobalPhoneStatus(); + if (nRet == KErrNone) + { + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + + //Create DTMF + CATChld* cResumeCall = CATChld::NewL((*iGloblePhone), iCtsyDispatcherCallback); + iGloblePhone->SetActiveRequest(cResumeCall); + if (cResumeCall->IsActiveCall(aCallId)) + { + LOGTEXT2(_L8("[Ltsy CallControl] aCallId = %d is a active call so return KErrNone"), aCallId); + iGloblePhone->iEventSignalActive = EFalse; + return KErrNotSupported; + } + cResumeCall->SetCallId(aCallId); + cResumeCall->SetIpcType(CATChld::ELtsyReqCallResume); + cResumeCall->SetChldType(CATChld::EHeldAllActiveCallAndAcceptHeldWaiting); + cResumeCall->StartRequest(); + } + + return nRet; + } // CLtsyCallControlHandler::HandleResumeReqL + +TInt CLtsyCallControlHandler::HandleSetDynamicHscsdParamsReqL( + TInt /*aCallId*/, const RMobileCall::TMobileHscsdCallParamsV1& /*aHscsdParams*/) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlSetDynamicHscsdParamsComp() + * + * @param aCallId The call ID of the data call. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TODO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleSetDynamicHscsdParamsReqL + + +TInt CLtsyCallControlHandler::HandleDialVoiceReqL(RMobilePhone::TMobilePhoneALSLine /*aLine*/, + const RMobilePhone::TMobileAddress& aDialledParty, const RMobileCall::TMobileCallParamsV1& /*aCallParamsV1*/, + TBool /*aIsIsvCall*/, RMobileCall::TCallParamOrigin /*aCallOrigin*/, TBool /*aPerformFdnCheck*/) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlDialVoiceComp() + * + * @param aCallLine The line to use to dial the call. + * + * @param aDialledParty Details about the dialled party including the phone + * number to dial. + * + * @param aCallParamsV1 The call parameters of the call to dial. + * + * @param aIsIsvCall Indicates whether the call originated from a third party + * application. + * + * @param aCallOrigin The origin of the dial request. e.g. Whether the dial + * came from an Etel client or the SIM or another source. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + LOGTEXT( _L8("[Ltsy CallControl] Starting CLtsyCallControlHandler::HandleDialVoiceReqL()")); + + TInt nEmergencyCallId = iGloblePhone->GetCallInfoManager().FindEmergencyCallId(); + if (nEmergencyCallId != KErrNotFound) + { + const TLtsyCallInformation& tCallInfo(iGloblePhone->GetCallInfoManager().GetCallInformationByCallId(nEmergencyCallId)); + if (TLtsyCallInformation::EHeldCall != tCallInfo.GetCallState()) + { + return KErrNotSupported; + } + } + + //Set telephone number + TBuf8 dialModifier; + TInt nRet = iGloblePhone->iConfiguration->ConfigModemStringL( + TPtrC(KCDTypeNameDialToneWaitModifier), + dialModifier); + if (nRet != KErrNone) + { + return nRet; + } + + TBuf8 tTelNum; + tTelNum.Copy(aDialledParty.iTelNumber.Left(tTelNum.MaxLength())); + + nRet = tTelNum.FindF(dialModifier); + if (nRet != KErrNotFound) + { + tTelNum.Delete(nRet, 1); + } + + nRet = iGloblePhone->CheckGlobalPhoneStatus(); + if (nRet == KErrNone) + { + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + + //Create dial voice + CATDialVoice* cDialVoice = CATDialVoice::NewL((*iGloblePhone), iCtsyDispatcherCallback); + iGloblePhone->SetActiveRequest(cDialVoice); + cDialVoice->SetTelephoneNumber(tTelNum); + cDialVoice->StartRequest(); + } + + return nRet; + } // CLtsyCallControlHandler::HandleDialReqL + +TInt CLtsyCallControlHandler::HandleTransferReqL(TInt /*aHeldCallId*/, TInt /*aSecondCallId*/) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlTransferComp() + * + * @param aHeldCallId Call ID of the held call to transfer. + * + * @param aSecondCallId Call ID of the other to transfer the held call to. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TODO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleTransferReqL + + +TInt CLtsyCallControlHandler::HandleSendDtmfTonesReqL(TInt aCallId, const TDesC &aTones) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlSendDtmfTonesComp() + * + * @param aCallId The Call ID of the call through which the DTMF string will be + * sent. + * + * @param aTones Tones to send through the active call. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + LOGTEXT( _L8("[Ltsy CallControl] Starting CLtsyCallControlHandler::HandleSendDtmfTonesReqL()")); + LOGTEXT3( _L8("[Ltsy CallControl] CallId = %d\tTones = %S"), aCallId, &aTones); + + TInt nRet = iGloblePhone->CheckGlobalPhoneStatus(); + if (nRet == KErrNone) + { + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + + //Create DTMF + CATDtmfVts* cDtmfVts = CATDtmfVts::NewL((*iGloblePhone), iCtsyDispatcherCallback); + iGloblePhone->SetActiveRequest(cDtmfVts); + //Set CallId + TInt nRet = cDtmfVts->SetCallId(aCallId); + if (nRet != KErrNone) + { + return nRet; + } + + //Set Tones + nRet = cDtmfVts->SetDtmfString(aTones); + if (nRet != KErrNone) + { + return nRet; + } + + //set work type + cDtmfVts->SetDtmfWorkType(CATDtmfVts::EDtmfSendMoreTones); + cDtmfVts->StartRequest(); + } + + return nRet; + } // CLtsyCallControlHandler::HandleSendDtmfTonesReqL + + +TInt CLtsyCallControlHandler::HandleGetIdentityServiceStatusReqL(RMobilePhone::TMobilePhoneIdService /*aService*/) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlGetIdentityServiceStatusComp() + * + * @param aService The service whose status needs to be retrieved. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TODO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleGetIdentityServiceStatusReqL + + +TInt CLtsyCallControlHandler::HandleSwapReqL(TInt aHeldCallId, TInt aConnectedCallId) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlSwapComp() + * + * @param aHeldCallId The Call ID of the held call to swap. + * + * @param aConnectedCallId The Call ID of the connected call to swap. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CLtsyCallControlHandler::HandleSwapReqL")); + LOGTEXT3(_L8("[Ltsy CallControl] aHeldCallId = %d\taConnectedCallId = %d"), aHeldCallId, aConnectedCallId); + + TInt nRet = iGloblePhone->CheckGlobalPhoneStatus(); + if (nRet == KErrNone) + { + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + + //Create DTMF + CATChld* cSwapCall = CATChld::NewL((*iGloblePhone), iCtsyDispatcherCallback); + iGloblePhone->SetActiveRequest(cSwapCall); + cSwapCall->SetCallId(aHeldCallId); + cSwapCall->SetConnectedCallId(aConnectedCallId); + cSwapCall->SetIpcType(CATChld::ELtsyReqCallSwap); + cSwapCall->SetChldType(CATChld::EHeldAllActiveCallAndAcceptHeldWaiting); + cSwapCall->StartRequest(); + } + + return nRet; + } // CLtsyCallControlHandler::HandleSwapReqL + +TInt CLtsyCallControlHandler::HandleLoanDataPortSyncL(TInt /*aCallId*/, RCall::TCommPort& /*aCommPort*/) +/** + * This request is part of + * MLtsyDispatchCallControlLoanDataPort::HandleLoanDataPortSyncL() + * + * @param aCallId Call ID of the data call requiring the data port. + * + * @param aCommPort Output parameter. The communications port information + * retrieved by a client using the RCall::LoanDataPort() API. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TODO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleLoanDataPortSyncL + + +TInt CLtsyCallControlHandler::HandleRecoverDataPortSyncL(TInt /*aCallId*/, RCall::TCommPort& /*aCommPort*/) +/** + * This request is part of + * MLtsyDispatchCallControlRecoverDataPort::HandleRecoverDataPortSyncL() + * + * @param aCallId Call ID of the data call requiring the data port. + * + * @param aCommPort The data port to recover. This contains the details previously + * returned by a call to RCall::LoanDataPort() + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TODO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleRecoverDataPortSyncL + + +TInt CLtsyCallControlHandler::HandleStartDtmfToneReqL(TInt aCallId, const TChar& aTone) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlStartDtmfTone() + * + * @param aCallId Call ID of the connected call through which the DTMF tone + * will be sent. + * + * @param aTone The tone character to send through the call. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CLtsyCallControlHandler::HandleStartDtmfToneReqL()")); + LOGTEXT2( _L8("[Ltsy CallControl] CallId = %d"), aCallId); + + TInt nRet = iGloblePhone->CheckGlobalPhoneStatus(); + if (nRet == KErrNone) + { + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + + //Create DTMF + CATDtmfVts* cDtmfVts = CATDtmfVts::NewL((*iGloblePhone), iCtsyDispatcherCallback); + iGloblePhone->SetActiveRequest(cDtmfVts); + //Set CallId + TInt nRet = cDtmfVts->SetCallId(aCallId); + if (nRet != KErrNone) + { + return nRet; + } + + //Set Tones + TBuf<16> bufTone; + bufTone.Append(aTone); + nRet = cDtmfVts->SetDtmfString(bufTone); + if (nRet != KErrNone) + { + return nRet; + } + + //set work type + cDtmfVts->SetDtmfWorkType(CATDtmfVts::EDtmfSendOneTone); + cDtmfVts->StartRequest(); + } + + return nRet; + } // CLtsyCallControlHandler::HandleStartDtmfToneSyncL + +TInt CLtsyCallControlHandler::HandleGetActiveAlsLineReqL() +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlGetActiveAlsLineComp() + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TO DO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleGetActiveAlsLineReqL + +TInt CLtsyCallControlHandler::HandleDialDataReqL(const RMobilePhone::TMobileAddress& /*aDialledParty*/, const RMobileCall::TMobileDataCallParamsV1& /*aCallParamsV1*/, TBool /*aPerformFdnCheck*/) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlGetActiveAlsLineComp() + * + * @param aLine The line to use to dial the call. + * + * @param aDialledParty Details about the dialled party including the phone + * number to dial. + * + * @param aCallParamsV1 The call parameters of the call to dial. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TO DO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleDialDataReqL + +TInt CLtsyCallControlHandler::HandleQueryIsEmergencyNumberSyncL(const TDesC& aNumber, TBool& aIsEmergencyNumber) +/** + * This request is part of + * MLtsyDispatchCallControlQueryIsEmergencyNumber::HandleQueryIsEmergencyNumberSyncL() + * + * @param aNumber Input parameter. The phone number being queried to see + * if it is an emergency number or not. + * + * @param aIsEmergencyNumber Output parameter used to indicate whether the + * aNumber parameter is an emergency number. ETrue if it is, EFalse otherwise. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CLtsyCallControlHandler::HandleQueryIsEmergencyNumberSyncL()")); + + TInt nEmergencyCallId = iGloblePhone->GetCallInfoManager().FindEmergencyCallId(); + if (nEmergencyCallId != KErrNotFound) + { + const TLtsyCallInformation& tCallInfo(iGloblePhone->GetCallInfoManager().GetCallInformationByCallId(nEmergencyCallId)); + if (TLtsyCallInformation::EHeldCall != tCallInfo.GetCallState()) + { + return KErrNotSupported; + } + } + + //Check Emergency call number + if (aNumber.CompareF(KLtsyEmergencyCallNumber911) == 0 || + aNumber.CompareF(KLtsyEmergencyCallNumber112) == 0 ) + { + aIsEmergencyNumber = ETrue; + } + else + { + aIsEmergencyNumber = EFalse; + } + + return KErrNone; + } // CLtsyCallControlHandler::HandleQueryIsEmergencyNumberSyncL + + +TInt CLtsyCallControlHandler::HandleGetAlsPpSupportL() +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlGetAlsPpSupportComp() + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TODO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleGetAlsPp + +TInt CLtsyCallControlHandler::HandleGetAlsBlockedStatusL() +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlGetAlsBlockedStatusComp() + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TODO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleGetAlsBlockedStatus + +TInt CLtsyCallControlHandler::HandleSetAlsBlockedL(RMmCustomAPI::TSetAlsBlock /*aBlocked*/) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlSetAlsBlockedComp() + * + * + * @param aBlocked RMmCustomAPI::EDeactivateBlock when the ALS blocked needs to be deactivate, + * RMmCustomAPI::EActivateBlock when the ALS blocked needs to be activate. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TODO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleSetAlsBlockedL + +TInt CLtsyCallControlHandler::HandleGetLifeTimeL() +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlGetLifeTimeComp() + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TODO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleGetLifeTime + +TInt CLtsyCallControlHandler::HandleTerminateErrorCallL(TInt /*aCallId*/) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlTerminateErrorCallComp() + * + * + * @param aCallId The Call ID of the call to terminate. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TODO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleTerminateErrorCallL + +TInt CLtsyCallControlHandler::HandleTerminateAllCallsL() +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::::CallbackCallControlTerminateAllCallsComp() + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CLtsyCallControlHandler::HandleTerminateAllCallsL()")); + + TInt nRet = iGloblePhone->CheckGlobalPhoneStatus(); + if (nRet == KErrNone) + { + //Setting Port active + iGloblePhone->iEventSignalActive = ETrue; + + //Reset Ring state + iGloblePhone->GetCallInfoManager().SetIncomingCallFlag(EFalse); + + CATHangUp* cTerminateAllCalls = CATHangUp::NewL((*iGloblePhone), iCtsyDispatcherCallback); + iGloblePhone->SetActiveRequest(cTerminateAllCalls); + cTerminateAllCalls->SetHangupOperator(CATHangUp::ECustomAPI); + cTerminateAllCalls->StartRequest(); + } + + return nRet; + } // CLtsyCallControlHandler::HandleTerminateAllCallsL + +TInt CLtsyCallControlHandler::HandleGetCallForwardingIndicatorL() +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlGetCallForwardingIndicatorComp() + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TODO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler::HandleGetCallForwardingIndicator + +TInt CLtsyCallControlHandler::HandleUpdateLifeTimerReqL(TUint32 /*aDuration*/) +/** + * This request is completed by invoking + * CCtsyDispatcherCallback::CallbackCallControlUpdateLifeTimerComp + * + * @param aDuration Time spent on call since the last invocation of this method. + * + * @return KErrNone on success, KErrNotSupported if this request is not supported, + * or another error code to indicate the failure otherwise. + */ + { + TSYLOGENTRYEXIT; + + TInt ret = KErrNotSupported; + + // TO DO: Add implementation here....... + + + return TSYLOGSETEXITERR(ret); + } // CLtsyCallControlHandler:::HandleUpdateLifeTimerReqL + + +MLtsyUnsolicitedCommandObserver* CLtsyCallControlHandler::GetUnsolicitedCallControlHandler() const + { + return static_cast(iUnsolicitedHandler); + } + +//End of file