cbsref/telephonyrefplugins/atltsy/atcommand/callcontrol/src/atclcc.cpp
branchRCL_3
changeset 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsref/telephonyrefplugins/atltsy/atcommand/callcontrol/src/atclcc.cpp	Tue Aug 31 16:23:08 2010 +0300
@@ -0,0 +1,511 @@
+// 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 atclcc.cpp
+// This contains CATClcc which query incoming or waitting call information.
+// 
+
+//system include
+
+//user include
+#include "mslogger.h"
+#include "atmanager.h"
+#include "activecommandstore.h"
+#include "atclcc.h"
+#include "callinformationquerycompletenotify.h"
+#include "ltsycommondefine.h"
+#include "ltsycallinformationmanager.h"
+
+//const define
+const TInt KLtsyClccReadTimeout = 2;
+
+//List current call information 
+_LIT8(KLtsyCLCCCommand, "AT+CLCC\r");
+_LIT8(KLtsyCLCCMatchString, "+CLCC:*");
+
+
+// ---------------------------------------------------------------------------
+// CATClcc::NewL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CATClcc* CATClcc::NewL(CGlobalPhonemanager& aGloblePhone,
+			           CCtsyDispatcherCallback& aCtsyDispatcherCallback)
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::NewL()"));
+	
+	CATClcc* self = CATClcc::NewLC(aGloblePhone, aCtsyDispatcherCallback);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::NewLC
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CATClcc* CATClcc::NewLC(CGlobalPhonemanager& aGloblePhone,
+		                CCtsyDispatcherCallback& aCtsyDispatcherCallback)
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::NewLC()"));
+	
+	CATClcc* self = new (ELeave) CATClcc(aGloblePhone, aCtsyDispatcherCallback);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CATClcc::~CATClcc
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CATClcc::~CATClcc()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::~CATClcc()"));
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::CATClcc
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CATClcc::CATClcc(CGlobalPhonemanager& aGloblePhone, 
+		         CCtsyDispatcherCallback& aCtsyDispatcherCallback)
+				 :CAtCommandBase(aGloblePhone, aCtsyDispatcherCallback)
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::CATClcc()"));
+	
+	iAtType = ELtsyAT_General_CLCC;
+	
+	iQueryCallInfoNotify = NULL;
+	InitVariable();
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::ConstructL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATClcc::ConstructL()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::ConstructL()"));
+	
+	//Invoke base class function
+	CAtCommandBase::ConstructL();
+	
+	//Set read and write timeout
+	SetTimeOut(KLtsyDefaultWriteTimeOut, KLtsyClccReadTimeout);
+	
+	//Add expecting string
+	AddExpectStringL(KLtsyCLCCMatchString);
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::ExecuteCommand
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATClcc::ExecuteCommand()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::ExecuteCommand()"));
+	
+	iOKFounded = EFalse;
+	iTxBuffer.Copy(KLtsyCLCCCommand);
+	Write();
+	iATStep = EATWaitForWriteComplete;
+	iProcessStates = EProcessInProgress;
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::InitVariable
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATClcc::InitVariable()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::InitVariable()"));
+	
+	iOKFounded = EFalse;
+	iIOStatus = KErrNone;
+	iATResult = KErrNone;
+	iATStep = EATNotInProgress;
+	iProcessStates = EProcessNotInProgress;	
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::AddQueryCallInformationCompleteNotify
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATClcc::AddQueryCallInformationCompleteNotify(MCallInformationQueryCompleteNotify* aQueryCallInfoNotify)
+	{
+	iQueryCallInfoNotify = aQueryCallInfoNotify;
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::GetProcessStates
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CATClcc::TATProcessStates CATClcc::GetProcessStates() const
+	{
+	return iProcessStates;
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::SetProcessStates
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATClcc::SetProcessStates(CATClcc::TATProcessStates aProcessState)
+	{
+	iProcessStates = aProcessState;
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::StartRequest
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATClcc::StartRequest()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::StartRequest()"));
+	
+	ExecuteCommand();
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::ParseCLCCResponseL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATClcc::ParseCLCCResponseL(const TDesC8& aResponseBuf)
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::ParseCLCCResponseL()"));
+	
+	RArray<TPtrC8> array;
+	CleanupClosePushL(array);
+	iParser->ParseRespondedBuffer(array, aResponseBuf);
+	TInt nCount = array.Count();
+	
+	//  1       2      3      4       5       6
+	//+CLCC : <id1>, <dir>, <stat>, <mode>, <mpty>
+	//Its count must >= 6
+	if (nCount < 6)	  
+		{
+		CleanupStack::PopAndDestroy(1);
+		return;
+		}
+	
+	//Parse +CLCC :* buffer
+	//Only care Waiting call and incoming call
+	TInt nVal(0);
+	TLex8 tLex(array[3]);
+	if (tLex.Val(nVal) == KErrNone)
+		{		
+		if (nVal == TLtsyCallInformation::EActiveCall ||
+			nVal == TLtsyCallInformation::EHeldCall ||
+			nVal == TLtsyCallInformation::EDialingCall ||
+			nVal == TLtsyCallInformation::EAlertingCall )
+			{
+			CleanupStack::PopAndDestroy(1);
+			LOGTEXT(_L8("[Ltsy CallControl] First Parse state of the call not find incoming call and waiting call"));
+			return;			
+			}
+		
+		}
+	else
+		{
+		CleanupStack::PopAndDestroy(1);
+		LOGTEXT(_L8("[Ltsy CallControl] First Parse state of the call Failing"));
+		return;
+		}
+	
+	//Parse incoming call or waiting call
+	
+	//Call id
+	tLex.Assign(array[1]);
+	if ((tLex.Val(nVal) != KErrNone)||
+	    (nVal < KLtsyMinCallId)	||
+		(nVal > KLtsyMaxCallId))
+		{
+		CleanupStack::PopAndDestroy(1);
+		LOGTEXT(_L8("[Ltsy CallControl] Parse call id of the call Failing"));
+		return;
+		}
+   
+	//Parse call id success
+	TLtsyCallInformation& callinfo(iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(nVal));
+	callinfo.SetCallIdIsUsedInfo(TLtsyCallInformation::EUsed);
+	callinfo.SetCallId(nVal);
+	
+	TBool bSuccess(ETrue);
+	for (TInt n = 2; bSuccess && n < nCount; n++)
+		{
+		//Direction Call
+		if (n == 2)
+			{
+			tLex.Assign(array[n]);
+			if (tLex.Val(nVal) == KErrNone)
+				{
+				if (TLtsyCallInformation::EMoCall == nVal)
+					{
+					callinfo.SetCallDirection(TLtsyCallInformation::EMoCall);
+					}
+				else
+					{
+					callinfo.SetCallDirection(TLtsyCallInformation::EMtCall);
+					}
+				}
+			else
+				{
+				bSuccess = EFalse;
+				LOGTEXT(_L8("[Ltsy CallControl] Parse direction call Failing"));
+				}
+			}
+		
+		//State of the Call
+		if (n == 3)
+			{
+			tLex.Assign(array[n]);
+			if (tLex.Val(nVal) == KErrNone)
+				{
+				if (TLtsyCallInformation::EInComingCall == nVal)
+					{
+					callinfo.SetCallState(TLtsyCallInformation::EInComingCall);
+					}
+				else
+					{
+					callinfo.SetCallState(TLtsyCallInformation::EWaitingCall);
+					}
+				}
+			else
+				{
+				bSuccess = EFalse;
+				LOGTEXT(_L8("[Ltsy CallControl] Parse state of the call Failing"));				
+				}
+			}
+		
+		//Teleservice
+		if (n == 4)
+			{
+			tLex.Assign(array[n]);
+			if (tLex.Val(nVal) == KErrNone)
+				{
+				if (TLtsyCallInformation::EVoiceCall == nVal)
+					{
+					callinfo.SetCallMode(TLtsyCallInformation::EVoiceCall);
+					}
+				else if (TLtsyCallInformation::EDataCall == nVal)
+					{
+					callinfo.SetCallMode(TLtsyCallInformation::EDataCall);
+					}
+				else if (TLtsyCallInformation::EFaxCall == nVal)
+					{
+					callinfo.SetCallMode(TLtsyCallInformation::EFaxCall);
+					}
+				else
+					{
+					callinfo.SetCallMode(TLtsyCallInformation::EUnKnowCall);
+					}
+				}
+			else
+				{
+				bSuccess = EFalse;
+				LOGTEXT(_L8("[Ltsy CallControl] Parse teleservice Failing"));					
+				}
+			}
+
+		//multiparty
+		if (n == 5)
+			{
+			tLex.Assign(array[n]);
+			if (tLex.Val(nVal) == KErrNone)
+				{
+				if (TLtsyCallInformation::ENotConference == nVal)
+					{
+					callinfo.SetConferenceCall(TLtsyCallInformation::ENotConference);
+					}
+				else
+					{
+					callinfo.SetConferenceCall(TLtsyCallInformation::EIsConference);
+					}
+				}
+			else
+				{
+				bSuccess = EFalse;
+				LOGTEXT(_L8("[Ltsy CallControl] Parse multiparty Failing"));				
+				}
+			}
+		
+		//telenum
+		if (n == 6)
+			{
+			callinfo.SetMobileTelNum(array[n]);
+			}		
+
+		//type of address
+		if (n == 7)
+			{
+			tLex.Assign(array[n]);
+			if (tLex.Val(nVal) == KErrNone)
+				{
+				callinfo.SetAddressType(nVal);
+				}
+			else
+				{
+				bSuccess = EFalse;
+				LOGTEXT(_L8("[Ltsy CallControl] Parse type of address Failing"));				
+				}
+			}
+		
+		//alpah
+		if (n == 8)
+			{
+			callinfo.SetMobileName(array[n]);
+			}
+		}
+	
+	//Parse failer
+	if (!bSuccess)
+		{
+		iPhoneGlobals.GetCallInfoManager().ResetCallInformationByCallId(callinfo.GetCallId());
+		}
+	
+	CleanupStack::PopAndDestroy(1);
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::ParseResponseL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATClcc::ParseResponseL(const TDesC8& aResponseBuf)
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::ParseResponseL()"));
+	
+	//Process expecting string +CLCC : *
+	if (aResponseBuf.Match(KLtsyCLCCMatchString) == 0)
+		{
+		ParseCLCCResponseL(aResponseBuf);
+		}
+	else if (aResponseBuf.Match(KLtsyOkString) == 0) //Process expecting string OK
+		{
+		iATResult = KErrNone;
+		iProcessStates = EProcessOK;
+		iOKFounded = ETrue;		
+		}
+	else if (aResponseBuf.Match(KLtsyErrorString) == 0) //Process expecting string ERROR
+		{
+		iATResult = KErrArgument;
+		iProcessStates = EProcessError;
+		iOKFounded = EFalse;		
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::HandleIOError
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATClcc::HandleIOError()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::HandleIOError()"));
+	
+	iProcessStates = EProcessError;
+	
+	if (iQueryCallInfoNotify != NULL)
+		{
+		iQueryCallInfoNotify->QueryCallInformationComplete(iIOStatus);
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::HandleResponseError
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATClcc::HandleResponseError()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::HandleResponseError()"));
+	
+	if (iQueryCallInfoNotify != NULL)
+		{
+		iQueryCallInfoNotify->QueryCallInformationComplete(iATResult);
+		}	
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::HandleCLCCComplete
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATClcc::HandleCLCCComplete()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::HandleCLCCComplete()"));
+	
+	if (iQueryCallInfoNotify != NULL)
+		{
+		iQueryCallInfoNotify->QueryCallInformationComplete(KErrNone);
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::Complete
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATClcc::Complete()
+	{
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::Complete()"));
+	LOGTEXT2(_L8("[Ltsy CallControl] iIOStatus = %d"), iIOStatus);
+	LOGTEXT2(_L8("[Ltsy CallControl] iATResult = %d"), iATResult);
+	
+	//Remove Ative Command and stop timer
+	CAtCommandBase::Complete();
+	
+	//Let other command can use I/O port
+	iPhoneGlobals.iEventSignalActive = EFalse;
+	}
+
+// ---------------------------------------------------------------------------
+// CATClcc::EventSignal
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATClcc::EventSignal(TAtEventSource /*aEventSource*/, TInt aStatus)
+	{  
+	LOGTEXT(_L8("[Ltsy CallControl] Starting CATClcc::EventSignal()"));
+	LOGTEXT2(_L8("[Ltsy CallControl] aEventSource = %d\taStatus = %d"),aStatus);
+	
+	iIOStatus = aStatus;
+	if (iIOStatus != KErrNone)
+		{
+		HandleIOError();	
+		Complete();
+		return;
+		}
+	
+	switch (iATStep)
+		{
+		case EATWaitForWriteComplete:
+			iATStep = EATReadComplete;
+			break;
+			
+		case EATReadComplete:
+			ClearCurrentLine();
+			if (iATResult == KErrNone)
+				{
+				if (iOKFounded)
+					{
+					HandleCLCCComplete();
+					Complete();
+					}
+				}
+			else
+				{
+				HandleResponseError();
+				Complete();
+				}
+			break;
+			
+		default:
+			break;
+		}
+	}
+
+//End of file