diff -r 000000000000 -r 7f656887cf89 libraries/ltkutils/inc/settings.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libraries/ltkutils/inc/settings.h Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,223 @@ +// settings.h +// +// Copyright (c) 2009 - 2010 Accenture. All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the "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: +// Accenture - Initial contribution +// + +#ifndef __SETTINGSEDITOR_H__ +#define __SETTINGSEDITOR_H__ + +#include +#include +#include + +namespace LtkUtils + { + + _LIT(KSettingPanic, "FSHELL_settings"); + enum TSettingPanic + { + EInvalidType, + ENotDefined, + }; + +/** +Class for encapsulating the context of an error within a text file that is being processed. + +Note, the valid lifetime of this class is tied to the lifetime of the decriptor it refers to. +Often, this is a descriptor on the stack and so copies of this class must not be kept. +*/ +class TErrorContext + { +public: + IMPORT_C TErrorContext(); + IMPORT_C TErrorContext(const TDesC& aFilename); + IMPORT_C void NextLine(); + IMPORT_C TInt LineNumber(); + IMPORT_C const TDesC& StringLC(); +private: + const TPtrC iFilename; + TInt iLineNumber; + }; + +class MValueHandler + { +public: + virtual void HandleValueL(const TDesC& aId, const TDesC& aValue, TErrorContext aErrorContext, TBool aOverwrite) = 0; + virtual void HandleCommentL(const TDesC& aComment, TErrorContext aErrorContext) = 0; + }; + +class CIniReader; + +enum TFileNotFoundAction + { + EFailIfFileNotFound, + ESucceedIfFileNotFound, + }; + +IMPORT_C void ReadIniFileL(const TDesC& aFilename, MValueHandler& aValueHandler, TErrorContext aErrorContext = TErrorContext(), TFileNotFoundAction aNotFoundAction = EFailIfFileNotFound); +IMPORT_C void ReadIniFileL(RIoReadHandle& aReadHandle, MValueHandler& aValueHandler); +IMPORT_C void WriteIniFileL(const TDesC& aFilename, CIniReader& aValues); + +class CValue : public CBase + { +public: + IMPORT_C static CValue* NewL(const TDesC& aId, const TDesC& aValue, TErrorContext aErrorContext = TErrorContext()); + IMPORT_C static CValue* NewLC(const TDesC& aId, const TDesC& aValue, TErrorContext aErrorContext = TErrorContext()); + IMPORT_C ~CValue(); + + IMPORT_C const TDesC& Id() const; + IMPORT_C const TDesC& Value() const; + IMPORT_C virtual void SetL(const TDesC& aNewValue, TErrorContext aErrorContext); + IMPORT_C TInt LineNumber() const; + IMPORT_C virtual TInt AsInt(TInt& aInt) const; + IMPORT_C virtual TInt AsBool(TBool& aBool) const; + IMPORT_C TInt AsIntL() const; + IMPORT_C TBool AsBoolL() const; + +protected: + CValue(TErrorContext aErrorContext); + void ConstructL(const TDesC& aId, const TDesC& aValue); +private: + RBuf iId; + RBuf iValue; +protected: + TInt iLineNumber; + }; + +/** +Class for reading an fshell style INI file. This class is intended to be robust, and should always +read the file even if it has errors in it. + +The class CIniFile is more strict and will validate the contents of the file as it is read. +*/ +class CIniReader : public CBase + , public MValueHandler + { +public: + IMPORT_C static CIniReader* NewL(const TDesC& aFilename, TErrorContext aErrorContext = TErrorContext()); + IMPORT_C ~CIniReader(); + + IMPORT_C const TDesC* GetValue(const TDesC& aId) const; + IMPORT_C void GetValuesL(RPointerArray& aValues); + IMPORT_C void GetValuesL(RPointerArray& aValues) const; + IMPORT_C void GetIdsL(RArray& aIds) const; + + IMPORT_C void SetValueL(const TDesC& aId, const TDesC& aValue); + IMPORT_C void RemoveValueL(const TDesC& aId); + + void AppendFirstLineL(IoUtils::CTextFormatter* aFormatter); +protected: // from MValueHandler + virtual void HandleValueL(const TDesC& aId, const TDesC& aValue, TErrorContext aErrorContext, TBool aOverwrite); + virtual void HandleCommentL(const TDesC& aComment, TErrorContext aErrorContext); +protected: + virtual CValue* CreateValueLC(const TDesC& aId, const TDesC& aValue, TErrorContext aErrorContext); + virtual void HandleFirstLineCommentL(const TDesC&, TErrorContext) {}; + virtual TBool IncludeValue(const CValue*) const { return ETrue; } + virtual void DoRemoveL(CValue* aValue); + CIniReader(); +protected: + RPtrHashMap iValues; + RBuf iFirstLineComment; + }; + +enum TSettingType + { + ETypeEnum, + ETypeFilename, + ETypeString, + ETypeInteger, + ETypeBoolean, + }; + +class CSetting : public CValue + { +public: + IMPORT_C static CSetting* NewL(TSettingType aType, const TDesC& aId, const TDesC& aName, const TDesC& aDescription, const TDesC& aDefault = KNullDesC, const TDesC& aEnumValues = KNullDesC, TErrorContext aErrorContext = TErrorContext()); + IMPORT_C static CSetting* NewLC(TSettingType aType, const TDesC& aId, const TDesC& aName, const TDesC& aDescription, const TDesC& aDefault = KNullDesC, const TDesC& aEnumValues = KNullDesC, TErrorContext aErrorContext = TErrorContext()); + IMPORT_C ~CSetting(); + + IMPORT_C virtual void SetL(const TDesC& aNewValue, TErrorContext aErrorContext = TErrorContext()); + IMPORT_C void SetL(TInt aNewValue); + IMPORT_C virtual TInt AsInt(TInt& aInt) const; + IMPORT_C virtual TInt AsBool(TBool& aBool) const; + IMPORT_C TInt AsInt() const; + IMPORT_C TBool AsBool() const; + + IMPORT_C TBool IsSet() const; + IMPORT_C void ClearL(); + + IMPORT_C const TDesC& Name(); + IMPORT_C const TDesC& Description(); +private: + CSetting(TSettingType aType); + void ConstructL(const TDesC& aId, const TDesC& aName, const TDesC& aDescription, const TDesC& aDefault, const TDesC& aEnumValues, TErrorContext aErrorContext = TErrorContext()); + TInt ParseL(const TDesC& aValue, TErrorContext aErrorContext); +private: + const TSettingType iType; + RBuf iName; + RBuf iDescription; + RBuf iDefault; + RBuf iEnumValues; + TInt iIntValue; + TInt iDefaultInt; + TBool iIsSet; + IoUtils::TEnum iEnum; + }; + +/** +Class for validating an fshell style ini file. This class will fail (and reports useful errors) if the +file is corrupt of invalid in any way. The file will be validated using an INI description file (IDF). +*/ +class CIniFile : public CIniReader + { +public: + /** + Read and validate an INI file. + + If an IDF file is given, it will be used to validate the INI file regardless of any #!iniedit + line at the start of the file. Also, if the INI file given does not exist, this function will + still succeed and can then be used to create the INI file by calling WriteIniFileL(). + + If no IDF file is specified here, then an IDF file specified in the #!iniedit comment on the + first line will be used. Note, if the INI file does not exist this function will fail in this + case. + */ + IMPORT_C static CIniFile* NewL(const TDesC& aIniFile, const TDesC& aInfoFile = KNullDesC); + IMPORT_C ~CIniFile(); + IMPORT_C CSetting* GetSetting(const TDesC& aId); + + IMPORT_C const TDesC& GetString(const TDesC& aId); + IMPORT_C TInt GetInt(const TDesC& aId); + IMPORT_C TBool GetBool(const TDesC& aId); + + IMPORT_C void SetL(const TDesC& aId, const TDesC& aString); + IMPORT_C void SetL(const TDesC& aId, TInt aInt); + + IMPORT_C void WriteL(); + +protected:// from CIniReader + virtual CValue* CreateValueLC(const TDesC& aId, const TDesC& aValue, TErrorContext aErrorContext); + virtual void HandleFirstLineCommentL(const TDesC& aComment, TErrorContext aErrorContext); + virtual TBool IncludeValue(const CValue* aValue) const; + virtual void DoRemoveL(CValue* aValue); +protected: // from MValueHandler + virtual void HandleValueL(const TDesC& aId, const TDesC& aValue, TErrorContext aErrorContext, TBool aOverwrite); +private: + CIniFile(); + void ConstructL(const TDesC& aIniFile, const TDesC& aInfoFile); + void ReadInfoFileL(const TDesC& aFileName, TErrorContext aErrorContext); +private: + CIniReader* iInfoFile; + RBuf iFilename; + }; + + } // namespace LtkUtils + +#endif //__SETTINGSEDITOR_H__