email/mail/PluginSrc/MailPlainView/MsgMailViewerHtmlConv.h
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/mail/PluginSrc/MailPlainView/MsgMailViewerHtmlConv.h	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,349 @@
+/*
+* Copyright (c) 2002 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: 
+*     Utility class for HTML converter
+*
+*/
+
+
+#ifndef CMSGMAILVIEWERHTMLCONV_H
+#define CMSGMAILVIEWERHTMLCONV_H
+
+//  INCLUDES
+#include <e32base.h>
+#include <txtrich.h>
+
+// FORWARD DECLARATIONS
+class CMsgBodyControl;
+class CCnvCharacterSetConverter;
+
+// CLASS DECLARATION
+
+/**
+*  Utility class for HTML converter. 
+*  A pair of two strings.
+*/
+class CStringPair : public CBase
+    {
+    public:
+        /**
+        * A constructor.
+        * @param aName a HTML macro, e.g. lt
+        * @param aValue a character that is represented by a macro e.g. <
+        * @return created object.
+        */
+        static CStringPair* NewLC(const TDesC& aName, const TDesC& aValue);
+
+        /**
+        * Destructor
+        */
+        ~CStringPair();
+
+        /**
+        * @return a name of the macro
+        */
+        HBufC* GetName() const;
+        
+        /**
+        * @return a value of the macro
+        */
+        HBufC* GetValue() const;
+        
+        /**
+        * Compares if two pairs are same. Names are compared.
+        * @return as in TBufC::Compare.
+        */
+        static TInt Compare(const CStringPair& aPair1, 
+            const CStringPair& aPair2);
+
+    private:
+        /**
+        * A constructor        
+        */
+        CStringPair();
+
+        /**
+        * A 2nd phase constructor
+        * @param aName a HTML macro, e.g. lt
+        * @param aValue a character that is represented by a macro e.g. <
+        */
+        void ConstructL(const TDesC& aName, const TDesC& aValue);
+
+    private:
+        /// Name of the macro. Owns.
+        HBufC* iName;
+        
+        /// Value of the macro. Owns.
+        HBufC* iValue;
+    };
+
+
+/**
+*  HTML converter.
+*  This class is used in Mail viewer application to convert
+*  messages with HTML-formatting to plain text.
+*/
+class CMsgMailViewerHtmlConv : public CActive
+    {
+    public:  // Constructors and destructor                
+
+        /**
+        * Two-phased constructor.
+        * @param aHandle a handle to HTML-file.
+        * @param aCharset Characterset ID
+        * @param aForced forse converter to use passed Character set id
+        * otherwise converter tries to use character set defined in HTML content
+        * If zero character set id is tried to find out from the HTML content.
+        */            
+        static CMsgMailViewerHtmlConv* NewLC(
+        	RFile& aHandle, TUint aCharset, TBool aForced);
+        static CMsgMailViewerHtmlConv* NewL(
+            RFile& aHandle, TUint aCharset, TBool aForced);
+        
+        /**
+        * Destructor.
+        */
+        virtual ~CMsgMailViewerHtmlConv();
+
+    public: // New functions
+        
+        /**
+        * Removes HTML-tags and replaces macros with real characters.
+        * @return KErrNone if part of the conversion has been successful.
+        * Returns KErrEof when conversion is done.
+        */
+        TInt Convert();
+
+        /**
+        * Removes HTML-tags and replaces macros with real characters.  
+        * Does the conversion asynchronously in low priority.
+        * 
+        * @param aStatus Generic request status.
+        *        KErrNone when the convertion is succesful. 
+        *        Other error codes are used to indicate an error during conversion. 
+        */
+        void Convert( TRequestStatus* aStatus );
+
+        
+        /**
+        * Returns a stripped text.
+        * @return stripped text object.
+        */
+        HBufC* GetText() const;
+
+        /**
+        * Return file id array of inline images.
+        * @return Reference to array.
+        * Ownership is transferred to caller
+        **/
+        RPointerArray<HBufC>* FileIdArray();       
+        /**
+        * Checks if the charset name and identifiers were autoparsed
+        */
+        TBool AutoParsedCharSetNameAndIdentifier() const;
+        
+        /**
+        * Returns the auto parsed charset identifier
+        */
+        TUint AutoParsedCharSetIdentifier() const;    
+
+    private:
+        /**
+        * C++ default constructor.
+        */
+        CMsgMailViewerHtmlConv();
+
+        /**
+        * By default Symbian OS constructor is private.
+        * @param aHandle file handle to HTML content
+        * @param aCharSet characterset id
+        */
+        void ConstructL(RFile& aHandle, TUint aCharSet);
+        
+        /**
+        * Deletes aLen characters beginning from aPos in iStrippedText.
+        * @param aLen how many characters will be deleted.
+        * @return New length of the message.
+        */
+        TInt Delete(const TInt aLen);
+
+        /**
+        * Inserts characters beginning from aPos in iStrippedText.
+        * @param aChars characters to be inserted.
+        * @return New length of the message.
+        */
+        TInt InsertTextL(const TDesC& aChars);
+
+        /**
+        * Replaces macro with real text
+        * @return New length of the message.
+        */
+        TInt ReplaceMacroL();
+
+        /**
+        * Fills a map of macros with name, value pairs.
+        */
+        void InitMacroArrayL();
+
+        /**
+        * Converts unnumbered list to a text.
+        * @param Indentation of the items.
+        * @return New length of the message.
+        */
+        TInt HandleUListL(const TInt aIndent);
+
+        /**
+        * Converts ordinal list to a text.
+        * @param Indentation of the items.
+        * @return New length of the message.
+        */
+        TInt HandleOListL(const TInt aIndent);
+        
+        /**
+        * Converts definition list to a text.
+        * @param Indentation of the items.
+        * @return New length of the message.
+        */
+        TInt HandleDListL(const TInt aIndent);
+
+        /**
+        * Converts lists into a text.
+        * @param aIndent Indentation of the items
+        * @param aNumbered, ETrue if ordinal list, EFalse otherwise
+        * @return New length of the message
+        */
+        TInt HandleListL(const TInt aIndent, const TBool aNumbered);
+
+        /**
+        * Converts HTML tags to plain text.
+        * @param indentation of the lists.
+        * @return New length of the message.
+        */
+        TInt HandleTagL(const TInt aIndent);
+
+        /**
+        * Removes characters from iPos to >-character. Shows an error
+        * and interrupts conversion if it is not found.
+        * @return New length of the message.
+        */
+        TInt RemoveTagL();
+
+        /**
+        * Adds an error message to end of the message 
+        * and shows an information note.
+        */
+        void ShowErrorL();
+
+        /**
+        * Adds a linefeed into a text.
+        */
+        void InsertLinefeedL();
+
+        /**
+        * Performs a character conversion for area started with 
+        * BeginConvertL();
+        */
+        void DoConvertL();
+        
+        /**
+        * Main loop
+        */
+        void DoConversionL();
+
+        /**
+         * Continue asynchronous conversion in next scheduler loop
+         */
+        void ContinueAsyncConvert();
+        
+        
+    protected: // From CActive
+        void RunL();
+        void DoCancel();
+
+        
+    private:    // Data
+        /**
+        * Contains a text read from file which is stripped (Owned).
+        */
+        HBufC *iOrigText;
+
+        /**
+        * A position in text.
+        */
+        TInt iPos;
+
+        /**
+        * An array which contains all HTML macro definitions which
+        * are read from a resource file.
+        */
+        RPointerArray<CStringPair> *iMacros;
+        
+        /**
+        * An array which contains places for line feeds. These will 
+        * be inserted to a RTF object.
+        */
+        RArray<TInt> *iNewLines;
+
+        /**
+        * Status of the conversion
+        */
+        TInt iReturnValue;
+
+        /**
+        * Position where an error occured
+        */
+        TInt iErrorPos;
+
+        /**
+        * Own: Character converter instance.
+        */
+        CCnvCharacterSetConverter* iCharConv;
+
+        /**
+        * State conversion is in.
+        */
+        TInt iConversionState;
+
+        /**
+        * An array containing inline image names
+        */
+        RPointerArray<HBufC>* iFileIdArray;
+
+        /**
+        * Characterset name
+        */
+        HBufC* iCharSetName;
+
+        /**
+        * Characterset id
+        */
+        TUint iCharacterSetId;
+        
+        /**
+        * Status flags
+        */
+        TUint iStatusFlags;
+        
+        /**
+         * Asynchronous convert request status 
+         */
+        TRequestStatus* iReqStatus;
+
+    };
+
+#include "MsgMailViewerHtmlConv.inl" // inline functions
+
+#endif      // CMSGMAILVIEWERHTMLCONV_H
+            
+// End of File