diff -r 2473f5e227f9 -r 8b72faa1200f cbsref/telephonyrefplugins/atltsy/atcommand/callcontrol/src/atclcc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsref/telephonyrefplugins/atltsy/atcommand/callcontrol/src/atclcc.cpp Tue Jun 22 11:02:32 2010 +0100 @@ -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 array; + CleanupClosePushL(array); + iParser->ParseRespondedBuffer(array, aResponseBuf); + TInt nCount = array.Count(); + + // 1 2 3 4 5 6 + //+CLCC : , , , , + //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