cbsref/telephonyrefplugins/atltsy/atcommand/callcontrol/src/unsolicitedcommandcallcontrolhandler.cpp
branchRCL_3
changeset 65 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsref/telephonyrefplugins/atltsy/atcommand/callcontrol/src/unsolicitedcommandcallcontrolhandler.cpp	Tue Aug 31 16:23:08 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 <ctsy/ltsy/cctsydispatchercallback.h>
+#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