epoc32/include/testconfigfileparser.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@4
     1
/**
williamr@4
     2
 * @file testscripts.h Defines classes for reading a configuration file
williamr@4
     3
 *
williamr@4
     4
 * @note Configuration File Format:
williamr@4
     5
 * 
williamr@4
     6
 * [Defaults]
williamr@4
     7
 * defaults= another_config_file.txt
williamr@4
     8
 *
williamr@4
     9
 * [SectionName]
williamr@4
    10
 * variable= value
williamr@4
    11
 * variable2= value2
williamr@4
    12
 * variable= value3
williamr@4
    13
 *
williamr@4
    14
 * [SectionName2]
williamr@4
    15
 * variable= value
williamr@4
    16
 *
williamr@4
    17
 * endscript
williamr@4
    18
 *
williamr@4
    19
 * 
williamr@4
    20
 * @note Explanation:
williamr@4
    21
 *
williamr@4
    22
 * A configuration file is made up of a number of "sections", each of which can contain a number of "items" (name, value combination).
williamr@4
    23
 * 
williamr@4
    24
 * "Sections" must have a name and be surrounded by square backets, e.g.:
williamr@4
    25
 *
williamr@4
    26
 *      [SectionName]
williamr@4
    27
 *
williamr@4
    28
 *
williamr@4
    29
 * Each "item" consists of consists of a name, followed by an equals sign, followed by blank space, followed by the value to assign to that variable.
williamr@4
    30
 * 
williamr@4
    31
 * The value can be of any length, contain whitespace and span multiple lines. The value ends when the next item or section is found. E.g:
williamr@4
    32
 * 
williamr@4
    33
 * Simple Item:
williamr@4
    34
 *
williamr@4
    35
 *      variable= value
williamr@4
    36
 *
williamr@4
    37
 * Two items on one line:
williamr@4
    38
 *
williamr@4
    39
 *      variable= value variable2= value2
williamr@4
    40
 *
williamr@4
    41
 * Multi-line item:
williamr@4
    42
 *
williamr@4
    43
 *      variable= This variable
williamr@4
    44
 *      spans multiple
williamr@4
    45
 *      lines
williamr@4
    46
 *
williamr@4
    47
 * 
williamr@4
    48
 * @note Parsing stops at End-Of-File or if the tag "endscript" (without the quotes) appears in the file.
williamr@4
    49
 *
williamr@4
    50
 * @note A section may take some default values from another section or config file
williamr@4
    51
 *
williamr@4
    52
 * To specify default values for all sections, add a section at the start of the config file called [Defaults], e.g.:
williamr@4
    53
 *
williamr@4
    54
 *      [Defaults]
williamr@4
    55
 *      sc= +447785016005
williamr@4
    56
 *
williamr@4
    57
 * To read default values from another config file, add an item with name "defaults" and value is the name of the file. E.g.:
williamr@4
    58
 *
williamr@4
    59
 *      defaults= another_config_file.txt
williamr@4
    60
williamr@4
    61
 */
williamr@4
    62
williamr@4
    63
williamr@4
    64
#ifndef __TEST_CONFIG_FILE_PARSER_H__
williamr@4
    65
#define __TEST_CONFIG_FILE_PARSER_H__
williamr@4
    66
williamr@4
    67
#include <e32std.h>
williamr@4
    68
#include <e32base.h>
williamr@4
    69
williamr@4
    70
class CTestConfigSection;
williamr@4
    71
class CTestConfigItem;
williamr@4
    72
class RFs;
williamr@4
    73
class TParse;
williamr@4
    74
class RFile;
williamr@4
    75
williamr@4
    76
_LIT(KScriptPanic, "TEST-SCRIPT");
williamr@4
    77
_LIT(KScriptPathSep,"\\");
williamr@4
    78
_LIT8(KScriptSectionStart, "[");
williamr@4
    79
_LIT8(KScriptSectionEnd, "]");
williamr@4
    80
