// Copyright (c) 1997-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 "CSimPacketQoS.h"
#include "CSimPhone.h"
#include <pcktcs.h>
#include "CSimPacketContext.h"
#include "Simlog.h"
#include "utils.h"
#include "CSimPubSubChange.h"
static const int KNumberofProfiles = 4; //< Number chosen at random.
CSimPacketQoS* CSimPacketQoS::NewL(CSimPhone* aPhone, CSimPacketContext* aPacketContext)
/**
* Standard two phase constructor
*
* @param aPacketContext Pointer to the Packet Context object (CSimPacketContext)
* @return CSimPacketQoS pointer to the packet QoS object created.
* @leave Leaves if no memory or object is not created for any reason.
*/
{
CSimPacketQoS* qos=new(ELeave) CSimPacketQoS(aPhone, aPacketContext);
CleanupStack::PushL(qos);
qos->ConstructL();
CleanupStack::Pop();
return qos;
}
void CSimPacketQoS::Init()
{}
/**
* Callback function for when timer expires. Note - this only gets called for Rel 99 profiles
*/
void CSimPacketQoS::TimerCallBack(TInt aId)
{
switch(aId)
{
case ETimerIdPcktQosNetWork:
{
TProfileNegR99 profile = iQosNetworkNotifications->At(iQosNetworkNotificationCount);
CompleteNotifications(profile);
break;
}
case ETimerIdPcktQosR5Network:
{
TProfileNegR5 profile = iQosR5NetworkNotifications->At(iQosR5NetworkNotificationCount);
CompleteNotifications(profile);
break;
}
case ETimerIdPcktQoSSet:
{
SetProfile(iSetQoSData->At(0).iTsyReqHandle, iSetQoSData->At(0).iData);
iSetQoSData->Delete(0);
if (iSetQoSData->Count() != 0)
iSetQoSTimer->Start(iSetQoSDelay,this,ETimerIdPcktQoSSet);
break;
}
}
}
void CSimPacketQoS::PubSubCallback(TInt aProfileIndex)
/**
* Called by CSimQoSChange when a network QoS change request has been received.
*
* @param aProfileIndex index of the QoS profile to set
*/
{
if (iCurrentProfileRel == TPacketDataConfigBase::KConfigRel5)
{
TInt length = iQosR5NetworkNotifications->Count();
if (aProfileIndex < length)
{
TProfileNegR5& profile = iQosR5NetworkNotifications->At(aProfileIndex);
if (profile.iContextName.Compare(iPacketContext->ContextName()) == 0)
{
CompleteNotifications(profile);
}
}
}
else // by default, uses R99/R4 notification setup
{
TInt length = iQosNetworkNotifications->Count();
if (aProfileIndex < length)
{
TProfileNegR99& profile = iQosNetworkNotifications->At(aProfileIndex);
if (profile.iContextName.Compare(iPacketContext->ContextName()) == 0)
{
CompleteNotifications(profile);
}
}
}
}
void CSimPacketQoS::CompleteNotifications(TProfileNegR99& aProfile)
{
if (MatchContext(aProfile)==KErrNone)
{
if (iNotifyProfileR99.iNotifyPending)
{
RPacketQoS::TQoSR99_R4Negotiated& qos = *(RPacketQoS::TQoSR99_R4Negotiated*)iNotifyProfileR99.iNotifyData;
qos.iBER = STATIC_CAST(RPacketQoS::TBitErrorRatio, aProfile.iNegTBitErrorRatio);
qos.iDeliverErroneousSDU = STATIC_CAST(RPacketQoS::TErroneousSDUDelivery, aProfile.iNegErroneousSDUDelivery);
qos.iDeliveryOrderReqd = STATIC_CAST(RPacketQoS::TDeliveryOrder, aProfile.iNegDeliveryOrder);
qos.iGuaranteedRate.iUplinkRate = aProfile.iNegGuaranteedUpLinkBitRate;
qos.iGuaranteedRate.iDownlinkRate = aProfile.iNegGuaranteedDownLinkBitRate;
qos.iMaxRate.iUplinkRate = aProfile.iNegMaxUpLinkRate;
qos.iMaxRate.iDownlinkRate = aProfile.iNegMaxDownLinkRate;
qos.iMaxSDUSize = aProfile.iNegMaxSDUSize;
qos.iSDUErrorRatio = STATIC_CAST(RPacketQoS::TSDUErrorRatio, aProfile.iNegTSDUErrorRatio);
qos.iTrafficClass = STATIC_CAST(RPacketQoS::TTrafficClass,aProfile.iNegTraffic);
qos.iTrafficHandlingPriority = STATIC_CAST(RPacketQoS::TTrafficHandlingPriority, aProfile.iNegTrafficHandlingPriority);
qos.iTransferDelay = aProfile.iNegTransferDelay;
iNotifyProfileR99.iNotifyPending=EFalse;
ReqCompleted(iNotifyProfileR99.iNotifyHandle, KErrNone);
}
if (iNotifyProfileR5.iNotifyPending)
{
RPacketQoS::TQoSR5Negotiated& qos = *(RPacketQoS::TQoSR5Negotiated*)iNotifyProfileR5.iNotifyData;
qos.iBER = STATIC_CAST(RPacketQoS::TBitErrorRatio, aProfile.iNegTBitErrorRatio);
qos.iDeliverErroneousSDU = STATIC_CAST(RPacketQoS::TErroneousSDUDelivery, aProfile.iNegErroneousSDUDelivery);
qos.iDeliveryOrderReqd = STATIC_CAST(RPacketQoS::TDeliveryOrder, aProfile.iNegDeliveryOrder);
qos.iGuaranteedRate.iUplinkRate = aProfile.iNegGuaranteedUpLinkBitRate;
qos.iGuaranteedRate.iDownlinkRate = aProfile.iNegGuaranteedDownLinkBitRate;
qos.iMaxRate.iUplinkRate = aProfile.iNegMaxUpLinkRate;
qos.iMaxRate.iDownlinkRate = aProfile.iNegMaxDownLinkRate;
qos.iMaxSDUSize = aProfile.iNegMaxSDUSize;
qos.iSDUErrorRatio = STATIC_CAST(RPacketQoS::TSDUErrorRatio, aProfile.iNegTSDUErrorRatio);
qos.iTrafficClass = STATIC_CAST(RPacketQoS::TTrafficClass,aProfile.iNegTraffic);
qos.iTrafficHandlingPriority = STATIC_CAST(RPacketQoS::TTrafficHandlingPriority, aProfile.iNegTrafficHandlingPriority);
qos.iTransferDelay = aProfile.iNegTransferDelay;
qos.iSignallingIndication = EFalse;
qos.iSourceStatisticsDescriptor = RPacketQoS::ESourceStatisticsDescriptorUnknown;
iNotifyProfileR5.iNotifyPending=EFalse;
ReqCompleted(iNotifyProfileR5.iNotifyHandle, KErrNone);
}
}
}
void CSimPacketQoS::CompleteNotifications(TProfileNegR5& aProfile)
{
if (MatchContext(aProfile)==KErrNone)
{
if (iNotifyProfileR99.iNotifyPending)
{
RPacketQoS::TQoSR99_R4Negotiated& qos = *(RPacketQoS::TQoSR99_R4Negotiated*)iNotifyProfileR99.iNotifyData;
qos.iBER = STATIC_CAST(RPacketQoS::TBitErrorRatio, aProfile.iNegTBitErrorRatio);
qos.iDeliverErroneousSDU = STATIC_CAST(RPacketQoS::TErroneousSDUDelivery, aProfile.iNegErroneousSDUDelivery);
qos.iDeliveryOrderReqd = STATIC_CAST(RPacketQoS::TDeliveryOrder, aProfile.iNegDeliveryOrder);
qos.iGuaranteedRate.iUplinkRate = aProfile.iNegGuaranteedUpLinkBitRate;
qos.iGuaranteedRate.iDownlinkRate = aProfile.iNegGuaranteedDownLinkBitRate;
qos.iMaxRate.iUplinkRate = aProfile.iNegMaxUpLinkRate;
qos.iMaxRate.iDownlinkRate = aProfile.iNegMaxDownLinkRate;
qos.iMaxSDUSize = aProfile.iNegMaxSDUSize;
qos.iSDUErrorRatio = STATIC_CAST(RPacketQoS::TSDUErrorRatio, aProfile.iNegTSDUErrorRatio);
qos.iTrafficClass = STATIC_CAST(RPacketQoS::TTrafficClass,aProfile.iNegTraffic);
qos.iTrafficHandlingPriority = STATIC_CAST(RPacketQoS::TTrafficHandlingPriority, aProfile.iNegTrafficHandlingPriority);
qos.iTransferDelay = aProfile.iNegTransferDelay;
iNotifyProfileR99.iNotifyPending=EFalse;
ReqCompleted(iNotifyProfileR99.iNotifyHandle, KErrNone);
}
if (iNotifyProfileR5.iNotifyPending)
{
RPacketQoS::TQoSR5Negotiated& qos = *(RPacketQoS::TQoSR5Negotiated*)iNotifyProfileR5.iNotifyData;
qos.iBER = STATIC_CAST(RPacketQoS::TBitErrorRatio, aProfile.iNegTBitErrorRatio);
qos.iDeliverErroneousSDU = STATIC_CAST(RPacketQoS::TErroneousSDUDelivery, aProfile.iNegErroneousSDUDelivery);
qos.iDeliveryOrderReqd = STATIC_CAST(RPacketQoS::TDeliveryOrder, aProfile.iNegDeliveryOrder);
qos.iGuaranteedRate.iUplinkRate = aProfile.iNegGuaranteedUpLinkBitRate;
qos.iGuaranteedRate.iDownlinkRate = aProfile.iNegGuaranteedDownLinkBitRate;
qos.iMaxRate.iUplinkRate = aProfile.iNegMaxUpLinkRate;
qos.iMaxRate.iDownlinkRate = aProfile.iNegMaxDownLinkRate;
qos.iMaxSDUSize = aProfile.iNegMaxSDUSize;
qos.iSDUErrorRatio = STATIC_CAST(RPacketQoS::TSDUErrorRatio, aProfile.iNegTSDUErrorRatio);
qos.iTrafficClass = STATIC_CAST(RPacketQoS::TTrafficClass,aProfile.iNegTraffic);
qos.iTrafficHandlingPriority = STATIC_CAST(RPacketQoS::TTrafficHandlingPriority, aProfile.iNegTrafficHandlingPriority);
qos.iTransferDelay = aProfile.iNegTransferDelay;
qos.iSignallingIndication = aProfile.iSignallingIndication;
qos.iSourceStatisticsDescriptor = STATIC_CAST(RPacketQoS::TSourceStatisticsDescriptor, aProfile.iNegTSourceStatisticsDescriptor);
iNotifyProfileR5.iNotifyPending=EFalse;
ReqCompleted(iNotifyProfileR5.iNotifyHandle, KErrNone);
}
}
}
CSimPacketQoS::CSimPacketQoS(CSimPhone* aPhone, CSimPacketContext* aPacketContext)
:iPhone(aPhone), iPacketContext(aPacketContext),iCurrentNeg(0), iCurrentNeg99(0), iCurrentNegR5(0),
iSetProfilePending(EFalse), iCurrentProfileRel(TPacketDataConfigBase::KConfigGPRS), iSetProfileCallCount(0),
iUseNetworkNotificationBool(EFalse), iTimerStartedBool(EFalse), iSetQoSData(NULL)
/**
* Trivial Constructor. Initialises all the data members
*
* @param aPacketContext Pointer to the Packet QoS object (CSimPacketContext)
*/
{
iNotifyProfileGPRS.iNotifyPending = EFalse;
iNotifyProfileR99.iNotifyPending = EFalse;
iNotifyProfileR5.iNotifyPending = EFalse;
}
void CSimPacketQoS::ConstructL()
/**
* Second phase of the 2-phase constructor.
* Constructs all the member data and retrieves all the data from the config file specific to this class.
*
* @leave Leaves no memory or any data member does not construct for any reason.
*/
{
LOGPACKET1("CSimPacketQoS: Entered constructor");
iQosNetworkNotificationCount = 0;
iQosR5NetworkNotificationCount = 0;
iTimer=CSimTimer::NewL(iPhone);
iSetQoSData = new (ELeave) CArrayFixFlat<TSetQoSData>(1);
iSetQoSTimer = CSimTimer::NewL(iPhone);
iSimQoSChange = CSimPubSubChange::NewL(this, CSimPubSub::TPubSubProperty(KUidPSSimTsyCategory, KPSSimTsyNetworkQoSChange, KPSSimTsyNetworkQoSChangeKeyType));
LOGPACKET1("Starting to Load and Parse Packet Qos Config File");
GetGPRSReqProfilesL();
GetGPRSNegProfilesL();
GetR99ReqProfilesL();
GetR99NegProfilesL();
GetR99NetworkNotificationsL();
GetR5ReqProfilesL();
GetR5NegProfilesL();
GetR5NetworkNotificationsL();
GetGPRSQosProfileCaps();
GetR99QosProfileCaps();
GetR5QosProfileCaps();
GetProfileFailSettings();
GetSetQoSSettings();
LOGPACKET1("...Finished parsing Packet qos config parameters...");
}
void CSimPacketQoS::GetGPRSReqProfilesL()
{
TProfileConfig profile;
TUint8 digit = 0;
iProfiles = new(ELeave) CArrayFixFlat<TProfileConfig>(KNumberofProfiles);
TInt count = iPacketContext->CfgFile()->ItemCount(KQosProfileReqGPRS);
//< Read in all the data for setting GPRS Requested Profile parameters
for(TInt i = 0; i < count; i++)
{
const CTestConfigItem *item = iPacketContext->CfgFile()->Item(KQosProfileReqGPRS,i);
if(!item)
break;
TPtrC8 minPrecedence, reqPrecedence, minDelay, reqDelay, minPeek, reqPeek;
TPtrC8 minReliability, reqReliability, minMean, reqMean;
TInt ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,minPrecedence);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::minPrecedence",ret,0,&KQosProfileReqGPRS);
continue;
}
else
{
if(AsciiToNum(minPrecedence, digit)==KErrNone)
profile.iMinPrecedence = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,reqPrecedence);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::reqPrecedence",ret,1,&KQosProfileReqGPRS);
continue;
}
else
{
if(AsciiToNum(reqPrecedence, digit)==KErrNone)
profile.iReqPrecedence = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,minDelay);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::minDelay",ret,2,&KQosProfileReqGPRS);
continue;
}
else
{
if(AsciiToNum(minDelay, digit)==KErrNone)
profile.iMinDelay = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,reqDelay);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::reqDelay",ret,3,&KQosProfileReqGPRS);
continue;
}
else
{
if(AsciiToNum(reqDelay, digit)==KErrNone)
profile.iReqDelay = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,minReliability);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::minReliability",ret,4,&KQosProfileReqGPRS);
continue;
}
else
{
if(AsciiToNum(minReliability, digit)==KErrNone)
profile.iMinReliability = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,reqReliability);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::reqReliability",ret,5,&KQosProfileReqGPRS);
continue;
}
else
{
if(AsciiToNum(reqReliability, digit)==KErrNone)
profile.iReqReliability = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,minPeek);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::minPeek",ret,6,&KQosProfileReqGPRS);
continue;
}
else
{
if(AsciiToNum(minPeek, digit)==KErrNone)
profile.iMinPeekThroughput = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,reqPeek);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::reqPeek",ret,7,&KQosProfileReqGPRS);
continue;
}
else
{
if(AsciiToNum(reqPeek, digit)==KErrNone)
profile.iReqPeekThroughput = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,minMean);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::minMean",ret,8,&KQosProfileReqGPRS);
continue;
}
else
{
if(AsciiToNum(minMean, digit)==KErrNone)
profile.iMinMeanThroughput = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,reqMean);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::reqMean",ret,9,&KQosProfileReqGPRS);
continue;
}
else
{
if(AsciiToNum(reqMean, digit)==KErrNone)
profile.iReqMeanThroughput = digit;
}
iProfiles->AppendL(profile);
}
}
void CSimPacketQoS::GetGPRSNegProfilesL()
{
TNegProfileConfig negProfile;
TUint8 digit = 0;
iNegProfiles = new(ELeave) CArrayFixFlat<TNegProfileConfig>(KNumberofProfiles);
TInt count = iPacketContext->CfgFile()->ItemCount(KQosProfileNegGPRS);
//< Read in all the data for setting GPRS Negotiated Profile parameters
for(TInt i = 0; i < count; i++)
{
const CTestConfigItem* item = iPacketContext->CfgFile()->Item(KQosProfileNegGPRS,i);
if(!item)
break;
TPtrC8 negPrecedence, negDelay, negPeek, negReliability, negMean;
TInt ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,negPrecedence);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::negPrecedence",ret,0,&KQosProfileNegGPRS);
continue;
}
else
if(AsciiToNum(negPrecedence, digit)==KErrNone)
negProfile.iNegPrecedence = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,negDelay);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::negDelay",ret,1,&KQosProfileNegGPRS);
continue;
}
else
if(AsciiToNum(negDelay, digit)==KErrNone)
negProfile.iNegDelay = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,negReliability);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::negReliability",ret,2,&KQosProfileNegGPRS);
continue;
}
else
if(AsciiToNum(negReliability, digit)==KErrNone)
negProfile.iNegReliability = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,negPeek);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::negPeek",ret,3,&KQosProfileNegGPRS);
continue;
}
else
if(AsciiToNum(negPeek, digit)==KErrNone)
negProfile.iNegPeekThroughput = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,negMean);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqGPRS::negMean",ret,4,&KQosProfileNegGPRS);
continue;
}
else
if(AsciiToNum(negMean, digit)==KErrNone)
negProfile.iNegMeanThroughput = digit;
iNegProfiles->AppendL(negProfile);
}
}
void CSimPacketQoS::GetR99ReqProfilesL()
{
TProfileReqR99 profileReq99;
TUint8 digit = 0;
iReqR99Profiles = new(ELeave) CArrayFixFlat<TProfileReqR99>(KNumberofProfiles);
// parse Release Rel99 profile parameters
TInt count = iPacketContext->CfgFile()->ItemCount(KQosProfileReqR99);
for(TInt i = 0; i < count; i++)
{
const CTestConfigItem* item = iPacketContext->CfgFile()->Item(KQosProfileReqR99,i);
if(!item)
break;
// continue to load item's parameters
TPtrC8 contextName, reqTraffic, minTraffic, reqDeliveryOrder, minDeliveryOrder;
TPtrC8 reqErroneousSDU, minErroneousSDU;
TInt minUpLinkBitRate, minDownLinkBitRate, reqUpLinkBitRate, reqDownLinkBitRate;
TInt maxSDUSize, minSDUSize;
TPtrC8 reqBitErrorRatio, minBitErrorRatio, reqSDUErrorRatio, minSDUErrorRatio;
TPtrC8 reqTrafficHandlingPriority, minTrafficHandlingPriority;
TInt reqTransferDelay, minTransferDelay, reqGuaranteedUpLinkBitRate, reqGuaranteedDownLinkBitRate;
TInt minGuaranteedUpLinkBitRate, minGuaranteedDownLinkBitRate;
TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::contextName",ret,0,KQosProfileReqR99);
continue;
}
else
{
profileReq99.iContextName.Copy(contextName);
if (profileReq99.iContextName.Match(iPacketContext->ContextName())==KErrNotFound)
{
LOGPARSERR("QosProfileReqR99::contextName",KErrArgument,0,&KQosProfileReqR99);
continue;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,reqTraffic);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::reqTraffic",ret,1,&KQosProfileReqR99);
continue;
}
else
{
if(AsciiToNum(reqTraffic, digit)==KErrNone)
{
profileReq99.iReqTraffic=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,minTraffic);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::minTraffic",ret,2,&KQosProfileReqR99);
continue;
}
else
{
if(AsciiToNum(minTraffic, digit)==KErrNone)
{
profileReq99.iMinTraffic=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,reqDeliveryOrder);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::reqDeliveryOrder",ret,3,&KQosProfileReqR99);
continue;
}
else
{
if(AsciiToNum(reqDeliveryOrder, digit)==KErrNone)
{
profileReq99.iReqDeliveryOrder=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,minDeliveryOrder);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::minDeliveryOrder",ret,4,&KQosProfileReqR99);
continue;
}
else
{
if(AsciiToNum(minDeliveryOrder, digit)==KErrNone)
{
profileReq99.iMinDeliveryOrder=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,reqErroneousSDU);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::reqErroneousSDU",ret,5,&KQosProfileReqR99);
continue;
}
else
{
if(AsciiToNum(reqErroneousSDU, digit)==KErrNone)
{
profileReq99.iReqErroneousSDU=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,minErroneousSDU);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::minErroneousSDU",ret,6,&KQosProfileReqR99);
continue;
}
else
{
if(AsciiToNum(minErroneousSDU, digit)==KErrNone)
{
profileReq99.iMinErroneousSDU=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,maxSDUSize);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::maxSDUSize",ret,7,&KQosProfileReqR99);
continue;
}
else
{
profileReq99.iMaxSDUSize=maxSDUSize;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,minSDUSize);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::minSDUSize",ret,8,&KQosProfileReqR99);
continue;
}
else
{
profileReq99.iMinSDUSize=minSDUSize;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,reqUpLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::reqUpLinkBitRate",ret,9,&KQosProfileReqR99);
continue;
}
else
{
profileReq99.iReqUpLinkTBitRate=reqUpLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,reqDownLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::reqDownLinkBitRate",ret,10,&KQosProfileReqR99);
continue;
}
else
{
profileReq99.iReqDownLinkTBitRate= reqDownLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,minUpLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::minUpLinkBitRate",ret,11,&KQosProfileReqR99);
continue;
}
else
{
profileReq99.iMinUpLinkTBitRate= minUpLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,minDownLinkBitRate);
if(ret!=KErrNone)
{
continue;
}
else
{
profileReq99.iMinDownLinkTBitRate= minDownLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,13,reqBitErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::reqBitErrorRatio",ret,13,&KQosProfileReqR99);
continue;
}
else
{
if(AsciiToNum(reqBitErrorRatio, digit)==KErrNone)
{
profileReq99.iReqTBitErrorRatio=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,14,minBitErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::minBitErrorRatio",ret,14,&KQosProfileReqR99);
continue;
}
else
{
if(AsciiToNum(minBitErrorRatio, digit)==KErrNone)
{
profileReq99.iMinTBitErrorRatio=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,15,reqSDUErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("- QosProfileReqR99::reqSDUErrorRatio",ret,15,&KQosProfileReqR99);
continue;
}
else
{
if(AsciiToNum(reqSDUErrorRatio, digit)==KErrNone)
{
profileReq99.iReqTSDUErrorRatio=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,16,minSDUErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("- QosProfileReqR99::minSDUErrorRatio",ret,16,&KQosProfileReqR99);
continue;
}
else
{
if(AsciiToNum(minSDUErrorRatio, digit)==KErrNone)
{
profileReq99.iMinTSDUErrorRatio=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,17,reqTrafficHandlingPriority);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::reqTrafficHandlingPriority",ret,17,&KQosProfileReqR99);
continue;
}
else
{
if(AsciiToNum(reqTrafficHandlingPriority, digit)==KErrNone)
{
profileReq99.iReqTTrafficHandlingPriority=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,18,minTrafficHandlingPriority);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::minTrafficHandlingPriority",ret,18,&KQosProfileReqR99);
continue;
}
else
{
if(AsciiToNum(minTrafficHandlingPriority, digit)==KErrNone)
{
profileReq99.iMinTTrafficHandlingPriority=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,19,reqTransferDelay);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::reqTransferDelay",ret,19,&KQosProfileReqR99);
continue;
}
else
{
profileReq99.iReqTransferDelay= reqTransferDelay;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,20,minTransferDelay);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::minTransferDelay",ret,20,&KQosProfileReqR99);
continue;
}
else
{
profileReq99.iMinTransferDelay= minTransferDelay;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,21,reqGuaranteedUpLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::reqGuaranteedUpLinkBitRate",ret,21,&KQosProfileReqR99);
continue;
}
else
{
profileReq99.iReqGuaranteedUpLinkTBitRate= reqGuaranteedUpLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,22,reqGuaranteedDownLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::reqGuaranteedDownLinkBitRate",ret,22,&KQosProfileReqR99);
continue;
}
else
{
profileReq99.iReqGuaranteedDownLinkTBitRate= reqGuaranteedDownLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,23,minGuaranteedUpLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::minGuaranteedUpLinkBitRate",ret,23,&KQosProfileReqR99);
continue;
}
else
{
profileReq99.iMinGuaranteedUpLinkTBitRate= minGuaranteedUpLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,24,minGuaranteedDownLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR99::minGuaranteedDownLinkBitRate",ret,24,&KQosProfileReqR99);
continue;
}
else
{
profileReq99.iMinGuaranteedDownLinkTBitRate= minGuaranteedDownLinkBitRate;
}
iReqR99Profiles->AppendL(profileReq99);
}
}
void CSimPacketQoS::GetR99NegProfilesL()
{
TProfileNegR99 profileNeg99;
TUint8 digit = 0;
iNegR99Profiles = new(ELeave) CArrayFixFlat<TProfileNegR99>(KNumberofProfiles);
// parse Negotiated Rel99 profile parameters
TInt count = iPacketContext->CfgFile()->ItemCount(KQosProfileNegR99);
for(TInt i = 0; i < count; i++)
{
const CTestConfigItem* item = iPacketContext->CfgFile()->Item(KQosProfileNegR99,i);
if(!item)
break;
TPtrC8 contextName, duration, negTraffic, negDeliveryOrder, negErroneousSDUDelivery;
TPtrC8 negBitErrorRatio, negSDUErrorRatio, negTrafficHandlingPriority;
TInt negTransferDelay, negGuaranteedUpLinkBitRate, negGuaranteedDownLinkBitRate;
TInt negMaxUpLinkRate, negMaxDownLinkRate, negMaxSDUSize;
TInt ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::contextName",ret,0,&KQosProfileNegR99);
continue;
}
else
{
profileNeg99.iContextName.Copy(contextName);
if (profileNeg99.iContextName.Match(iPacketContext->ContextName())==KErrNotFound)
{
LOGPARSERR("QosProfileNegR99::contextName",KErrArgument,0,&KQosProfileNegR99);
continue;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,duration);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::duration",ret,1,&KQosProfileNegR99);
continue;
}
else
{
if(AsciiToNum(duration, digit)==KErrNone)
profileNeg99.iDuration = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,negTraffic);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::negTraffic",ret,2,&KQosProfileNegR99);
continue;
}
else
{
if(AsciiToNum(negTraffic, digit)==KErrNone)
profileNeg99.iNegTraffic = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,negDeliveryOrder);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::negDeliveryOrder",ret,3,&KQosProfileNegR99);
continue;
}
else
{
if(AsciiToNum(negDeliveryOrder, digit)==KErrNone)
profileNeg99.iNegDeliveryOrder = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,negErroneousSDUDelivery);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::negErroneousSDUDelivery",ret,4,&KQosProfileNegR99);
continue;
}
else
{
if(AsciiToNum(negErroneousSDUDelivery, digit)==KErrNone)
profileNeg99.iNegErroneousSDUDelivery = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,negMaxSDUSize);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::negMaxSDUSize",ret,5,&KQosProfileNegR99);
continue;
}
else
{
profileNeg99.iNegMaxSDUSize = negMaxSDUSize;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,negBitErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::negBitErrorRatio",ret,6,&KQosProfileNegR99);
continue;
}
else
{
if(AsciiToNum(negBitErrorRatio, digit)==KErrNone)
profileNeg99.iNegTBitErrorRatio = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,negSDUErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::negSDUErrorRatio",ret,7,&KQosProfileNegR99);
continue;
}
else
{
if(AsciiToNum(negSDUErrorRatio, digit)==KErrNone)
profileNeg99.iNegTSDUErrorRatio = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,negTrafficHandlingPriority);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::negTrafficHandlingPriority",ret,8,&KQosProfileNegR99);
continue;
}
else
{
if(AsciiToNum(negTrafficHandlingPriority, digit)==KErrNone)
profileNeg99.iNegTrafficHandlingPriority = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,negTransferDelay);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::negTransferDelay",ret,9,&KQosProfileNegR99);
continue;
}
else
{
profileNeg99.iNegTransferDelay = negTransferDelay;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,negGuaranteedUpLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::negGuaranteedUpLinkBitRate",ret,10,&KQosProfileNegR99);
continue;
}
else
{
profileNeg99.iNegGuaranteedUpLinkBitRate = negGuaranteedUpLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,negGuaranteedDownLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::negGuaranteedDownLinkBitRate",ret,11,&KQosProfileNegR99);
continue;
}
else
{
profileNeg99.iNegGuaranteedDownLinkBitRate = negGuaranteedDownLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,negMaxUpLinkRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::negMaxUpLinkRate",ret,12,&KQosProfileNegR99);
continue;
}
else
{
profileNeg99.iNegMaxUpLinkRate = negMaxUpLinkRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,13,negMaxDownLinkRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR99::negMaxDownLinkRate",ret,13,&KQosProfileNegR99);
continue;
}
else
{
profileNeg99.iNegMaxDownLinkRate = negMaxDownLinkRate;
}
iNegR99Profiles->AppendL(profileNeg99);
}
}
void CSimPacketQoS::GetR99NetworkNotificationsL()
{
TInt ret;
TUint8 digit = 0;
iQosNetworkNotifications = new(ELeave) CArrayFixFlat<TProfileNegR99>(KNumberofProfiles);
// parse the Qos Network Notification parameters
iNetworkNotificationType = ETimer;
const CTestConfigItem* item = iPacketContext->CfgFile()->Item(KQosNetworkNotificationType);
if (item)
{
TPtrC8 networkNotificationType;
ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,networkNotificationType);
if(ret==KErrNone && networkNotificationType.Compare(KNotificationTypePublishSubscribe)==0)
{
iNetworkNotificationType = EPublishAndSubscribe;
}
}
TInt count=iPacketContext->CfgFile()->ItemCount(KQosNetworkNotification);
for(TInt i = 0; i < count; i++)
{
item=iPacketContext->CfgFile()->Item(KQosNetworkNotification,i);
if(!item)
break;
TProfileNegR99 qosNetworkNotification;
TPtrC8 contextName, duration, negTraffic, negDeliveryOrder, negErroneousSDUDelivery;
TPtrC8 negBitErrorRatio, negSDUErrorRatio, negTrafficHandlingPriority;
TInt negTransferDelay, negGuaranteedUpLinkBitRate, negGuaranteedDownLinkBitRate;
TInt negMaxUpLinkRate, negMaxDownLinkRate, negMaxSDUSize;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::contextName",ret,0,&KQosNetworkNotificationType);
continue;
}
else
{
qosNetworkNotification.iContextName.Copy(contextName);
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,duration);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::duration",ret,1,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(duration, digit)==KErrNone)
qosNetworkNotification.iDuration = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,negTraffic);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::negTraffic",ret,2,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(negTraffic, digit)==KErrNone)
qosNetworkNotification.iNegTraffic = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,negDeliveryOrder);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::negDeliveryOrder",ret,3,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(negDeliveryOrder, digit)==KErrNone)
qosNetworkNotification.iNegDeliveryOrder = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,negErroneousSDUDelivery);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::negErroneousSDUDelivery",ret,4,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(negErroneousSDUDelivery, digit)==KErrNone)
qosNetworkNotification.iNegErroneousSDUDelivery = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,negMaxSDUSize);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::negMaxSDUSize",ret,5,&KQosNetworkNotificationType);
continue;
}
else
{
qosNetworkNotification.iNegMaxSDUSize = negMaxSDUSize;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,negBitErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::negBitErrorRatio",ret,6,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(negBitErrorRatio, digit)==KErrNone)
qosNetworkNotification.iNegTBitErrorRatio = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,negSDUErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::negSDUErrorRatio",ret,7,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(negSDUErrorRatio, digit)==KErrNone)
qosNetworkNotification.iNegTSDUErrorRatio = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,negTrafficHandlingPriority);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::negTrafficHandlingPriority",ret,8,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(negTrafficHandlingPriority, digit)==KErrNone)
qosNetworkNotification.iNegTrafficHandlingPriority = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,negTransferDelay);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::negTransferDelay",ret,9,&KQosNetworkNotificationType);
continue;
}
else
{
qosNetworkNotification.iNegTransferDelay = negTransferDelay;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,negGuaranteedUpLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::negGuaranteedUpLinkBitRate",ret,10,&KQosNetworkNotificationType);
continue;
}
else
{
qosNetworkNotification.iNegGuaranteedUpLinkBitRate = negGuaranteedUpLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,negGuaranteedDownLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::negGuaranteedDownLinkBitRate",ret,11,&KQosNetworkNotificationType);
continue;
}
else
{
qosNetworkNotification.iNegGuaranteedDownLinkBitRate = negGuaranteedDownLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,negMaxUpLinkRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::negMaxUpLinkRate",ret,12,&KQosNetworkNotificationType);
continue;
}
else
{
qosNetworkNotification.iNegMaxUpLinkRate = negMaxUpLinkRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,13,negMaxDownLinkRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosNetworkNotification::negMaxDownLinkRate",ret,13,&KQosNetworkNotificationType);
continue;
}
else
{
qosNetworkNotification.iNegMaxDownLinkRate = negMaxDownLinkRate;
}
iQosNetworkNotifications->AppendL(qosNetworkNotification);
}
}
void CSimPacketQoS::GetR99QosProfileCaps()
{
TUint8 digit = 0;
// parse Caps Rel99 profile parameters
const CTestConfigItem* item = iPacketContext->CfgFile()->Item(KQosProfileCapsR99);
if(item)
{
TPtrC8 trafficCap, deliveryOrderReqCap, deliverErroneousSDUCap;
TPtrC8 BERCap, SDUErrorRatioCap, trafficHandlingPriorityCap;
TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,trafficCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR99::trafficCap",ret,0,&KQosProfileCapsR99);
}
else
if(AsciiToNum(trafficCap, digit)==KErrNone)
iCapsR99.iTraffic = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,deliveryOrderReqCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR99::deliveryOrderReqCap",ret,1,&KQosProfileCapsR99);
}
else
if(AsciiToNum(deliveryOrderReqCap, digit)==KErrNone)
iCapsR99.iDeliveryOrderReq = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,deliverErroneousSDUCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR99::deliverErroneousSDUCap",ret,2,&KQosProfileCapsR99);
}
else
if(AsciiToNum(deliverErroneousSDUCap, digit)==KErrNone)
iCapsR99.iDeliverErroneousSDU = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,BERCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR99::BERCap",ret,3,&KQosProfileCapsR99);
}
else
if(AsciiToNum(BERCap, digit)==KErrNone)
iCapsR99.iBER = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,SDUErrorRatioCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR99::SDUErrorRatioCap",ret,4,&KQosProfileCapsR99);
}
else
if(AsciiToNum(SDUErrorRatioCap, digit)==KErrNone)
iCapsR99.iSDUErrorRatio = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,trafficHandlingPriorityCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR99::trafficHandlingPriorityCap",ret,5,&KQosProfileCapsR99);
}
else
if(AsciiToNum(trafficHandlingPriorityCap, digit)==KErrNone)
iCapsR99.iTrafficHandlingPriority = digit;
}
}
void CSimPacketQoS::GetR5QosProfileCaps()
{
TUint8 digit = 0;
// parse Caps Rel5 profile parameters
const CTestConfigItem* item = iPacketContext->CfgFile()->Item(KQosProfileCapsR5);
if(item)
{
TPtrC8 trafficCap, deliveryOrderReqCap, deliverErroneousSDUCap;
TPtrC8 BERCap, SDUErrorRatioCap, trafficHandlingPriorityCap;
TPtrC8 signallingIndication, sourceStatisticsDescriptor;
TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,trafficCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR5::trafficCap",ret,0,&KQosProfileCapsR5);
}
else
if(AsciiToNum(trafficCap, digit)==KErrNone)
iCapsR5.iTraffic = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,deliveryOrderReqCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR5::deliveryOrderReqCap",ret,1,&KQosProfileCapsR5);
}
else
if(AsciiToNum(deliveryOrderReqCap, digit)==KErrNone)
iCapsR5.iDeliveryOrderReq = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,deliverErroneousSDUCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR5::deliverErroneousSDUCap",ret,2,&KQosProfileCapsR5);
}
else
if(AsciiToNum(deliverErroneousSDUCap, digit)==KErrNone)
iCapsR5.iDeliverErroneousSDU = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,BERCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR5::BERCap",ret,3,&KQosProfileCapsR5);
}
else
if(AsciiToNum(BERCap, digit)==KErrNone)
iCapsR5.iBER = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,SDUErrorRatioCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR5::SDUErrorRatioCap",ret,4,&KQosProfileCapsR5);
}
else
if(AsciiToNum(SDUErrorRatioCap, digit)==KErrNone)
iCapsR5.iSDUErrorRatio = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,trafficHandlingPriorityCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR5::trafficHandlingPriorityCap",ret,5,&KQosProfileCapsR5);
}
else
if(AsciiToNum(trafficHandlingPriorityCap, digit)==KErrNone)
iCapsR5.iTrafficHandlingPriority = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,signallingIndication);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR5::signallingIndication",ret,6,&KQosProfileCapsR5);
}
else
if(AsciiToNum(signallingIndication, digit)==KErrNone)
iCapsR5.iSignallingIndication = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,sourceStatisticsDescriptor);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsR5::sourceStatisticsDescriptor",ret,7,&KQosProfileCapsR5);
}
else
if(AsciiToNum(sourceStatisticsDescriptor, digit)==KErrNone)
iCapsR5.iNegTSourceStatisticsDescriptor = digit;
}
}
void CSimPacketQoS::GetProfileFailSettings()
{
const CTestConfigItem* item = iPacketContext->CfgFile()->Item(KSetProfileFail);
if(item)
{
TPtrC8 contextName, numberOfTimes, errorCode;
TInt32 setProfileDigit;
TInt ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
TName tempContextName;
tempContextName.Copy(contextName);
if (iPacketContext->ContextName().Compare(tempContextName)==0)
{
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,numberOfTimes);
if(ret!=KErrNone)
{
LOGPARSERR("SetProfileFail::numberOfTimes",ret,1,&KSetProfileFail);
}
else
{
if(AsciiToNum(numberOfTimes, setProfileDigit)==KErrNone)
iSetProfileFail.iNumberOfTimes = setProfileDigit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,errorCode);
if(ret!=KErrNone)
{
LOGPARSERR("SetProfileFail::errorCode",ret,2,&KSetProfileFail);
}
else
{
if(AsciiToNum(errorCode, setProfileDigit)==KErrNone)
iSetProfileFail.iFailErrorCode = setProfileDigit;
}
}
else
{
iSetProfileFail.iNumberOfTimes = 0;
iSetProfileFail.iFailErrorCode = KErrNone;
}
}
}
void CSimPacketQoS::GetGPRSQosProfileCaps()
{
TUint8 digit = 0;
const CTestConfigItem* item = iPacketContext->CfgFile()->Item(KQosProfileCapsGPRS);
if(item)
{
TPtrC8 negPrecedenceCap, negDelayCap, negPeekCap, negReliabilityCap, negMeanCap;
TInt ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,negPrecedenceCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsGPRS::negPrecedenceCap",ret,0,&KQosProfileCapsGPRS);
}
else
if(AsciiToNum(negPrecedenceCap, digit)==KErrNone)
iCapsGPRS.iPrecedence = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,negDelayCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsGPRS::negDelayCap",ret,1,&KQosProfileCapsGPRS);
}
else
if(AsciiToNum(negDelayCap, digit)==KErrNone)
iCapsGPRS.iDelay = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,negReliabilityCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsGPRS::negReliabilityCap",ret,2,&KQosProfileCapsGPRS);
}
else
if(AsciiToNum(negReliabilityCap, digit)==KErrNone)
iCapsGPRS.iReliability = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,negPeekCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsGPRS::negPeekCap",ret,3,&KQosProfileCapsGPRS);
}
else
if(AsciiToNum(negPeekCap, digit)==KErrNone)
iCapsGPRS.iPeak = digit;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,negMeanCap);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileCapsGPRS::negMeanCap",ret,4,&KQosProfileCapsGPRS);
}
else
if(AsciiToNum(negMeanCap, digit)==KErrNone)
iCapsGPRS.iMean = digit;
}
}
void CSimPacketQoS::GetR5ReqProfilesL()
{
TProfileReqR5 profileReq5;
TUint8 digit = 0;
iReqR5Profiles = new(ELeave) CArrayFixFlat<TProfileReqR5>(KNumberofProfiles);
// parse Release Rel99 profile parameters
TInt count = iPacketContext->CfgFile()->ItemCount(KQosProfileReqR5);
for(TInt i = 0; i < count; i++)
{
const CTestConfigItem* item = iPacketContext->CfgFile()->Item(KQosProfileReqR5,i);
if(!item)
break;
// continue to load item's parameters
TPtrC8 contextName, reqTraffic, minTraffic, reqDeliveryOrder, minDeliveryOrder;
TPtrC8 reqErroneousSDU, minErroneousSDU;
TInt minUpLinkBitRate, minDownLinkBitRate, reqUpLinkBitRate, reqDownLinkBitRate;
TInt maxSDUSize, minSDUSize;
TPtrC8 reqBitErrorRatio, minBitErrorRatio, reqSDUErrorRatio, minSDUErrorRatio;
TPtrC8 reqTrafficHandlingPriority, minTrafficHandlingPriority;
TInt reqTransferDelay, minTransferDelay, reqGuaranteedUpLinkBitRate, reqGuaranteedDownLinkBitRate;
TInt minGuaranteedUpLinkBitRate, minGuaranteedDownLinkBitRate;
TInt signallingIndication;
TPtrC8 reqTSourceStatisticsDescriptor;
TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::contextName",ret,0,&KQosProfileReqR5);
continue;
}
else
{
profileReq5.iContextName.Copy(contextName);
if (profileReq5.iContextName.Match(iPacketContext->ContextName())==KErrNotFound)
{
LOGPARSERR("QosProfileReqR5::contextName",KErrArgument,0,&KQosProfileReqR5);
continue;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,reqTraffic);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::reqTraffic",ret,1,&KQosProfileReqR5);
continue;
}
else
{
if(AsciiToNum(reqTraffic, digit)==KErrNone)
{
profileReq5.iReqTraffic=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,minTraffic);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::minTraffic",ret,2,&KQosProfileReqR5);
continue;
}
else
{
if(AsciiToNum(minTraffic, digit)==KErrNone)
{
profileReq5.iMinTraffic=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,reqDeliveryOrder);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::reqDeliveryOrder",ret,3,&KQosProfileReqR5);
continue;
}
else
{
if(AsciiToNum(reqDeliveryOrder, digit)==KErrNone)
{
profileReq5.iReqDeliveryOrder=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,minDeliveryOrder);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::minDeliveryOrder",ret,4,&KQosProfileReqR5);
continue;
}
else
{
if(AsciiToNum(minDeliveryOrder, digit)==KErrNone)
{
profileReq5.iMinDeliveryOrder=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,reqErroneousSDU);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::reqErroneousSDU",ret,5,&KQosProfileReqR5);
continue;
}
else
{
if(AsciiToNum(reqErroneousSDU, digit)==KErrNone)
{
profileReq5.iReqErroneousSDU=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,minErroneousSDU);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::minErroneousSDU",ret,6,&KQosProfileReqR5);
continue;
}
else
{
if(AsciiToNum(minErroneousSDU, digit)==KErrNone)
{
profileReq5.iMinErroneousSDU=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,maxSDUSize);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::maxSDUSize",ret,7,&KQosProfileReqR5);
continue;
}
else
{
profileReq5.iMaxSDUSize=maxSDUSize;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,minSDUSize);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::minSDUSize",ret,8,&KQosProfileReqR5);
continue;
}
else
{
profileReq5.iMinSDUSize=minSDUSize;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,reqUpLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::reqUpLinkBitRate",ret,9,&KQosProfileReqR5);
continue;
}
else
{
profileReq5.iReqUpLinkTBitRate=reqUpLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,reqDownLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::reqDownLinkBitRate",ret,10,&KQosProfileReqR5);
continue;
}
else
{
profileReq5.iReqDownLinkTBitRate= reqDownLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,minUpLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::minUpLinkBitRate",ret,11,&KQosProfileReqR5);
continue;
}
else
{
profileReq5.iMinUpLinkTBitRate= minUpLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,minDownLinkBitRate);
if(ret!=KErrNone)
{
continue;
}
else
{
profileReq5.iMinDownLinkTBitRate= minDownLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,13,reqBitErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::reqBitErrorRatio",ret,13,&KQosProfileReqR5);
continue;
}
else
{
if(AsciiToNum(reqBitErrorRatio, digit)==KErrNone)
{
profileReq5.iReqTBitErrorRatio=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,14,minBitErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::minBitErrorRatio",ret,14,&KQosProfileReqR5);
continue;
}
else
{
if(AsciiToNum(minBitErrorRatio, digit)==KErrNone)
{
profileReq5.iMinTBitErrorRatio=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,15,reqSDUErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("- QosProfileReqR5::reqSDUErrorRatio",ret,15,&KQosProfileReqR5);
continue;
}
else
{
if(AsciiToNum(reqSDUErrorRatio, digit)==KErrNone)
{
profileReq5.iReqTSDUErrorRatio=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,16,minSDUErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("- QosProfileReqR5::minSDUErrorRatio",ret,16,&KQosProfileReqR5);
continue;
}
else
{
if(AsciiToNum(minSDUErrorRatio, digit)==KErrNone)
{
profileReq5.iMinTSDUErrorRatio=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,17,reqTrafficHandlingPriority);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::reqTrafficHandlingPriority",ret,17,&KQosProfileReqR5);
continue;
}
else
{
if(AsciiToNum(reqTrafficHandlingPriority, digit)==KErrNone)
{
profileReq5.iReqTTrafficHandlingPriority=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,18,minTrafficHandlingPriority);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::minTrafficHandlingPriority",ret,18,&KQosProfileReqR5);
continue;
}
else
{
if(AsciiToNum(minTrafficHandlingPriority, digit)==KErrNone)
{
profileReq5.iMinTTrafficHandlingPriority=digit;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,19,reqTransferDelay);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::reqTransferDelay",ret,19,&KQosProfileReqR5);
continue;
}
else
{
profileReq5.iReqTransferDelay= reqTransferDelay;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,20,minTransferDelay);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::minTransferDelay",ret,20,&KQosProfileReqR5);
continue;
}
else
{
profileReq5.iMinTransferDelay= minTransferDelay;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,21,reqGuaranteedUpLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::reqGuaranteedUpLinkBitRate",ret,21,&KQosProfileReqR5);
continue;
}
else
{
profileReq5.iReqGuaranteedUpLinkTBitRate= reqGuaranteedUpLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,22,reqGuaranteedDownLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::reqGuaranteedDownLinkBitRate",ret,22,&KQosProfileReqR5);
continue;
}
else
{
profileReq5.iReqGuaranteedDownLinkTBitRate= reqGuaranteedDownLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,23,minGuaranteedUpLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::minGuaranteedUpLinkBitRate",ret,23,&KQosProfileReqR5);
continue;
}
else
{
profileReq5.iMinGuaranteedUpLinkTBitRate= minGuaranteedUpLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,24,minGuaranteedDownLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::minGuaranteedDownLinkBitRate",ret,24,&KQosProfileReqR5);
continue;
}
else
{
profileReq5.iMinGuaranteedDownLinkTBitRate= minGuaranteedDownLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,25,signallingIndication);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::signallingIndication",ret,25,&KQosProfileReqR5);
continue;
}
else
{
profileReq5.iSignallingIndication= signallingIndication;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,26,reqTSourceStatisticsDescriptor);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileReqR5::reqTSourceStatisticsDescriptor",ret,26,&KQosProfileReqR5);
continue;
}
else
{
if(AsciiToNum(reqTSourceStatisticsDescriptor, digit)==KErrNone)
{
profileReq5.iReqTSourceStatisticsDescriptor=digit;
}
}
iReqR5Profiles->AppendL(profileReq5);
}
}
void CSimPacketQoS::GetR5NegProfilesL()
{
TProfileNegR5 profileNeg5;
TUint8 digit = 0;
iNegR5Profiles = new(ELeave) CArrayFixFlat<TProfileNegR5>(KNumberofProfiles);
// parse Negotiated Rel5 profile parameters
TInt count = iPacketContext->CfgFile()->ItemCount(KQosProfileNegR5);
for(TInt i = 0; i < count; i++)
{
const CTestConfigItem* item = iPacketContext->CfgFile()->Item(KQosProfileNegR5,i);
if(!item)
break;
TPtrC8 contextName, duration, negTraffic, negDeliveryOrder, negErroneousSDUDelivery;
TPtrC8 negBitErrorRatio, negSDUErrorRatio, negTrafficHandlingPriority;
TInt negTransferDelay, negGuaranteedUpLinkBitRate, negGuaranteedDownLinkBitRate;
TInt negMaxUpLinkRate, negMaxDownLinkRate, negMaxSDUSize;
TInt signallingIndication;
TPtrC8 reqTSourceStatisticsDescriptor;
TInt ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::contextName",ret,0,&KQosProfileNegR5);
continue;
}
else
{
profileNeg5.iContextName.Copy(contextName);
if (profileNeg5.iContextName.Match(iPacketContext->ContextName())==KErrNotFound)
{
LOGPARSERR("QosProfileNegR5::contextName",KErrArgument,0,&KQosProfileNegR5);
continue;
}
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,duration);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::duration",ret,1,&KQosProfileNegR5);
continue;
}
else
{
if(AsciiToNum(duration, digit)==KErrNone)
profileNeg5.iDuration = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,negTraffic);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::negTraffic",ret,2,&KQosProfileNegR5);
continue;
}
else
{
if(AsciiToNum(negTraffic, digit)==KErrNone)
profileNeg5.iNegTraffic = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,negDeliveryOrder);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::negDeliveryOrder",ret,3,&KQosProfileNegR5);
continue;
}
else
{
if(AsciiToNum(negDeliveryOrder, digit)==KErrNone)
profileNeg5.iNegDeliveryOrder = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,negErroneousSDUDelivery);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::negErroneousSDUDelivery",ret,4,&KQosProfileNegR5);
continue;
}
else
{
if(AsciiToNum(negErroneousSDUDelivery, digit)==KErrNone)
profileNeg5.iNegErroneousSDUDelivery = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,negMaxSDUSize);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::negMaxSDUSize",ret,5,&KQosProfileNegR5);
continue;
}
else
{
profileNeg5.iNegMaxSDUSize = negMaxSDUSize;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,negBitErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::negBitErrorRatio",ret,6,&KQosProfileNegR5);
continue;
}
else
{
if(AsciiToNum(negBitErrorRatio, digit)==KErrNone)
profileNeg5.iNegTBitErrorRatio = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,negSDUErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::negSDUErrorRatio",ret,7,&KQosProfileNegR5);
continue;
}
else
{
if(AsciiToNum(negSDUErrorRatio, digit)==KErrNone)
profileNeg5.iNegTSDUErrorRatio = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,negTrafficHandlingPriority);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::negTrafficHandlingPriority",ret,8,&KQosProfileNegR5);
continue;
}
else
{
if(AsciiToNum(negTrafficHandlingPriority, digit)==KErrNone)
profileNeg5.iNegTrafficHandlingPriority = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,negTransferDelay);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::negTransferDelay",ret,9,&KQosProfileNegR5);
continue;
}
else
{
profileNeg5.iNegTransferDelay = negTransferDelay;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,negGuaranteedUpLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::negGuaranteedUpLinkBitRate",ret,10,&KQosProfileNegR5);
continue;
}
else
{
profileNeg5.iNegGuaranteedUpLinkBitRate = negGuaranteedUpLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,negGuaranteedDownLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::negGuaranteedDownLinkBitRate",ret,11,&KQosProfileNegR5);
continue;
}
else
{
profileNeg5.iNegGuaranteedDownLinkBitRate = negGuaranteedDownLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,negMaxUpLinkRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::negMaxUpLinkRate",ret,12,&KQosProfileNegR5);
continue;
}
else
{
profileNeg5.iNegMaxUpLinkRate = negMaxUpLinkRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,13,negMaxDownLinkRate);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::negMaxDownLinkRate",ret,13,&KQosProfileNegR5);
continue;
}
else
{
profileNeg5.iNegMaxDownLinkRate = negMaxDownLinkRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,14,signallingIndication);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::signallingIndication",ret,14,&KQosProfileNegR5);
continue;
}
else
{
profileNeg5.iSignallingIndication = signallingIndication;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,15,reqTSourceStatisticsDescriptor);
if(ret!=KErrNone)
{
LOGPARSERR("QosProfileNegR5::reqTSourceStatisticsDescriptor",ret,15,&KQosProfileNegR5);
continue;
}
else
{
if(AsciiToNum(reqTSourceStatisticsDescriptor, digit)==KErrNone)
profileNeg5.iNegTSourceStatisticsDescriptor = digit;
}
iNegR5Profiles->AppendL(profileNeg5);
}
}
void CSimPacketQoS::GetR5NetworkNotificationsL()
{
TInt ret;
TUint8 digit = 0;
iQosR5NetworkNotifications = new(ELeave) CArrayFixFlat<TProfileNegR5>(KNumberofProfiles);
// parse the Qos Network Notification parameters
iNetworkNotificationType = ETimer;
const CTestConfigItem* item = iPacketContext->CfgFile()->Item(KQosNetworkNotificationType);
if (item)
{
TPtrC8 networkNotificationType;
ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,networkNotificationType);
if(ret==KErrNone && networkNotificationType.Compare(KNotificationTypePublishSubscribe)==0)
{
iNetworkNotificationType = EPublishAndSubscribe;
}
}
TInt count=iPacketContext->CfgFile()->ItemCount(KQosR5NetworkNotification);
for(TInt i = 0; i < count; i++)
{
item=iPacketContext->CfgFile()->Item(KQosR5NetworkNotification,i);
if(!item)
break;
TProfileNegR5 qosR5NetworkNotification;
TPtrC8 contextName, duration, negTraffic, negDeliveryOrder, negErroneousSDUDelivery;
TPtrC8 negBitErrorRatio, negSDUErrorRatio, negTrafficHandlingPriority;
TInt negTransferDelay, negGuaranteedUpLinkBitRate, negGuaranteedDownLinkBitRate;
TInt negMaxUpLinkRate, negMaxDownLinkRate, negMaxSDUSize;
TInt signallingIndication;
TPtrC8 reqTSourceStatisticsDescriptor;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::contextName",ret,0,&KQosNetworkNotificationType);
continue;
}
else
{
qosR5NetworkNotification.iContextName.Copy(contextName);
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,duration);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::duration",ret,1,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(duration, digit)==KErrNone)
qosR5NetworkNotification.iDuration = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,negTraffic);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::negTraffic",ret,2,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(negTraffic, digit)==KErrNone)
qosR5NetworkNotification.iNegTraffic = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,negDeliveryOrder);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::negDeliveryOrder",ret,3,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(negDeliveryOrder, digit)==KErrNone)
qosR5NetworkNotification.iNegDeliveryOrder = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,negErroneousSDUDelivery);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::negErroneousSDUDelivery",ret,4,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(negErroneousSDUDelivery, digit)==KErrNone)
qosR5NetworkNotification.iNegErroneousSDUDelivery = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,negMaxSDUSize);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::negMaxSDUSize",ret,5,&KQosNetworkNotificationType);
continue;
}
else
{
qosR5NetworkNotification.iNegMaxSDUSize = negMaxSDUSize;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,negBitErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::negBitErrorRatio",ret,6,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(negBitErrorRatio, digit)==KErrNone)
qosR5NetworkNotification.iNegTBitErrorRatio = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,negSDUErrorRatio);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::negSDUErrorRatio",ret,7,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(negSDUErrorRatio, digit)==KErrNone)
qosR5NetworkNotification.iNegTSDUErrorRatio = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,negTrafficHandlingPriority);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::negTrafficHandlingPriority",ret,8,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(negTrafficHandlingPriority, digit)==KErrNone)
qosR5NetworkNotification.iNegTrafficHandlingPriority = digit;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,negTransferDelay);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::negTransferDelay",ret,9,&KQosNetworkNotificationType);
continue;
}
else
{
qosR5NetworkNotification.iNegTransferDelay = negTransferDelay;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,negGuaranteedUpLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::negGuaranteedUpLinkBitRate",ret,10,&KQosNetworkNotificationType);
continue;
}
else
{
qosR5NetworkNotification.iNegGuaranteedUpLinkBitRate = negGuaranteedUpLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,negGuaranteedDownLinkBitRate);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::negGuaranteedDownLinkBitRate",ret,11,&KQosNetworkNotificationType);
continue;
}
else
{
qosR5NetworkNotification.iNegGuaranteedDownLinkBitRate = negGuaranteedDownLinkBitRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,negMaxUpLinkRate);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::negMaxUpLinkRate",ret,12,&KQosNetworkNotificationType);
continue;
}
else
{
qosR5NetworkNotification.iNegMaxUpLinkRate = negMaxUpLinkRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,13,negMaxDownLinkRate);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::negMaxDownLinkRate",ret,13,&KQosNetworkNotificationType);
continue;
}
else
{
qosR5NetworkNotification.iNegMaxDownLinkRate = negMaxDownLinkRate;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,14,signallingIndication);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::signallingIndication",ret,14,&KQosNetworkNotificationType);
continue;
}
else
{
qosR5NetworkNotification.iSignallingIndication = signallingIndication;
}
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,15,reqTSourceStatisticsDescriptor);
if(ret!=KErrNone)
{
LOGPARSERR("qosR5NetworkNotification::reqTSourceStatisticsDescriptor",ret,15,&KQosNetworkNotificationType);
continue;
}
else
{
if(AsciiToNum(reqTSourceStatisticsDescriptor, digit)==KErrNone)
qosR5NetworkNotification.iNegTSourceStatisticsDescriptor = digit;
}
iQosR5NetworkNotifications->AppendL(qosR5NetworkNotification);
}
}
void CSimPacketQoS::GetSetQoSSettings()
/**
* Gets set qos delay settins from config file
*
*/
{
TInt ret;
iSetQoSDelay = 0;
iSetQoSDelayAt=0;
const CTestConfigItem* item=iPacketContext->CfgFile()->Item(KSetQoSDelay);
if(item)
{
TInt delay = 0;
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,delay);
if(ret!=KErrNone || delay < 0)
{
LOGPARSERR("SetQoSDelay::delay",ret,0,&KSetQoSDelay);
}
else
{
iSetQoSDelay = delay;
}
TInt at = 0;
ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,1,at);
if(ret != KErrNone)
{
LOGPARSERR("SetQoSDelay::at",ret,1,&KSetQoSDelay);
}
else
{
iSetQoSDelayAt = at;
}
}
}
CSimPacketQoS::~CSimPacketQoS()
/**
* Trivial Destructor
* Closes all CObject type objects and destroys all other objects created in the ConstructL()
*
*/
{
LOGPACKET1("CSimPacketQoS: Entered destructor");
if (iProfiles != NULL)
{
iProfiles->Delete(0,iProfiles->Count());
delete iProfiles;
}
if (iNegProfiles != NULL)
{
iNegProfiles->Delete(0,iNegProfiles->Count());
delete iNegProfiles;
}
if (iReqR99Profiles != NULL)
{
iReqR99Profiles->Delete(0, iReqR99Profiles->Count());
delete iReqR99Profiles;
}
if (iNegR99Profiles != NULL)
{
iNegR99Profiles->Delete(0,iNegR99Profiles->Count());
delete iNegR99Profiles;
}
if (iReqR5Profiles != NULL)
{
iReqR5Profiles->Delete(0, iReqR5Profiles->Count());
delete iReqR5Profiles;
}
if (iNegR5Profiles != NULL)
{
iNegR5Profiles->Delete(0,iNegR5Profiles->Count());
delete iNegR5Profiles;
}
if (iCapsR99Profiles != NULL)
{
iCapsR99Profiles->Delete(0, iCapsR99Profiles->Count());
delete iCapsR99Profiles;
}
if (iQosNetworkNotifications != NULL)
{
iQosNetworkNotifications->Delete(0, iQosNetworkNotifications->Count());
delete iQosNetworkNotifications;
}
if (iQosR5NetworkNotifications != NULL)
{
iQosR5NetworkNotifications->Delete(0, iQosR5NetworkNotifications->Count());
delete iQosR5NetworkNotifications;
}
if (iTimer != NULL)
{
delete iTimer;
}
if (iSetQoSTimer != NULL)
{
delete iSetQoSTimer;
}
delete iSimQoSChange;
delete iSetQoSData;
}
CTelObject* CSimPacketQoS::OpenNewObjectByNameL(const TDesC& /*aName*/)
/**
* Opening object(s) from RPacketQoS is not supported
*
* @param aName Name of object to open
* @return CTelObject pointer to the object created.
*/
{
User::Leave(KErrNotSupported);
return NULL;
}
CTelObject* CSimPacketQoS::OpenNewObjectL(TDes& /*aNewName*/)
/**
* Opening object(s) from RPacketQoS is not supported
*
* @param aNewName Name of object to open
* @return CTelObject pointer to the object created.
*/
{
User::Leave(KErrNotSupported);
return NULL;
}
CTelObject::TReqMode CSimPacketQoS::ReqModeL(const TInt aIpc)
/**
* ReqModeL is called from the server's CTelObject::ReqAnalyserL
* in order to check the type of request it has.
*
*
* @param aIpc the ipc number that identifies the client request
* @return CTelObject::TReqMode The request mode to be used for this request
* @leave Leaves if not supported by this tsy
*/
{
CTelObject::TReqMode ret=0;
switch (aIpc)
{
case EPacketQoSSetProfileParams:
case EPacketQoSGetProfileParams:
case EPacketQoSGetProfileCaps:
break;
case EPacketQoSNotifyProfileChanged:
ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
break;
default:
User::Leave(KErrNotSupported);
break;
}
return ret;
}
TInt CSimPacketQoS::RegisterNotification(const TInt aIpc)
/**
* RegisterNotification is called when the server recognises that this notification
* is being posted for the first time on this sub-session object.
*
* It enables the TSY to "turn on" any regular notification messages that it may receive
* from the phone
*
* @param aIpc the ipc number that identifies the client request
* @return err KErrNone if fine
*/
{
switch (aIpc)
{
case EPacketQoSNotifyProfileChanged:
LOGPACKET1("CSimPacketQoS: RegisterNotification - Profile Changed");
return KErrNone;
default:
// Unknown or invalid IPC
LOGPACKET1("CSimPacketQoS: Register error, unknown IPC");
return KErrNotSupported;
}
}
TInt CSimPacketQoS::DeregisterNotification(const TInt aIpc)
/**
* DeregisterNotification is called when the server recognises that this notification
* will not be posted again because the last client to have a handle on this sub-session
* object has just closed the handle.
*
* It enables the TSY to "turn off" any regular notification messages that it may
* receive from the phone
*
* @param aIpc the ipc number that identifies the client request
* @return err KErrNone if fine
*/
{
switch (aIpc)
{
case EPacketQoSNotifyProfileChanged:
LOGPACKET1("CSimPacketQoS: DeregisterNotification - Profile Changed");
return KErrNone;
default:
// Unknown or invalid IPC
LOGPACKET1("CSimPacketQoS: Deregister error, unknown IPC");
return KErrNotSupported;
}
}
TInt CSimPacketQoS::NumberOfSlotsL(const TInt aIpc)
/**
* NumberOfSlotsL is called by the server when it is registering a new notification
* It enables the TSY to tell the server how many buffer slots to allocate for
* "repost immediately" notifications that may trigger before clients collect them
*
* @param aIpc the ipc number that identifies the client request
* @return err KErrNone if fine
*/
{
TInt numberOfSlots=1;
switch (aIpc)
{
case EPacketQoSNotifyProfileChanged:
LOGPACKET1("CGprsDGprsTsy: Registered with 5 slots");
numberOfSlots=5;
break;
default:
// Unknown or invalid IPC
LOGPACKET1("CSimPacketQoS: Number of Slots error, unknown IPC");
User::Leave(KErrNotSupported);
break;
}
return numberOfSlots;
}
TInt CSimPacketQoS::ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,
const TDataPackage& aPackage)
/**
* ExtFunc is called by the server when it has a "extended", i.e. non-core ETel request
* for the TSY to process.
* A request handle, request type and request data are passed to the TSY
*
* @param aTsyReqHandle The request handle for completing the request
* @param aIpc Ipc representing the request
* @param aPackage any data associated with the request
* @return err KErrNone if request completes ok
*/
{
/**
* for UMTS on specified number, SetProfileFail occurs
**/
switch (aIpc)
{
case EPacketQoSSetProfileParams:
{
if (iSetProfileCallCount <= iSetProfileFail.iNumberOfTimes // if the SetProfileFail limit has not been reached
|| iSetProfileFail.iNumberOfTimes==0) // call SetProfile()
{
// only delay setprofile when the user wants to
if (iSetQoSDelay > 0 && iSetProfileCallCount == iSetQoSDelayAt)
{
TSetQoSData setQoSData;
setQoSData.iTsyReqHandle = aTsyReqHandle;
setQoSData.iData = aPackage.Des1n();
TRAPD(ret, iSetQoSData->AppendL(setQoSData) );
if (ret != KErrNone)
{
LOGPACKET1("CSimPacketQoS::ExtFunc AppendL call fail");
return ret;
}
iSetProfileCallCount++;
iSetQoSTimer->Start(iSetQoSDelay,this,ETimerIdPcktQoSSet);
return KErrNone;
}
else
{
iSetProfileCallCount++;
return SetProfile(aTsyReqHandle, aPackage.Des1n());
}
}
else
{
iSetProfileCallCount=0;
iSetProfileFail.iNumberOfTimes = 0;
ReqCompleted(aTsyReqHandle,iSetProfileFail.iFailErrorCode);
return KErrNone;
}
}
case EPacketQoSGetProfileParams:
return GetProfile(aTsyReqHandle, aPackage.Des1n());
case EPacketQoSNotifyProfileChanged:
return NotifyProfileChanged(aTsyReqHandle, aPackage.Des1n());
case EPacketQoSGetProfileCaps:
return GetProfileCaps(aTsyReqHandle, aPackage.Des1n());
case EPacketQoSNotifyProfileChangedCancel:
return NotifyProfileChangedCancel(aTsyReqHandle);
case EPacketQoSSetProfileParamsCancel:
return SetProfileCancel(aTsyReqHandle);
case EPacketQoSGetProfileParamsCancel:
return GetProfileCancel(aTsyReqHandle);
case EPacketQoSGetProfileCapsCancel:
return GetProfileCapsCancel(aTsyReqHandle);
default:
return KErrNotSupported;
}
}
TInt CSimPacketQoS::CancelService(const TInt aIpc,const TTsyReqHandle aTsyReqHandle)
/**
* CancelService is called by the server when it is "cleaning-up" any still outstanding
* asynchronous requests before closing a client's sub-session.
* This will happen if a client closes its R-class handle without cancelling outstanding asynchronous requests.
*
* @param aTsyReqHandle The request handle for completing the request
* @param aIpc Ipc representing the request
* @return err KErrNone if request completes ok
*/
{
LOGPACKET1("CSimPacketQoS: - CancelService called");
switch (aIpc)
{
case EPacketQoSSetProfileParams:
return SetProfileCancel(aTsyReqHandle);
case EPacketQoSGetProfileParams:
return GetProfileCancel(aTsyReqHandle);
case EPacketQoSGetProfileCaps:
return GetProfileCapsCancel(aTsyReqHandle);
case EPacketQoSNotifyProfileChanged:
return NotifyProfileChangedCancel(aTsyReqHandle);
default:
return KErrGeneral;
}
}
TInt CSimPacketQoS::SetProfile(const TTsyReqHandle aTsyReqHandle,const TDesC8* aConfig)
/**
* Sets the Quality of Service Requested and Minimum Profile Parameters supported.
*
* In this TSY, we compare the value sent by the client with the data read from the configuration file.
* If they are not the same then the data sent has been corrupted.
*
* @param aTsyReqHandle Tsy Request handle for the client request
* @param aConfig pointer containing the parameters to set to.
* @return KErrNone
*/
{
LOGPACKET1("CSimPacketQoS::SetProfile called");
TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aConfig;
TPacketDataConfigBase& configBaseV1 = (*configBase)();
TInt err = KErrGeneral;
// GPRS
if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigGPRS)
{
TPckg<RPacketQoS::TQoSGPRSRequested>* profileConfig = (TPckg<RPacketQoS::TQoSGPRSRequested>*)aConfig;
RPacketQoS::TQoSGPRSRequested& qosConfigV1 = (*profileConfig)();
for(TInt i=0; i<iProfiles->Count(); i++)
{
TProfileConfig profile = iProfiles->At(i);
if ((qosConfigV1.iMinDelay != profile.iMinDelay)||
(qosConfigV1.iMinMeanThroughput != profile.iMinMeanThroughput)||
(qosConfigV1.iMinPeakThroughput != profile.iMinPeekThroughput)||
(qosConfigV1.iMinPrecedence != profile.iMinPrecedence)||
(qosConfigV1.iMinReliability != profile.iMinReliability)||
(qosConfigV1.iReqDelay != profile.iReqDelay)||
(qosConfigV1.iReqMeanThroughput != profile.iReqMeanThroughput)||
(qosConfigV1.iReqPeakThroughput != profile.iReqPeekThroughput)||
(qosConfigV1.iReqPrecedence != profile.iReqPrecedence)||
(qosConfigV1.iReqReliability != profile.iReqReliability))
err=KErrCorrupt;
else
{
err=KErrNone;
iSetProfilePending = ETrue;
// Check for a pending profile notification.
if(iNotifyProfileGPRS.iNotifyPending)
{
iNotifyProfileGPRS.iNotifyPending=EFalse;
RPacketQoS::TQoSGPRSNegotiated notifyProfile;
//echo the requested values back to the notify message and complete
notifyProfile.iDelay = qosConfigV1.iReqDelay;
notifyProfile.iMeanThroughput = qosConfigV1.iReqMeanThroughput;
notifyProfile.iPeakThroughput = qosConfigV1.iReqPeakThroughput;
notifyProfile.iPrecedence = qosConfigV1.iReqPrecedence;
notifyProfile.iReliability = qosConfigV1.iReqReliability;
*(RPacketQoS::TQoSGPRSNegotiated*)iNotifyProfileGPRS.iNotifyData = notifyProfile;
ReqCompleted(iNotifyProfileGPRS.iNotifyHandle,KErrNone);
}
iUseNetworkNotificationBool = EFalse;
break;
}
}
ReqCompleted(aTsyReqHandle,err);
}
// UMTS
else if (configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel99Rel4)
{
TPckg<RPacketQoS::TQoSR99_R4Requested>* rel99Config = (TPckg<RPacketQoS::TQoSR99_R4Requested>*)aConfig;
RPacketQoS::TQoSR99_R4Requested& qosConfigV1 = (*rel99Config)();
for(TInt i=0; i<iReqR99Profiles->Count(); i++)
{
TProfileReqR99 profile = iReqR99Profiles->At(i);
if (MatchContext(profile)==KErrNone)
{
LOGPACKET1("====REQ QOS===");
// LOGPACKET3("Req Traffic [%d] [%d]", qosConfigV1.iReqTrafficClass, profile.iReqTraffic);
// LOGCOMMON3("Min Traffic [%d] [%d]", qosConfigV1.iMinTrafficClass, profile.iMinTraffic);
LOGPACKET3("Req Del order [%d] [%d]",qosConfigV1.iReqDeliveryOrderReqd, profile.iReqDeliveryOrder);
LOGPACKET3("Min Del order [%d] [%d]",qosConfigV1.iMinDeliveryOrderReqd , profile.iMinDeliveryOrder);
LOGPACKET3("Req Del err SDU [%d] [%d]",qosConfigV1.iReqDeliverErroneousSDU , profile.iReqErroneousSDU);
LOGPACKET3("Min Del err SDU [%d] [%d]",qosConfigV1.iMinDeliverErroneousSDU , profile.iMinErroneousSDU);
LOGPACKET3("Max Sdu Size [%d] [%d]",qosConfigV1.iReqMaxSDUSize , profile.iMaxSDUSize);
LOGPACKET3("Min Sdu Size [%d] [%d]",qosConfigV1.iMinAcceptableMaxSDUSize , profile.iMinSDUSize);
LOGPACKET3("Req Down [%d] [%d]",qosConfigV1.iReqMaxRate.iDownlinkRate , profile.iReqDownLinkTBitRate);
LOGPACKET3("Req Up [%d] [%d]", qosConfigV1.iReqMaxRate.iUplinkRate , profile.iReqUpLinkTBitRate);
LOGPACKET3("Min Guar Down[%d] [%d]",qosConfigV1.iMinGuaranteedRate.iDownlinkRate , profile.iMinGuaranteedDownLinkTBitRate);
LOGPACKET3("Min Guar Up [%d] [%d]",qosConfigV1.iMinGuaranteedRate.iUplinkRate , profile.iMinGuaranteedUpLinkTBitRate);
LOGPACKET3("Req BER [%d] [%d]",qosConfigV1.iReqBER , profile.iReqTBitErrorRatio);
LOGPACKET3("Max BER [%d] [%d]",qosConfigV1.iMaxBER , profile.iMinTBitErrorRatio);
LOGPACKET3("Req SDU err ratio [%d] [%d]",qosConfigV1.iReqSDUErrorRatio , profile.iReqTSDUErrorRatio);
LOGPACKET3("Max SDU err ration [%d] [%d]",qosConfigV1.iMaxSDUErrorRatio , profile.iMinTSDUErrorRatio);
LOGPACKET3("Req Traffic Handling priority [%d] [%d]",qosConfigV1.iReqTrafficHandlingPriority , profile.iReqTTrafficHandlingPriority);
LOGPACKET3("Min Traffic Handling priority [%d] [%d]",qosConfigV1.iMinTrafficHandlingPriority , profile.iMinTTrafficHandlingPriority);
LOGPACKET3("Req Transfer Delay [%d] [%d]",qosConfigV1.iReqTransferDelay , profile.iReqTransferDelay);
LOGPACKET3("Max Transfer Delay [%d] [%d]",qosConfigV1.iMaxTransferDelay , profile.iMinTransferDelay);
LOGPACKET3("Req Guar downlink bitrate [%d] [%d]",qosConfigV1.iReqGuaranteedRate.iDownlinkRate , profile.iReqGuaranteedDownLinkTBitRate);
LOGPACKET3("Req Guar uplink bitrate [%d] [%d]",qosConfigV1.iReqGuaranteedRate.iUplinkRate , profile.iReqGuaranteedUpLinkTBitRate);
LOGPACKET3("Min Guar downlink [%d] [%d]",qosConfigV1.iMinGuaranteedRate.iDownlinkRate , profile.iMinGuaranteedDownLinkTBitRate);
LOGPACKET3("Min Guar uplink [%d] [%d]",qosConfigV1.iMinGuaranteedRate.iUplinkRate , profile.iMinGuaranteedUpLinkTBitRate);
//-----------------------
if (
// ( qosConfigV1.iReqTrafficClass != profile.iReqTraffic) ||
// (qosConfigV1.iMinTrafficClass != profile.iMinTraffic)||
(qosConfigV1.iReqDeliveryOrderReqd != profile.iReqDeliveryOrder)||
(qosConfigV1.iMinDeliveryOrderReqd != profile.iMinDeliveryOrder)||
(qosConfigV1.iReqDeliverErroneousSDU != profile.iReqErroneousSDU)||
(qosConfigV1.iMinDeliverErroneousSDU != profile.iMinErroneousSDU)||
( (profile.iMaxSDUSize >= 0) && (qosConfigV1.iReqMaxSDUSize != profile.iMaxSDUSize) )||
( (profile.iMinSDUSize >= 0) && (qosConfigV1.iMinAcceptableMaxSDUSize != profile.iMinSDUSize) )||
( (profile.iReqDownLinkTBitRate >= 0) && (qosConfigV1.iReqMaxRate.iDownlinkRate != profile.iReqDownLinkTBitRate) )||
( (profile.iReqUpLinkTBitRate >= 0) && (qosConfigV1.iReqMaxRate.iUplinkRate != profile.iReqUpLinkTBitRate) )||
(qosConfigV1.iMinGuaranteedRate.iDownlinkRate != profile.iMinGuaranteedDownLinkTBitRate)||
(qosConfigV1.iMinGuaranteedRate.iUplinkRate != profile.iMinGuaranteedUpLinkTBitRate)||
(qosConfigV1.iReqBER != profile.iReqTBitErrorRatio) ||
(qosConfigV1.iMaxBER != profile.iMinTBitErrorRatio) ||
(qosConfigV1.iReqSDUErrorRatio != profile.iReqTSDUErrorRatio) ||
(qosConfigV1.iMaxSDUErrorRatio != profile.iMinTSDUErrorRatio) ||
(qosConfigV1.iReqTrafficHandlingPriority != profile.iReqTTrafficHandlingPriority) ||
(qosConfigV1.iMinTrafficHandlingPriority != profile.iMinTTrafficHandlingPriority) ||
(qosConfigV1.iReqTransferDelay != profile.iReqTransferDelay) ||
(qosConfigV1.iMaxTransferDelay != profile.iMinTransferDelay) ||
( (profile.iReqGuaranteedDownLinkTBitRate >= 0) && (qosConfigV1.iReqGuaranteedRate.iDownlinkRate != profile.iReqGuaranteedDownLinkTBitRate) )||
( (profile.iReqGuaranteedUpLinkTBitRate >= 0) && (qosConfigV1.iReqGuaranteedRate.iUplinkRate != profile.iReqGuaranteedUpLinkTBitRate))||
(qosConfigV1.iMinGuaranteedRate.iDownlinkRate != profile.iMinGuaranteedDownLinkTBitRate) ||
(qosConfigV1.iMinGuaranteedRate.iUplinkRate != profile.iMinGuaranteedUpLinkTBitRate)
)
{
err=KErrCorrupt;
}
else
{
err=KErrNone;
iSetProfilePending = ETrue;
iCurrentNeg99=i;
iCurrentProfileRel = TPacketDataConfigBase::KConfigRel99Rel4;
if (iNotifyProfileR99.iNotifyPending || iNotifyProfileR5.iNotifyPending)
{
CompleteNotifications(iNegR99Profiles->At(iCurrentNeg99));
}
iUseNetworkNotificationBool = EFalse;
break;
}
}
else
{
err = KErrNotFound;
}
}
ReqCompleted(aTsyReqHandle,err);
}
else if (configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel5)
{
TPckg<RPacketQoS::TQoSR5Requested>* rel5Config = (TPckg<RPacketQoS::TQoSR5Requested>*)aConfig;
RPacketQoS::TQoSR5Requested& qosConfigV1 = (*rel5Config)();
for(TInt i=0; i<iReqR5Profiles->Count(); i++)
{
TProfileReqR5 profile = iReqR5Profiles->At(i);
if (MatchContext(profile)==KErrNone)
{
if ((qosConfigV1.iReqTrafficClass != profile.iReqTraffic ||
(qosConfigV1.iMinTrafficClass != profile.iMinTraffic)||
(qosConfigV1.iReqDeliveryOrderReqd != profile.iReqDeliveryOrder)||
(qosConfigV1.iMinDeliveryOrderReqd != profile.iMinDeliveryOrder)||
(qosConfigV1.iReqDeliverErroneousSDU != profile.iReqErroneousSDU)||
(qosConfigV1.iMinDeliverErroneousSDU != profile.iMinErroneousSDU)||
( (profile.iMaxSDUSize >= 0) && (qosConfigV1.iReqMaxSDUSize != profile.iMaxSDUSize) )||
( (profile.iMinSDUSize >= 0) && (qosConfigV1.iMinAcceptableMaxSDUSize != profile.iMinSDUSize) )||
( (profile.iReqDownLinkTBitRate >= 0) && (qosConfigV1.iReqMaxRate.iDownlinkRate != profile.iReqDownLinkTBitRate) )||
( (profile.iReqUpLinkTBitRate >= 0) && qosConfigV1.iReqMaxRate.iUplinkRate != profile.iReqUpLinkTBitRate) )||
(qosConfigV1.iMinGuaranteedRate.iDownlinkRate != profile.iMinGuaranteedDownLinkTBitRate)||
(qosConfigV1.iMinGuaranteedRate.iUplinkRate != profile.iMinGuaranteedUpLinkTBitRate)||
(qosConfigV1.iReqBER != profile.iReqTBitErrorRatio) ||
(qosConfigV1.iMaxBER != profile.iMinTBitErrorRatio) ||
(qosConfigV1.iReqSDUErrorRatio != profile.iReqTSDUErrorRatio) ||
(qosConfigV1.iMaxSDUErrorRatio != profile.iMinTSDUErrorRatio) ||
(qosConfigV1.iReqTrafficHandlingPriority != profile.iReqTTrafficHandlingPriority) ||
(qosConfigV1.iMinTrafficHandlingPriority != profile.iMinTTrafficHandlingPriority) ||
(qosConfigV1.iReqTransferDelay != profile.iReqTransferDelay) ||
(qosConfigV1.iMaxTransferDelay != profile.iMinTransferDelay) ||
( (profile.iReqGuaranteedDownLinkTBitRate >= 0) && (qosConfigV1.iReqGuaranteedRate.iDownlinkRate != profile.iReqGuaranteedDownLinkTBitRate) )||
( (profile.iReqGuaranteedUpLinkTBitRate >= 0) && (qosConfigV1.iReqGuaranteedRate.iUplinkRate != profile.iReqGuaranteedUpLinkTBitRate) )||
(qosConfigV1.iMinGuaranteedRate.iDownlinkRate != profile.iMinGuaranteedDownLinkTBitRate) ||
(qosConfigV1.iMinGuaranteedRate.iUplinkRate != profile.iMinGuaranteedUpLinkTBitRate) ||
(qosConfigV1.iSignallingIndication != profile.iSignallingIndication) ||
(qosConfigV1.iSourceStatisticsDescriptor != profile.iReqTSourceStatisticsDescriptor))
{
err=KErrCorrupt;
}
else
{
err=KErrNone;
iSetProfilePending = ETrue;
iCurrentNegR5=i;
iCurrentProfileRel = TPacketDataConfigBase::KConfigRel5;
if (iNotifyProfileR99.iNotifyPending || iNotifyProfileR5.iNotifyPending)
{
CompleteNotifications(iNegR5Profiles->At(iCurrentNegR5));
}
iUseNetworkNotificationBool = EFalse;
break;
}
}
else
{
err = KErrNotFound;
}
}
ReqCompleted(aTsyReqHandle,err);
}
return KErrNone;
}
TInt CSimPacketQoS::SetProfileCancel(const TTsyReqHandle aTsyReqHandle )
{
/**
* Cancels the Setconfig request.
*
* @param aTsyReqHandle Tsy Request handle for the client request
* @return err KErrNone
*/
LOGPACKET1("CSimPacketQoS::SetProfileCancel called");
TInt index = 0;
if (TSetQoSData::Find(iSetQoSData, aTsyReqHandle, index) == KErrNone)
{
iSetQoSData->Delete(index);
}
if (iSetQoSData->Count() == 0)
{
iSetQoSTimer->Cancel();
}
ReqCompleted(aTsyReqHandle, KErrCancel);
return KErrNone;
}
TInt CSimPacketQoS::GetProfile(const TTsyReqHandle aTsyReqHandle,TDes8* aConfig)
/**
* Returns to the client the Quality of Service Requested and Minimum Profile Parameters supported.
*
* In this TSY, Return the profile read from the config file and its up to the client to compare it
* with the values its expecting.
*
* @param aTsyReqHandle Tsy Request handle for the client request
* @param aConfig pointer containing the parameters to Get to.
* @return KErrNone
*/
{
LOGPACKET1("CSimPacketQoS::GetProfile called");
TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aConfig;
TPacketDataConfigBase& configBaseV1 = (*configBase)();
// GPRS
if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigGPRS)
{
TPckg<RPacketQoS::TQoSGPRSNegotiated>* qosConfigGPRSPckg = (TPckg<RPacketQoS::TQoSGPRSNegotiated>*)aConfig;
RPacketQoS::TQoSGPRSNegotiated& qosConfigV1 = (*qosConfigGPRSPckg)();
TNegProfileConfig negProfile = iNegProfiles->At(iCurrentNeg++);
qosConfigV1.iDelay = STATIC_CAST(RPacketQoS::TQoSDelay,negProfile.iNegDelay);
qosConfigV1.iMeanThroughput = STATIC_CAST(RPacketQoS::TQoSMeanThroughput,negProfile.iNegMeanThroughput);
qosConfigV1.iPeakThroughput = STATIC_CAST(RPacketQoS::TQoSPeakThroughput,negProfile.iNegPeekThroughput);
qosConfigV1.iPrecedence = STATIC_CAST(RPacketQoS::TQoSPrecedence, negProfile.iNegPrecedence);
qosConfigV1.iReliability = STATIC_CAST(RPacketQoS::TQoSReliability, negProfile.iNegReliability);
ReqCompleted(aTsyReqHandle,KErrNone);
}
// UMTS
else if (configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel99Rel4)
{
TPckg<RPacketQoS::TQoSR99_R4Negotiated>* qosConfigR99 = (TPckg<RPacketQoS::TQoSR99_R4Negotiated>*)aConfig;
RPacketQoS::TQoSR99_R4Negotiated& qosConfigNegR99 = (*qosConfigR99)();
// check context names match, if not, find correct one
if (!iUseNetworkNotificationBool)
{
TProfileNegR99* R99NegProfile;
TInt matchContextErr;
// profile was set using R5 params, get negociated profile from R5NegProfile
if (iCurrentProfileRel == TPacketDataConfigBase::KConfigRel5)
{
TProfileNegR5& R5NegProfile = iNegR5Profiles->At(iCurrentNegR5);
matchContextErr = MatchContext(R5NegProfile);
R99NegProfile = &R5NegProfile;
}
else // default is to use the format of the client request
{
R99NegProfile = &iNegR99Profiles->At(iCurrentNeg99);
matchContextErr = MatchContext(*R99NegProfile);
}
if (matchContextErr==KErrNone)
{
qosConfigNegR99.iMaxSDUSize = R99NegProfile->iNegMaxSDUSize;
qosConfigNegR99.iTransferDelay = R99NegProfile->iNegTransferDelay;
qosConfigNegR99.iTrafficClass = STATIC_CAST(RPacketQoS::TTrafficClass, R99NegProfile->iNegTraffic);
qosConfigNegR99.iDeliveryOrderReqd = STATIC_CAST(RPacketQoS::TDeliveryOrder, R99NegProfile->iNegDeliveryOrder);
qosConfigNegR99.iDeliverErroneousSDU = STATIC_CAST(RPacketQoS::TErroneousSDUDelivery, R99NegProfile->iNegErroneousSDUDelivery);
qosConfigNegR99.iTrafficHandlingPriority = STATIC_CAST(RPacketQoS::TTrafficHandlingPriority, R99NegProfile->iNegTrafficHandlingPriority);
qosConfigNegR99.iSDUErrorRatio = STATIC_CAST(RPacketQoS::TSDUErrorRatio, R99NegProfile->iNegTSDUErrorRatio);
qosConfigNegR99.iBER = STATIC_CAST(RPacketQoS::TBitErrorRatio, R99NegProfile->iNegTBitErrorRatio);
qosConfigNegR99.iGuaranteedRate.iDownlinkRate = R99NegProfile->iNegGuaranteedDownLinkBitRate;
qosConfigNegR99.iGuaranteedRate.iUplinkRate = R99NegProfile->iNegGuaranteedUpLinkBitRate;
qosConfigNegR99.iMaxRate.iDownlinkRate = R99NegProfile->iNegMaxDownLinkRate;
qosConfigNegR99.iMaxRate.iUplinkRate = R99NegProfile->iNegMaxUpLinkRate;
ReqCompleted(aTsyReqHandle,KErrNone);
}
else
{
ReqCompleted(aTsyReqHandle,KErrNotFound);
}
}
else
{
TProfileNegR99* R99NegProfile;
TInt matchContextErr;
if (iCurrentProfileRel == TPacketDataConfigBase::KConfigRel5)
{
TProfileNegR5& R5NegProfile = iQosR5NetworkNotifications->At(iQosR5NetworkNotificationCount);
matchContextErr = MatchContext(R5NegProfile);
R99NegProfile = &R5NegProfile;
}
else // default is to use the format of the client request
{
R99NegProfile = &iQosNetworkNotifications->At(iQosNetworkNotificationCount);
matchContextErr = MatchContext(*R99NegProfile);
}
if (matchContextErr==KErrNone)
{
qosConfigNegR99.iMaxSDUSize = R99NegProfile->iNegMaxSDUSize;
qosConfigNegR99.iTransferDelay = R99NegProfile->iNegTransferDelay;
qosConfigNegR99.iTrafficClass = STATIC_CAST(RPacketQoS::TTrafficClass, R99NegProfile->iNegTraffic);
qosConfigNegR99.iDeliveryOrderReqd = STATIC_CAST(RPacketQoS::TDeliveryOrder, R99NegProfile->iNegDeliveryOrder);
qosConfigNegR99.iDeliverErroneousSDU = STATIC_CAST(RPacketQoS::TErroneousSDUDelivery, R99NegProfile->iNegErroneousSDUDelivery);
qosConfigNegR99.iTrafficHandlingPriority = STATIC_CAST(RPacketQoS::TTrafficHandlingPriority, R99NegProfile->iNegTrafficHandlingPriority);
qosConfigNegR99.iSDUErrorRatio = STATIC_CAST(RPacketQoS::TSDUErrorRatio, R99NegProfile->iNegTSDUErrorRatio);
qosConfigNegR99.iBER = STATIC_CAST(RPacketQoS::TBitErrorRatio, R99NegProfile->iNegTBitErrorRatio);
qosConfigNegR99.iGuaranteedRate.iDownlinkRate = R99NegProfile->iNegGuaranteedDownLinkBitRate;
qosConfigNegR99.iGuaranteedRate.iUplinkRate = R99NegProfile->iNegGuaranteedUpLinkBitRate;
qosConfigNegR99.iMaxRate.iDownlinkRate = R99NegProfile->iNegMaxDownLinkRate;
qosConfigNegR99.iMaxRate.iUplinkRate = R99NegProfile->iNegMaxUpLinkRate;
ReqCompleted(aTsyReqHandle,KErrNone);
}
else
{
ReqCompleted(aTsyReqHandle,KErrNotFound);
}
}
}
else if (configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel5)
{
TPckg<RPacketQoS::TQoSR5Negotiated>* qosConfigR5 = (TPckg<RPacketQoS::TQoSR5Negotiated>*)aConfig;
RPacketQoS::TQoSR5Negotiated& qosConfigNegR5 = (*qosConfigR5)();
// check context names match, if not, find correct one
if (!iUseNetworkNotificationBool)
{
TProfileNegR5* R5NegProfile;
TProfileNegR99* R99NegProfile;
TInt matchContextErr;
// profile was set using R99/R4 params, get negociated profile from R99NegProfile
if (iCurrentProfileRel == TPacketDataConfigBase::KConfigRel99Rel4)
{
R99NegProfile = &iNegR99Profiles->At(iCurrentNeg99);
matchContextErr = MatchContext(*R99NegProfile);
R5NegProfile = NULL;
}
else // default is to use the format of the client request
{
R5NegProfile = &iNegR5Profiles->At(iCurrentNegR5);
matchContextErr = MatchContext(*R5NegProfile);
// R99 profile is the same as R5
R99NegProfile = R5NegProfile;
}
if (matchContextErr==KErrNone)
{
qosConfigNegR5.iMaxSDUSize = R99NegProfile->iNegMaxSDUSize;
qosConfigNegR5.iTransferDelay = R99NegProfile->iNegTransferDelay;
qosConfigNegR5.iTrafficClass = STATIC_CAST(RPacketQoS::TTrafficClass, R99NegProfile->iNegTraffic);
qosConfigNegR5.iDeliveryOrderReqd = STATIC_CAST(RPacketQoS::TDeliveryOrder, R99NegProfile->iNegDeliveryOrder);
qosConfigNegR5.iDeliverErroneousSDU = STATIC_CAST(RPacketQoS::TErroneousSDUDelivery, R99NegProfile->iNegErroneousSDUDelivery);
qosConfigNegR5.iTrafficHandlingPriority = STATIC_CAST(RPacketQoS::TTrafficHandlingPriority, R99NegProfile->iNegTrafficHandlingPriority);
qosConfigNegR5.iSDUErrorRatio = STATIC_CAST(RPacketQoS::TSDUErrorRatio, R99NegProfile->iNegTSDUErrorRatio);
qosConfigNegR5.iBER = STATIC_CAST(RPacketQoS::TBitErrorRatio, R99NegProfile->iNegTBitErrorRatio);
qosConfigNegR5.iGuaranteedRate.iDownlinkRate = R99NegProfile->iNegGuaranteedDownLinkBitRate;
qosConfigNegR5.iGuaranteedRate.iUplinkRate = R99NegProfile->iNegGuaranteedUpLinkBitRate;
qosConfigNegR5.iMaxRate.iDownlinkRate = R99NegProfile->iNegMaxDownLinkRate;
qosConfigNegR5.iMaxRate.iUplinkRate = R99NegProfile->iNegMaxUpLinkRate;
if (R5NegProfile != NULL)
{
qosConfigNegR5.iSignallingIndication = R5NegProfile->iSignallingIndication;
qosConfigNegR5.iSourceStatisticsDescriptor = STATIC_CAST(RPacketQoS::TSourceStatisticsDescriptor, R5NegProfile->iNegTSourceStatisticsDescriptor);
}
else
{
qosConfigNegR5.iSignallingIndication = EFalse;
qosConfigNegR5.iSourceStatisticsDescriptor = RPacketQoS::ESourceStatisticsDescriptorUnknown;
}
ReqCompleted(aTsyReqHandle,KErrNone);
}
else
{
ReqCompleted(aTsyReqHandle,KErrNotFound);
}
}
else
{
TProfileNegR5* R5NegProfile;
TProfileNegR99* R99NegProfile;
TInt matchContextErr;
// profile was set using R99/R4 params, get negociated profile from R99NegProfile
if (iCurrentProfileRel == TPacketDataConfigBase::KConfigRel99Rel4)
{
R99NegProfile = &iQosNetworkNotifications->At(iQosNetworkNotificationCount);
matchContextErr = MatchContext(*R99NegProfile);
R5NegProfile = NULL;
}
else // default is to use the format of the client request
{
R5NegProfile = &iQosR5NetworkNotifications->At(iQosR5NetworkNotificationCount);
matchContextErr = MatchContext(*R5NegProfile);
// R99 profile is the same as R5
R99NegProfile = R5NegProfile;
}
if (matchContextErr==KErrNone)
{
qosConfigNegR5.iMaxSDUSize = R99NegProfile->iNegMaxSDUSize;
qosConfigNegR5.iTransferDelay = R99NegProfile->iNegTransferDelay;
qosConfigNegR5.iTrafficClass = STATIC_CAST(RPacketQoS::TTrafficClass, R99NegProfile->iNegTraffic);
qosConfigNegR5.iDeliveryOrderReqd = STATIC_CAST(RPacketQoS::TDeliveryOrder, R99NegProfile->iNegDeliveryOrder);
qosConfigNegR5.iDeliverErroneousSDU = STATIC_CAST(RPacketQoS::TErroneousSDUDelivery, R99NegProfile->iNegErroneousSDUDelivery);
qosConfigNegR5.iTrafficHandlingPriority = STATIC_CAST(RPacketQoS::TTrafficHandlingPriority, R99NegProfile->iNegTrafficHandlingPriority);
qosConfigNegR5.iSDUErrorRatio = STATIC_CAST(RPacketQoS::TSDUErrorRatio, R99NegProfile->iNegTSDUErrorRatio);
qosConfigNegR5.iBER = STATIC_CAST(RPacketQoS::TBitErrorRatio, R99NegProfile->iNegTBitErrorRatio);
qosConfigNegR5.iGuaranteedRate.iDownlinkRate = R99NegProfile->iNegGuaranteedDownLinkBitRate;
qosConfigNegR5.iGuaranteedRate.iUplinkRate = R99NegProfile->iNegGuaranteedUpLinkBitRate;
qosConfigNegR5.iMaxRate.iDownlinkRate = R99NegProfile->iNegMaxDownLinkRate;
qosConfigNegR5.iMaxRate.iUplinkRate = R99NegProfile->iNegMaxUpLinkRate;
if (R5NegProfile != NULL)
{
qosConfigNegR5.iSignallingIndication = R5NegProfile->iSignallingIndication;
qosConfigNegR5.iSourceStatisticsDescriptor = STATIC_CAST(RPacketQoS::TSourceStatisticsDescriptor, R5NegProfile->iNegTSourceStatisticsDescriptor);
}
else
{
qosConfigNegR5.iSignallingIndication = EFalse;
qosConfigNegR5.iSourceStatisticsDescriptor = RPacketQoS::ESourceStatisticsDescriptorUnknown;
}
ReqCompleted(aTsyReqHandle,KErrNone);
}
else
{
ReqCompleted(aTsyReqHandle,KErrNotFound);
}
}
}
return KErrNone;
}
TInt CSimPacketQoS::GetProfileCancel(const TTsyReqHandle /*aTsyReqHandle*/)
/**
* Cancels the GetProfile request. This method is not supported in this version of the TSY.
*
* @param aTsyReqHandle Tsy Request handle for the client cancel request
* @return KErrNone
*/
{
LOGPACKET1("CSimPacketQoS::GetProfileCancel called");
return KErrNone;
}
TInt CSimPacketQoS::GetProfileCaps(const TTsyReqHandle aTsyReqHandle,TDes8* aConfig)
/**
* Returns to the client the capabilities of the TSY.
*
* In this TSY, Return the profile read from the config file and its up to the client to compare it
* with the values its expecting.
*
* @param aTsyReqHandle Tsy Request handle for the client request
* @param aConfig pointer containing the parameters to Get to.
* @return KErrNone
*/
{
LOGPACKET1("CSimPacketQoS::GetProfileCaps called");
TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aConfig;
TPacketDataConfigBase& configBaseV1 = (*configBase)();
// GPRS
if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigGPRS)
{
TPckg<RPacketQoS::TQoSCapsGPRS>* qosCapsGPRSPckg = (TPckg<RPacketQoS::TQoSCapsGPRS>*)aConfig;
RPacketQoS::TQoSCapsGPRS& qosCaps = (*qosCapsGPRSPckg)();
qosCaps.iDelay = STATIC_CAST(RPacketQoS::TQoSDelay,iCapsGPRS.iDelay);
qosCaps.iMean = STATIC_CAST(RPacketQoS::TQoSMeanThroughput,iCapsGPRS.iMean);
qosCaps.iPeak = STATIC_CAST(RPacketQoS::TQoSPeakThroughput,iCapsGPRS.iPeak);
qosCaps.iPrecedence = STATIC_CAST(RPacketQoS::TQoSPrecedence, iCapsGPRS.iPrecedence);
qosCaps.iReliability = STATIC_CAST(RPacketQoS::TQoSReliability, iCapsGPRS.iReliability);
ReqCompleted(aTsyReqHandle,KErrNone);
}
// UMTS
else if (configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel99Rel4)
{
TPckg<RPacketQoS::TQoSCapsR99_R4>* qosCapsR99Pckg = (TPckg<RPacketQoS::TQoSCapsR99_R4>*)aConfig;
RPacketQoS::TQoSCapsR99_R4& r99Caps = (*qosCapsR99Pckg)();
r99Caps.iBER = iCapsR99.iBER;
r99Caps.iDeliverErroneousSDU = iCapsR99.iDeliverErroneousSDU;
r99Caps.iDeliveryOrderReqd = iCapsR99.iDeliveryOrderReq;
r99Caps.iSDUErrorRatio = iCapsR99.iSDUErrorRatio;
r99Caps.iTrafficClass = iCapsR99.iTraffic;
r99Caps.iTrafficHandlingPriority = iCapsR99.iTrafficHandlingPriority;
ReqCompleted(aTsyReqHandle,KErrNone);
}
else if (configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel5)
{
TPckg<RPacketQoS::TQoSCapsR5>* qosCapsR5Pckg = (TPckg<RPacketQoS::TQoSCapsR5>*)aConfig;
RPacketQoS::TQoSCapsR5& r5Caps = (*qosCapsR5Pckg)();
r5Caps.iBER = iCapsR5.iBER;
r5Caps.iDeliverErroneousSDU = iCapsR5.iDeliverErroneousSDU;
r5Caps.iDeliveryOrderReqd = iCapsR5.iDeliveryOrderReq;
r5Caps.iSDUErrorRatio = iCapsR5.iSDUErrorRatio;
r5Caps.iTrafficClass = iCapsR5.iTraffic;
r5Caps.iTrafficHandlingPriority = iCapsR5.iTrafficHandlingPriority;
r5Caps.iSignallingIndication = iCapsR5.iSignallingIndication;
r5Caps.iSourceStatisticsDescriptor = iCapsR5.iNegTSourceStatisticsDescriptor;
ReqCompleted(aTsyReqHandle,KErrNone);
}
return KErrNone;
}
TInt CSimPacketQoS::GetProfileCapsCancel(const TTsyReqHandle /*aTsyReqHandle*/)
/**
* Cancels the GetProfileCaps request. This method is not supported in this version of the TSY.
*
* @param aTsyReqHandle Tsy Request handle for the client cancel request
* @return KErrNone
*/
{
LOGPACKET1("CSimPacketQoS::GetProfileCapsCancel called");
return KErrNone;
}
TInt CSimPacketQoS::NotifyProfileChanged(const TTsyReqHandle aTsyReqHandle, TDes8* aConfig)
/**
* Records a client interest in being notified of a change in the QoS Profile.
*
* @param aTsyReqHandle Tsy Request handle for the client request
* @param aConfig pointer to the profile to store the profile info when the profile changes.
* @return KErrNone
*/
{
TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aConfig;
TPacketDataConfigBase& configBaseV1 = (*configBase)();
if (configBaseV1.ExtensionId() == TPacketDataConfigBase::KConfigGPRS)
{
__ASSERT_ALWAYS(!iNotifyProfileGPRS.iNotifyPending,SimPanic(ENotificationAlreadyPending));
iNotifyProfileGPRS.iNotifyPending = ETrue;
iNotifyProfileGPRS.iNotifyHandle = aTsyReqHandle;
iNotifyProfileGPRS.iNotifyData = &configBaseV1;
}
else if (configBaseV1.ExtensionId() == TPacketDataConfigBase::KConfigRel99Rel4)
{
__ASSERT_ALWAYS(!iNotifyProfileR99.iNotifyPending,SimPanic(ENotificationAlreadyPending));
iNotifyProfileR99.iNotifyPending = ETrue;
iNotifyProfileR99.iNotifyHandle = aTsyReqHandle;
iNotifyProfileR99.iNotifyData = &configBaseV1;
// start network events only if the release format used to set this QoS profile is R99_R4
if (!iUseNetworkNotificationBool && iNetworkNotificationType == ETimer && iCurrentProfileRel == TPacketDataConfigBase::KConfigRel99Rel4)
{
TInt count=iQosNetworkNotifications->Count();
for(TInt i = 0; i<count; i++)
{
TProfileNegR99 qos = (TProfileNegR99)iQosNetworkNotifications->At(i);
if(qos.iContextName.Compare(iPacketContext->ContextName()) == 0)
{
if (iTimerStartedBool)
{
delete iTimer;
iTimer = NULL;
TRAP_IGNORE(iTimer=CSimTimer::NewL(iPhone));
}
iUseNetworkNotificationBool = ETrue;
iQosNetworkNotificationCount = i;
iTimerStartedBool=ETrue;
if (iTimer != NULL)
iTimer->Start(qos.iDuration, this, ETimerIdPcktQosNetWork);
break;
}
}
}
}
else if (configBaseV1.ExtensionId() == TPacketDataConfigBase::KConfigRel5)
{
__ASSERT_ALWAYS(!iNotifyProfileR5.iNotifyPending,SimPanic(ENotificationAlreadyPending));
iNotifyProfileR5.iNotifyPending = ETrue;
iNotifyProfileR5.iNotifyHandle = aTsyReqHandle;
iNotifyProfileR5.iNotifyData = &configBaseV1;
// start network events only if the release format used to set this QoS profile is R5
if (!iUseNetworkNotificationBool && iNetworkNotificationType == ETimer && iCurrentProfileRel == TPacketDataConfigBase::KConfigRel5)
{
TInt count=iQosR5NetworkNotifications->Count();
for(TInt i = 0; i<count; i++)
{
TProfileNegR5 qos = (TProfileNegR5)iQosR5NetworkNotifications->At(i);
if(qos.iContextName.Compare(iPacketContext->ContextName()) == 0)
{
if (iTimerStartedBool)
{
delete iTimer;
iTimer = NULL;
TRAP_IGNORE(iTimer=CSimTimer::NewL(iPhone));
}
iUseNetworkNotificationBool = ETrue;
iQosR5NetworkNotificationCount = i;
iTimerStartedBool=ETrue;
if (iTimer != NULL)
iTimer->Start(qos.iDuration, this, ETimerIdPcktQosR5Network);
break;
}
}
}
}
return KErrNone;
}
TInt CSimPacketQoS::NotifyProfileChangedCancel(const TTsyReqHandle aTsyReqHandle)
/**
* Cancel a client's interest in being notified when the profile configuration changes
* This is acheived simply by resetting the flag that indicates a notification is pending.
*
* @param aTsyReqHandle Tsy Request handle for the client cancel request
* @return KErrNone
*/
{
LOGPACKET1("CSimPacketQoS::NotifyProfileChangedCancel called");
if(iNotifyProfileGPRS.iNotifyPending && iNotifyProfileGPRS.iNotifyHandle == aTsyReqHandle)
{
iNotifyProfileGPRS.iNotifyPending=EFalse;
ReqCompleted(aTsyReqHandle,KErrCancel);
}
else if(iNotifyProfileR99.iNotifyPending && iNotifyProfileR99.iNotifyHandle == aTsyReqHandle)
{
iNotifyProfileR99.iNotifyPending=EFalse;
if (iTimer != NULL)
iTimer->Cancel();
ReqCompleted(aTsyReqHandle,KErrCancel);
}
else if(iNotifyProfileR5.iNotifyPending && iNotifyProfileR5.iNotifyHandle == aTsyReqHandle)
{
iNotifyProfileR5.iNotifyPending=EFalse;
if (iTimer != NULL)
iTimer->Cancel();
ReqCompleted(aTsyReqHandle,KErrCancel);
}
return KErrNone;
}
/**
* This function matches the Rel99 Release profile to one in the array of Rel99 Release profiles
*/
TInt CSimPacketQoS::MatchContext(TProfileReqR99& aR99ReqProfile)
{
if (iPacketContext->ContextName().Compare(aR99ReqProfile.iContextName)==0)
{
return KErrNone;
}
else
{
TInt count = iReqR99Profiles->Count();
for (TInt i = 0; i<count; i++)
{
TProfileReqR99 profile = iReqR99Profiles->At(i);
if (iPacketContext->ContextName().Compare(profile.iContextName)==0)
{
aR99ReqProfile = profile;
return KErrNone;
}
}
}
return KErrNotFound;
}
/**
* This function matches the Rel99 Negotiated profile to one in the array of Rel99 Negotiated profiles
*/
TInt CSimPacketQoS::MatchContext(TProfileNegR99& aR99NegProfile)
{
if (iPacketContext->ContextName().Compare(aR99NegProfile.iContextName)==0)
{
return KErrNone;
}
else
{
TInt count = iNegR99Profiles->Count();
for (TInt i = 0; i<count; i++)
{
TProfileNegR99 profile = iNegR99Profiles->At(i);
if (iPacketContext->ContextName().Compare(profile.iContextName)==0)
{
aR99NegProfile = profile;
return KErrNone;
}
}
}
return KErrNotFound;
}
/**
* This function matches the Rel5 Release profile to one in the array of Rel5 Release profiles
*/
TInt CSimPacketQoS::MatchContext(TProfileReqR5& aR5ReqProfile)
{
if (iPacketContext->ContextName().Compare(aR5ReqProfile.iContextName)==0)
{
return KErrNone;
}
else
{
TInt count = iReqR5Profiles->Count();
for (TInt i = 0; i<count; i++)
{
TProfileReqR5 profile = iReqR5Profiles->At(i);
if (iPacketContext->ContextName().Compare(profile.iContextName)==0)
{
aR5ReqProfile = profile;
return KErrNone;
}
}
}
return KErrNotFound;
}
/**
* This function matches the Rel99 Negotiated profile to one in the array of Rel99 Negotiated profiles
*/
TInt CSimPacketQoS::MatchContext(TProfileNegR5& aR5NegProfile)
{
if (iPacketContext->ContextName().Compare(aR5NegProfile.iContextName)==0)
{
return KErrNone;
}
else
{
TInt count = iNegR5Profiles->Count();
for (TInt i = 0; i<count; i++)
{
TProfileNegR5 profile = iNegR5Profiles->At(i);
if (iPacketContext->ContextName().Compare(profile.iContextName)==0)
{
aR5NegProfile = profile;
return KErrNone;
}
}
}
return KErrNotFound;
}
void CSimPacketQoS::ClearChangeQoSPending()
{
iSetProfilePending = EFalse;
}
/**
* Sets the current negotiated profile to the required profile parameters
*/
TInt CSimPacketQoS::PerformProfileChange()
{
if (iSetProfilePending)
{
iSetProfilePending = EFalse;
return KErrNone;
}
return KErrNotReady;
}
TInt CSimPacketQoS::TSetQoSData::Find(CArrayFixFlat<TSetQoSData>* aSetQoSArray, TTsyReqHandle aTsyReqHandle, TInt& aIndex)
/**
* Finds a qos data set from array using the tsy request handle
*
* @param CArrayFixFlat<TSetQoSData>* aSetQoSArray - Array of qos data stored
* @param TTsyReqHandle aTsyReqHandle - Tsy request handle for the client
* @param TInt& aIndex - Index of current qos data set
* @return KErrNone or KErrNotFound
*/
{
for (TInt i = 0; i < aSetQoSArray->Count(); i++)
{
if (aSetQoSArray->At(i).iTsyReqHandle == aTsyReqHandle)
{
aIndex = i;
return KErrNone;
}
}
aIndex = -1;
return KErrNotFound;
}