messagingappbase/smartmessaging/gmsmodel/inc/gmsModel.h
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/smartmessaging/gmsmodel/inc/gmsModel.h	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,484 @@
+/*
+* 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:  
+*     Picture Message model and converter.
+*
+*/
+
+
+
+#ifndef _GMSMODEL_
+#define _GMSMODEL_
+
+// INCLUDES
+
+#include<e32base.h>
+
+// CONSTANTS
+
+const TInt KGmsMaxPictureWidthPixels  = 72; //this is also in appl. LAF
+const TInt KGmsMaxPictureHeightPixels = 28; //this is also in appl. LAF
+const TInt KGmsMinPictureWidthPixels  = 1;
+const TInt KGmsMinPictureHeightPixels = 1;
+
+// MACROS
+// DATA TYPES
+
+/**
+ * After an import or after setting the text, the model will be in one of the
+ * two modes.
+ */
+enum TGmsMode
+    {
+    EGmsModeUnicode,
+    EGmsModeLatin
+    };
+
+enum TGmsModelPanic
+    {
+    EGmsMPanicNoPicData1,
+    EGmsMPanicNoPicData2,
+    EGmsMPanicNoPictureToExport,
+    EGmsMPanicStreamIsEmpty,
+    EGmsMPanicNotSupported,
+    EGmsNullParameter1,
+    EGmsNoPic1,
+    EGmsNull1,
+    EGmsProblem1,
+    EGmsProblem2
+    };
+
+// FORWARD DECLARATIONS
+
+class RReadStream;
+class RWriteStream;
+class CRichText;
+class RFs;
+
+// CLASS DECLARATION
+
+/**
+ * Class for managing the data of a Picture Message.
+ * It supports message text of type Unicode and ISO-8859-1.
+ * See Smart Messaging Specification 3.0.0 for info on picture messaging.
+ *
+ * Note that the failure (leaving) of the import operation might
+ * put the model in an invalid state. The model should be reset after a
+ * failed import.
+ */
+class CGmsModel : public CBase
+    {
+    public: //construction and destruction
+        /**
+         * Two-phased constructor
+         * @param aFs Reference to an open file session.
+         * @param aLeaveCodeForCorrupt The leave code that is to be used for
+         * signalling about corrupted data when importing. It is kept in
+         * iLeaveCorrupt.
+         * @return The newly created object.
+         */
+        IMPORT_C static CGmsModel* NewL(RFs& aFs, TInt aLeaveCodeForCorrupt);
+
+        /// Destructor
+        IMPORT_C ~CGmsModel();
+
+    public:
+
+        /**
+         * Reads the GMS data from a descriptor, parses it and stores the
+         * parsed data in members. The text and bitmap is extracted at this
+         * stage. The bitmap is validated.
+         * @param aInput The input.
+         * @exception If data is corrupt or picture invalid, leaves with
+         * iLeaveCorrupt.
+         */
+        IMPORT_C void ImportGMSL(const TDesC8& aInput);
+
+        /**
+         * Imports the GMS data from a rich text object, and parses the data.
+         * This is used primarily with rich text obtained from a CMsvStore.
+         * Extracts text and bitmap.
+         * Leaving happens if the extraction fails.
+         * @param aRichText The source of extraction.
+         * @exception If data is corrupt, leaves with iLeaveCorrupt.
+         */
+        IMPORT_C void ImportGMSL(const CRichText& aRichText);
+
+        /**
+         * Returns the GMS message as a HBufC8 which is on the cleanup stack.
+         *
+         * The text part is exported as UCS-2 format if the model is in
+         * Unicode mode. If the model is in Latin mode, the text is exported
+         * Latin text. (see the S.M. specification) You can use the function
+         * IsTextLatin() to find out the current text mode. (the model can
+         * only be in Latin or Unicode mode)
+         *
+         * @return The GMS message in a HBufC8.
+         * @exception Panics if there is no picture data.
+         */
+        IMPORT_C HBufC8* ExportGMS8LC();
+
+        /**
+         * Returns the GMS message as a HBufC16 which is on the cleanup stack.
+         * Each data byte occupies a 16 bit slot.
+         *
+         * The text part is exported as UCS-2 format if the model is in
+         * Unicode mode. If the model is in Latin mode, the text is exported
+         * Latin text. (see the S.M. specification) You can use the function
+         * IsTextLatin() to find out the current text mode. (the model can
+         * only be in Latin or Unicode mode)
+         *
+         * @return The GMS message in a HBufC16.
+         * @exception Panics if there is no picture data.
+         */
+        IMPORT_C HBufC16* ExportGMS16LC();
+
+        /**
+         * Gets text part as a HBufC, which is placed on the cleanup stack.
+         * @return Text part of message as HBufC in cleanup stack.
+         */
+        IMPORT_C HBufC* TextAsHBufC16LC() const;
+
+        /**
+         * Sets the text for this model. It is able to handle Unicode also.
+         * Afterwards you can use the method IsTextLatin() for finding out if
+         * the model is in Unicode mode or Latin mode.
+         * If you set the text again, the earlier text is replaced.
+         * There is no restriction on the length of the text.
+         * @param aSource The source text.
+         */
+        IMPORT_C void SetTextL(const TDesC& aSource);
+
+        /**
+         * Sets the message text with latin type of text.
+         * Note that this function does not check the character set.
+         * It sets the model to Latin mode. The mode can be queried
+         * using IsTextLatin(). (the modes are Latin and Unicode)
+         * If you set the text again, the earlier text is replaced.
+         * There is no restriction on the length of the text.
+         * @param aSource The source text.
+         */
+        IMPORT_C void SetTextLatinL(const TDesC& aSource);
+
+        /**
+         * Sets the message text with Unicode type of text.
+         * There is no restriction on the length of the text.
+         * Note that this function does not check the character set.
+         * It sets the model to Unicode mode. The mode can be queried
+         * using IsTextLatin(). (the modes are Latin and Unicode)
+         * If you set the text again, the earlier text is replaced.
+         * UCS-2 encoding is used, so each char occupies two bytes.
+         * @param aSource The source text.
+         */
+        IMPORT_C void SetTextUnicodeL(const TDesC& aSource);
+
+        /**
+         * Exports only the OTA Bitmap.
+         * @param aOutStream Reference to an output stream which is open.
+         * @exception Panics with EGmsNoPictureToExport if there is no picture
+         * data to export.
+         */
+        IMPORT_C void ExportOTABitmapL(RWriteStream& aOutStream);
+
+        /**
+         * Imports an OTA Bitmap.
+         * Leaves with iLeaveCorrupt if the data is invalid.
+         * If you import again, the earlier data is replaced.
+         *
+         * @param aReadStream Reference to the input stream which is open.
+         * @exception Panics if the stream buffer is empty.
+         */
+        IMPORT_C void ImportOTABitmapL(RReadStream& aReadStream);
+
+        /**
+         * Size of complete message excluding text and pic.
+         * @return Number of bytes.
+         */
+        IMPORT_C TInt SizeOfCompleteMsgExcludingTextAndPic() const;
+
+        /**
+         * Does the converter have text data.
+         * @return ETrue if there is text data.
+         */
+        IMPORT_C TBool HasText() const;
+
+        /**
+         * Is there picture data? Note that the validity of the picture data
+         * is not checked.
+         * @return ETrue if there is picture data.
+         */
+        IMPORT_C TBool HasPicture() const;
+
+        /**
+         * Tells if the text data is of type Latin or Unicode.
+         * @return ETrue if the type of text is Latin, and EFalse if Unicode.
+         */
+        IMPORT_C TBool IsTextLatin() const;
+
+        /**
+         * Returns the total message size but not taking into account the text
+         * size.
+         * @return Message size in bytes.
+         */
+        IMPORT_C TInt TotalSizeExcludingText() const;
+
+        /**
+         * The total size of the message data in bytes.
+         * @return Message size in bytes.
+         */
+        IMPORT_C TInt TotalSize() const;
+
+        /**
+         * Length of the text.
+         * It is not the same thing as size of text. You can use IsTextLatin()
+         * to find out if it is Unicode or Latin.
+         */
+        IMPORT_C TInt Textlength() const;
+
+        /**
+         * Size of picture in bytes.
+         * @return Size of picture in bytes.
+         */
+        IMPORT_C TInt PictureSize() const;
+
+        /// Resets this model.
+        IMPORT_C void Reset();
+
+        /**
+         * Deprecated. Do not use this method.
+         */
+        IMPORT_C TInt _TestingL(TInt aCode1, TInt& aCode2, const TDesC8& aDes1, const TDesC16& aDes2);
+
+        /// Deprecated. Do not use this method.
+        IMPORT_C HBufC* ExtractTextFromMsgLC(const TDesC& aMsg, TInt aAmount);
+
+        /// Deprecated. Do not use this method.
+        IMPORT_C TBool IsPictureValidL();
+
+    public: //not exported
+
+        /**
+         * Imports the OTA Bitmat and validates it. Does not leave if bitmap
+         * is invalid. The validation result is returned by the method.
+         * @param aFileName Source file name.
+         * @return Validation result.
+         */
+        TBool ImportOtaBitmapL(const TDesC& aFileName);
+
+    private: //message data extraction functions
+
+        /**
+         * Checks if version of Picture Message is valid. Leaves with
+         * iLeaveCorrupt if invalid.
+         * This function is the first extraction function called.
+         * @param aInput The source of extraction.
+         * @param aIndex Reference to position of extraction. (not const)
+         * @exception If data is corrupt, leaves with iLeaveCorrupt.
+         */
+        void CheckVersionL(const TDesC8& aInput, TInt& aIndex);
+
+        /**
+         * Extracts a sub item which is either a picture, text or something
+         * unknown: <item>
+         *
+         * @param aInput The source of extraction.
+         * @param aIndex Reference to position of extraction. (not const)
+         * @exception If data is corrupt, leaves with iLeaveCorrupt.
+         */
+        void ExtractGMSSubItemL(
+            const TDesC8& aInput,
+            TInt& aIndex);
+
+        /**
+         * Extracts a sub item which is either a picture, text or something
+         * unknown: <item>
+         *
+         * @param aInput The source of extraction.
+         * @param aIndex Reference to position of extraction. (not const)
+         * @param aSkipBitmap Whether to skip the OTA Bitmap.
+         * @exception If data is corrupt, leaves with iLeaveCorrupt.
+         */
+        void ExtractGMSSubItemL(
+            const TDesC8& aInput,
+            TInt& aIndex,
+            TBool aSkipBitmap);
+
+        /**
+         * Extracts a Latin text entity: <item-length><ISO-8859-1-char>*
+         *
+         * @param aInput The source of extraction.
+         * @param aIndex Reference to position of extraction. (not const)
+         * @exception If data is corrupt, leaves with iLeaveCorrupt.
+         */
+        void ExtractLatin1L(const TDesC8& aInput, TInt& aIndex);
+
+        /**
+         * Extracts a Unicode text entity: <item-length><UNICODE-char>*
+         *
+         * @param aInput The source of extraction.
+         * @param aIndex Reference to position of extraction. (not const)
+         * @exception If data is corrupt, leaves with iLeaveCorrupt.
+         */
+        void ExtractUnicodeL(const TDesC8& aInput, TInt& aIndex);
+
+        /**
+         * Extracts OTA Bitmap data: <OTA-bitmap>
+         * It also checks the OTA Bitmap syntax and leaves if it is bad or too
+         * big.
+         * @param aInput The source of extraction.
+         * @param aIndex Reference to position of extraction. (not const)
+         * @exception If there is less data than what the length field
+         *   specifies, it leaves with iLeaveCorrupt.
+         * @exception Leaves with iLeaveCorrupt in case of syntax error.
+         */
+        void ExtractOTABitmapL(const TDesC8& aInput, TInt& aIndex);
+
+        /**
+         * Skips an entity which is of unknown type.
+         * @param aInput The source of extraction.
+         * @param aIndex Reference to position of extraction. (not const)
+         * @exception If there is less data than what the length field
+         *   specifies, it leaves with iLeaveCorrupt.
+         */
+        void ExtractUnknownL(const TDesC8& aInput, TInt& aIndex);
+
+        /**
+         * Extracts the entity length header: <item-length>
+         * @param aInput The source of extraction.
+         * @param aIndex Reference to position of extraction. (not const)
+         * @exception If data is corrupt, leaves with iLeaveCorrupt.
+         */
+        TInt ExtractLengthL(const TDesC8& aInput, TInt& aIndex);
+
+    private: // other private functions
+
+        /**
+         * Checks if the text contains any Unicode characters.
+         * Unicode line breaks are ignored. They are converted to LF if
+         * exporting in Latin-1 mode.
+         * @param aText The text that is to be scanned.
+         * @return ETrue if text contains Unicode characters.
+         */
+        TBool ContainsUnicodeL(const TDesC& aText) const;
+
+        /**
+         * Appends <version>
+         * @param aGms The descriptor to which the data is appended.
+         */
+        void AppendVersionL(TDes8& aGms);
+
+        /**
+         * Appends "00" <Item-length> <ISO-8859-1-char>*
+         *       | "01" <Item-length> <UNICODE-char>*
+         * @param aGms The descriptor to which the data is appended.
+         */
+        void AppendTextSubItemL(TDes8& aGms);
+
+        /**
+         * Appends "02" <Item-length> <OTA-bitmap>
+         * @param aGms The descriptor to which the data is appended.
+         */
+        void AppendPictureSubItemL(TDes8& aGms);
+
+        /**
+         * Encodes Unicode text into UCS2 and appends it to a descriptor.
+         * @param aGms The descriptor to which the data is appended.
+         * @param aText The Unicode text.
+         */
+        void AppendUCS2TextL(TDes8& aGms, const TDesC& aText);
+
+        /**
+         * Apppends the text to aGms, but replaces Unicode line breaks with
+         * CR.
+         * @param aGms The descriptor to which the data is appended.
+         * @param aText The Latin1 text (which may contain Unicode line
+         * breaks).
+         */
+        void AppendLatin1TextL(TDes8& aGms, const TDesC& aText);
+
+        /**
+         * Checks the OTA syntax and size. It leaves with iLeaveCorrupt in
+         * case the bitmap did not pass the tests.
+         * @param aOta The data that is to be checked.
+         * @return The checked and fixed bitmap.
+         */
+        HBufC8* CheckedAndFixedOtaBitmapL(const TDesC8& aOta) const;
+
+        /**
+         * Checks the OTA syntax and size. Does not leave if the bitmap is
+         * bad. The result is obtained using a TBool reference parameter.
+         * @param aOta The data that is to be checked.
+         * @param aSuccess Reference to a TBool that gets the result of the
+         * validation.
+         * @return The checked and fixed bitmap, or NULL if the validation
+         * failed.
+         */
+        HBufC8* CheckedAndFixedOtaBitmapL(const TDesC8& aOta, TBool& aSuccess) const;
+
+        /**
+         * Panic wrapper.
+         * @param aCode The panic code.
+         */
+        static void Panic(TGmsModelPanic aCode);
+
+    private: // construction related
+
+        /// constructor
+        CGmsModel(RFs& aFs, TInt aLeaveCodeForCorrupt);
+
+        /// Second phase constructor.
+        void ConstructL();
+
+    private: // prohibited
+
+        /// The default constructor is prohibited
+        CGmsModel();
+
+        /// Copy contructor prohibited.
+        CGmsModel(const CGmsModel& aSource);
+
+        /// Assignment operator prohibited.
+        const CGmsModel& operator=(const CGmsModel& aSource);
+
+    private: //data
+
+        /// The message text in Unicode (native Symbian OS) format.
+        HBufC16* iText;
+
+        /**
+         * The OTA Bitmap data.
+         */
+        HBufC8* iOTABitmap;
+
+        /**
+         * Flag which tells if the model is in Latin or Unicode mode
+         * The mode is changed by either using the text setting functions, or
+         * by importing a complete message.
+         */
+        TGmsMode iMode;
+
+        mutable RFs& iFs;
+
+        /**
+         * This leave code is used if the importing fails because of corrupt
+         * data. It is set in the constructor.
+         */
+        const TInt iLeaveCorrupt;
+    };
+
+
+
+#endif // _GMSMODEL_
+
+// end of file