--- a/omads/omadsextensions/dsutils/emailxmlutils/inc/nsmlxmlparser.h Mon Nov 23 14:46:41 2009 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,659 +0,0 @@
-/*
-* 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: Email XML parser
-*
-*/
-
-
-// 1.2 Changes: nsmlxmlparser module added
-
-
-#ifndef __NSMLXMLPARSER_H__
-#define __NSMLXMLPARSER_H__
-
-// ------------------------------------------------------------------------------------------------
-// Includes
-// ------------------------------------------------------------------------------------------------
-#include <e32base.h>
-#include <s32strm.h>
-#include "nsmlEmailmtmdefs.h"
-
-
-// ------------------------------------------------------------------------------------------------
-// Defines for binary size optimization
-// ------------------------------------------------------------------------------------------------
-#define __NO_XML_COMMENTS_
-//#define __NO_EMPTY_ELEMENTS_
-
-
-// ------------------------------------------------------------------------------------------------
-// Class forward declarations
-// ------------------------------------------------------------------------------------------------
-class CNSmlXmlParser;
-class CNSmlExtData;
-
-
-// ------------------------------------------------------------------------------------------------
-// Typedefs
-// ------------------------------------------------------------------------------------------------
-// the array used for xval-values
-typedef CArrayPtrFlat<HBufC8> CNSmlXValArray;
-// the array used for extension data
-typedef CArrayPtrFlat<CNSmlExtData> CNSmlExtDataArray;
-// the array used for truncate info attachments data
-typedef RPointerArray<CNSmlAttachmentTruncateInfo> RNSmlAttachArray;
-// the array used for truncate info body data
-typedef RPointerArray<CNSmlBodyTruncateInfo> RNSmlBodyArray;
-
-
-// ------------------------------------------------------------------------------------------------
-// constants
-// ------------------------------------------------------------------------------------------------
-
-// the maximum length of an integer in characters
-const TInt KIntegerMaxLength = 12;
-
-// the length of a datetime in characters
-const TInt KDateTimeLength = 16;
-
-// the length of element start (<) and end (>)
-const TInt KElementStartEndWidth = 2;
-
-// constants used with files
-const TInt KReadDataLength = 512;
-const TUint KFileReadAccess = EFileRead|EFileShareAny;
-const TUint KFileWriteAccess = EFileWrite|EFileShareExclusive;
-const TInt KMaxEmailItemFileNameLength = 256;
-_LIT(KEmailItemFile, "c:\\system\\temp\\emailitem.txt");
-_LIT(KEmailItemPath, "c:\\system\\temp\\");
-
-const TInt KNSmlEmailItemDrive = EDriveC;
-
-// Whitespace characters
-const TText KWhitespaceEmpty = ' ';
-const TText KWhitespaceLineFeed = '\r';
-const TText KWhitespaceNewLine = '\n';
-const TText KWhitespaceTabular = '\t';
-const TText KWhitespaceLineFeedNewLine = '\r\n';
-
-const TText KCharacterSlash = '/';
-
-// CData
-_LIT8(KCDataStart, "<![CDATA[");
-_LIT8(KCDataEnd, "]]>");
-_LIT8(KCDataInnerEnd, "]]]]>><![CDATA[");
-
-#ifndef __NO_XML_COMMENTS_
-// Xml comments
-_LIT8(KCommentStart, "<!--");
-_LIT8(KCommentEnd, "-->");
-#endif
-
-const TText KElementStart = '<';
-const TText KElementEnd = '>';
-
-// Xml entities
-_LIT8(KEntityLT, "<");
-_LIT8(KEntityGT, ">");
-_LIT8(KEntityAMP, "&");
-_LIT8(KEntityAPOS, "'");
-_LIT8(KEntityQUOT, """);
-
-// special characters
-_LIT8(KLessThan, "<");
-_LIT8(KGreaterThan, ">");
-_LIT8(KAmpersand, "&");
-_LIT8(KApostrophe, "\'");
-_LIT8(KQuotation, "\"");
-
-// boolean string representations
-_LIT8(KStringTrue, "true");
-_LIT8(KStringFalse, "false");
-
-// empty string
-_LIT8(KStringEmpty, "");
-
-// email spesific elements
-_LIT8(KEmailElement, "Email");
-_LIT8(KEmailReadElement, "read");
-_LIT8(KEmailForwardedElement, "forwarded");
-_LIT8(KEmailRepliedElement, "replied");
-_LIT8(KEmailReceivedElement, "received");
-_LIT8(KEmailCreatedElement, "created");
-_LIT8(KEmailModifiedElement, "modified");
-_LIT8(KEmailDeletedElement, "deleted");
-_LIT8(KEmailFlaggedElement, "flagged");
-_LIT8(KEmailItemElement, "emailitem");
-
-// truncated info spesific elements
-_LIT8(KTruncatedElement, "truncated");
-_LIT8(KTruncatedBodyElement, "body");
-_LIT8(KTruncatedAttachElement, "attach");
-_LIT8(KTruncatedSizeElement, "size");
-_LIT8(KTruncatedTypeElement, "type");
-_LIT8(KTruncatedNameElement, "name");
-
-// extension spesific elements
-_LIT8(KExtElement, "Ext");
-_LIT8(KExtXNamElement, "XNam");
-_LIT8(KExtXValElement, "XVal");
-
-// folder spesific elements
-_LIT8(KFolderElement, "Folder");
-_LIT8(KFolderNameElement, "name");
-_LIT8(KFolderCreatedElement, "created");
-_LIT8(KFolderModifiedElement, "modified");
-_LIT8(KFolderAccessedElement, "accessed");
-_LIT8(KFolderAttributesElement, "attributes");
-_LIT8(KFolderRoleElement, "role");
-
-// folder attributes
-_LIT8(KAttributeHiddenElement, "h");
-_LIT8(KAttributeSystemElement, "s");
-_LIT8(KAttributeArchivedElement, "a");
-_LIT8(KAttributeDeleteElement, "d");
-_LIT8(KAttributeWritableElement, "w");
-_LIT8(KAttributeReadableElement, "r");
-_LIT8(KAttributeExecutableElement, "x");
-
-
-// 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
- };
-
-
-// enumeration for boolean values
-enum TNSmlBoolean
- {
- EBooleanMissing = 0, // not included in the xml
- EBooleanTrue,
- EBooleanFalse
- };
-
-
-// extension data (found in both email 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;
- };
-
-
-// truncate info data
-class CNSmlTruncatedData : public CBase
- {
-public:
- IMPORT_C static CNSmlTruncatedData* NewL();
- IMPORT_C static CNSmlTruncatedData* NewLC();
- IMPORT_C virtual ~CNSmlTruncatedData();
-
- IMPORT_C void AddAttachmentL(HBufC8* aName, TInt aSize, HBufC8* aType);
- IMPORT_C void AddBodyL(TInt aSize, HBufC8* aType);
-
- IMPORT_C void GenerateXmlL( TPtr8& aXml, const CNSmlXmlParser* aParser ) const;
- IMPORT_C TInt CountXmlSizeL( const CNSmlXmlParser* aParser ) const;
- IMPORT_C void ConvertIntoEntitiesL( const CNSmlXmlParser* aParser );
-
-private:
- CNSmlTruncatedData();
- void ConstructL();
-
-public:
- RNSmlBodyArray iBodys;
- RNSmlAttachArray iAttachments;
- };
-
-
-// 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;
- };
-
-
-
-// Email parser. Implements the parsing and generating of Email xml.
-class CNSmlEmailParser : public CNSmlXmlParser
- {
-public:
- IMPORT_C static CNSmlEmailParser* NewL();
- IMPORT_C static CNSmlEmailParser* NewLC();
- IMPORT_C virtual ~CNSmlEmailParser();
-
- 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 );
-
- virtual void HandleNextEmailItemDataL( TPtrC8 aData );
- virtual void HandleNextEmailItemStartL() {}; // nothing to do
- virtual void HandleNextEmailItemEndL() {}; // nothing to do
-
- void ConvertIntoEntitiesL();
-
- CNSmlEmailParser();
- void ConstructL();
-
-protected:
-
- // the email elements (states) in the order they appear in DTD
- enum TNSmlCurrentEmailElement
- {
- ENone = 0,
- EEmail,
- ERead,
- EForwarded,
- EReplied,
- EReceived,
- ECreated,
- EModified,
- EDeleted,
- EFlagged,
- EEmailItem,
- ETrunc,
- ETruncBody,
- ETruncBodySize,
- ETruncBodyType,
- ETruncAttach,
- ETruncAttachName,
- ETruncAttachSize,
- ETruncAttachType,
- EExt,
- EExtXNam,
- EExtXVal
- };
-
- // struct used in email parsing to know which members are already set
- struct TNSmlSetEmailValues
- {
- TNSmlSetEmailValues();
- void Reset();
-
- TBool iEmail;
- TBool iRead;
- TBool iForwarded;
- TBool iReplied;
- TBool iDeleted;
- TBool iFlagged;
- TBool iReceived;
- TBool iCreated;
- TBool iModified;
- TBool iEmailItem;
- TBool iTrunc;
- TBool iTruncBodySize;
- TBool iTruncBodyType;
- TBool iTruncAttachSize;
- TBool iTruncAttachType;
- TBool iTruncAttachName;
- TBool iXNam;
- };
-
-private:
- void StartElementStateChangeL( TNSmlCurrentEmailElement aCurrentState, TNSmlCurrentEmailElement aNextState, TBool aIsSet = EFalse );
- void EndElementStateChangeL( TNSmlCurrentEmailElement aCurrentState, TNSmlCurrentEmailElement aNextState );
-
- void GenerateEmailXmlL( HBufC8*& aXml );
-
-public:
-
- /*
- * The values of the data below is treated as follows:
- * When constructing this data from an xml, boolean values
- * are EBooleanTrue, when <field>true</field>, EBooleanFalse
- * when <field>false</field> OR <field/>, and EBooleanMissing
- * when the field is not present in the xml. Datetime values
- * are equal to Time::NullTTime when the field is missing (they should
- * never be empty). Text values (HBufC8*) are NULL when the field is
- * missing, an empty string when <field></field> OR <field/> and the
- * actual value between elements if there is data between those
- * elements. iExt is never NULL, but when iExt->Count()
- * equals to zero, there are no extensions present in the xml.
- *
- * These same rules are used when generating xml from
- * this data object.
- */
-
- TNSmlBoolean iRead;
- TNSmlBoolean iForwarded;
- TNSmlBoolean iReplied;
- TTime iReceived;
- TTime iCreated;
- TTime iModified;
- HBufC8* iEmailItem;
- TNSmlBoolean iDeleted;
- TNSmlBoolean iFlagged;
- CNSmlTruncatedData* iTruncated;
- CNSmlExtDataArray* iExt;
-
-protected:
- TNSmlSetEmailValues iSetValues;
- TNSmlCurrentEmailElement iCurrentState;
- TNSmlCurrentEmailElement iLastState;
-
-private:
-
- TInt iTruncSize;
- HBufC8* iTruncType;
- HBufC8* iTruncName;
- CNSmlExtData* iExtData;
- };
-
-
-
-// ------------------------------------------------------------------------------------------------
-// Parses and generates the xml using files/streams. If emailitem is present, it is
-// stored in a file.
-// ------------------------------------------------------------------------------------------------
-class CNSmlEmailFileParser : public CNSmlEmailParser
- {
-public:
- IMPORT_C static CNSmlEmailFileParser* NewL();
- IMPORT_C static CNSmlEmailFileParser* NewLC();
- IMPORT_C virtual ~CNSmlEmailFileParser();
-
- IMPORT_C virtual TNSmlParserGeneratorError ParseXml( HBufC8* aXml );
- IMPORT_C virtual TNSmlParserGeneratorError ParseXml( RReadStream& aRs );
- IMPORT_C virtual TNSmlParserGeneratorError GenerateXml( HBufC8*& aXml );
- IMPORT_C virtual TNSmlParserGeneratorError GenerateXml( RWriteStream& aWs );
- IMPORT_C virtual TInt CountXmlSizeL();
-
-protected:
- virtual void HandleNextEmailItemDataL( TPtrC8 aData );
- virtual void HandleNextEmailItemStartL();
- virtual void HandleNextEmailItemEndL();
-
-private:
- void ParseFromStreamL( RReadStream& rs );
- void ParsePieceL( TPtrC8& aXml, TBool aLastPiece = EFalse );
- TUint RemoveIncompleteL( HBufC8* aPiece, RReadStream& aStream );
- TUint CheckPiece( const TPtrC8 aEnd ) const;
- void PreProcessPieceL( HBufC8* aXml );
-
- void GenerateEmailXmlL( RWriteStream& aWs );
-
- void ResetParserL();
- void ResetPreProcessor();
-
- HBufC* Buf8ToBuf16( const HBufC8* buf8 ) const;
-
- CNSmlEmailFileParser();
- void ConstructL();
-
-public:
-
- TBool iUseEmailItem; // whether or not emailitem should be used in generation
-
-private:
-
- // xml parsing state
- TBool iReadingElementName;
- TBool iReadingCData;
-#ifndef __NO_XML_COMMENTS_
- TBool iReadingComment;
-#endif
- TBool iReadingEmailItemData;
-
- // pre-processing state
- TInt iCdataStartPos;
- TInt iCdataEndPos;
-
- // file handling
- RFs iRfs;
- RFileWriteStream iWriteStream;
-
- HBufC* iEmailItemFile;
- TBool iFirstPiece;
- TBool iCdataFoundFromFirstPiece;
- };
-
-
-
-
-// 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 // __NSMLXMLPARSER_H__