diff -r 9905f7d46607 -r b63e67867dcd omads/omadsextensions/adapters/sms/inc/vmessageparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/inc/vmessageparser.h Tue Jul 13 03:39:25 2010 +0530 @@ -0,0 +1,352 @@ +/* +* Copyright (c) 2005-2007 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: CVMessageParser header +* +*/ + + +#ifndef VMESSAGEPARSER_H +#define VMESSAGEPARSER_H + +#include "omadsfolderobject.h" + + +// CONSTANTS +_LIT(KVMsgTagBegin, "BEGIN:"); +_LIT(KVMsgTagEnd, "END:"); +_LIT(KVMsgTagStatus, "X-IRMC-STATUS:"); +_LIT(KVMsgTagBox, "X-IRMC-BOX:"); +_LIT(KVMsgTagVersion, "VERSION:"); +_LIT(KVMsgTagName, "N:"); +_LIT(KVMsgTagTelephone, "TEL:"); +_LIT(KVMsgTagDateTime, "X-NOK-DT:"); +_LIT(KVMsgTagDate, "Date:"); +_LIT(KVMsgSectionVMsg, "VMSG"); +_LIT(KVMsgSectionVCard, "VCARD"); +_LIT(KVMsgSectionVEnv, "VENV"); +_LIT(KVMsgSectionVBody, "VBODY"); +_LIT(KVMsgSectionEndVBody, "END:VBODY"); +_LIT(KVMsgLineFeed, "\n"); +_LIT(KDesNoData, ""); +_LIT(KVMsgVersion, "1.1"); +_LIT(KVMsgVCardVersion, "2.1"); +_LIT(KVMsgStatusRead, "READ"); +_LIT(KVMsgStatusUnread, "UNREAD"); +_LIT(KVMsgStatusSent, "SENT"); +_LIT(KVMsgStatusUnsent, "UNSENT"); +_LIT(KFolderInbox, "INBOX"); +_LIT(KFolderOutbox, "OUTBOX"); +_LIT(KFolderDraft, "DRAFT"); +_LIT(KFolderSent, "SENT"); +_LIT(KFolderMyFolders, "MY FOLDERS"); +_LIT(KFolderUnspesified, ""); +const TInt KIndentStepSize = 1; + + +// FORWARD DECLARATIONS +class CRichText; + +// CLASS DECLARATION + +const TInt KNameMaxLength = 32; +const TInt KNumberMaxLength = 48; + +/** +* Class CVMessageParser +* Helper class for converting SMS message information to/from text/x-VMessage. +*/ +class CVMessageParser: public CBase + { +public: // Data types + + struct TTelephoneNumber + { + TBuf iName; + TBuf iNumber; + }; + +public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CVMessageParser* NewL(); + + /** + * Two-phased constructor leaving item to clenup stack + */ + static CVMessageParser* NewLC(); + + /** + * Destructor. + */ + ~CVMessageParser(); + +private: // Private constructors + + /** + * C++ default constructor. + * C++ default constructor can NOT contain any code, that + * might leave. + */ + CVMessageParser(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + +public: // New functions + + /** + * This function decodes received text/x-vMessage and stores the data + * to member variables of this class. + * + * @param aMessage IN: buffer containing received text/x-vMessage + * @return TInt Result, Length of SMS message body or negative error code. + */ + TInt ParseMessageL( const TDesC8& aMessage ); + + /** + * This function constructs a text/x-vMessage based on the data stored + * to member variables of this class. + * + * @param aMessage OUT: dynamic buffer where text/x-vMessage is constructed + */ + void ConstructMessageL( CBufBase& aMessage ); + + /** + * Initialises all variables to with default values + */ + void ResetAll(); + + /** + * Loads message body data to given rich text object + * + * @param aMsgBody where to load the data + */ + void LoadMessageBodyL( CRichText& aMsgBody ); + + /** + * Stores message body data from given rich text object + * + * @param aMsgBody where from store the data + */ + void StoreMessageBodyL( CRichText& aMsgBody ); + + /** + * Parses telephone number and name from the string containing number and possibly contact name + * + * @param aNumberSring IN: String from which to parse the number (like "Abc Pqr <+0123456789>") + * @param aNumberStore OUT: Variable where to store the output data + * @return TBool ETrue if operation was successful + */ + TBool ParseTelephoneNumber(const TDesC& aNumberString, TTelephoneNumber& aNumberStore); + +private: // Internal functions used by ReadMessage() + + /** + * Reads and decodes text/x-VMessage header. + * + * @return TInt KErrNone or negative error code + */ + TInt ReadMessageHeader(); + + /** + * Reads and decodes envelope part of text/x-VMessage header. + * There can be multiple envelopes, which are handled recursively. + * + * @return TInt KErrNone or negative error code + */ + TInt ReadEnvelope(); + + /** + * Reads and parses time stamp field found from vMessage starting from the current read position. + * Note that this field is optional. + * + * @param aTimetstamp IN: Timestamp field found from vMessage + * @param aUniversalTime OUT: Parsed timestand as universal time + * @return TInt KErrNone if operation succeeded + */ + TInt ReadTaggedTimeStamp( TTime& aUniversalTime ); + + /** + * Reads and decodes text/x-VMessage body. + * + * @return TInt Length of message body or negative value in error case + */ + TInt ReadMessageBodyL(); + + /** + * Raeds VCARD section of text/x-vMessage - contains cotact information + * + * @param aResult telephone number and contact name found is stored here + * @return TInt Result + */ + TInt ReadVCard(TTelephoneNumber& aResult); + + /** + * Searches next given message tag with given value from text/x-VMessage + * + * @param aMsgTag IN: Message tag to be found + * @param aValue IN: Expected value of the message tag to be found + * @return TInt Result, Starting point of the message tag. KErrNotFound if not found. + */ + TInt FindMessageTagWithValue( const TDesC& aMsgTag, const TDesC& aValue ); + + /** + * Searches next given message tag from text/x-VMessage and gets it's value + * Value is expected to start from tag and end to newline. + * + * @param aMsgTag IN: Message tag to be found + * @param aValue OUT: Value of the message tag + * @param aMoveReadPosition IN: whether moving start point of seach for the next field forward or not + * @return TInt Result, Starting point of the message tag. KErrNotFound if not found. + */ + TInt GetMessageTagValue( const TDesC& aMsgTag, TDes& aValue, TBool aMoveReadBufPos = ETrue ); + + /** + * Stores a portion of message data from text/x-vMessage to local descriptor varķable. + * Conversion from TDes8 to TDes16 is done and sufficient length of local descriptor + * is checked - no more bytes than maximum length of the descriptor will be copied. + * + * @param aStart IN: Start point of data to be copied in text/x-vMessage + * @param aLength IN: Length of data to be copied + * @param aLocalStore OUT: Place where the data will be copied + */ + void StoreMessageDataField(TInt aStart, TInt aLength, TDes& aLocalStore); + +private: // Internal functions used by WriteMessageL() + + /** + * Writes message properties to text/x-VMessage header. + */ + void WriteMessagePropertiesL(); + + /** + * Writes message VCARD information to text/x-VMessage header. + */ + void WriteMessageVCARDL(const TDesC& aName, const TDesC& aNumber); + + /** + * Writes message envelope information to text/x-VMessage header. + */ + void WriteMessageEnvelopeL(); + + /** + * Writes tagged timestamp field to vMessage in format + * X-NOK-DT:yyyymmddThhmmssZ (universal time format) + * + * @param aUniversalTime IN: Time value to be used + */ + void WriteTaggedTimestampL( TTime aUniversalTime ); + + /** + * Writes message body to text/x-VMessage. + */ + void WriteMessageBodyL(); + + /** + * Writes one line to text/x-vMessage + * + * @param aMsgTag IN: Message tag to use + * @param aMsgTagData IN: Message tag value to use + * @param aIndent IN: Whether indentication is used or not + */ + void WriteMessageLineL( const TDesC& aMsgTag, const TDesC& aMsgTagData, TBool aIndent = EFalse ); + + /** + * Writes given data to text/x-vMessage. + * Size of pre-allocated dynamic buffer is checked and new size allocated if necessary. + * + * @param aDate IN: Data to be written + */ + void WriteToMessageL( const TDesC& aData ); + + /** + * Gets currect indentication level for writing message line. + * + * @param aMsgTag IN: Message tag used in the line + */ + TInt GetIndentLevel( const TDesC& aMsgTag ); + + /** + * Fills fixed size buffer with given data in safe way so that max size will not be exeeded. + * + * @param aData IN: Input data + * @param aBuffer OUT: Buffer to fill + */ + void AssignDataToBuffer( const TDesC& aData, TDes& aBuffer ); + + + + + +public: // Public member variables. Contain text/x-vMessage data. + + + /** + * Actual message body is stored here + */ + HBufC* iMessageBody; + + /** + * Message time stamp in universal time + */ + TTime iUniversalTime; + + /** + * Message time stamp in home time + */ + TTime iHomeTime; + + /** + * Message folder name + */ + TBuf iFolder; + + /** + * Message status + */ + TBuf<8> iStatus; + + /** + * Sender phone number + */ + TTelephoneNumber iSender; + + /** + * Recipient phone numbers + */ + RArray iRecipients; + +private: // Internal member variables + + /** + * Internal variables used for parsing vMessage + */ + TInt iReadBufPosition; + TPtrC iReadBuf; + + /** + * Internal variables used for constructing vMessage + */ + TInt iWriteBufPosition; + TInt iWriteBufSize; + TInt iWriteIndentLevel; + CBufBase* iWriteBuf; + + }; + +#endif // VMESSAGEPARSER_H