lbs/lbstestutils/inc/ctlbsconfigreader.h
branchSymbian2
changeset 1 8758140453c0
child 6 c108117318cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lbs/lbstestutils/inc/ctlbsconfigreader.h	Thu Jan 21 12:53:44 2010 +0000
@@ -0,0 +1,406 @@
+// 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.h
+// This is the header file which contains the ini file configuration reader classes
+// 
+//
+
+#ifndef __CT_LBS_CONFIG_READER_H__
+#define __CT_LBS_CONFIG_READER_H__
+
+
+// Epoc includes
+#include <e32cmn.h>
+
+// LBS includes
+#include <lbs.h>
+#include <lbscommon.h>
+#include <lbspositioninfo.h>
+#include <LbsLocDataSourceGpsBase.h>
+
+// LBS test includes
+#include "tlbsutils.h"
+
+// Forward Declaration
+
+
+
+const TInt KMaxSentence = 200;
+const TInt KMaxFields = 20;
+const TInt KMaxIniFileBuffer = 100;
+const TInt KMaxConfigReaderIniFileName = 100;
+
+class CConfigReaderBase : public CBase
+	{
+public:
+    virtual ~CConfigReaderBase();
+
+	/** Main entry function which reads the ini file, fills out the data items defined in the
+		derived classes. Once NewL as been called to construct the object, this should then be
+		called. */
+	void ProcessL();
+
+protected:
+	/** Converts a string to a TInt value. */
+	void ExtractValueL(const TPtrC8& aField, TInt& aValue);
+	
+	/** Converts a string to a TReal32 value. */
+	void ExtractValueL(const TPtrC8& aField, TReal32& aValue);
+	
+	/** Converts a string to a TReal64 value. */
+	void ExtractValueL(const TPtrC8& aField, TReal64& aValue);
+
+//	void ExtractDegreesL(const TPtrC8& aField, TReal64& aDegrees); this maybe handy so we can have lat, long in degrees not raw real numbers...
+//	void ExtractTimeL(const TPtrC8& aTime, TDateTime& aTheTime);
+//	void ExtractDateL(const TPtrC8& aDate, TDateTime& aTheDate);
+
+//	Derived classes provide the implementation.
+	/** Parses a full sentence read from the ini file. */
+	virtual void HandleSentenceL()=0;
+	
+	/** Fills the data item (detailed in the derived class) with default values. */
+	virtual void DefaultData()=0;
+	
+	/** Fills the data item (detailed in the derived class) with values parsed from the sentence. */
+	virtual void ExtractDataL()=0;
+	
+	CConfigReaderBase(const TDesC &aConfigFileName);
+	
+	CConfigReaderBase(const TDesC& aConfigFileName, const TDesC& aConfigSection);
+	
+private:
+	/** Adds valid sentence character to the field. Once the field delimiter is found the field
+		is appended to the field array. */
+	void AppendFieldChar(TUint aChar);
+	
+	/** Process sentences read from the ini file buffer. A complete valid sentence is passed
+		to HandeSentenceL() to allow the derived class to process the sentence fields into
+		it's data items. */
+	void ProcessStringL(const TDesC8& aData);
+
+private:	
+//	enum TReadState {EWantStart, EWantTerminator};
+
+	enum TReadState {/*	EStart, */
+						EStartSection,
+						EProcessSection,
+						EStartSentence,
+						EProcessSentence,
+						EHalt};
+
+
+	//const TDesC iConfigFileName;	// can we try this, but we will not be able to add the path
+	/** Configuration ini filename to open and read. */
+	TBuf<KMaxConfigReaderIniFileName> iConfigFileName;
+	TBuf<KMaxSentence> iConfigSection;
+	
+	/** State machine variable used while processing a sentence. */
+	TReadState iReadState;
+
+	/** The sentence buffer, to store a valid sentence ready for processing. */
+	TBuf8<KMaxSentence> iSentence;
+	
+
+	TBuf8<KMaxSentence> iReadSection;
+
+protected:
+	/** Field array. Each field is delimited by a ',' or '*' and will be converted into the
+		member variable of the data item defined in the derived class. */
+	TPtrC8 iFields[KMaxFields];
+	
+	/** Number of fields in the field array. */
+	TInt iNumFields;
+	
+	/** Where the field starts in the sentence string. */
+	TInt iFieldStart;
+	
+	/** Length of the field. */
+	TInt iFieldLength;
+	};
+
+
+
+// Default values for TPosition,
+#define DEFAULT_NOTIFY_POS_UPDATE_LATITUDE            49.2
+#define DEFAULT_NOTIFY_POS_UPDATE_LONGITUDE            3.5
+#define DEFAULT_NOTIFY_POS_UPDATE_ALTITUDE            50.0
+#define DEFAULT_NOTIFY_POS_UPDATE_HORIZONTAL_ACCURACY  2.0
+#define DEFAULT_NOTIFY_POS_UPDATE_VERTICAL_ACCURACY    3.0
+
+// TCourse and
+#define DEFAULT_NOTIFY_POS_UPDATE_SPEED             26.66f
+#define DEFAULT_NOTIFY_POS_UPDATE_HEADING           25.0
+#define DEFAULT_NOTIFY_POS_UPDATE_SPEED_ACCURACY    2.0
+#define DEFAULT_NOTIFY_POS_UPDATE_HEADING_ACCURACY  10.0
+
+// TSatelliteData - first satellite
+#define DEFAULT_NOTIFY_POS_UPDATE_SATELLITE_ID1      10
+#define DEFAULT_NOTIFY_POS_UPDATE_AZIMUTH1           50.0
+#define DEFAULT_NOTIFY_POS_UPDATE_ELEVATION1         27.0
+#define DEFAULT_NOTIFY_POS_UPDATE_IS_USED1           ETrue
+#define DEFAULT_NOTIFY_POS_UPDATE_SIGNAL_STRENGTH1   4
+
+// TSatelliteData - second stellite
+#define DEFAULT_NOTIFY_POS_UPDATE_SATELLITE_ID2      11
+#define DEFAULT_NOTIFY_POS_UPDATE_AZIMUTH2           47.0
+#define DEFAULT_NOTIFY_POS_UPDATE_ELEVATION2         30.0
+#define DEFAULT_NOTIFY_POS_UPDATE_IS_USED2           EFalse
+#define DEFAULT_NOTIFY_POS_UPDATE_SIGNAL_STRENGTH2   3
+
+
+
+
+class CUpdateConfigReader : public CConfigReaderBase
+	{
+public:
+
+	enum TUpdateFields
+		{
+		EUpdateType = 0,	// Must be present
+		EUpdateRepeat,
+		ENumOfMeasurements,
+
+		// TCoordinate
+		EPosLatitude,			/** TCoordinate.iLatitude, TReal64 */
+		EPosLongitude,			/** TCoordinate.iLongitude, TReal64 */
+		EPosAltitude,			/** TCoordinate.iAltitude, TReal32 */
+	
+		// TLocalitiy
+		EPosHorzAccuracy,		/** TLocality.iHorizontalAccuracy, TReal32 */
+		EPosVertAccuracy,		/** TLocality.iVerticalAccuracy, TReal32 */
+
+		// Optional
+		EUpdateErr,
+		EUpdateDelay			/** Time to delay, can be negative to force early update */
+	};
+
+
+	static CUpdateConfigReader* NewL(const TDesC &aConfigFileName, const TDesC& aConfigSection, RPointerArray<TLbsModuleUpdateItem>& aUpdateArr);
+
+protected:
+	void HandleSentenceL();
+
+	void DefaultData();
+	void ExtractDataL();
+		
+private:
+	CUpdateConfigReader(const TDesC &aConfigFileName, const TDesC& aConfigSection, RPointerArray<TLbsModuleUpdateItem>& aUpdateArr);
+	void ConstructL();  
+
+	RPointerArray<TLbsModuleUpdateItem>& iUpdateArr;
+	TLbsModuleUpdateItem* iUpdate;
+	};
+
+
+
+
+class CPosInfoConfigReader : public CConfigReaderBase
+	{
+public:
+
+	enum TPosInfoFields
+		{
+		EPosType = 0,	// Must be present
+		EposRepeat,
+
+		// TCoordinate
+		EPosLatitude,			/** TCoordinate.iLatitude, TReal64 */
+		EPosLongitude,			/** TCoordinate.iLongitude, TReal64 */
+		EPosAltitude,			/** TCoordinate.iAltitude, TReal32 */
+		EPosDatum,				/** TCoordinate.iDatum, TUid */
+	
+		// TLocalitiy
+		EPosHorzAccuracy,		/** TLocality.iHorizontalAccuracy, TReal32 */
+		EPosVertAccuracy,		/** TLocality.iVerticalAccuracy, TReal32 */
+	
+		// TPosition
+	//	EPosTime,	/** TPosition.iTime, TTime */	// see comment below
+	
+		// TCourse
+		EPosSpeed,				/** TCourse.iSpeed, TReal32 */
+		EPosHeading,			/** TCourse.iHeading, TReal32 */
+		EPosSpeedAccuracy,		/** TCourse.iSpeedAccuracy, TReal32 */
+		EPosHeadingAccuracy,	/** TCourse.iHeadingAccuracy, TReal32 */
+	};
+
+
+	static CPosInfoConfigReader* NewL(const TDesC &aConfigFileName, const TDesC& aConfigSection, RPointerArray<TAny>& aPosInfoArr);
+
+protected:
+	void HandleSentenceL();
+
+	void DefaultData();
+	void ExtractDataL();
+		
+private:
+	CPosInfoConfigReader(const TDesC &aConfigFileName, const TDesC& aConfigSection, RPointerArray<TAny>& aPosInfoArr);
+	void ConstructL();  
+
+	RPointerArray<TAny>& iPosInfoArr;
+	TPositionInfoBase* iPosInfo;
+	};
+
+
+
+/** CModuleStatusConfigReader is a reader class to process module status sentences.
+	Once processed the aModuleStatus item will be filled with field values held in
+	the sentence.
+	
+	The supported sentence is "modstatus", which MUST start with '$' and end with '*',
+	fields MUST be delimted by ',' and the sentence MUST NOT contain any white space.
+
+	$modstatus,device_field,data_quality_field*
+
+		where device_field is one of
+			device_error
+			device_disable
+			device_inactive
+			device_initialising
+			device_standby
+			device_ready
+			device_active
+
+		where data_quality_field is one of 
+			data_quality_loss
+			data_quality_partial
+			data_quality_normal
+			
+*/
+class CModuleStatusConfigReader : public CConfigReaderBase
+	{
+public:
+
+	enum TModuleStatusFields
+		{
+		EModuleStatusType = 0,	// Must be present, only 1 type 'modstatus'.
+
+		// TPositionModuleStatus fields.
+		EModuleStatusDevice,		/**	TPositionModuleStatus.iDeviceStatus, TDeviceStatus */
+		EModuleStatusDataQuality	/** TPositionModuleStatus.iDataQualityStatus, TDataQualityStatus */
+	};
+
+	static CModuleStatusConfigReader* NewL(const TDesC &aConfigFileName, const TDesC& aConfigSection, TPositionModuleStatus& aModuleStatus);
+
+protected:
+	/** Converts a string to a TPositionModuleStatus::TDeviceStatus enum value. */
+	void ExtractValueDevice(const TPtrC8& aField, TPositionModuleStatus::TDeviceStatus& aValue);
+	
+	/** Converts a string to a TPositionModuleStatus::TDataQualityStatus enum value. */
+	void ExtractValueDataQuality(const TPtrC8& aField, TPositionModuleStatus::TDataQualityStatus& aValue);
+
+	/** See CConfigReaderBase for comments. */
+	void HandleSentenceL();
+	void DefaultData();
+	void ExtractDataL();
+	
+private:
+	CModuleStatusConfigReader(const TDesC &aConfigFileName, const TDesC& aConfigSection, TPositionModuleStatus& aModuleStatus);
+
+	/** Reference to the module status data item to be setup. */
+	TPositionModuleStatus& iModuleStatus;
+	};
+
+
+
+/* and a class reader for module update options
+updateoptions,100,100,100,false
+interval,
+timeout
+maxage
+partialupdates
+*/
+
+class CUpdateOptsConfigReader : public CConfigReaderBase
+	{
+public:
+
+	enum TUpdateOptsFields
+		{
+		EUpdateOptsType = 0,	// Must be present, only 1 type 'updateoptions'
+
+		// TPositionUpdateOptions
+		EUpdateOptsInterval,		/**	TPositionUpdateOptions.iUpdateInterval, TTimeIntervalMicroSeconds */
+		EUpdateOptsTimeOut,			/** TPositionUpdateOptions.iUpdateTimeOut, TTimeIntervalMicroSeconds */
+		EUpdateOptsMaxAge,			/** TPositionUpdateOptions.iMaxUpdateAge, TTimeIntervalMicroSeconds */
+		EUpdateOptsPartialUpdates	/** TBool TPositionUpdateOptions.iAcceptPartialUpdates, TBool */
+	};
+
+
+	static CUpdateOptsConfigReader* NewL(const TDesC &aConfigFileName, const TDesC& aConfigSection, TPositionUpdateOptions& aUpdateOpts);
+
+protected:
+	/** Converts string to a TTimeIntervalMicroSeconds value. */
+	void ExtractValueL(const TPtrC8& aField, TTimeIntervalMicroSeconds& aValue);
+	
+	/** Converts string to a TBool value. */
+	void ExtractValue(const TPtrC8& aField, TBool& aValue);
+
+	void HandleSentenceL();
+
+	void DefaultData();
+	void ExtractDataL();
+	
+private:
+	CUpdateOptsConfigReader(const TDesC &aConfigFileName, const TDesC& aConfigSection, TPositionUpdateOptions& aUpdateOpts);
+
+	TPositionUpdateOptions& iUpdateOpts;
+	};
+
+/*
+ * Class reader for the expected modes in which the module is asked to run
+ */
+class CAgpsModuleModesConfigReader : public CConfigReaderBase
+	{
+private:
+	enum TModuleModesFields
+		{
+		EModuleModesType = 0,			// must be present and needs to be 'modulemodes'
+		EGpsModeField, 					// the GPS mode
+		EBegginingOfGpsOptionsArray		// where the array of gps options items starts
+		};
+public:
+	static CAgpsModuleModesConfigReader* NewL(const TDesC &aConfigFileName, const TDesC& aConfigSection, 
+					RPointerArray<TLbsGpsOptions>& aModuleModes);
+private:
+	CAgpsModuleModesConfigReader(const TDesC &aConfigFileName, const TDesC& aConfigSection, 
+					RPointerArray<TLbsGpsOptions>& aModuleModes);
+	void HandleSentenceL();
+	
+	void DefaultData();
+	void ExtractDataL();
+
+private:
+	RPointerArray<TLbsGpsOptions>& iModuleModes;
+	};
+
+/*
+ * Class reader for details of all clients making requests in a test
+ */
+class CClientDetailsConfigReader : public CConfigReaderBase
+	{
+public:
+	static CClientDetailsConfigReader* NewL(const TDesC &aConfigFileName, const TDesC& aConfigSection, 
+					RArray<TCTClientDetails>& aClientDetailsArray);
+private:
+	CClientDetailsConfigReader(const TDesC &aConfigFileName, const TDesC& aConfigSection, 
+					RArray<TCTClientDetails>& aClientDetailsArray);
+	void HandleSentenceL();
+	
+	void DefaultData();
+	void ExtractDataL();
+
+private:
+	RArray<TCTClientDetails>& iClientDetailsArray;
+	};
+#endif //__CT_LBS_CONFIG_READER_H__