diff -r e8c1ea2c6496 -r 8758140453c0 lbs/lbstestutils/src/ctlbsconfigreader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lbs/lbstestutils/src/ctlbsconfigreader.cpp Thu Jan 21 12:53:44 2010 +0000 @@ -0,0 +1,1027 @@ +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// @file ctlbsconfigreader.cpp +// This is the Cpp file which contains the ini file configuration reader classes +// +// + +// User includes +#include "ctlbsconfigreader.h" + +// Epoc includes +#include + +// Lbs includes +#include +#include + +// Literals Used +_LIT8(KNotANumber, "nan"); + + +CConfigReaderBase::CConfigReaderBase(const TDesC& aConfigFileName, const TDesC& aConfigSection) : iConfigFileName(aConfigFileName), iConfigSection(aConfigSection) + { + } + + +CConfigReaderBase::~CConfigReaderBase() + { + } + + +void CConfigReaderBase::AppendFieldChar(TUint aChar) + { + if (iSentence.Length() >= iSentence.MaxLength()) + { + return; + } + + iSentence.Append(aChar); + + // If aChar is not a field delimiter then just add it to buffer and return + if (aChar != ',' && aChar != '*') + { + iFieldLength++; + return; + } + + // Got a field delimiter increase the number of fields + // aChar == ',' || aChar == '*' + + TPtrC8 thisField = iSentence.Mid(iFieldStart, iFieldLength); + iFields[iNumFields].Set(thisField); + iNumFields++; + + // Next field starts here + iFieldStart = iSentence.Length(); + iFieldLength = 0; + } + + +void CConfigReaderBase::ProcessStringL(const TDesC8& aData) + { + TInt length = aData.Length(); + + for (TInt index = 0; index < length; index++) + { + TUint ch = aData[index]; + + switch(iReadState) + { + // Keep reading until a section is found. + case EStartSection: + { + if (ch == '[') + { + iReadSection.SetLength(0); + iReadState = EProcessSection; + } + break; + } + + // Found a section, keep reading until end of section found. + case EProcessSection: + { + // End of section, check if it's ours. + if (ch == ']') + { + // Need to convert from TBuf8 to TBuf for the comparision. + TBuf cmpSection; + cmpSection.Copy(iReadSection); + + // Not our section. + if (iConfigSection.Compare(cmpSection) != 0) + { + iReadState = EStartSection; + } + + // Is our section. + else + { + iReadState = EStartSentence; + } + } + else + { + iReadSection.Append(ch); + } + break; + } + + case EStartSentence: + { + // + if (ch == '$') + { + iReadState = EProcessSentence; + iSentence.SetLength(0); + iNumFields = 0; + iFieldStart = 0; + iFieldLength = 0; + for (TInt i = 0; i < KMaxFields; i++) + { + iFields[i].Set(KNullDesC8); + } + } + + // If we find a section we know to stop reading sentences for our section + // and we let the other section be handled, but it will not match ours. + else if (ch == '[') + { + iReadSection.SetLength(0); + iReadState = EProcessSection; + } + + break; + } + + case EProcessSentence: + { + AppendFieldChar(ch); // calling this don't you end up with a * in the field, does it matter + + if (ch == '*') + { + iReadState = EStartSentence; + HandleSentenceL(); + } + break; + } + } + } + } + + +void CConfigReaderBase::ExtractValueL(const TPtrC8& aField, TInt& aValue) + { + if (aField.Length() != 0) + { + TLex8 lex(aField); + TInt err = lex.Val(aValue); + User::LeaveIfError(err); + } + } + + +void CConfigReaderBase::ExtractValueL(const TPtrC8& aField, TReal32& aValue) + { + TRealX nan; + nan.SetNaN(); + + aValue = nan; + + if (aField.Length() != 0) + { + if (aField.CompareF(KNotANumber)) + { + TLex8 lex(aField); + TInt err = lex.Val(aValue); + User::LeaveIfError(err); + } + } + } + + +void CConfigReaderBase::ExtractValueL(const TPtrC8& aField, TReal64& aValue) + { + TRealX nan; + nan.SetNaN(); + + aValue = nan; + + if (aField.Length() != 0) + { + if (aField.CompareF(KNotANumber)) + { + TLex8 lex(aField); + TInt err = lex.Val(aValue); + User::LeaveIfError(err); + } + } + } + +/* +void CConfigReaderBase::ExtractDegreesL(const TPtrC8& aField, TReal64& aDegrees) + { + TRealX nan; + nan.SetNaN(); + + aDegrees = nan; + + if (aField.Length() != 0) + { + TLex8 lex(aField); + TInt err = lex.Val(aDegrees); + User::LeaveIfError(err); + + ConvertDecimalMinutesToDecimalDegrees(aDegrees); + } + } +*/ + + +void CConfigReaderBase::ProcessL() + { + if (iConfigFileName.Length() == 0) + { + User::LeaveIfError(KErrArgument); + } + + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + RFile iniFile; + + User::LeaveIfError(iniFile.Open(fs, iConfigFileName, EFileRead|EFileShareReadersOnly)); + + CleanupClosePushL(iniFile); + + TBuf8 buf; + + // Loop until EOF. + User::LeaveIfError(iniFile.Read(buf)); + while (buf.Length() > 0) + { + // Process data read from file. + ProcessStringL(buf); + + // Refresh buffer from file. + User::LeaveIfError(iniFile.Read(buf)); + } + + CleanupStack::PopAndDestroy(2, &fs); // iniFile, fs. + } + + + + + + + +/*********************** Update Info Reader ************************/ + +CUpdateConfigReader* CUpdateConfigReader::NewL(const TDesC &aConfigFileName, const TDesC& aConfigSection, RPointerArray& aUpdateArr) + { + return new (ELeave) CUpdateConfigReader(aConfigFileName, aConfigSection, aUpdateArr); + } + + +CUpdateConfigReader::CUpdateConfigReader(const TDesC &aConfigFileName, const TDesC& aConfigSection, RPointerArray& aUpdateArr) : CConfigReaderBase(aConfigFileName, aConfigSection), iUpdateArr(aUpdateArr) + { + } + + +void CUpdateConfigReader::HandleSentenceL() + { + // Not a update sentence, ignore all other valid sentences. + if ( (iNumFields == EUpdateType) || (iFields[EUpdateType].Compare(_L8("update")) != 0) ) + { + return; + } + + // Determine the number of times to repeat the update. + TInt repeat = 1; + + if (iFields[EUpdateRepeat].Length() != 0) + { + ExtractValueL(iFields[1], repeat); + } + + // Determine the number of measurements for each update. + TInt numOfMeasurements = 0; + + if (iFields[ENumOfMeasurements].Length() != 0) + { + ExtractValueL(iFields[ENumOfMeasurements], numOfMeasurements); // make this member, then set up this + error in the default + extract maybe + } + + // Add repeat items to the pos info array. + for (TInt i = 0; i < repeat; i++) + { + TPositionGpsMeasurementInfo measureInfo; + TPositionGpsMeasurementData measureData; + + + // Alloc a update item. + iUpdate = new(ELeave) TLbsModuleUpdateItem(); + + + // Set measurement info. + for (TInt j = 0; j < numOfMeasurements; j++) + { + measureData.SetSatelliteId(j + 1); + measureData.SetCarrierNoiseRatio((j+1) + 1); + measureData.SetDoppler((j+1) + 2); + measureData.SetWholeGpsChips((j+1) + 3); + measureData.SetFractionalGpsChips((j+1) + 4); + measureData.SetMultiPathIndicator(TPositionGpsMeasurementData::EMultiPathLow); + measureData.SetPseudoRangeRmsError((j+1) + 5); + + User::LeaveIfError(measureInfo.AppendMeasurementData(measureData)); + } + measureInfo.SetGpsTimeOfWeek(i + 1000); + iUpdate->SetMeasurement(measureInfo); + + + // Set position update. + // Optional fields are present fill out pos info based on them. + if (iFields[3].Length() != 0) + { + DefaultData(); // This will ensure the pos info items are set to a default value for any incomplete sentences. + ExtractDataL(); + } + + // Otherwise use default values. + else + { + DefaultData(); + } + + + // Optional error value is present. Set update error. + TInt updateErr = KErrNone; + if (iFields[EUpdateErr].Length() != 0) + { + ExtractValueL(iFields[EUpdateErr], updateErr); + } + iUpdate->SetError(updateErr); + + // Optional time delay(could be negative) + TInt updateDelay = 0; + if (iFields[EUpdateDelay].Length() != 0) + { + ExtractValueL(iFields[EUpdateDelay], updateDelay); + } + iUpdate->SetDelay(updateDelay); + + + // Add to array, and reset pointer. + iUpdateArr.AppendL(iUpdate); + iUpdate = NULL; + } + } + + +void CUpdateConfigReader::ExtractDataL() + { + // Access the position info from the update structure. + TPositionSatelliteInfo posInfo = iUpdate->Position(); + TPosition position; + + // Process fields. + TReal64 latitude; + TReal64 longitude; + TReal32 altitude; + TReal32 horzAccuracy; + TReal32 vertAccuracy; + + ExtractValueL(iFields[EPosLatitude], latitude); + ExtractValueL(iFields[EPosLongitude], longitude); + ExtractValueL(iFields[EPosAltitude], altitude); + ExtractValueL(iFields[EPosHorzAccuracy], horzAccuracy); + ExtractValueL(iFields[EPosVertAccuracy], vertAccuracy); + + // Set values. + position.SetCoordinate(latitude, longitude, altitude); + position.SetAccuracy(horzAccuracy, vertAccuracy); + position.SetCurrentTime(); + + posInfo.SetPosition(position); + + iUpdate->SetPosition(posInfo); + } + + +void CUpdateConfigReader::DefaultData() + { + // Access the position info from the update structure. + TPositionSatelliteInfo posSatalliteInfo = iUpdate->Position(); + + + // Fill out default position data. + TPosition position; + + position.SetCoordinate(DEFAULT_NOTIFY_POS_UPDATE_LATITUDE, DEFAULT_NOTIFY_POS_UPDATE_LONGITUDE, DEFAULT_NOTIFY_POS_UPDATE_ALTITUDE); + position.SetAccuracy(DEFAULT_NOTIFY_POS_UPDATE_HORIZONTAL_ACCURACY, DEFAULT_NOTIFY_POS_UPDATE_VERTICAL_ACCURACY); + position.SetCurrentTime(); + + posSatalliteInfo.SetPosition(position); + + + // Fill out default course data. + TCourse course; + + course.SetSpeed(DEFAULT_NOTIFY_POS_UPDATE_SPEED); + course.SetHeading(DEFAULT_NOTIFY_POS_UPDATE_HEADING); + course.SetSpeedAccuracy(DEFAULT_NOTIFY_POS_UPDATE_SPEED_ACCURACY); + course.SetHeadingAccuracy(DEFAULT_NOTIFY_POS_UPDATE_HEADING_ACCURACY); + + posSatalliteInfo.SetCourse(course); + + + // Fill out default satalliteInfo. + TSatelliteData satellite; + + satellite.SetSatelliteId(DEFAULT_NOTIFY_POS_UPDATE_SATELLITE_ID1); + satellite.SetAzimuth(DEFAULT_NOTIFY_POS_UPDATE_AZIMUTH1); + satellite.SetElevation(DEFAULT_NOTIFY_POS_UPDATE_ELEVATION1); + satellite.SetIsUsed(DEFAULT_NOTIFY_POS_UPDATE_IS_USED1); + satellite.SetSignalStrength(DEFAULT_NOTIFY_POS_UPDATE_SIGNAL_STRENGTH1); + + posSatalliteInfo.AppendSatelliteData(satellite); + + satellite.SetSatelliteId(DEFAULT_NOTIFY_POS_UPDATE_SATELLITE_ID2); + satellite.SetAzimuth(DEFAULT_NOTIFY_POS_UPDATE_AZIMUTH2); + satellite.SetElevation(DEFAULT_NOTIFY_POS_UPDATE_ELEVATION2); + satellite.SetIsUsed(DEFAULT_NOTIFY_POS_UPDATE_IS_USED2); + satellite.SetSignalStrength(DEFAULT_NOTIFY_POS_UPDATE_SIGNAL_STRENGTH2); + + posSatalliteInfo.AppendSatelliteData(satellite); + + + iUpdate->SetPosition(posSatalliteInfo); + } + + + + + + +/*********************** Position Info Reader ************************/ + +CPosInfoConfigReader* CPosInfoConfigReader::NewL(const TDesC &aConfigFileName, const TDesC& aConfigSection, RPointerArray& aPosInfoArr) + { + return new (ELeave) CPosInfoConfigReader(aConfigFileName, aConfigSection, aPosInfoArr); + } + + +CPosInfoConfigReader::CPosInfoConfigReader(const TDesC &aConfigFileName, const TDesC& aConfigSection, RPointerArray& aPosInfoArr) : CConfigReaderBase(aConfigFileName, aConfigSection), iPosInfoArr(aPosInfoArr) + { + } + + +void CPosInfoConfigReader::HandleSentenceL() + { + // Not a position info sentence, ignore all other valid sentences. + if ( (iNumFields == 0) || ( + (iFields[0].Compare(_L8("position")) != 0) && + (iFields[0].Compare(_L8("course")) != 0) && + (iFields[0].Compare(_L8("satellite")) != 0) )) + { + return; + } + + // Determine the number of times to repeat the pos info. + TInt repeat = 1; + + if (iFields[1].Length() != 0) + { + ExtractValueL(iFields[1], repeat); + } + + // Add repeat items to the pos info array. + for (TInt i = 0; i < repeat; i++) + { + // Alloc a Satellite type info. + iPosInfo = new(ELeave) TPositionSatelliteInfo(); + + // Optional fields are present fill out pos info based on them. + if (iFields[2].Length() != 0) + { + DefaultData(); // This will ensure the pos info items are set to a default value for any incomplete sentences. + ExtractDataL(); + } + + // Otherwise use default values. + else + { + DefaultData(); + } + + // Add to array, and reset pointer. + User::LeaveIfError(iPosInfoArr.Append(iPosInfo)); + iPosInfo = NULL; + } + } + +// i think we will always have to call default to ensure we set things for missing fields +void CPosInfoConfigReader::ExtractDataL() + { + // TODO: we need to support something like this, ie $position,1,10,2.3* which is lat, long only + // I think it will because extract value deals with empty strings + if (iPosInfo->PositionClassType() & EPositionInfoClass) + { + TPosition position; + TPositionInfo& posInfo = static_cast(*iPosInfo); + + TReal64 latitude; + TReal64 longitude; + TReal32 altitude; + // TODO: TUid datum; + TReal32 horzAccuracy; + TReal32 vertAccuracy; + + ExtractValueL(iFields[EPosLatitude], latitude); + ExtractValueL(iFields[EPosLongitude], longitude); + ExtractValueL(iFields[EPosAltitude], altitude); + // TODO: ExtractUidL() not sure what datum is + ExtractValueL(iFields[EPosHorzAccuracy], horzAccuracy); + ExtractValueL(iFields[EPosVertAccuracy], vertAccuracy); + + position.SetCoordinate(latitude, longitude, altitude); + position.SetAccuracy(horzAccuracy, vertAccuracy); + position.SetCurrentTime(); + + posInfo.SetPosition(position); + } + + if (iPosInfo->PositionClassType() & EPositionCourseInfoClass) + { + TCourse course; + TPositionCourseInfo& posCourseInfo = static_cast(*iPosInfo); + + TReal32 speed; + TReal32 heading; + TReal32 speedAccuracy; + TReal32 headingAccuracy; + + ExtractValueL(iFields[EPosSpeed], speed); + ExtractValueL(iFields[EPosHeading], heading); + ExtractValueL(iFields[EPosSpeedAccuracy], speedAccuracy); + ExtractValueL(iFields[EPosHeadingAccuracy], headingAccuracy); + + course.SetSpeed(speed); + course.SetHeading(heading); + course.SetSpeedAccuracy(speedAccuracy); + course.SetHeadingAccuracy(headingAccuracy); + + posCourseInfo.SetCourse(course); + } + + if (iPosInfo->PositionClassType() & EPositionSatelliteInfoClass) + { + // TODO satellite info + } + } + + +void CPosInfoConfigReader::DefaultData() + { + + if (iPosInfo->PositionClassType() & EPositionInfoClass) + { + TPosition position; + TPositionInfo& posInfo = static_cast(*iPosInfo); + + position.SetCoordinate(DEFAULT_NOTIFY_POS_UPDATE_LATITUDE, DEFAULT_NOTIFY_POS_UPDATE_LONGITUDE, DEFAULT_NOTIFY_POS_UPDATE_ALTITUDE); + position.SetAccuracy(DEFAULT_NOTIFY_POS_UPDATE_HORIZONTAL_ACCURACY, DEFAULT_NOTIFY_POS_UPDATE_VERTICAL_ACCURACY); + position.SetCurrentTime(); + + posInfo.SetPosition(position); + } + + if (iPosInfo->PositionClassType() & EPositionCourseInfoClass) + { + TCourse course; + TPositionCourseInfo& posCourseInfo = static_cast(*iPosInfo); + + course.SetSpeed(DEFAULT_NOTIFY_POS_UPDATE_SPEED); + course.SetHeading(DEFAULT_NOTIFY_POS_UPDATE_HEADING); + course.SetSpeedAccuracy(DEFAULT_NOTIFY_POS_UPDATE_SPEED_ACCURACY); + course.SetHeadingAccuracy(DEFAULT_NOTIFY_POS_UPDATE_HEADING_ACCURACY); + + posCourseInfo.SetCourse(course); + } + + if (iPosInfo->PositionClassType() & EPositionSatelliteInfoClass) + { + TSatelliteData satellite; + TPositionSatelliteInfo& posSatalliteInfo = static_cast(*iPosInfo); + + satellite.SetSatelliteId(DEFAULT_NOTIFY_POS_UPDATE_SATELLITE_ID1); + satellite.SetAzimuth(DEFAULT_NOTIFY_POS_UPDATE_AZIMUTH1); + satellite.SetElevation(DEFAULT_NOTIFY_POS_UPDATE_ELEVATION1); + satellite.SetIsUsed(DEFAULT_NOTIFY_POS_UPDATE_IS_USED1); + satellite.SetSignalStrength(DEFAULT_NOTIFY_POS_UPDATE_SIGNAL_STRENGTH1); + + posSatalliteInfo.AppendSatelliteData(satellite); + + satellite.SetSatelliteId(DEFAULT_NOTIFY_POS_UPDATE_SATELLITE_ID2); + satellite.SetAzimuth(DEFAULT_NOTIFY_POS_UPDATE_AZIMUTH2); + satellite.SetElevation(DEFAULT_NOTIFY_POS_UPDATE_ELEVATION2); + satellite.SetIsUsed(DEFAULT_NOTIFY_POS_UPDATE_IS_USED2); + satellite.SetSignalStrength(DEFAULT_NOTIFY_POS_UPDATE_SIGNAL_STRENGTH2); + + posSatalliteInfo.AppendSatelliteData(satellite); + } + +/* For extended tests when/if we have them. + if (infoBase.PositionClassType() & EPositionClassTestExtension) + { + TExtPosInfo* genInfo = reinterpret_cast(buffer); + + genInfo->iGalaxy = DEFAULT_NOTIFY_POS_UPDATE_EXT_GALAXY; + genInfo->iSolarSystem = DEFAULT_NOTIFY_POS_UPDATE_EXT_SOLARSYS; + genInfo->iStarDate = DEFAULT_NOTIFY_POS_UPDATE_EXT_STARDATE; + } +*/ + } + + +/*********************** Module Status Reader ************************/ + +CModuleStatusConfigReader* CModuleStatusConfigReader::NewL(const TDesC &aConfigFileName, const TDesC& aConfigSection, TPositionModuleStatus& aModuleStatus) + { + return new (ELeave) CModuleStatusConfigReader(aConfigFileName, aConfigSection, aModuleStatus); + } + + +CModuleStatusConfigReader::CModuleStatusConfigReader(const TDesC &aConfigFileName, const TDesC& aConfigSection, TPositionModuleStatus& aModuleStatus) : CConfigReaderBase(aConfigFileName, aConfigSection), iModuleStatus(aModuleStatus) + { + } + + +void CModuleStatusConfigReader::ExtractValueDevice(const TPtrC8& aField, TPositionModuleStatus::TDeviceStatus& aValue) + { + // Set device status. + if (aField.Length() != 0) + { + if (aField.Compare(_L8("device_error")) == 0) + { + aValue = TPositionModuleStatus::EDeviceError; + } + + else if (aField.Compare(_L8("device_disable")) == 0) + { + aValue = TPositionModuleStatus::EDeviceDisabled; + } + + else if (aField.Compare(_L8("device_inactive")) == 0) + { + aValue = TPositionModuleStatus::EDeviceInactive; + } + + else if (aField.Compare(_L8("device_initalising")) == 0) + { + aValue = TPositionModuleStatus::EDeviceInitialising; + } + + else if (aField.Compare(_L8("device_standby")) == 0) + { + aValue = TPositionModuleStatus::EDeviceStandBy; + } + + else if (aField.Compare(_L8("device_ready")) == 0) + { + aValue = TPositionModuleStatus::EDeviceReady; + } + + else if (aField.Compare(_L8("device_active")) == 0) + { + aValue = TPositionModuleStatus::EDeviceActive; + } + } + } + + +void CModuleStatusConfigReader::ExtractValueDataQuality(const TPtrC8& aField, TPositionModuleStatus::TDataQualityStatus& aValue) + { + // Set data quality. + if (aField.Length() != 0) + { + if (aField.Compare(_L8("data_quality_loss")) == 0) + { + aValue = TPositionModuleStatus::EDataQualityLoss; + } + + else if (aField.Compare(_L8("data_quality_partial")) == 0) + { + aValue = TPositionModuleStatus::EDataQualityPartial; + } + + else if (aField.Compare(_L8("data_quality_normal")) == 0) + { + aValue = TPositionModuleStatus::EDataQualityNormal; + } + } + } + + +void CModuleStatusConfigReader::HandleSentenceL() + { + // Not a 'updateoptions' sentence, ignore all other valid sentences. + if ( (iNumFields == 0) || (iFields[EModuleStatusType].Compare(_L8("modstatus")) != 0) ) + { + return; + } + + // Set default values for any fields not present in the sentence. + DefaultData(); + + // Set values from set fields in the sentence. + if (iNumFields == 3) + { + ExtractDataL(); + } + } + + +void CModuleStatusConfigReader::ExtractDataL() + { + + TPositionModuleStatus::TDeviceStatus device; + TPositionModuleStatus::TDataQualityStatus dataQuality; + + ExtractValueDevice(iFields[EModuleStatusDevice], device); + ExtractValueDataQuality(iFields[EModuleStatusDataQuality], dataQuality); + + iModuleStatus.SetDeviceStatus(device); + iModuleStatus.SetDataQualityStatus(dataQuality); + } + + +void CModuleStatusConfigReader::DefaultData() + { + iModuleStatus.SetDeviceStatus(TPositionModuleStatus::EDeviceReady); + iModuleStatus.SetDataQualityStatus(TPositionModuleStatus::EDataQualityNormal); + } + + + + +/*********************** Update Options Reader ************************/ + +CUpdateOptsConfigReader* CUpdateOptsConfigReader::NewL(const TDesC &aConfigFileName, const TDesC& aConfigSection, TPositionUpdateOptions& aUpdateOpts) + { + return new (ELeave) CUpdateOptsConfigReader(aConfigFileName, aConfigSection, aUpdateOpts); + } + + +CUpdateOptsConfigReader::CUpdateOptsConfigReader(const TDesC &aConfigFileName, const TDesC& aConfigSection, TPositionUpdateOptions& aUpdateOpts) : CConfigReaderBase(aConfigFileName, aConfigSection), iUpdateOpts(aUpdateOpts) + { + + } + + +void CUpdateOptsConfigReader::ExtractValueL(const TPtrC8& aField, TTimeIntervalMicroSeconds& aValue) + { + if (aField.Length() != 0) + { + TLex8 lex(aField); + TInt64 value; + TInt err = lex.Val(value); + User::LeaveIfError(err); + aValue = value; + } + } + + +void CUpdateOptsConfigReader::ExtractValue(const TPtrC8& aField, TBool& aValue) + { + aValue = EFalse; + if (aField.Length() != 0) + { + if (aField.Compare(_L8("true")) == 0) + { + aValue = ETrue; + } + } + } + + +void CUpdateOptsConfigReader::HandleSentenceL() + { + // Not a 'updateoptions' sentence, ignore all other valid sentences. + if ( (iNumFields == 0) || (iFields[EUpdateOptsType].Compare(_L8("updateoptions")) != 0) ) + { + return; + } + + // Set default values for any fields not present in the sentence. + DefaultData(); + + // Set values from set fields in the sentence. + if (iNumFields == 5) + { + ExtractDataL(); + } + } + + +void CUpdateOptsConfigReader::ExtractDataL() + { + TTimeIntervalMicroSeconds interval; + TTimeIntervalMicroSeconds timeout; + TTimeIntervalMicroSeconds maxage; + TBool partialUpdates; + + ExtractValueL(iFields[EUpdateOptsInterval], interval); + ExtractValueL(iFields[EUpdateOptsTimeOut], timeout); + ExtractValueL(iFields[EUpdateOptsMaxAge], maxage); + ExtractValue(iFields[EUpdateOptsPartialUpdates], partialUpdates); + + iUpdateOpts.SetUpdateInterval(interval); + iUpdateOpts.SetUpdateTimeOut(timeout); + iUpdateOpts.SetMaxUpdateAge(maxage); + iUpdateOpts.SetAcceptPartialUpdates(partialUpdates); + } + + +void CUpdateOptsConfigReader::DefaultData() + { + iUpdateOpts.SetUpdateInterval(0); + iUpdateOpts.SetUpdateTimeOut(0); + iUpdateOpts.SetMaxUpdateAge(0); + iUpdateOpts.SetAcceptPartialUpdates(EFalse); + } + + + + +CAgpsModuleModesConfigReader* CAgpsModuleModesConfigReader::NewL(const TDesC &aConfigFileName, const TDesC& aConfigSection, + RPointerArray& aModuleModes) + { + return new (ELeave) CAgpsModuleModesConfigReader(aConfigFileName, aConfigSection, aModuleModes); + } +CAgpsModuleModesConfigReader::CAgpsModuleModesConfigReader(const TDesC &aConfigFileName, const TDesC& aConfigSection, + RPointerArray& aModuleModes) + : CConfigReaderBase(aConfigFileName, aConfigSection), iModuleModes(aModuleModes) + { + } + +void CAgpsModuleModesConfigReader::HandleSentenceL() + { + // Not a 'modulemodes' sentence, ignore all other valid sentences. + if ( (iNumFields == 0) || (iFields[EModuleModesType].Compare(_L8("modulemodes")) != 0) ) + { + return; + } + + // Set default values for any fields not present in the sentence. + DefaultData(); + + // Set values from set fields in the sentence. + if (iNumFields > 1) + { + ExtractDataL(); + } + } + +void CAgpsModuleModesConfigReader::DefaultData() +/** + * Does nothing since there is no default data to be set for the expected gps mode + */ + { + } + +void CAgpsModuleModesConfigReader::ExtractDataL() + { + TInt gpsModeInt; + ExtractValueL(iFields[EGpsModeField], gpsModeInt); + CLbsAdmin::TGpsMode gpsMode(static_cast(gpsModeInt)); + + if(iNumFields == EGpsModeField+1) + { // there is no options array + TLbsGpsOptions* gpsOptions = new(ELeave) TLbsGpsOptions; + gpsOptions->SetGpsMode(gpsMode); + iModuleModes.AppendL(gpsOptions); + } + else + { + TLbsGpsOptionsArray* gpsOptionsArray = new(ELeave) TLbsGpsOptionsArray; + gpsOptionsArray->SetGpsMode(gpsMode); + + for(TInt index = EBegginingOfGpsOptionsArray; index < iNumFields; ++index) + { + TLbsGpsOptionsItem optionsItem; + TInt posUpdateTypeInt; + ExtractValueL(iFields[index], posUpdateTypeInt); + TLbsGpsOptionsItem::TPosUpdateType posUpdateType(static_cast(posUpdateTypeInt)); + optionsItem.SetLocUpdateType(posUpdateType); + gpsOptionsArray->AppendOptionItem(optionsItem); + } + + iModuleModes.AppendL(gpsOptionsArray); + } + } + + +CClientDetailsConfigReader* CClientDetailsConfigReader::NewL(const TDesC &aConfigFileName, const TDesC& aConfigSection, + RArray& aClientDetailsArray) + { + return new (ELeave) CClientDetailsConfigReader(aConfigFileName, aConfigSection, aClientDetailsArray); + } +CClientDetailsConfigReader::CClientDetailsConfigReader(const TDesC &aConfigFileName, const TDesC& aConfigSection, + RArray& aClientDetailsArray) + : CConfigReaderBase(aConfigFileName, aConfigSection), + iClientDetailsArray(aClientDetailsArray) + { + } + +void CClientDetailsConfigReader::HandleSentenceL() + { + // Not a 'clientdetails' sentence, ignore all other valid sentences. + if ( (iNumFields == 0) || (iFields[0].Compare(_L8("clientdetails")) != 0) ) + { + return; + } + + ExtractDataL(); + } + +void CClientDetailsConfigReader::DefaultData() +/** + * Does nothing since there is no default data to be set for the expected gps mode + */ + { + } + +void CClientDetailsConfigReader::ExtractDataL() + { + TCTClientDetails clientDetails; + TInt value; + + if(iNumFields > 1) + { // initial delay - after which session ID it should start - default is 0 + ExtractValueL(iFields[1], value); + clientDetails.iSessionIdDelay = value; + } + + if(iNumFields > 2) + { // initial delay - after which step in the session it should start - default is 0 + ExtractValueL(iFields[2], value); + clientDetails.iSessionStepDelay = value; + } + + if(iNumFields > 3) + { // number of NPUDs issued by the client - default is 1 + ExtractValueL(iFields[3], value); + clientDetails.iNumberOfNPUDs = value > 0 ? value : 1; + } + + if(iNumFields > 4) + { // the update interval - default is 0 (no tracking) + ExtractValueL(iFields[4], value); + clientDetails.iUpdateOptions.SetUpdateInterval(value); + } + + if(clientDetails.iNumberOfNPUDs == 1 || clientDetails.iUpdateOptions.UpdateInterval() == 0) + { // if one of the params indicates no tracking then set the others to say the same + clientDetails.iUpdateOptions.SetUpdateInterval(0); + } + + if(iNumFields > 5) + { // the max fix time - default is 0 (no timeout) + ExtractValueL(iFields[5], value); + clientDetails.iUpdateOptions.SetUpdateTimeOut(value); + } + + if(iNumFields > 6) + { // the max update age - default is 0 + ExtractValueL(iFields[6], value); + clientDetails.iUpdateOptions.SetMaxUpdateAge(value); + } + + if(iNumFields > 7) + { // if partial updates should be accepted - default is EFalse + if (iFields[7].Compare(_L8("true")) == 0) + { + clientDetails.iUpdateOptions.SetAcceptPartialUpdates(ETrue); + } + } + + if(iNumFields > 8) + { + { // if partial updates should be accepted - default is EFalse + if (iFields[8].Compare(_L8("cancel")) == 0) + { + clientDetails.iCancelRequest = ETrue; + } + } + } + + if(iNumFields > 9) + { // delay after which step in the session the last request should be cancelled - default is 0 + ExtractValueL(iFields[9], value); + clientDetails.iSessionIdCancel = value; + } + + if(iNumFields > 10) + { // delay after which session ID the last request should be cancelled - default is 0 + ExtractValueL(iFields[10], value); + clientDetails.iSessionStepCancel = value; + } + + iClientDetailsArray.AppendL(clientDetails); + }