messagingapp/msgutils/unidatautils/unidatamodel/inc/UniSmilModel.h
changeset 25 84d9eb65b26f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgutils/unidatautils/unidatamodel/inc/UniSmilModel.h	Mon May 03 12:29:07 2010 +0300
@@ -0,0 +1,728 @@
+/*
+* Copyright (c) 2005 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: 
+*       CUniSmilModel, Storage for Smil presentation data.
+*
+*
+*/
+
+
+#ifndef __UNISMILMODEL_H
+#define __UNISMILMODEL_H
+
+// INCLUDES
+#include <cmsvattachment.h>
+
+#include <UniModelConst.h>
+#include <UniObjectList.h>
+#include <UniSmilUtils.h>
+
+// CONSTANTS
+
+// MACROS
+
+// FORWARD DECLARATIONS
+
+class RResourceFile;
+
+class CBaseMtm;
+class CUniSmilSlide;
+class CSmilPresentation;
+class TDataType;
+class CMsvEntrySelection;
+class CUniDataUtils;
+class CUniObject;
+class CUniTextObject;
+class CEikRichTextEditor;
+
+class CMDXMLNode;
+class CMDXMLElement;
+class CUniSmilParams;
+
+// DATA TYPES
+
+typedef CArrayPtrFlat<CUniSmilSlide> CSmilSlideArray;
+
+// FUNCTION PROTOTYPES
+
+// CLASS DECLARATION
+
+/**
+* CUniSmilModel - Representation of SMIL presentation data.
+* Hides SMIL syntax from client.
+*
+* @lib UniDataModel.lib
+* @since 3.1
+*/
+class CUniSmilModel : public CBase
+    {
+    public:  // New methods
+
+        /**
+        * NewLC
+        * Factory method that creates this object.
+        *
+        * @since    3.1
+        * @param    aFs     IN reference to file session
+        * @param    aMtm    IN reference to client mtm
+        * @param    aData   IN reference to MsgData object
+        * @param    aObjectList IN reference to object list
+        * @return   Pointer to instance in cleanup stack
+        */
+        IMPORT_C static CUniSmilModel* NewLC(
+            RFs& aFs,
+            CBaseMtm& aMtm,
+            CUniDataUtils& aData,
+            CUniObjectList& aObjectList );
+
+        /**
+        * NewL
+        * Factory method that creates this object.
+        *
+        * @since    3.1
+        * @param    aFs     IN reference to file session
+        * @param    aMtm    IN reference to client mtm
+        * @param    aData   IN reference to MsgData object
+        * @param    aObjectList IN reference to object list
+        * @return   Pointer to instance
+        */
+        IMPORT_C static CUniSmilModel* NewL(
+            RFs& aFs,
+            CBaseMtm& aMtm,
+            CUniDataUtils& aData,
+            CUniObjectList& aObjectList );
+
+        /**
+        * Destructor
+        *
+        * @since    3.1
+        */
+        virtual ~CUniSmilModel();
+
+        /**
+        * ParseL
+        * Creates presentation from either from DOM (if set) or
+        * from object list (no SMIL used).
+        * Set various flags according to parse results.
+        *
+        * This function should only leave if model cannot be made
+        * because some basic Symbian OS error for example OOM.
+        * This never leaves if there is some kind of mitchmatch between
+        * presentation and actual message ie smil refers to object
+        * that does not exist. This kind of leaves are TRAPPED here
+        * and if they are not the leave should be considered as an
+        * implementation bug in this function.
+        *
+        * @since    3.1
+        * @return   Parse result flags
+        */
+        IMPORT_C TInt ParseL( CMDXMLDocument* aDom );
+
+        /**
+        * SetScreenSize
+        * Sets size of physical dislplay in pixels
+        *
+        * @since    3.1
+        * @param    aScreenSize     IN screen size in pixels
+        */
+        inline void SetScreenSize( const TSize& aScreenSize );
+
+        /*
+        * AddSlideL
+        * Adds slide to model. If aSlideNum is -1 or greater than
+        * current max -> appends. Otherwise adds to given pos.
+        * Zero means first.
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN insert position
+        */
+        IMPORT_C void AddSlideL( TInt aSlideNum = -1 );
+
+        /**
+        * RemoveSlide
+        * Removes slide. Slide must be empty!
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN position of slide to be removed
+        */
+        IMPORT_C void RemoveSlide( TInt aSlideNum );
+
+        /**
+        * MoveSlideL
+        * Moves slide.
+        *
+        * @since    3.1
+        * @param    aSlideToMove IN the original position of slide to be moved
+        * @param    aPlaceToMove IN place where slide is moved to
+        */
+        IMPORT_C void MoveSlideL( TInt aSlideToMove, TInt aPlaceToMove );
+
+        /**
+        * SortSlidesL
+        * Sorts slides accoring to a separate comparison function
+        * called SortSlidesCompare().
+        * Insertion sort algorithm.
+        *
+        * Notice! Intended to be used with SendAs when there
+        * are multiple slides - each slide containing only
+        * one object. (Sorts slides accoring to first object in
+        * the slide.)
+        *
+        * @since    3.1
+        */
+        IMPORT_C void SortSlidesL();
+
+        /*
+        * IsSlide
+        * Check if model contains given slide
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN slide to check
+        * @return   ETrue, if slide exists,
+        *           EFalse, otherwise
+        */
+        IMPORT_C TBool IsSlide( TInt aSlideNum ) const;
+
+        /**
+        * Adds text buffer to model.
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN slide number where text is added
+        * @param    aText   IN text buffer to be added
+        * @return   Pointer to the added text object
+        *           Ownership NOT transferred.
+        */
+        IMPORT_C CUniTextObject* AddTextObjectL(
+            TInt aSlideNum, 
+            CEikRichTextEditor* aText );
+
+        /**
+        * AddObjectL
+        * Adds an object into msg store and smil slide
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN slide number where text is added
+        * @param    aPathToObject   IN file to be added
+        * @return   Pointer to the added object
+        *           Ownership NOT transferred.
+        */
+        IMPORT_C CUniObject* AddObjectL(
+            MUniObjectSaveObserver& aObserver,
+            TInt aSlideNum,
+            CMsgMediaInfo* aMedia );
+
+        /**
+        * AddStoredObjectL
+        * Adds an object that is already in msg store to smil slide
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN slide number where text is added
+        * @param    aAttachmentId   IN file to be added
+        * @param    aMedia      IN media info - ownership transferred to MsgObject
+        * @return   Pointer to the added object
+        *           Ownership NOT transferred.
+        */
+        IMPORT_C CUniObject* AddStoredObjectL(
+            TInt aSlideNum,
+            TMsvAttachmentId aAttachmentId,
+            CMsgMediaInfo* aMedia );
+
+        /**
+        * RemoveObjectL
+        * Deletes an object of certain type from a slide and msg store
+        * if needed (last reference to the object removed).
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN slide number where text is added
+        * @param    aObject     IN the object to be removed
+        * @param    aLeaveToStore IN Do not remove attachment from store
+        *                            USE ONLY AS SECOND ATTEMPT IF REMOVING NORMALLY FAILS
+        */
+        IMPORT_C void RemoveObjectL(
+            TInt aSlideNum,
+            CUniObject* aObject,
+            TBool aLeaveToStore = EFalse);
+
+        /**
+        * RemoveObjectByIndexL
+        * Deletes the N'th object of from a slide and msg store if
+        * needed (last reference to the object removed).
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN slide number
+        * @param    aObjectNum  IN number of the object to be removed
+        */
+        IMPORT_C void RemoveObjectByIndexL(
+            TInt aSlideNum,
+            TInt aObjectNum );
+
+        /**
+        * GetObjectByIndex
+        * Gets object by it's layout position in slide.
+        * E.g. object number "0" is the first in layout.
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN slide number
+        * @param    aObjectNum  IN number of the object
+        * @return   Pointer to the object,
+        *           NULL if not found
+        */
+        IMPORT_C CUniObject* GetObjectByIndex(
+            TInt aSlideNum,
+            TInt aObjectNum ) const;
+
+        /**
+        * GetObject
+        * Gets object of certain type from a slide
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN slide number
+        * @param    aObjectType IN type of the object
+        * @return   Pointer to the object,
+        *           NULL if not found
+        */
+        IMPORT_C CUniObject* GetObject(
+            TInt aSlideNum,
+            TUniRegion aRegion ) const;
+
+        /**
+        * IsObject
+        * Checks if given slide has object of certain type.
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN slide number
+        * @param    aObjectType IN type of the object
+        * @param    aNum    IN the ordinal number of the object
+        * @return   ETrue, slide has object of asked type,
+        *           EFalse, otherwise.
+        */
+        //TBool IsObject(
+        //    TInt aSlideNum,
+        //    TMsgMediaType aObjType ) const;
+
+        /**
+        * SlideCount
+        * Count of slides in SMIL presentation.
+        *
+        * @since    3.1
+        * @return   Number of slides
+        */
+        inline TInt SlideCount() const;
+
+        /**
+        * ObjectCount
+        * Count of media objects in SMIL presentation.
+        * NOTE: Smil attachment is _not_ counted as object.
+        *
+        * @since    3.1
+        * @return   Number of objects
+        */
+        IMPORT_C TInt ObjectCount() const;
+
+        /**
+        * SlideObjectCount
+        * Count of media objects in given slide
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN slide number
+        * @return   Number of objects on the slide
+        */
+        IMPORT_C TInt SlideObjectCount( TInt aSlideNum ) const;
+
+        /**
+        * Layout
+        * Accessor. Queries current layout. Layout is same for all slides.
+        *
+        * @since    3.1
+        * @return   Layout
+        */
+        inline TUniLayout Layout() const;
+
+        /**
+        * SetLayoutL
+        * Mutator. All slides have same layout.
+        * NOTE: This should only be called from editor objectsview
+        * ChangeOrder command. Layout is automatically determined
+        * at parse time.
+        *
+        * @since    3.1
+        * @param    aLayout IN new layout to be set
+        */
+        IMPORT_C void SetLayoutL( TUniLayout aNewLayout ); 
+
+        /**
+        * Returns the (estimate) total size of SMIL.
+        *
+        * @since    3.1
+        * @return   Total size in bytes
+        */
+        IMPORT_C TInt SmilComposeSize();
+
+        /**
+        * SmilComposeSize
+        * Returns the (estimate) size of SMIL from beginning to the
+        * object given as parameter.
+        *
+        * @since    3.1
+        * @param    aToSlideNum     IN calculate till this slide
+        *                              (From "1" to "SlideCount")
+        * @param    aToObjectNum    IN calculate till this object
+        *                              (From "1" to "SlideObjectCount")
+        * @return   Size in bytes
+        */
+        IMPORT_C TInt SmilComposeSize(
+            TInt aToSlideNum,
+            TInt aToObjectNum );
+
+        /**
+        * RemoveEmptySlides
+        * Removes empty all slides from the presentation
+        *
+        * @since    3.1
+        */
+        IMPORT_C void RemoveEmptySlides();
+
+        /**
+        * ComposeL
+        * Composes new SMIL from current model content. SMIL is created as
+        * an attachment to message.
+        * Old SMIL should be deleted before calling this.
+        *
+        * @since    3.1
+        * return    Pointer to new DOM
+        */
+        IMPORT_C CMDXMLDocument* ComposeL();
+
+        /**
+        * ChangeLayoutL
+        * Changes layout of SMIL to match Series 60 created SMIL
+        *
+        * @since 3.1
+        * @param aDom   SMIL DOM to be changed
+        * @return ETrue if layout could be changed
+        *         EFalse if layout couldn't be changed (e.g. missing head or root-region)
+        */
+        IMPORT_C TBool ChangeLayoutL( CMDXMLDocument* aDom );
+        
+        /**
+        * CorrectTimingL
+        * Correct timing of media objects on SMIL if it is invalid.
+        *
+        * @since  3.1
+        * @param  aDom   SMIL DOM
+        * @return ETrue if timing is valid.
+        *         EFalse if timing couldn't be corrected (e.g. missing body)
+        */
+        IMPORT_C TBool CorrectTimingL( CMDXMLDocument* aDom );
+        
+        /**
+        * Determines if given media type can be added to the SMIL model.
+        *
+        * @since 3.1
+        * @param aMediaType Tested media type
+        * @return ETrue if media type can be added to the SMIL model.
+        *         EFalse if media type cannot be added
+        */
+        IMPORT_C TBool IsSupportedMediaType( TMsgMediaType aMediaType ) const;
+        
+        /**
+        * Maximum number of slide in MMS message.
+        *
+        * @return 0 or less if not specified. Otherwise maximum slide limit.
+        */
+        inline TInt MaxSlideCount() const;
+
+        /**
+        * Sets maximum slide limit.
+        *
+        * @param aSlideCount Maximum slide count.
+        */
+        inline void SetMaxSlideCount( TInt aSlideCount );
+
+        /**
+        * Returns whether maximum slide count has been reached.
+        *
+        * @return ETrue if maximum slide count is set and has been reached.
+        *         EFalse otherwise.
+        */
+        inline TBool MaxSlideCountReached() const;
+
+    private:
+
+        /**
+        * Constructor.
+        *
+        * @since    3.1
+        * @param    aFs     IN reference to file session
+        * @param    aMtm    IN reference to client mtm
+        * @param    aData   IN reference to MsgData object
+        * @param    aObjectList IN reference to object list
+        */
+        CUniSmilModel(
+            RFs& aFs,
+            CBaseMtm& aMtm,
+            CUniDataUtils& aData,
+            CUniObjectList& aObjectList );
+
+        /**
+        * 2nd phase constructor.
+        *
+        * @since    3.1
+        */
+        void ConstructL();
+
+        /**
+        * DoPresentationFromDomL
+        * Makes a presentation (model content) from DOM.
+        *
+        * @since    3.1
+        * @return   ETrue, if created successfully,
+        *           EFalse, otherwise
+        */
+        void DoPresentationFromDomL( CMDXMLDocument* aDom );
+
+        /**
+        * IsMessageSlide
+        * Check if messages attachments fit into slide (no smil case)
+        *
+        * @since    3.1
+        * @return   ETrue, if all objects fit into slide,
+        *           EFalse, otherwise
+        */
+        TBool IsMessageSlide();
+
+        /**
+        * DoNoSmilOneSlide
+        * Makes presentation (max one slide) from object list. Message
+        * may contain SMIL, but when calling this function it should be
+        * clear that model cannot be made as SMIL describes.
+        *
+        * @since    3.1
+        */
+        void DoNoSmilOneSlideL();
+
+        /**
+        * DoNoSmilManySlide
+        * Makes presentation from object list. Message may contain SMIL,
+        * but when calling this function it should be clear that model cannot
+        * be made as SMIL describes.
+        *
+        * @since    3.1
+        */
+        void DoNoSmilManySlideL();
+
+        /**
+        * AddSlideFromDomL
+        * Used when creating presentation from SMIL
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN slide number
+        * @param    aObj    IN object to be added
+        * @return   ETrue, object added successfully,
+        *           EFalse, otherwise
+        */
+        void AddSlideFromDomL( CMDXMLNode* aPage );
+
+        /**
+        * AddObjectFromDomL
+        * Used when creating presentation from SMIL
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN slide number
+        * @param    aObj    IN object to be added
+        */
+        void AddObjectFromDomL(
+            CUniSmilSlide* aSlide,
+            CUniObject* aObj,
+            TUniRegion aRegion );
+
+        /**
+        * Reset
+        * Clears flag & empties slide & object arrays.
+        * NOTE: Mtm pointer is not reseted.
+        *
+        * @since    3.1
+        */
+        void Reset();
+
+        /**
+        * CreateItemL
+        * Sub function for ComposeL
+        *
+        * @since    3.1
+        * @param    aRoot   IN parent element for the new element(s)
+        * @param    aObj    IN object to be added
+        */
+        TInt CreateItemL( CMDXMLDocument* aDom, CMDXMLElement* aRoot, CUniObject* aObj );
+
+        /**
+        * CreateParL
+        * Sub function for ComposeL
+        *
+        * @since    3.1
+        * @param    aRoot   IN parent element for the new element(s)
+        * @param    aSlide  IN slide number
+        */
+        void CreateParL( CMDXMLDocument* aDom, CMDXMLElement* aRoot, TInt aSlide );
+
+        /**
+        * CreateBodyL
+        * Sub function for ComposeL
+        *
+        * @since    3.1
+        * @param    aRoot   IN parent element for the new element(s)
+        */
+        void CreateBodyL( CMDXMLDocument* aDom, CMDXMLElement* aRoot );
+
+        /**
+        * CreateLayoutL
+        * Sub function for ComposeL
+        *
+        * @since    3.1
+        * @param    aRoot        IN parent element for the new element(s)
+        * @param    aRootLayout  IN root-layout element
+        * @param    aLayout      IN layout element
+        * @param    aTextRegion  IN text region element
+        * @param    aImageRegion IN image region element
+        */
+        void CreateLayoutL(
+            CMDXMLDocument* aDom,
+            CMDXMLElement* aRoot,
+            CMDXMLElement* aRootLayout = NULL,
+            CMDXMLElement* aLayout = NULL,
+            CMDXMLElement* aTextRegion = NULL,
+            CMDXMLElement* aImageRegion = NULL );
+
+        /**
+        * CreateHeadL
+        * Sub function for ComposeL
+        *
+        * @since    3.1
+        * @param    aRoot   IN parent element for the new element(s)
+        */
+        void CreateHeadL( CMDXMLDocument* aDom, CMDXMLElement* aRoot );
+
+        /**
+        * DoRemoveObjectL
+        * Deletes object from slide and msg store if needed.
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN slide number where text is added
+        * @param    aObjectType IN type of the object to be removed
+        */
+        void DoRemoveObjectL( TInt aSlideNum,
+                              CUniObject* aObject,
+                              TBool aLeaveToStore = EFalse );
+
+        /**
+        * Adds slide. Appends if slidenum greater than current max,
+        * otherwise inserts.
+        *
+        * @since    3.1
+        * @param    aSlideNum   IN insert position
+        */
+        CUniSmilSlide* DoAddSlideL( TInt aSlideNum = -1 );
+
+        /**
+        * SortSlidesCompare
+        * Compares slides according to time. Most recent is greatest.
+        * Empty slides are greater than non-empty slides.
+        *
+        * @since    3.1
+        * @param    aSlide1     IN slide to compare
+        * @param    aSlide2     IN slide to compare
+        * @return If aSlide1 "is greater than" aSlide2 returns positive value.
+        *         If aSlide1 "is smaller than" aSlide2 returns negative value.
+        *         If aSlide1 and aSlide2 "are equal" returns zero.
+        */
+        TInt SortSlidesCompare( CUniSmilSlide* aSlide1, CUniSmilSlide* aSlide2 );
+
+        /**
+        * Gets the layout of MMS SMIL document.
+        * Assumes that the document is valid MMS SMIL.
+
+        * @since 3.1
+        * @param    aDom    Root node of the document tree.
+        * @return           Layout of the document.
+        */
+        TUniLayout GetMmsSmilLayout( CMDXMLDocument* aDom );
+
+        /**
+        * Gets the first element of given name from the SMIL document.
+        *
+        * @since 3.1
+        * @param    aDom    Root node of the document tree.
+        * @param    aName   The name of the node to be searched.
+        * @return           Pointer to the element node.
+        *                   If element not found returns NULL.
+        */
+        CMDXMLNode* GetNode( CMDXMLDocument* aDom, const TDesC& aName );
+
+        void GetMediaElemRegionIDs( CMDXMLNode* aPage );
+
+        void GetAllMediaElemRegionIDs( CMDXMLNode* aPage );
+
+        void GetLayoutElements(
+            CMDXMLNode* aLayout,
+            CMDXMLElement*& aRlEle,
+            CMDXMLElement*& aTxtEle,
+            CMDXMLElement*& aImgEle );
+
+        void GetRootLayoutSize( CMDXMLElement* aRl, TSize& aSize );
+
+        void GetRegionRect( CMDXMLElement* aRegion, TSize aRoot, TRect& aRect );
+
+        TUniRegion GetRegionType( CMDXMLNode* aNodePtr );
+
+        void RemoveMetaTagsAndComments( CMDXMLDocument* aDom );
+
+        /**
+        * CorrectSlideTimingL
+        *
+        * @since    3.1
+        */
+        void CorrectSlideTimingL( CMDXMLElement* aPage );
+
+        /**
+        * TimingSpecified
+        *
+        * @since    3.1
+        */
+        TBool TimingSpecified( CMDXMLElement* aNodePrt );
+
+    private: // data
+
+        RFs&                iFs;
+        CBaseMtm&      iMtm;
+        CUniDataUtils&           iData;
+        CUniObjectList&     iObjectList;
+
+        TUniLayout iSlideLayout; // Defines order of objects in display for slides.
+
+        CSmilSlideArray*    iSlideArray;    // Holds slides
+        TInt                iParseResult;
+        CUniSmilParams*     iSmilParams;
+        TSize               iScreenSize;
+        TBool               iSizeEstimateUpToDate;
+        TInt                iSizeEstimate;
+
+        TPtrC               iTextRegionId;
+        TPtrC               iImageRegionId;
+        TInt                iMaxSlideCount;
+    };
+
+
+#include <UniSmilModel.inl>
+
+#endif // __UNISMILMODEL_H