diff -r 8e7494275d3a -r 4f0867e42d62 contentctrl_plat/ds_folder_util_api/inc/nsmlfolderparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentctrl_plat/ds_folder_util_api/inc/nsmlfolderparser.h Wed Sep 01 12:30:02 2010 +0100 @@ -0,0 +1,310 @@ +/* +* Copyright (c) 2004 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: Folder XML parser +* +*/ + + +// 1.2 Changes: nsmlxmlparser module added + + +#ifndef __NSMLFOLDERPARSER_H__ +#define __NSMLFOLDERPARSER_H__ + +// ------------------------------------------------------------------------------------------------ +// Includes +// ------------------------------------------------------------------------------------------------ +#include +#include + +// ------------------------------------------------------------------------------------------------ +// Class forward declarations +// ------------------------------------------------------------------------------------------------ +class CNSmlXmlParser; +class CNSmlExtData; + + +//Constants + +// the maximum length of an integer in characters +const TInt KIntegerMaxLength = 12; + +// the length of a datetime in characters +const TInt KDateTimeLength = 16; + +// ------------------------------------------------------------------------------------------------ +// Typedefs +// ------------------------------------------------------------------------------------------------ +// the array used for xval-values +typedef CArrayPtrFlat CNSmlXValArray; +// the array used for extension data +typedef CArrayPtrFlat CNSmlExtDataArray; + +// enumeration for boolean values +enum TNSmlBoolean + { + EBooleanMissing = 0, // not included in the xml + EBooleanTrue, + EBooleanFalse + }; + +// The error values returned from parser and generator functions +enum TNSmlParserGeneratorError + { + EErrorNone, // no error + EOutOfMemory, // out of memory + EMandatoryFieldNotFound,// XNam inside Ext missing + EInvalidBooleanValue, // Invalid value inside boolean elements + EInvalidIntegerValue, // Invalid value inside integer elements + EInvalidDatetimeValue, // Invalid value inside datetime elements + EInvalidCDataStructure, // CDATA error + EInvalidXmlError, // Xml includes invalid data, i.e. xml generally against dtd + EInvalidFilename, // file was not found or the filename was otherwise erroneous + EUnknownError // Unknown error + }; + +// extension data (found in and folder) +class CNSmlExtData : public CBase + { +public: + IMPORT_C static CNSmlExtData* NewL(); + IMPORT_C static CNSmlExtData* NewLC(); + IMPORT_C virtual ~CNSmlExtData(); + + IMPORT_C void AddXValL( HBufC8* aXVal ); + + IMPORT_C void GenerateXmlL( TPtr8& aXml, const CNSmlXmlParser* aParser ) const; + IMPORT_C TInt CountXmlSize( const CNSmlXmlParser* aParser ) const; + IMPORT_C void ConvertIntoEntitiesL( const CNSmlXmlParser* aParser ); + +private: + CNSmlExtData(); + void ConstructL(); + +public: + HBufC8* iXNam; + CNSmlXValArray* iXVals; + }; + + +// folder attributes +struct TNSmlFolderAttributeData + { + IMPORT_C TNSmlFolderAttributeData(); + + /* + * Returns the count of attributes that are not EBooleanMissing. + */ + IMPORT_C TInt AttributeCount() const; + + IMPORT_C void GenerateXml( TPtr8& aXml, const CNSmlXmlParser* aParser ) const; + IMPORT_C TInt CountXmlSize( const CNSmlXmlParser* aParser ) const; + + TNSmlBoolean iHidden; + TNSmlBoolean iSystem; + TNSmlBoolean iArchived; + TNSmlBoolean iDelete; + TNSmlBoolean iWritable; + TNSmlBoolean iReadable; + TNSmlBoolean iExecutable; + }; + +// Base class for actual parsergenerators. +// Implements basic utilities for parsing and generating the xml. +class CNSmlXmlParser : public CBase + { +public: + /* + * The constructor. + */ + IMPORT_C CNSmlXmlParser(); + + /* + * The destructor. + */ + IMPORT_C virtual ~CNSmlXmlParser(); + + /* + * Parses through the given xml and places the data it contains to + * member variables. Removes all the comments from the original string. + * @param aXml The xml to be parsed. + * @return + */ + virtual TNSmlParserGeneratorError ParseXml( HBufC8* aXml ) =0; + + /* + * Generates xml using the data in member variables of the child class. + * aXml contains the generated xml when method returns successfully. + * Caller should not instantiate + * the buffer, since this method counts the size of the xml and + * instantiates the buffer using the size as its maximum size. + * Caller gets the control of the buffer when method returns. + * @param aXml A pointer to a buffer, which is instantiated in this + * method and contains the xml when method returns succesfully. + * @return + */ + virtual TNSmlParserGeneratorError GenerateXml( HBufC8*& aXml ) =0; + + /* + * Counts the size of the generated xml, when the xml would be generated + * using the data in child class' member variables. + */ + virtual TInt CountXmlSizeL() =0; + + /* utility functions */ + + void PreProcessL( HBufC8* aXml ) const; + + TPtrC8 BooleanToString( const TNSmlBoolean aValue ) const; + TBuf8 DateTimeToStringL( const TTime& aValue ) const; + TBuf8 IntegerToString( const TInt aValue ) const; + + TNSmlBoolean StringToBooleanL( const TPtrC8& aValue ) const; + TInt StringToIntegerL( const TPtrC8& aValue ) const; + // Note: Ignores UTC-times (Z-ending) and treats them as local time! + TTime StringToTTimeL( TPtrC8& aValue ) const; + + void AppendElement( TPtr8& aPtr, const TDesC8& aElementName, const TDesC8& aValue ) const; + void AppendElement( TPtr8& aPtr, const TDesC8& aElementName ) const; + void AppendEndElement( TPtr8& aPtr, const TDesC8& aElementName ) const; + + TInt SizeOfElements( const TDesC8& aElementName ) const; + TInt SizeOfBoolean( const TNSmlBoolean aValue, const TDesC8& aElementName ) const; + TInt SizeOfDatetime( const TDesC8& aElementName ) const; + TInt SizeOfInteger( const TDesC8& aElementName ) const; + TInt SizeOfString( const HBufC8* aValue, const TDesC8& aElementName ) const; + + TInt EntitiesToCharactersL( HBufC8*& aXml, TInt aStartPos, TInt aEndPos ) const; + TInt CharactersToEntitiesL( HBufC8*& aXml, TInt aStartPos, TInt aEndPos ) const; + + TBool IsWhitespace( const TDesC8& aText ) const; + void LeaveIfNotWhiteSpaceL( const TDesC8& aText ) const; + + TNSmlParserGeneratorError CheckError( const TInt error ) const; + +protected: + // parsing methods + void ParseL( TPtrC8& aXml ); + void AddToCompleteL( const TPtrC8 aStr ); + void ResetBufferL( HBufC8*& aBuf ) const; + void AddToBufferL( const TText c, HBufC8*& aBuf ) const; + + virtual void NextElementL( TPtrC8 aElement ) =0; + virtual void NextDataL( TPtrC8 aData ) =0; + +private: + TInt ReplaceL( HBufC8*& aText, const TDesC8& aTarget, const TDesC8& aItem, TInt aStartPos, TInt aEndPos ) const; + void CheckDatetimeErrorL( const TInt error ) const; + +protected: + HBufC8* iBuffer; + HBufC8* iCompleteBuffer; + }; + +// Folder parser. Implements parsing and generating of Folder xml. +class CNSmlFolderParser : public CNSmlXmlParser + { +public: + IMPORT_C static CNSmlFolderParser* NewL(); + IMPORT_C static CNSmlFolderParser* NewLC(); + IMPORT_C virtual ~CNSmlFolderParser(); + + IMPORT_C virtual TNSmlParserGeneratorError ParseXml( HBufC8* aXml ); + IMPORT_C virtual TNSmlParserGeneratorError GenerateXml( HBufC8*& aXml ); + IMPORT_C virtual TInt CountXmlSizeL() ; + + IMPORT_C void AddExtL( CNSmlExtData* aExt ); + +protected: + virtual void NextElementL( TPtrC8 aElement ); + virtual void NextDataL( TPtrC8 aData ); + +protected: + + // the folder elements (states) in the order they appear in DTD + enum TNSmlCurrentFolderElement + { + EFolderNone = 0, + EFolder, + EFolderName, + EFolderCreated, + EFolderModified, + EFolderAccessed, + EAttributes, + EAttributesH, + EAttributesS, + EAttributesA, + EAttributesD, + EAttributesW, + EAttributesR, + EAttributesX, + EFolderRole, + EFolderExt, + EFolderExtXNam, + EFolderExtXVal + }; + + // struct used in folder parsing (which members are already set) + struct TNSmlSetFolderValues + { + TNSmlSetFolderValues(); + void Reset(); + + TBool iFolder; + TBool iName; + TBool iCreated; + TBool iModified; + TBool iAccessed; + TBool iAttributes; + TBool iAttributesH; + TBool iAttributesS; + TBool iAttributesA; + TBool iAttributesD; + TBool iAttributesW; + TBool iAttributesR; + TBool iAttributesX; + TBool iRole; + TBool iXNam; + }; + +private: + void StartElementStateChangeL( TNSmlCurrentFolderElement aCurrentState, TNSmlCurrentFolderElement aNextState, TBool aIsSet = EFalse ); + void EndElementStateChangeL( TNSmlCurrentFolderElement aCurrentState, TNSmlCurrentFolderElement aNextState ); + + void GenerateFolderXmlL( HBufC8*& aXml ); + void ConvertIntoEntitiesL(); + + CNSmlFolderParser(); + void ConstructL(); + +public: + HBufC8* iName; + TTime iCreated; + TTime iModified; + TTime iAccessed; + TNSmlFolderAttributeData iAttributes; + HBufC8* iRole; + CNSmlExtDataArray* iExt; + +private: + TNSmlCurrentFolderElement iCurrentState; + TNSmlCurrentFolderElement iLastState; + TNSmlSetFolderValues iSetValues; + + CNSmlExtData* iExtData; + }; + + + +#endif // __NSMLFOLDERPARSER_H__