diff -r 6a20128ce557 -r ebfee66fde93 messagingapp/msgutils/unidatautils/unidatamodel/inc/UniSmilModel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgutils/unidatautils/unidatamodel/inc/UniSmilModel.h Fri Jun 04 10:25:39 2010 +0100 @@ -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 + +#include +#include +#include + +// 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 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 + +#endif // __UNISMILMODEL_H