diff -r 000000000000 -r 3553901f7fa8 telephonyserverplugins/multimodetsy/Multimode/gprs/atgprssetqosprofile.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyserverplugins/multimodetsy/Multimode/gprs/atgprssetqosprofile.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,1327 @@ +// Copyright (c) 2001-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: +// + + + +#include "gprsqos.h" +#include "mSLOGGER.H" +#include +#include "atgprsqosprofile.h" +#include "ATIO.H" +#include +#include "NOTIFY.H" +#include "Matstd.h" + +_LIT8(KGetCGQREQCommand,"AT+CGQREQ?\r"); +_LIT8(KGetCGQMINCommand,"AT+CGQMIN?\r"); +_LIT8(KCGQmin, "AT+CGQMIN=%d,%d,%d,%d,%d,%d\r"); +_LIT8(KCGQreq, "AT+CGQREQ=%d,%d,%d,%d,%d,%d\r"); + + + /** + * @file + * This file implements the CATGprsSetProfile class and the CATGprsGetProfile. These two classes are used by the + * GPRS AT TSY library. + * This state machine uses "AT+CGQREQ" "AT+CGQMIN" commands. + */ +CATGprsSetProfile* CATGprsSetProfile::NewL(TInt aCid, CATIO* aIo, CTelObject* aTelObject, CATInit* aInit, CPhoneGlobals* aPhoneGlobals) +/** + * Standard 2 phase constructor. + * + * @param aIo pointer to communication object. + * @param aTelObject pointer to parent. + * @param aPhoneGlobals pointer to phone global wide states. + */ + { + CATGprsSetProfile* p=new(ELeave) CATGprsSetProfile(aCid, aIo, aTelObject, aInit, aPhoneGlobals); + CleanupStack::PushL(p); + p->ConstructL(); + CleanupStack::Pop(); + return p; + } + +void CATGprsSetProfile::ConstructL() +/** + * Construct all objects that can leave. + */ + { + CATCommands::ConstructL(); + } + + +CATGprsSetProfile::CATGprsSetProfile(TInt aCid, CATIO* aIo, CTelObject *aTelObject, CATInit* aInit, CPhoneGlobals* aPhoneGlobals) + : CATCommands(aIo, aTelObject, aInit, aPhoneGlobals), iCid(aCid) +/** + * Constructor. + * + * @param aIo pointer to communication object. + * @param aTelObject pointer to parent. + * @param aInit pointer to AT phone init object. + * @param aPhoneGlobals pointer to phone global wide states. + */ + { + LOGTEXT(_L8("CATGprsClass::CATGprsClass called")); + } + + +CATGprsSetProfile::~CATGprsSetProfile() +/** + * Destructor. + */ + { + LOGTEXT(_L8("CATGprsSetProfile::~CATGprsSetProfile called")); + } + + +void CATGprsSetProfile::Start(TTsyReqHandle aTsyReqHandle, TAny* aConfig) +/** + * This starts the sending of the set commands. + * + * @param aConfig config package. + * @param aTsyReqHandle handle to the client. + */ + { + TPckg* qoSProfileV1Pckg = (TPckg*)aConfig; + iGprsReqProfile = &(*qoSProfileV1Pckg)(); + MakeupCGQMIN(); + LOGTEXT(_L8("CATGprsSetProfile:\tCATConfigGPRS::Start function called in TSY")); + + __ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString) != NULL, Panic(EGeneral)); + iReqHandle = aTsyReqHandle; + iState=EWaitForSetCGQMINComplete; + Write(KGprsCommandTimeOut); + } + +void CATGprsSetProfile::Stop(TTsyReqHandle aTsyReqHandle) +/** + * This function cancels the outstanding read and sets the state to EWaitForDSR. + * + * @param aTsyReqHandle handle to the client. + */ + { + LOGTEXT(_L8("CATGprsSetProfile::Stop called")); + if(iState!=EATNotInProgress && aTsyReqHandle==iReqHandle) + { + LOGTEXT(_L8("CATGprsSetProfile::Stop Completing client request with KErrCancel")); + Complete(KErrCancel,ETimeOutCompletion); + } + } + + +void CATGprsSetProfile::CompleteWithIOError(TEventSource aSource,TInt aStatus) +/** + * This Function completes the command from the client whith an error. + * + * @param aSource source of event from communication class. + * @param aStatus status of event. + */ + { + Complete(aStatus, aSource); + } + + +void CATGprsSetProfile::Complete(TInt aErr, TEventSource aSource) +/** + * This Function completes the get or set command from the client. + * + * @param aErr an error code to relay to client. + */ + { + LOGTEXT(_L8("CATGprsSetProfile::Complete")); + RemoveStdExpectStrings(); + iIo->WriteAndTimerCancel(this); + iIo->RemoveExpectStrings(this); + if (aErr == KErrNone) + { + ((CGprsQoS*)iTelObject)->SetReqQoSProfile(iGprsReqProfile); + iPhoneGlobals->iNotificationStore->CheckNotification(iTelObject, EPacketQoSProfileChanged); + } + + // Allow our base class to do its thing and then complete the client request + CATCommands::Complete(aErr,aSource); + iTelObject->ReqCompleted(iReqHandle,aErr); + + iState=EATNotInProgress; + } + + +void CATGprsSetProfile::EventSignal(TEventSource aSource) +/** + * This function contains the state machine for the command. The states flow consecutively in + * get and set states and are described below. + * + * @par aSource Source of function call. + * + * @par EWaitForSetCGQMINComplete, + * Wait for response from the phone on the set command. + * + * @par EWaitForSetCGQMINOK, + * Validate phone response and send set AT+CGQREQ command. + * + * @par EWaitForSetCGQREQComplete, + * Wait for response from the phone on the set command. + * + * @par EWaitForSetCGQREQOK, + * Validate response and Complete set command. + */ + { + LOGTEXT2(_L8("CATGprsSetProfile::EventSignal with iState %d"),iState); + if ((aSource==ETimeOutCompletion)) + { + LOGTEXT(_L8("CATGprsSetProfile:\tTimeout Error during Config")); + Complete(KErrTimedOut,aSource); + return; + } + switch(iState) + { + case EWaitForSetCGQMINComplete: + { + LOGTEXT(_L8("CATGprsSetProfile::EventSignal, EWaitForSetCGQMINComplete")); + iIo->WriteAndTimerCancel(this); + StandardWriteCompletionHandler(aSource, KGprsCommandTimeOut); + iState = EWaitForSetCGQMINOK; + } + break; + case EWaitForSetCGQMINOK: + { + LOGTEXT(_L8("CATGprsSetProfile::EventSignal, EWaitForSetCGQMINOK")); + __ASSERT_ALWAYS(aSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected)); + TInt ret = ValidateExpectString(); + RemoveStdExpectStrings(); + if(ret) + { + Complete(ret, aSource); + return; + } + MakeupCGQREQ(); + Write(KGprsCommandTimeOut); + iState = EWaitForSetCGQREQComplete; + } + break; + case EWaitForSetCGQREQComplete: + { + LOGTEXT(_L8("CATGprsSetProfile::EventSignal, EWaitForSetCGQREQComplete")); + StandardWriteCompletionHandler(aSource, KGprsCommandTimeOut); + iState = EWaitForSetCGQREQOK; + } + break; + case EWaitForSetCGQREQOK: + { + LOGTEXT(_L8("CATGprsSetProfile::EventSignal, EWaitForSetCGQREQOK")); + __ASSERT_ALWAYS(aSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected)); + TInt ret = ValidateExpectString(); + Complete(ret, aSource); + } + break; + case EATNotInProgress: + break; + default: + { + LOGTEXT(_L8("CATGprsSetProfile::EventSignal, default. Panic")); + Panic(EIllegalEvent); + } + break; + } + } + + +void CATGprsSetProfile::MakeupCGQMIN() +/** + * This Function creates the at set string for the AT+CGQMIN command. + */ + { + TInt precedence, delay, reliability, peakthru, meanthru = 0; + + switch (iGprsReqProfile->iMinPrecedence) + { + case RPacketQoS::EPriorityHighPrecedence: + precedence = 1; // high precedence + break; + + case RPacketQoS::EPriorityMediumPrecedence: + precedence = 2; // normal precedence + break; + + case RPacketQoS::EPriorityLowPrecedence: + precedence = 3; // low precedence + break; + + default: + precedence = 0; // unspecified or unknown precedence + break; + }; + + switch (iGprsReqProfile->iMinDelay) + { + case RPacketQoS::EDelayClass1: + delay = 1; + break; + + case RPacketQoS::EDelayClass2: + delay = 2; + break; + + case RPacketQoS::EDelayClass3: + delay = 3; + break; + + case RPacketQoS::EDelayClass4: + delay = 4; + break; + + default: + delay = 0; + break; + }; + + switch (iGprsReqProfile->iMinReliability) + { + case RPacketQoS::EReliabilityClass1: + reliability = 1; + break; + + case RPacketQoS::EReliabilityClass2: + reliability = 2; + break; + + case RPacketQoS::EReliabilityClass3: + reliability = 3; + break; + + case RPacketQoS::EReliabilityClass4: + reliability = 4; + break; + + case RPacketQoS::EReliabilityClass5: + reliability = 5; + break; + + default: + reliability = 0; // unspecified or unknown reliability + break; + }; + + switch (iGprsReqProfile->iMinPeakThroughput) + { + case RPacketQoS::EPeakThroughput1000: + peakthru = 1; + break; + + case RPacketQoS::EPeakThroughput2000: + peakthru = 2; + break; + + case RPacketQoS::EPeakThroughput4000: + peakthru = 3; + break; + + case RPacketQoS::EPeakThroughput8000: + peakthru = 4; + break; + + case RPacketQoS::EPeakThroughput16000: + peakthru = 5; + break; + + case RPacketQoS::EPeakThroughput32000: + peakthru = 6; + break; + + case RPacketQoS::EPeakThroughput64000: + peakthru = 7; + break; + + case RPacketQoS::EPeakThroughput128000: + peakthru = 8; + break; + + case RPacketQoS::EPeakThroughput256000: + peakthru = 9; + break; + + default: + peakthru = 0; // unspecified or unknown peak throughput + break; + }; + + switch (iGprsReqProfile->iMinMeanThroughput) + { + case RPacketQoS::EMeanThroughput100: + meanthru = 2; + break; + + case RPacketQoS::EMeanThroughput200: + meanthru = 3; + break; + + case RPacketQoS::EMeanThroughput500: + meanthru = 4; + break; + + case RPacketQoS::EMeanThroughput1000: + meanthru = 5; + break; + + case RPacketQoS::EMeanThroughput2000: + meanthru = 6; + break; + + case RPacketQoS::EMeanThroughput5000: + meanthru = 7; + break; + + case RPacketQoS::EMeanThroughput10000: + meanthru = 8; + break; + + case RPacketQoS::EMeanThroughput20000: + meanthru = 9; + break; + + case RPacketQoS::EMeanThroughput50000: + meanthru = 10; + break; + + case RPacketQoS::EMeanThroughput100000: + meanthru = 11; + break; + + case RPacketQoS::EMeanThroughput200000: + meanthru = 12; + break; + case RPacketQoS::EMeanThroughput500000: + meanthru = 13; + break; + + case RPacketQoS::EMeanThroughput1000000: + meanthru = 14; + break; + + case RPacketQoS::EMeanThroughput2000000: + meanthru = 15; + break; + + case RPacketQoS::EMeanThroughput5000000: + meanthru = 16; + break; + + case RPacketQoS::EMeanThroughput10000000: + meanthru = 17; + break; + + case RPacketQoS::EMeanThroughput20000000: + meanthru = 18; + break; + + case RPacketQoS::EUnspecifiedMeanThroughput: + case RPacketQoS::EMeanThroughput50000000: + meanthru = 31; + break; + + default: + meanthru = 0; // unspecified or unknown mean throughput + break; + }; + + + iTxBuffer.Format(KCGQmin, iCid, + precedence, + delay, + reliability, + peakthru, + meanthru); + } + + +void CATGprsSetProfile::MakeupCGQREQ() +/** + * This Function creates the at set string for the AT+CGQREQ command. + */ + { + TInt precedence, delay, reliability, peakthru, meanthru = 0; + + switch (iGprsReqProfile->iReqPrecedence) + { + case RPacketQoS::EPriorityHighPrecedence: + precedence = 1; // high precedence + break; + + case RPacketQoS::EPriorityMediumPrecedence: + precedence = 2; // normal precedence + break; + + case RPacketQoS::EPriorityLowPrecedence: + precedence = 3; // low precedence + break; + + default: + precedence = 0; // unspecified or unknown precedence + break; + }; + + switch (iGprsReqProfile->iReqDelay) + { + case RPacketQoS::EDelayClass1: + delay = 1; + break; + + case RPacketQoS::EDelayClass2: + delay = 2; + break; + + case RPacketQoS::EDelayClass3: + delay = 3; + break; + + case RPacketQoS::EDelayClass4: + delay = 4; + break; + + default: + delay = 0; + break; + }; + + switch (iGprsReqProfile->iReqReliability) + { + case RPacketQoS::EReliabilityClass1: + reliability = 1; + break; + + case RPacketQoS::EReliabilityClass2: + reliability = 2; + break; + + case RPacketQoS::EReliabilityClass3: + reliability = 3; + break; + + case RPacketQoS::EReliabilityClass4: + reliability = 4; + break; + + case RPacketQoS::EReliabilityClass5: + reliability = 5; + break; + + default: + reliability = 0; // unspecified or unknown reliability + break; + }; + + switch (iGprsReqProfile->iReqPeakThroughput) + { + case RPacketQoS::EPeakThroughput1000: + peakthru = 1; + break; + + case RPacketQoS::EPeakThroughput2000: + peakthru = 2; + break; + + case RPacketQoS::EPeakThroughput4000: + peakthru = 3; + break; + + case RPacketQoS::EPeakThroughput8000: + peakthru = 4; + break; + + case RPacketQoS::EPeakThroughput16000: + peakthru = 5; + break; + + case RPacketQoS::EPeakThroughput32000: + peakthru = 6; + break; + + case RPacketQoS::EPeakThroughput64000: + peakthru = 7; + break; + + case RPacketQoS::EPeakThroughput128000: + peakthru = 8; + break; + + case RPacketQoS::EPeakThroughput256000: + peakthru = 9; + break; + + default: + peakthru = 0; // unspecified or unknown peak throughput + break; + }; + + switch (iGprsReqProfile->iReqMeanThroughput) + { + case RPacketQoS::EMeanThroughput100: + meanthru = 2; + break; + + case RPacketQoS::EMeanThroughput200: + meanthru = 3; + break; + + case RPacketQoS::EMeanThroughput500: + meanthru = 4; + break; + + case RPacketQoS::EMeanThroughput1000: + meanthru = 5; + break; + + case RPacketQoS::EMeanThroughput2000: + meanthru = 6; + break; + + case RPacketQoS::EMeanThroughput5000: + meanthru = 7; + break; + + case RPacketQoS::EMeanThroughput10000: + meanthru = 8; + break; + + case RPacketQoS::EMeanThroughput20000: + meanthru = 9; + break; + + case RPacketQoS::EMeanThroughput50000: + meanthru = 10; + break; + + case RPacketQoS::EMeanThroughput100000: + meanthru = 11; + break; + + case RPacketQoS::EMeanThroughput200000: + meanthru = 12; + break; + case RPacketQoS::EMeanThroughput500000: + meanthru = 13; + break; + + case RPacketQoS::EMeanThroughput1000000: + meanthru = 14; + break; + + case RPacketQoS::EMeanThroughput2000000: + meanthru = 15; + break; + + case RPacketQoS::EMeanThroughput5000000: + meanthru = 16; + break; + + case RPacketQoS::EMeanThroughput10000000: + meanthru = 17; + break; + + case RPacketQoS::EMeanThroughput20000000: + meanthru = 18; + break; + + case RPacketQoS::EUnspecifiedMeanThroughput: + case RPacketQoS::EMeanThroughput50000000: + meanthru = 31; + break; + + default: + meanthru = 0; // unspecified or unknown mean throughput + break; + }; + + iTxBuffer.Format(KCGQreq,iCid, + precedence, + delay, + reliability, + peakthru, + meanthru); + } + + + +// +// +// CATGprsGetProfile +// +// +// +// + +CATGprsGetProfile* CATGprsGetProfile::NewL(TInt aCid, CATIO* aIo, CTelObject* aTelObject, CATInit* aInit, CPhoneGlobals* aPhoneGlobals) +/** + * Standard 2 phase constructor. + * @param aIo pointer to communication object. + * @param aTelObject pointer to parent. + * @param aInit pointer to AT phone init object. + * @param aPhoneGlobals pointer to phone global wide states. + */ + { + CATGprsGetProfile* p=new(ELeave) CATGprsGetProfile(aCid, aIo, aTelObject, aInit, aPhoneGlobals); + CleanupStack::PushL(p); + p->ConstructL(); + CleanupStack::Pop(); + return p; + } + +void CATGprsGetProfile::ConstructL() +/** + * Construct all objects that can leave. + */ + { + CATCommands::ConstructL(); + } + +CATGprsGetProfile::CATGprsGetProfile(TInt aCid, CATIO* aIo, CTelObject *aTelObject, CATInit* aInit, CPhoneGlobals* aPhoneGlobals) + : CATCommands(aIo, aTelObject, aInit, aPhoneGlobals), iCid(aCid) +/** + * Constructor. + * @param aIo pointer to communication object. + * @param aTelObject pointer to parent. + * @param aInit pointer to AT phone init object. + * @param aPhoneGlobals pointer to phone global wide states. + */ + {} + + +CATGprsGetProfile::~CATGprsGetProfile() +/** + * Destructor. + */ + {} + + +void CATGprsGetProfile::Start(TTsyReqHandle aTsyReqHandle, TAny* aConfig) +/** + * This starts the sending of the get commands. + * + * @param aTsyReqHandle handle to the client. + * @param aConfig Pointer to a RPacketQoS::TQoSGPRSNegotiated + */ + + { + TPckg* qoSProfileV1Pckg = (TPckg*)aConfig; + iGprsNegProfile= &(*qoSProfileV1Pckg)(); + LOGTEXT(_L8("CATGprsGetProfile:\tCATConfigGPRS::Start function called in TSY")); + + __ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString) != NULL, Panic(EGeneral)); + iReqHandle = aTsyReqHandle; + iState=EWaitForGetCGQMINComplete; + Write(KGetCGQMINCommand, KGprsCommandTimeOut); + } + +void CATGprsGetProfile::Stop(TTsyReqHandle aTsyReqHandle) +/** + * This function cancels the outstanding read and sets the state to EWaitForDSR. + * + * @param aTsyReqHandle handle to the client. + */ + { + LOGTEXT(_L8("CATGprsGetProfile::Stop called")); + if(iState!=EATNotInProgress && aTsyReqHandle==iReqHandle) + { + LOGTEXT(_L8("CATGprsGetProfile::Stop Completing client request with KErrCancel")); + Complete(KErrCancel,ETimeOutCompletion); + } + } + +void CATGprsGetProfile::Complete(TInt aErr, TEventSource aSource) +/** + * This Function completes the get or set command from the client. + * @param aErr and error to relay to the client. + */ + { + LOGTEXT(_L8("CATGprsGetProfile::Complete")); + RemoveStdExpectStrings(); + iIo->WriteAndTimerCancel(this); + iIo->RemoveExpectStrings(this); + if(aErr == KErrNone) + { + ((CGprsQoS*)iTelObject)->SetNegQoSProfile(iGprsNegProfile); + } + + // Allow our base class to do its thing and then complete the client request + CATCommands::Complete(aErr,aSource); + iTelObject->ReqCompleted(iReqHandle,aErr); + + iState=EATNotInProgress; + } + + +void CATGprsGetProfile::CompleteWithIOError(TEventSource aSource,TInt aStatus) +/** + * This Function completes the command from the client whith an error. + * + * @param aSource source of event from communication class. + * @param aStatus status of event. + */ + { + Complete(aStatus, aSource); + } + + + +void CATGprsGetProfile::EventSignal(TEventSource aSource) +/** + * This function contains the state machine for the command. The states flow consecutively in + * get and set states and are described below. + * + * @par aSource Source of function call. + * + * + * @par EWaitForGetCGQMINComplete, + * Wait for response from the phone on the set command. + * + * @par EWaitForGetCGQMINOK, + * Validate phone response and send set AT+CGQREQ command. + * + * @par EWaitForGetCGQREQComplete, + * Wait for response from the phone on the set command. + * + * @par EWaitForGetCGQREQOK * + * Validate phone response and complete get command. + * + */ + { + LOGTEXT2(_L8("CATGprsGetProfile::EventSignal with iState %d"),iState); + if ((aSource==ETimeOutCompletion)) + { + LOGTEXT(_L8("CATGprsGetProfile:\tTimeout Error during Config")); + Complete(KErrTimedOut,aSource); + return; + } + switch(iState) + { + case EWaitForGetCGQMINComplete: + { + StandardWriteCompletionHandler(aSource, KGprsCommandTimeOut); + iState = EWaitForGetCGQMINOK; + } + break; + + case EWaitForGetCGQMINOK: + { + __ASSERT_ALWAYS(aSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected)); + TInt ret = ValidateExpectString(); + RemoveStdExpectStrings(); + if(ret) + { + Complete(ret, aSource); + return; + } + TRAPD(err,ParseCGQMINResponseL()); + if (err != KErrNone) + { + LOGTEXT(_L8("ATGPRSCONFIG::\tError parsing +CGQMIN=?")); + Complete(ret, aSource); + return; + } + Write(KGetCGQREQCommand, KGprsCommandTimeOut); + iState = EWaitForGetCGQREQComplete; + } + break; + + case EWaitForGetCGQREQComplete: + { + StandardWriteCompletionHandler(aSource, KGprsCommandTimeOut); + iState = EWaitForGetCGQREQOK; + } + break; + case EWaitForGetCGQREQOK: + { + __ASSERT_ALWAYS(aSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected)); + TInt ret = ValidateExpectString(); + RemoveStdExpectStrings(); + if(ret) + { + Complete(ret, aSource); + return; + } + TRAPD(err,ParseCGQREQResponseL()); + if (err != KErrNone) + { + LOGTEXT(_L8("ATGPRSCONFIG::\tError parsing +CGQREQ=?")); + Complete(ret, aSource); + return; + } + iIo->RemoveExpectStrings(this); + Complete(ret, aSource); + } + break; + case EATNotInProgress: + break; + default: + { + LOGTEXT(_L8("CATGprsGetProfile::EventSignal, Default, panic")); + Panic(EIllegalEvent); + } + break; + } + } + + +void CATGprsGetProfile::ParseCGQMINResponseL() +/** + * This Function parses the response from the get AT+CGQMIN command to the phone + */ + { + ParseBufferLC(); + CATParamListEntry* entry; + TDblQueIter iter(iRxResults); + while(entry = iter++,entry!=NULL) + { + if (entry->iResultPtr.MatchF(KCGQMINResponseString)!=0) + continue; + entry = iter++; + if(entry == NULL) + User::Leave(KErrGeneral); + TLex8 lex(entry->iResultPtr); + TInt val; + (void)User::LeaveIfError(lex.Val(val)); + if(iCid == val) + { + entry = iter++; + break; + } + } + if(entry == NULL) + User::Leave(KErrGeneral); + // we are now pointing to the correct context, just parse the values + // Get precedence + TLex8 lex(entry->iResultPtr); + TInt val; + (void)User::LeaveIfError(lex.Val(val)); + switch(val) + { + case 0: + iGprsNegProfile->iPrecedence = RPacketQoS::EUnspecifiedPrecedence; + break; + case 1: + iGprsNegProfile->iPrecedence = RPacketQoS::EPriorityHighPrecedence; + break; + case 2: + iGprsNegProfile->iPrecedence = RPacketQoS::EPriorityMediumPrecedence; + break; + case 3: + iGprsNegProfile->iPrecedence = RPacketQoS::EPriorityLowPrecedence; + break; + default: + iGprsNegProfile->iPrecedence = RPacketQoS::EUnspecifiedPrecedence; + } + // Get delay class + entry = iter++; + if(entry == NULL) + User::Leave(KErrGeneral); + lex = entry->iResultPtr; + (void)User::LeaveIfError(lex.Val(val)); + switch(val) + { + case 0: + iGprsNegProfile->iDelay = RPacketQoS::EUnspecifiedDelayClass; + break; + case 1: + iGprsNegProfile->iDelay = RPacketQoS::EDelayClass1; + break; + case 2: + iGprsNegProfile->iDelay = RPacketQoS::EDelayClass2; + break; + case 3: + iGprsNegProfile->iDelay = RPacketQoS::EDelayClass3; + break; + case 4: + iGprsNegProfile->iDelay = RPacketQoS::EDelayClass4; + break; + default: + iGprsNegProfile->iDelay = RPacketQoS::EUnspecifiedDelayClass; + } + // Get reliability class + entry = iter++; + if(entry == NULL) + User::Leave(KErrGeneral); + lex = entry->iResultPtr; + (void)User::LeaveIfError(lex.Val(val)); + + switch(val) + { + case 0: + iGprsNegProfile->iReliability = RPacketQoS::EUnspecifiedReliabilityClass; + break; + case 1: + iGprsNegProfile->iReliability = RPacketQoS::EReliabilityClass1; + break; + case 2: + iGprsNegProfile->iReliability = RPacketQoS::EReliabilityClass2; + break; + case 3: + iGprsNegProfile->iReliability = RPacketQoS::EReliabilityClass3; + break; + case 4: + iGprsNegProfile->iReliability = RPacketQoS::EReliabilityClass4; + break; + case 5: + iGprsNegProfile->iReliability = RPacketQoS::EReliabilityClass5; + break; + default: + iGprsNegProfile->iReliability = RPacketQoS::EUnspecifiedReliabilityClass; + } + + + // Get peak + entry = iter++; + if(entry == NULL) + User::Leave(KErrGeneral); + lex = entry->iResultPtr; + (void)User::LeaveIfError(lex.Val(val)); + switch(val) + { + case 0: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EUnspecifiedPeakThroughput; + break; + case 1: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput1000; + break; + case 2: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput2000; + break; + case 3: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput4000; + break; + case 4: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput8000; + break; + case 5: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput16000; + break; + case 6: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput32000; + break; + case 7: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput64000; + break; + case 8: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput128000; + break; + case 9: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput256000; + break; + default: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EUnspecifiedPeakThroughput; + } + // Get mean + entry = iter++; + if(entry == NULL) + User::Leave(KErrGeneral); + lex = entry->iResultPtr; + (void)User::LeaveIfError(lex.Val(val)); + + switch(val) + { + case 0: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EUnspecifiedMeanThroughput; + break; + case 2: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput100; + break; + case 3: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput200; + break; + case 4: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput500; + break; + case 5: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput1000; + break; + case 6: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput2000; + break; + case 7: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput5000; + break; + case 8: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput10000; + break; + case 9: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput20000; + break; + case 10: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput50000; + break; + case 11: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput100000; + break; + case 12: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput200000; + break; + case 13: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput500000; + break; + case 14: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput1000000; + break; + case 15: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput2000000; + break; + case 16: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput5000000; + break; + case 17: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput10000000; + break; + case 18: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput20000000; + break; + case 31: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput50000000; + break; + default: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EUnspecifiedMeanThroughput; + } + CleanupStack::PopAndDestroy(); + } + + +void CATGprsGetProfile::ParseCGQREQResponseL() +/** + * This Function parses the response from the get CGQREQ command to the phone + */ + { + ParseBufferLC(); + CATParamListEntry* entry; + TDblQueIter iter(iRxResults); + while(entry = iter++,entry!=NULL) + { + if (entry->iResultPtr.MatchF(KCGQREQResponseString)!=0) + continue; + entry = iter++; + if(entry == NULL) + User::Leave(KErrGeneral); + TLex8 lex(entry->iResultPtr); + TInt val; + (void)User::LeaveIfError(lex.Val(val)); + if(iCid == val) + { + entry = iter++; + break; + } + + } + if(entry == NULL) + User::Leave(KErrGeneral); + // we are now pointing to the correct context, just parse the values + // Get precedence + TLex8 lex(entry->iResultPtr); + TInt val; + (void)User::LeaveIfError(lex.Val(val)); + switch(val) + { + case 0: + iGprsNegProfile->iPrecedence = RPacketQoS::EUnspecifiedPrecedence; + break; + case 1: + iGprsNegProfile->iPrecedence = RPacketQoS::EPriorityHighPrecedence; + break; + case 2: + iGprsNegProfile->iPrecedence = RPacketQoS::EPriorityMediumPrecedence; + break; + case 3: + iGprsNegProfile->iPrecedence = RPacketQoS::EPriorityLowPrecedence; + break; + default: + iGprsNegProfile->iPrecedence = RPacketQoS::EUnspecifiedPrecedence; + } + + // Get delay class + entry = iter++; + if(entry == NULL) + User::Leave(KErrGeneral); + lex = entry->iResultPtr; + (void)User::LeaveIfError(lex.Val(val)); + switch(val) + { + case 0: + iGprsNegProfile->iDelay = RPacketQoS::EUnspecifiedDelayClass; + break; + case 1: + iGprsNegProfile->iDelay = RPacketQoS::EDelayClass1; + break; + case 2: + iGprsNegProfile->iDelay = RPacketQoS::EDelayClass2; + break; + case 3: + iGprsNegProfile->iDelay = RPacketQoS::EDelayClass3; + break; + case 4: + iGprsNegProfile->iDelay = RPacketQoS::EDelayClass4; + break; + default: + iGprsNegProfile->iDelay = RPacketQoS::EUnspecifiedDelayClass; + } + + + // Get reliability class + entry = iter++; + if(entry == NULL) + User::Leave(KErrGeneral); + lex = entry->iResultPtr; + (void)User::LeaveIfError(lex.Val(val)); + + switch(val) + { + case 0: + iGprsNegProfile->iReliability = RPacketQoS::EUnspecifiedReliabilityClass; + break; + case 1: + iGprsNegProfile->iReliability = RPacketQoS::EReliabilityClass1; + break; + case 2: + iGprsNegProfile->iReliability = RPacketQoS::EReliabilityClass2; + break; + case 3: + iGprsNegProfile->iReliability = RPacketQoS::EReliabilityClass3; + break; + case 4: + iGprsNegProfile->iReliability = RPacketQoS::EReliabilityClass4; + break; + case 5: + iGprsNegProfile->iReliability = RPacketQoS::EReliabilityClass5; + break; + default: + iGprsNegProfile->iReliability = RPacketQoS::EUnspecifiedReliabilityClass; + } + + + // Get peak + entry = iter++; + if(entry == NULL) + User::Leave(KErrGeneral); + lex = entry->iResultPtr; + (void)User::LeaveIfError(lex.Val(val)); + switch(val) + { + case 0: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EUnspecifiedPeakThroughput; + break; + case 1: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput1000; + break; + case 2: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput2000; + break; + case 3: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput4000; + break; + case 4: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput8000; + break; + case 5: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput16000; + break; + case 6: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput32000; + break; + case 7: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput64000; + break; + case 8: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput128000; + break; + case 9: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EPeakThroughput256000; + break; + default: + iGprsNegProfile->iPeakThroughput = RPacketQoS::EUnspecifiedPeakThroughput; + } + // Get mean + entry = iter++; + if(entry == NULL) + User::Leave(KErrGeneral); + lex = entry->iResultPtr; + (void)User::LeaveIfError(lex.Val(val)); + + switch(val) + { + case 0: + case 1: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EUnspecifiedMeanThroughput; + break; +// case 1: +// iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughputBestEffort; +// break; +// +// Best Effort & Subscribed are now contained in the EUnspecifiedMeanThroughput +// + case 2: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput100; + break; + case 3: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput200; + break; + case 4: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput500; + break; + case 5: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput1000; + break; + case 6: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput2000; + break; + case 7: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput5000; + break; + case 8: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput10000; + break; + case 9: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput20000; + break; + case 10: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput50000; + break; + case 11: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput100000; + break; + case 12: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput200000; + break; + case 13: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput500000; + break; + case 14: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput1000000; + break; + case 15: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput2000000; + break; + case 16: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput5000000; + break; + case 17: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput10000000; + break; + case 18: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput20000000; + break; + case 31: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EMeanThroughput50000000; + break; + default: + iGprsNegProfile->iMeanThroughput = RPacketQoS::EUnspecifiedMeanThroughput; + } + CleanupStack::PopAndDestroy(); + + } + +