_LIT8(KScriptCRLF, "\r\n");
williamr@4
    81
_LIT8(KScriptCRLF8, "\r\n");
williamr@4
    82
_LIT8(KScriptLF, "\n");
williamr@4
    83
_LIT8(KScriptCR, "\r");
williamr@4
    84
_LIT8(KScriptItemEnd, "=");
williamr@4
    85
_LIT8(KScriptItemEnd8, "=");
williamr@4
    86
_LIT8(KScriptSpace8, " ");
williamr@4
    87
_LIT8(KScriptDefaults, "Defaults");
williamr@4
    88
_LIT8(KScriptDefault1, "Def");
williamr@4
    89
_LIT8(KScriptDefault2, "Default");
williamr@4
    90
_LIT8(KScriptCommentStart, "#");
williamr@4
    91
const TInt KScriptLFChar = '\n';
williamr@4
    92
const TInt KScriptCRChar = '\r';
williamr@4
    93
williamr@4
    94
class CTestConfig : public CBase
williamr@4
    95
/**
williamr@4
    96
 * @internalComponent
williamr@4
    97
 * @deprecated
williamr@4
    98
 */
williamr@4
    99
	{
williamr@4
   100
	public:
williamr@4
   101
		IMPORT_C static CTestConfig* NewLC(RFs& aFs, const TDesC& aComponent, const TDesC& aScriptFile);
williamr@4
   102
		IMPORT_C static CTestConfig* NewLC(RFs& aFs, const TDesC& aComponent);
williamr@4
   103
		IMPORT_C ~CTestConfig();
williamr@4
   104
williamr@4
   105
		IMPORT_C const TDesC8& ItemValue(const TDesC8& aSection, const TDesC8& aItem, const TDesC8& aDefault) const;
williamr@4
   106
		IMPORT_C TInt ItemValue(const TDesC8& aSection, const TDesC8& aItem, const TInt aDefault) const;
williamr@4
   107
		
williamr@4
   108
		IMPORT_C void ReadScriptL(const TDesC& aScript);
williamr@4
   109
williamr@4
   110
		inline const RPointerArray<CTestConfigSection>& Sections() const;
williamr@4
   111
		inline RPointerArray<CTestConfigSection>& Sections();
williamr@4
   112
williamr@4
   113
		IMPORT_C const CTestConfigSection* Section(const TDesC8& aSectionName) const; //return NULL if section not found
williamr@4
   114
		IMPORT_C CTestConfigSection* Section(const TDesC8& aSectionName); //return NULL if section not found
williamr@4
   115
		inline const CTestConfigSection& operator[](TInt aIndex) const {return *iSections[aIndex];}
williamr@4
   116
		inline CTestConfigSection& operator[](TInt aIndex) {return *iSections[aIndex];}
williamr@4
   117
williamr@4
   118
		IMPORT_C static TInt CountElements(const TDesC8& aInput, TChar aDelimiter);
williamr@4
   119
		IMPORT_C static TInt GetElement(const TDesC8& aInput, TChar aDelimiter, TInt aIndex, TInt& aOutput);
williamr@4
   120
		IMPORT_C static TInt GetElement(const TDesC8& aInput, TChar aDelimiter, TInt aIndex, TPtrC8& aOutput, TBool aTrimOutput = ETrue);
williamr@4
   121
		IMPORT_C static TPtrC8 Trim(const TDesC8& aInput);
williamr@4
   122
		IMPORT_C static TPtrC8 TrimLeft(const TDesC8& aInput);
williamr@4
   123
		IMPORT_C static TPtrC8 TrimRight(const TDesC8& aInput);
williamr@4
   124
williamr@4
   125
		IMPORT_C static HBufC8* ReplaceLC(const TDesC8& aOld, const TDesC8& aNew, const TDesC8& aOldString);
williamr@4
   126
		IMPORT_C static TInt ResolveFile(RFs& aFs, const TDesC& aComponent, const TDesC& aFileName, TParse& aParseOut);
williamr@4
   127
williamr@4
   128
		IMPORT_C void WriteFileL(const TDesC& aFileName);
williamr@4
   129
		IMPORT_C TBool operator==(const CTestConfig& aFile) const;
williamr@4
   130
williamr@4
   131
		IMPORT_C void AddSectionL(CTestConfigSection& aSection);
williamr@4
   132
williamr@4
   133
	protected:
williamr@4
   134
williamr@4
   135
		CTestConfig(RFs& aFs);
williamr@4
   136
		void ConstructL(const TDesC& aComponent);
williamr@4
   137
williamr@4
   138
		TPtrC8 ParseValue(const TDesC8& aText, const TLex8& aInput, TInt aCurrentItemStart) const;
williamr@4
   139
		void ParseAndSetItemValueL(const TDesC8& aText, const TLex8& aInput, TInt aCurrentItemStart, CTestConfigItem*& arCurrentItem);
williamr@4
   140
		void CopyInDefaultsL(CTestConfigSection& aSection, const TDesC& aDefaultFile);
williamr@4
   141
williamr@4
   142
		HBufC8* ReadFileL(const TDesC& aFile) const;
williamr@4
   143
williamr@4
   144
		TBool IsDefaultSection(const TDesC8& aSectionName) const;
williamr@4
   145
		static TInt GetNextElement(TLex8& aInput, TChar aDelimiter, TPtrC8& aOutput);
williamr@4
   146
		TBool IsNewSection(const TDesC8& aSource, const TLex8& aInput) const;
williamr@4
   147
		TBool IsNewItem(const TDesC8& aSource, const TLex8& aLex, TPtrC8& aItem, TInt& aStartOfValue) const;
williamr@4
   148
		TBool IsNewComment(const TDesC8& aSource, const TLex8& aLex) const;
williamr@4
   149
		TBool IsAtStartOfNewLine(const TDesC8& aSource, const TLex8& aLex, TBool aIgnoreSpaces) const;
williamr@4
   150
		void SkipToNextLine(TLex8& aInput) const;
williamr@4
   151
williamr@4
   152
williamr@4
   153
	protected:
williamr@4
   154
williamr@4
   155
		RFs& iFs;
williamr@4
   156
		HBufC* iComponent;
williamr@4
   157
		RPointerArray<CTestConfigSection> iSections;
williamr@4
   158
	};
