--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsref/telephonyrefplugins/atltsy/atcommand/callcontrol/src/atclcc.cpp Tue Jul 06 15:36:38 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