contentctrl_plat/ds_folder_util_api/inc/nsmlfolderparser.h
branchRCL_3
changeset 52 4f0867e42d62
parent 1 95fdac6ccb5c
--- /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 <e32base.h>
+#include <s32strm.h>
+
+// ------------------------------------------------------------------------------------------------
+// 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<HBufC8> CNSmlXValArray;
+// the array used for extension data
+typedef CArrayPtrFlat<CNSmlExtData> 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<KDateTimeLength> DateTimeToStringL( const TTime& aValue ) const;
+	TBuf8<KIntegerMaxLength> 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__