williamr@4
   159
williamr@4
   160
class CTestConfigSection : public CBase
williamr@4
   161
/**
williamr@4
   162
 * @internalComponent
williamr@4
   163
 * @deprecated
williamr@4
   164
 */
williamr@4
   165
	{
williamr@4
   166
	friend class CTestConfig;
williamr@4
   167
williamr@4
   168
	public:
williamr@4
   169
		IMPORT_C static CTestConfigSection* NewLC(const TDesC8& aSectionName);
williamr@4
   170
		IMPORT_C static CTestConfigSection* NewLC(const TDesC8& aSectionName, CTestConfigSection& aDefaults);
williamr@4
   171
		IMPORT_C ~CTestConfigSection();
williamr@4
   172
		
williamr@4
   173
		inline const TDesC8& SectionName() const;
williamr@4
   174
williamr@4
   175
		IMPORT_C const CTestConfigItem* Item(const TDesC8& aItemTag) const; //return NULL if the item does not exist
williamr@4
   176
		IMPORT_C CTestConfigItem* Item(const TDesC8& aItemTag); //return NULL if the item does not exist
williamr@4
   177
		IMPORT_C const CTestConfigItem* Item(const TDesC8& aItemTag,TInt aIndex) const; //return NULL if the item does not exist
williamr@4
   178
		IMPORT_C CTestConfigItem* Item(const TDesC8& aItemTag,TInt aIndex); //return NULL if the item does not exist
williamr@4
   179
williamr@4
   180
		IMPORT_C const TDesC8& ItemValue(const TDesC8& aItemTag, const TDesC8& aDefault) const;
williamr@4
   181
		IMPORT_C TInt ItemValue(const TDesC8& aItemTag, TInt aDefault) const;
williamr@4
   182
williamr@4
   183
		IMPORT_C CTestConfigItem& AddItemL(const TDesC8& aItemTag, const TDesC8& aValue);
williamr@4
   184
		IMPORT_C void DeleteItemsL(const TDesC8& aItem);
williamr@4
   185
williamr@4
   186
		inline const RPointerArray<CTestConfigItem>& Items() const {return iItems;}
williamr@4
   187
		inline RPointerArray<CTestConfigItem>& Items() {return iItems;}
williamr@4
   188
williamr@4
   189
		IMPORT_C TInt ItemCount(const TDesC8& aItemTag) const;
williamr@4
   190
		IMPORT_C void ItemsL(RPointerArray<CTestConfigItem>& aArray, const TDesC8& aItemTag);
williamr@4
   191
		IMPORT_C void ItemsL(RPointerArray<const CTestConfigItem>& aArray, const TDesC8& aItemTag) const;
williamr@4
   192
williamr@4
   193
		inline const CTestConfigItem& operator[](TInt aIndex) const  {return *iItems[aIndex];}
williamr@4
   194
williamr@4
   195
		inline void SetDefaultsL(const CTestConfigSection& aDefaults);
williamr@4
   196
		inline CTestConfigSection* Defaults() const {return iDefaults;}
williamr@4
   197
williamr@4
   198
		IMPORT_C CTestConfigSection* CopyLC() const;
williamr@4
   199
williamr@4
   200
		void WriteL(RFile& aFile) const;
williamr@4
   201
		TBool operator==(const CTestConfigSection& aFile) const;
williamr@4
   202
williamr@4
   203
	private:
williamr@4
   204
		void ConstructL(const TDesC8& aSectionName);
williamr@4
   205
		CTestConfigSection();
williamr@4
   206
		RPointerArray<CTestConfigItem> iItems;
williamr@4
   207
		HBufC8* iSectionName;
williamr@4
   208
		CTestConfigSection* iDefaults;
williamr@4
   209
	};
