cbsref/telephonyrefplugins/atltsy/atcommand/callcontrol/src/atchld.cpp
branchRCL_3
changeset 65 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsref/telephonyrefplugins/atltsy/atcommand/callcontrol/src/atchld.cpp	Tue Aug 31 16:23:08 2010 +0300
@@ -0,0 +1,622 @@
+// 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:
+// @file atchld.cpp
+// This contains CATChld which hold, resume, release, swap one call.
+// 
+
+
+//sysmtem include
+
+//user include
+#include "atchld.h"
+#include "ltsycallinformationmanager.h"
+#include "athangupcommandrecords.h"
+#include "mslogger.h"
+
+//const define
+const TInt KLtsyCHLDReadTimeout = 3;
+const TInt KLtsyCHLDWaitForModemTime = 1000*250; // 0.25 seconds
+_LIT8(KLtsyCHLDCommandFormat1, "AT+CHLD=%d\r");
+_LIT8(KLtsyCHLDCommandFormat2, "AT+CHLD=%d%d\r");
+_LIT8(KLtsyReleaseOutgoingCommand, "ATH1\r");    //Hang up outging call
+
+
+// ---------------------------------------------------------------------------
+// CATChld::NewL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CATChld* CATChld::NewL(CGlobalPhonemanager& aGloblePhone,
+		               CCtsyDispatcherCallback& aCtsyDispatcherCallback)
+	{
+	CATChld* self = CATChld::NewLC(aGloblePhone, aCtsyDispatcherCallback);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::NewLC
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CATChld* CATChld::NewLC(CGlobalPhonemanager& aGloblePhone,
+		               CCtsyDispatcherCallback& aCtsyDispatcherCallback)
+	{
+	CATChld* self = new (ELeave) CATChld(aGloblePhone, aCtsyDispatcherCallback);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CATChld::~CATChld
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CATChld::~CATChld()
+	{
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::CATChld
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CATChld::CATChld(CGlobalPhonemanager& aGloblePhone,
+		         CCtsyDispatcherCallback& aCtsyDispatcherCallback)
+				 : CAtCommandBase(aGloblePhone, aCtsyDispatcherCallback)
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::CATChld()"));
+	
+	//Set At type
+	iAtType = ELtsyAT_Call_CHLD;
+	
+	//Init variable
+	InitVariable();
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::InitVariable
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::InitVariable()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::InitVariable()"));
+	
+	iIOStatus = KErrNone;
+	iATResult = KErrNone;
+	iATStep = EATNotInProgress;
+	iIpcType = ELtsyReqCallHangup;
+	iChldType = ERleaseSpecificCall;
+	iCallId = KLtsyErrorCallId;
+	iConnectedCallId = KLtsyErrorCallId;
+	iHangupCause = -1;
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::IsHoldCall
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+TBool CATChld::IsHoldCall(TInt aHoldCallId)
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::IsHoldCall()"));
+	if (aHoldCallId >= KLtsyMinCallId && aHoldCallId <= KLtsyMaxCallId)
+		{
+		const TLtsyCallInformation& tCallInfo = iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(aHoldCallId);
+		if (TLtsyCallInformation::EUsed == tCallInfo.GetCallIdIsUsedInfo() &&
+			TLtsyCallInformation::EHeldCall == tCallInfo.GetCallState())
+			{
+			return ETrue;
+			}		
+		}
+	return EFalse;
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::IsActiveCall
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+TBool CATChld::IsActiveCall(TInt aActiveCallId)
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::IsActiveCall()"));
+	
+	if (aActiveCallId >= KLtsyMinCallId && aActiveCallId <= KLtsyMaxCallId)
+		{
+		const TLtsyCallInformation& tCallInfo = iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(aActiveCallId);
+		if (TLtsyCallInformation::EUsed == tCallInfo.GetCallIdIsUsedInfo() &&
+			TLtsyCallInformation::EActiveCall == tCallInfo.GetCallState())
+			{
+			return ETrue;
+			}		
+		}	
+	
+	return EFalse;
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::ConstructL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::ConstructL()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::ConstructL()"));
+	
+	//Invoke base class function
+	CAtCommandBase::ConstructL();
+	
+	//Set read and write timeout
+	SetTimeOut(KLtsyDefaultWriteTimeOut, KLtsyCHLDReadTimeout);	
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::ExecuteCommand
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::ExecuteCommand()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::ExecuteCommand()"));
+	
+	if (iChldType == EReleaseAllHeldCallOrUDUB ||
+		iChldType == EReleaseAllActiveCallAndAcceptHeldWaiting ||
+		iChldType == EHeldAllActiveCallAndAcceptHeldWaiting ||
+		iChldType == EAddHeldCallToConversation ||
+		iChldType == ECallTranster)
+		{
+		iTxBuffer.Format(KLtsyCHLDCommandFormat1, iChldType);
+		}
+	else
+		{
+		if (iChldType == ERleaseSpecificCall) //Release one call
+			{
+			
+			const TLtsyCallInformation& tCallInfo(iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(iCallId));
+			
+			if (TLtsyCallInformation::EDialingCall == tCallInfo.GetCallState() ||
+				TLtsyCallInformation::EAlertingCall == 	tCallInfo.GetCallState())
+				{
+				//Hang up dialing or Alerting call(Outgoing call)
+				iTxBuffer.Copy(KLtsyReleaseOutgoingCommand);
+				}
+			else //Other call
+				{
+				iTxBuffer.Format(KLtsyCHLDCommandFormat2, EReleaseAllActiveCallAndAcceptHeldWaiting, iCallId);
+				}
+			}
+		else
+			{
+			iTxBuffer.Format(KLtsyCHLDCommandFormat2, EHeldAllActiveCallAndAcceptHeldWaiting, iCallId);
+			}
+		}
+	
+	LOGTEXT2(_L8("[Ltsy CallControl] CHLD Command = %S"), &iTxBuffer);
+	
+	//Setting waiting for modem time, when Command is too fast, Modem response error
+	if (iIpcType == ELtsyReqCallHold || 
+		iIpcType == ELtsyReqCallResume ||
+		iIpcType == ELtsyReqCallSwap)
+		{
+		User::After(KLtsyCHLDWaitForModemTime);
+		}
+	
+	Write();
+	iATStep = EATWaitForWriteComplete;
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::StartRequest
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::StartRequest()
+	{
+	ExecuteCommand();
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::SetIpcType
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::SetIpcType(TIpcType aIpcType)
+	{
+	iIpcType = aIpcType;
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::SetChldType
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::SetChldType(TChldType aChldType)
+	{
+	iChldType = aChldType;
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::SetCallId
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::SetCallId(TInt aCallId)
+	{
+	iCallId = aCallId;
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::SetConnectedCallId
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::SetConnectedCallId(TInt aConnectedCallId)
+	{
+	iConnectedCallId = aConnectedCallId;
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::SetHangupCase
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::SetHangupCase(TInt aHangupCase)
+	{
+	iHangupCause = aHangupCase;
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::ParseResponseL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::ParseResponseL(const TDesC8& aResponseBuf)
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::ParseResponseL()"));
+	
+	if (aResponseBuf.Match(KLtsyOkString) == 0)
+		{
+		iATResult = KErrNone;
+		}
+	else if (aResponseBuf.Match(KLtsyErrorString) == 0)
+		{
+		iATResult = KErrArgument;
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::HandleIOError
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::HandleIOError()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleIOError()"));
+	
+	//Hangup
+	if (iIpcType == ELtsyReqCallHangup)
+		{
+		iCtsyDispatcherCallback.CallbackCallControlHangUpComp(iIOStatus, iCallId);
+		}
+	else if (iIpcType == ELtsyReqCallHold) //Hold call
+		{
+		iCtsyDispatcherCallback.CallbackCallControlHoldComp(iIOStatus, iCallId);
+		}
+	else if (iIpcType == ELtsyReqCallResume) //Resume call
+		{
+		iCtsyDispatcherCallback.CallbackCallControlResumeComp(iIOStatus, iCallId);
+		}
+	else if (iIpcType == ELtsyReqCallSwap) //Swap call
+		{
+		iCtsyDispatcherCallback.CallbackCallControlSwapComp(iIOStatus);
+		}		
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::HandleResponseError
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::HandleResponseError()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleResponseError()"));
+	
+	//Hangup
+	if (iIpcType == ELtsyReqCallHangup)
+		{
+		iCtsyDispatcherCallback.CallbackCallControlHangUpComp(iATResult, iCallId);
+		}
+	else if (iIpcType == ELtsyReqCallHold) //Hold call
+		{
+		iCtsyDispatcherCallback.CallbackCallControlHoldComp(iATResult, iCallId);
+		}
+	else if (iIpcType == ELtsyReqCallResume) //Resume call
+		{
+		iCtsyDispatcherCallback.CallbackCallControlResumeComp(iATResult, iCallId);
+		}
+	else if (iIpcType == ELtsyReqCallSwap) //Swap call
+		{
+		iCtsyDispatcherCallback.CallbackCallControlSwapComp(iATResult);
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::HandleCHLDComplete
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::HandleCHLDComplete()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleCHLDComplete()"));
+	
+	//Hangup
+	if (iIpcType == ELtsyReqCallHangup)
+		{
+		HandleHangupComplete();
+		}
+	else if (iIpcType == ELtsyReqCallHold) //Hold call
+		{
+		HandleHoldComplete();
+		}
+	else if (iIpcType == ELtsyReqCallResume) //Resume call
+		{
+		HandleResumeComplete();
+		}
+	else if (iIpcType == ELtsyReqCallSwap) //Swap call
+		{
+		HandleSwapComplete();
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::HandleHangupComplete
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::HandleHangupComplete()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleHangupComplete()"));
+	
+	const TLtsyCallInformation& tCallInfo(iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(iCallId));
+	
+	if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed)
+		{
+		if (tCallInfo.GetCallState() == TLtsyCallInformation::EInComingCall ||
+			tCallInfo.GetCallState() == TLtsyCallInformation::EWaitingCall	)
+			{
+			iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrGsmCCCallRejected, 
+					                                                             iCallId, 
+					                                                             RMobileCall::EStatusDisconnecting);
+			
+			iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrGsmCCCallRejected, 
+					                                                             iCallId, 
+					                                                             RMobileCall::EStatusIdle);			
+			}
+		else
+			{
+			iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrGsmCCNormalCallClearing, 
+					                                                             iCallId, 
+					                                                             RMobileCall::EStatusDisconnecting);
+			
+			iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrGsmCCNormalCallClearing, 
+					                                                             iCallId, 
+					                                                             RMobileCall::EStatusIdle);			
+			}
+		}
+	
+	//Call back
+	iCtsyDispatcherCallback.CallbackCallControlHangUpComp(KErrNone, iCallId);
+	//Setting all call id state unused
+	iPhoneGlobals.GetCallInfoManager().ResetCallInformationByCallId(iCallId);
+	}
+
+
+// ---------------------------------------------------------------------------
+// CATChld::HandleHoldComplete
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::HandleHoldComplete()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleHoldComplete()"));
+	
+	iCtsyDispatcherCallback.CallbackCallControlHoldComp(KErrNone, iCallId);
+	iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrNone, 
+			                                                             iCallId, 
+			                                                             RMobileCall::EStatusHold);
+	
+	//Notify CTSY Call id Idel
+	for (TInt n = KLtsyMinCallId; n <= KLtsyMaxCallId; n++)
+		{
+		TLtsyCallInformation& tCallInfo(iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(n));
+		if (n == iCallId)
+			{
+			if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed)
+				{
+				//Setting my call state active
+				tCallInfo.SetCallState(TLtsyCallInformation::EHeldCall);				
+				}
+			}
+		else
+			{
+			if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed)
+				{
+				//Setting my call state active
+				tCallInfo.SetCallState(TLtsyCallInformation::EActiveCall);
+				
+				//Notify CTSY call state change
+				iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrNone, 
+																					 n,
+																                     RMobileCall::EStatusConnected);
+				}
+			}
+		}	
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::HandleResumeComplete
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::HandleResumeComplete()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleResumeComplete()"));
+	
+	iCtsyDispatcherCallback.CallbackCallControlResumeComp(KErrNone, iCallId);
+	iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrNone, 
+			                                                             iCallId, 
+			                                                             RMobileCall::EStatusConnected);
+
+	//Notify CTSY Call id Idel
+	for (TInt n = KLtsyMinCallId; n <= KLtsyMaxCallId; n++)
+		{
+		TLtsyCallInformation& tCallInfo(iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(n));
+		if (n == iCallId)
+			{
+			if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed)
+				{
+				//Setting my call state active
+				tCallInfo.SetCallState(TLtsyCallInformation::EActiveCall);				
+				}			
+			}
+		else
+			{
+			if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed)
+				{
+				//Setting my call state active
+				tCallInfo.SetCallState(TLtsyCallInformation::EHeldCall);
+				
+				//Notify CTSY call state change
+				iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrNone, 
+																					 n,
+																                     RMobileCall::EStatusHold);
+				}			
+			}
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::HandleSwapComplete
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::HandleSwapComplete()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleSwapComplete()"));
+	
+	iCtsyDispatcherCallback.CallbackCallControlSwapComp(KErrNone);
+	
+	//One call or two calls situation
+	for (TInt n = KLtsyMinCallId; n <= KLtsyMaxCallId; n++)
+		{
+		TLtsyCallInformation& tCallInfo(iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(n));
+		
+		if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed &&
+			tCallInfo.GetCallState() == TLtsyCallInformation::EActiveCall)
+			{
+			tCallInfo.SetCallState(TLtsyCallInformation::EHeldCall);
+			//Notify CTSY call state change
+			iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrNone, 
+																				 n,
+															                     RMobileCall::EStatusHold);			
+			}
+		else if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed &&
+				((tCallInfo.GetCallState() == TLtsyCallInformation::EHeldCall) || 
+				 (tCallInfo.GetCallState() == TLtsyCallInformation::EWaitingCall) ||
+				 (tCallInfo.GetCallState() == TLtsyCallInformation::EInComingCall))) //????
+			{
+			tCallInfo.SetCallState(TLtsyCallInformation::EActiveCall);
+			//Notify CTSY call state change
+			iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrNone, 
+																				 n,
+															                     RMobileCall::EStatusConnected);			
+			}		
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::Complete
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::Complete()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::Complete()"));
+	
+	//Check Hang up arrray
+	if ((iIpcType == ELtsyReqCallHangup) && iPhoneGlobals.GetCallInfoManager().GetHangupCommandRecords().IsHaveRecords())
+		{
+		InitVariable();
+		
+		TATHanupCommandInfo tHangupInfo;
+		iPhoneGlobals.GetCallInfoManager().GetHangupCommandRecords().GetFirstHangupCommandInfoAndRemoveIt(tHangupInfo);
+		
+		//Set hang up info
+		SetCallId(tHangupInfo.iCallId);
+		SetHangupCase(tHangupInfo.iHangupCause);
+		SetIpcType(CATChld::ELtsyReqCallHangup);
+		SetChldType(CATChld::ERleaseSpecificCall);
+		StartRequest();
+		return;
+		}
+	
+	//Invoke base class complete
+	CAtCommandBase::Complete();
+	
+	//Set hang up active
+	iPhoneGlobals.GetCallInfoManager().GetHangupCommandRecords().SetHangupActiveFlag(EFalse);
+	
+	//Let other command can use I/O port
+	iPhoneGlobals.iEventSignalActive = EFalse;
+	}
+
+// ---------------------------------------------------------------------------
+// CATChld::EventSignal
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATChld::EventSignal(TAtEventSource aEventSource, TInt aStatus)
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::EventSignal()"));
+	if(aEventSource == EReadCompletion)
+	    {
+	    LOGTEXT(_L8("[Ltsy CallControl] The EventSource = EReadCompletion"));
+	    }
+	else if(aEventSource == EWriteCompletion)
+	    {
+	    LOGTEXT(_L8("[Ltsy CallControl] The EventSource = EWriteCompletion"));
+	    }
+	else if(aEventSource == ETimeoutCompletion)
+	    {
+	    LOGTEXT(_L8("[Ltsy CallControl] The EventSource = ETimeoutCompletion"));
+	    }
+	else
+	    {
+	    LOGTEXT(_L8("[Ltsy CallControl] The EventSource = Unknown"));
+	    }
+	    
+	LOGTEXT2(_L8("[Ltsy CallControl]aStatus = %d"),aStatus);
+
+	iIOStatus = aStatus;
+	
+	if (iIOStatus != KErrNone)
+		{
+		HandleIOError();
+		Complete();
+		return;
+		}
+	
+	switch (iATStep)
+		{
+		case EATWaitForWriteComplete:
+			iATStep = EATReadComplete;
+			break;
+			
+		case EATReadComplete:
+			ClearCurrentLine();
+			if (iATResult == KErrNone)
+				{
+				HandleCHLDComplete();
+				}
+			else
+				{
+				HandleResponseError();
+				}
+			Complete();
+			break;
+			
+		default:
+			break;
+		}
+	}
+
+//End of file