diff -r 14460bf2a402 -r f50f4094acd7 cbsref/telephonyrefplugins/atltsy/atcommand/callcontrol/src/unsolicitedcommandcallcontrolhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsref/telephonyrefplugins/atltsy/atcommand/callcontrol/src/unsolicitedcommandcallcontrolhandler.cpp Tue Jul 06 15:36:38 2010 +0300 @@ -0,0 +1,291 @@ +// 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: +// CUnsolicitedCommandCallControlHandler. The handler for handling the unsolicited command related to call control + +//system include + +//user include +#include "unsolicitedcommandcallcontrolhandler.h" +#include +#include "ltsycommondefine.h" +#include "globalphonemanager.h" +#include "unsolicitedparams.h" +#include "atclcc.h" +#include "ltsycallinformationmanager.h" +#include "mslogger.h" + +CUnsolicitedCommandCallControlHandler* CUnsolicitedCommandCallControlHandler::NewL(CGlobalPhonemanager& aGloblePhone, + CCtsyDispatcherCallback& aCtsyDispatcherCallback) + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CUnsolicitedCommandCallControlHandler::NewL()")); + + CUnsolicitedCommandCallControlHandler* self = CUnsolicitedCommandCallControlHandler::NewLC(aGloblePhone, + aCtsyDispatcherCallback); + CleanupStack::Pop(self); + return self; + } + +CUnsolicitedCommandCallControlHandler* CUnsolicitedCommandCallControlHandler::NewLC(CGlobalPhonemanager& aGloblePhone, + CCtsyDispatcherCallback& aCtsyDispatcherCallback) + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CUnsolicitedCommandCallControlHandler::NewLC()")); + + CUnsolicitedCommandCallControlHandler* self = new (ELeave) CUnsolicitedCommandCallControlHandler(aGloblePhone, + aCtsyDispatcherCallback); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CUnsolicitedCommandCallControlHandler::~CUnsolicitedCommandCallControlHandler() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CUnsolicitedCommandCallControlHandler::~CUnsolicitedCommandCallControlHandler()")); + } + +CUnsolicitedCommandCallControlHandler::CUnsolicitedCommandCallControlHandler(CGlobalPhonemanager& aGloblePhone, + CCtsyDispatcherCallback& aCtsyDispatcherCallback) + :iGlobalPhone(aGloblePhone), + iCtsyDispatcherCallback(aCtsyDispatcherCallback) + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CUnsolicitedCommandCallControlHandler::CUnsolicitedCommandCallControlHandler()")); + } + +void CUnsolicitedCommandCallControlHandler::ConstructL() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CUnsolicitedCommandCallControlHandler::ConstructL()")); + + iAtClcc = CATClcc::NewL(iGlobalPhone, iCtsyDispatcherCallback); + + iAtClcc->AddQueryCallInformationCompleteNotify(this); + } + +void CUnsolicitedCommandCallControlHandler::QueryCallInformationComplete(TInt /*aError*/) + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CUnsolicitedCommandCallControlHandler::QueryCallInformationComplete()")); + + if (iAtClcc->GetProcessStates() == CATClcc::EProcessOK) + { + TInt nCallId = iGlobalPhone.GetCallInfoManager().FindWaitingCallId(); + + LOGTEXT2(_L8("[Ltsy CallControl] The Waiting Call Id = %d"), nCallId); + if (KErrNotFound == nCallId) + { + iAtClcc->InitVariable(); + return; + } + + //Waiting call information + TLtsyCallInformation& tWaitingCallInfo(iGlobalPhone.GetCallInfoManager().GetCallInformationByCallId(nCallId)); + + RMobileCall::TMobileCallInfoV1 tMobileCallInfo; + + //Call id + tMobileCallInfo.iCallId = tWaitingCallInfo.GetCallId(); + + //Call service + TLtsyCallInformation::TCallMode tCallService(tWaitingCallInfo.GetCallMode()); + if (TLtsyCallInformation::EVoiceCall == tCallService) + { + tMobileCallInfo.iService = RMobilePhone::EVoiceService; + } + else if (TLtsyCallInformation::EDataCall == tCallService) + { + tMobileCallInfo.iService = RMobilePhone::ECircuitDataService; + } + else if (TLtsyCallInformation::EFaxCall == tCallService) + { + tMobileCallInfo.iService = RMobilePhone::EFaxService; + } + else + { + tMobileCallInfo.iService = RMobilePhone::EServiceUnspecified; + } + + //Call back + iCtsyDispatcherCallback.CallbackCallControlNotifyIncomingCallInd(KErrNone, tMobileCallInfo); + + //Waiting States + tMobileCallInfo.iStatus = RMobileCall::EStatusRinging; + + //Telephone number + tMobileCallInfo.iRemoteParty.iRemoteNumber.iTelNumber.Copy(tWaitingCallInfo.GetMobileTelNum()); + + //Callback + iCtsyDispatcherCallback.CallbackCallControlNotifyCallInfoChangeInd(KErrNone, tMobileCallInfo); + } + + //Init iAtCll for reusing it + iAtClcc->InitVariable(); + } + +void CUnsolicitedCommandCallControlHandler::HandleSimRemoveEvent() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CUnsolicitedCommandCallControlHandler::HandleSimRemoveEvent()")); + + TInt nErr = KErrEtelNoCarrier; + + for (TInt nCallId = KLtsyMinCallId; nCallId <= KLtsyMaxCallId; nCallId++) + { + TLtsyCallInformation& tCallInfo(iGlobalPhone.GetCallInfoManager().GetCallInformationByCallId(nCallId)); + if (TLtsyCallInformation::EUsed == tCallInfo.GetCallIdIsUsedInfo()) + { + //Notify disconnecting status + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(nErr, + nCallId, + RMobileCall::EStatusDisconnecting); + + //Nofity idel status + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(nErr, + nCallId, + RMobileCall::EStatusIdle); + } + } + + iGlobalPhone.GetCallInfoManager().ResetAllCalInformation(); + } + +void CUnsolicitedCommandCallControlHandler::HandleProductInitEvent() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CUnsolicitedCommandCallControlHandler::HandleProductInitEvent()")); + + TInt nErr = KErrEtelNoCarrier; + + for (TInt nCallId = KLtsyMinCallId; nCallId <= KLtsyMaxCallId; nCallId++) + { + TLtsyCallInformation& tCallInfo(iGlobalPhone.GetCallInfoManager().GetCallInformationByCallId(nCallId)); + if (TLtsyCallInformation::EUsed == tCallInfo.GetCallIdIsUsedInfo()) + { + //Notify disconnecting status + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(nErr, + nCallId, + RMobileCall::EStatusDisconnecting); + //Notify idel status + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(nErr, + nCallId, + RMobileCall::EStatusIdle); + } + } + + iGlobalPhone.GetCallInfoManager().ResetAllCalInformation(); + } + +void CUnsolicitedCommandCallControlHandler::HandleNetworkLostEvent() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CUnsolicitedCommandCallControlHandler::HandleNetworkLostEvent()")); + + TInt nErr = KErrEtelNoCarrier; + + for (TInt nCallId = KLtsyMinCallId; nCallId <= KLtsyMaxCallId; nCallId++) + { + TLtsyCallInformation& tCallInfo(iGlobalPhone.GetCallInfoManager().GetCallInformationByCallId(nCallId)); + if (TLtsyCallInformation::EUsed == tCallInfo.GetCallIdIsUsedInfo()) + { + //Notify disconnecting status + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(nErr, + nCallId, + RMobileCall::EStatusDisconnecting); + //Notify idel status + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(nErr, + nCallId, + RMobileCall::EStatusIdle); + } + } + + iGlobalPhone.GetCallInfoManager().ResetAllCalInformation(); + } + +void CUnsolicitedCommandCallControlHandler::HandleCallCreatedEvent(const TDesC8& aWindPkg) + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CUnsolicitedCommandCallControlHandler::HandleCallCreatedEvent()")); + + TUnsolicitedParams::TUnsolicitedParamsPckgBuf* pPckg = (TUnsolicitedParams::TUnsolicitedParamsPckgBuf*)(&aWindPkg); + TInt nCallId = (*pPckg)().iIdx; + LOGTEXT2(_L8("[Ltsy CallControl] nCallId = %d"), nCallId); + + if (iAtClcc->GetProcessStates() == CATClcc::EProcessNotInProgress) + { + TInt nRet = iGlobalPhone.CheckGlobalPhoneStatus(); + if (nRet == KErrNone) + { + iGlobalPhone.iEventSignalActive = ETrue; + iAtClcc->StartRequest(); + } + } + } + +void CUnsolicitedCommandCallControlHandler::HandleCallReleasedEvent(const TDesC8& aWindPkg) + { + //if call id is incoming call reset incoming call states + iGlobalPhone.GetCallInfoManager().SetIncomingCallFlag(EFalse); + + //Notify CTSY incoming call release + TUnsolicitedParams::TUnsolicitedParamsPckgBuf* pPckg = (TUnsolicitedParams::TUnsolicitedParamsPckgBuf*)(&aWindPkg); + TInt nCallId = (*pPckg)().iIdx; + LOGTEXT2(_L8("[Ltsy CallControl] nCallId = %d"), nCallId); + + if (nCallId >= KLtsyMinCallId && nCallId <= KLtsyMaxCallId) + { + TLtsyCallInformation& tCallInfo(iGlobalPhone.GetCallInfoManager().GetCallInformationByCallId(nCallId)); + if (TLtsyCallInformation::EUsed == tCallInfo.GetCallIdIsUsedInfo()) + { + //Notify disconnecting status + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrGsmCCNormalCallClearing, + nCallId, + RMobileCall::EStatusDisconnecting); + //Notify idel status + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrGsmCCNormalCallClearing, + nCallId, + RMobileCall::EStatusIdle); + + iGlobalPhone.GetCallInfoManager().ResetCallInformationByCallId(nCallId); + } + } + } + +void CUnsolicitedCommandCallControlHandler::UnsolicitedCommandArriving(TInt aEvent, + const TDesC8& aWindPkg) + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CUnsolicitedCommandCallControlHandler::UnsolicitedCommandArriving()")); + LOGTEXT2(_L8("[Ltsy CallControl] nEvent = %d"), aEvent); + + switch (aEvent) + { + case KLtsyUnsolicitedEvent00: + HandleSimRemoveEvent(); + break; + + case KLtsyUnsolicitedEvent03: + HandleProductInitEvent(); + break; + + case KLtsyUnsolicitedEvent08: + HandleNetworkLostEvent(); + break; + + case KLtsyUnsolicitedEvent05: + HandleCallCreatedEvent(aWindPkg); + break; + + case KLtsyUnsolicitedEvent06: + HandleCallReleasedEvent(aWindPkg); + break; + + default: + break; + } + + LOGTEXT(_L8("[Ltsy CallControl] End CUnsolicitedCommandCallControlHandler::UnsolicitedCommandArriving()")); + } + +//End of file