williamr@4
   210
williamr@4
   211
class CTestConfigItem : public CBase
williamr@4
   212
/**
williamr@4
   213
 * @internalComponent
williamr@4
   214
 * @deprecated
williamr@4
   215
 */
williamr@4
   216
	{
williamr@4
   217
	friend class CTestConfigSection;
williamr@4
   218
	friend class CTestConfig;
williamr@4
   219
williamr@4
   220
	public:
williamr@4
   221
		IMPORT_C static CTestConfigItem* NewLC(CTestConfigSection& aParent, const TDesC8& aItem, const TDesC8& aValue);
williamr@4
   222
		inline CTestConfigItem* CopyLC() const;
williamr@4
   223
williamr@4
   224
		IMPORT_C ~CTestConfigItem();
williamr@4
   225
		inline const TDesC8& Item() const;
williamr@4
   226
		inline const TDesC8& Value() const;
williamr@4
   227
williamr@4
   228
		void WriteL(RFile& aFile) const;
williamr@4
   229
		TBool operator==(const CTestConfigItem& aItem) const {return Item() == aItem.Item() && Value() == aItem.Value();}
williamr@4
   230
williamr@4
   231
	public:
williamr@4
   232
williamr@4
   233
		CTestConfigSection& iParent;
williamr@4
   234
		
williamr@4
   235
	private:
williamr@4
   236
		CTestConfigItem(CTestConfigSection& aParent);
williamr@4
   237
		void ConstructL(const TDesC8& aItem, const TDesC8& aValue);
williamr@4
   238
		HBufC8* iItem;
williamr@4
   239
		HBufC8* iValue;
williamr@4
   240
	};
williamr@4
   241
williamr@4
   242
#include "testconfigfileparser.inl"
williamr@4
   243
williamr@4
   244
#endif