mobilemessaging/unieditor/model/src/UniSmilModel.cpp
changeset 0 72b543305e3a
equal deleted inserted replaced
-1:000000000000 0:72b543305e3a
       
     1 /*
       
     2 * Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  
       
    15 *       CUniSmilModel, Storage for Smil presentation data.
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 
       
    21 // ========== INCLUDE FILES ================================
       
    22 
       
    23 
       
    24 #include <e32def.h>
       
    25 #include <eikenv.h>
       
    26 #include <eikfutil.h>               // CopyFile
       
    27 
       
    28 #include <mtclbase.h>   // for CBaseMtm
       
    29 #include <msvstd.h>     // for TMsvId
       
    30 #include <msvids.h>     // for KMsvTempIndexEntryId
       
    31 #include <msvstore.h>
       
    32 #include <mmsvattachmentmanager.h>
       
    33 #include <mmsvattachmentmanagersync.h>
       
    34 #include <cmsvattachment.h>
       
    35 
       
    36 #include <bautils.h>                // NearestLanguageFile
       
    37 
       
    38 #include <coemain.h>
       
    39 
       
    40 #include <MuiuMsvUiServiceUtilities.h>  //Disk space check
       
    41 
       
    42 // LAF
       
    43 #include <AknUtils.h>
       
    44 #include <aknlayoutscalable_avkon.cdl.h>
       
    45 #include <aknlayoutscalable_apps.cdl.h>
       
    46 #include <layoutmetadata.cdl.h>
       
    47 
       
    48 // DOM
       
    49 #include <gmxmldocument.h>
       
    50 #include <gmxmlnode.h>
       
    51 #include <gmxmlelement.h>
       
    52 
       
    53 // MsgMedia
       
    54 #include <MsgMedia.hrh>
       
    55 #include <MsgMediaInfo.h>
       
    56 #include <MmsConformance.h>
       
    57 #include <mmsversion.h>
       
    58 #include <MsgTextInfo.h>
       
    59 #include <MsgMimeTypes.h>
       
    60 
       
    61 #include <fileprotectionresolver.h>     //     EFileProtDrm2
       
    62 
       
    63 // MsgDataUTILS
       
    64 #include <UniDataModel.rsg>             // Viewer/Editor Mimetype strings
       
    65 #include "UniModelConst.h"              // Definitions and enums
       
    66 #include "UniDataUtils.h"
       
    67 #include "UniSmilSlide.h"
       
    68 #include "UniSmilModel.h"
       
    69 #include "UniObjectList.h"
       
    70 #include "UniObject.h"
       
    71 #include "UniTextObject.h"
       
    72 #include "UniMimeInfo.h"
       
    73 #include "UniSmilUtils.h"
       
    74 #include "UniSmilParams.h"
       
    75 
       
    76 // Logging
       
    77 //#include "//MsgDataUTILSLOGGing.h"
       
    78 
       
    79 
       
    80 // ========== EXTERNAL DATA STRUCTURES =====================
       
    81 
       
    82 // ========== EXTERNAL FUNCTION PROTOTYPES =================
       
    83 
       
    84 // ========== CONSTANTS ====================================
       
    85 
       
    86 // ========== MACROS =======================================
       
    87 
       
    88 // ========== LOCAL CONSTANTS AND MACROS ===================
       
    89 
       
    90 _LIT( KSmilIntFormat, "%d" );
       
    91 _LIT( KSmilMsecFormat, "%dms" );
       
    92 const TUint KSlideArrayGranularity( 16 );
       
    93 
       
    94 // SMIL size estimates
       
    95 const TInt KSizeMandatorySmilTags = 148;
       
    96 const TInt KSizeHeadOneRegion = 85;
       
    97 const TInt KSizeHeadTwoRegions = 170;
       
    98 const TInt KSizeEmptyPar = 27;
       
    99 const TInt KSizeNonEmptyPar = 41;
       
   100 const TInt KSizeAudioTag = 38;
       
   101 const TInt KSizeImageTag = 52;
       
   102 const TInt KSizeTextTag = 51;
       
   103 const TInt KSizeVideoTag = 53;
       
   104 
       
   105 const TInt KSizeLowResHeight = 208;
       
   106 const TInt KSizeLowResWidth = 176;
       
   107 
       
   108 // ========== MODULE DATA STRUCTURES =======================
       
   109 
       
   110 // ========== LOCAL FUNCTION PROTOTYPES ====================
       
   111 
       
   112 // ========== LOCAL FUNCTIONS ==============================
       
   113 
       
   114 // ========== MEMBER FUNCTIONS =============================
       
   115 
       
   116 
       
   117 // ---------------------------------------------------------
       
   118 // CUniSmilModel::NewL
       
   119 //
       
   120 // Factory method.
       
   121 // ---------------------------------------------------------
       
   122 //
       
   123 EXPORT_C CUniSmilModel* CUniSmilModel::NewLC( RFs& aFs,
       
   124                                              CBaseMtm& aMtm,
       
   125                                              CUniDataUtils& aData,
       
   126                                              CUniObjectList& aObjectList )
       
   127     {
       
   128     CUniSmilModel* self = new ( ELeave )
       
   129         CUniSmilModel( aFs, aMtm, aData, aObjectList );
       
   130 
       
   131     CleanupStack::PushL(self);
       
   132     self->ConstructL();
       
   133     return self;
       
   134     }
       
   135 
       
   136 
       
   137 // ---------------------------------------------------------
       
   138 // CUniSmilModel::NewL
       
   139 //
       
   140 // Factory method.
       
   141 // ---------------------------------------------------------
       
   142 //
       
   143 EXPORT_C CUniSmilModel* CUniSmilModel::NewL( RFs& aFs,
       
   144                                             CBaseMtm& aMtm,
       
   145                                             CUniDataUtils& aData,
       
   146                                             CUniObjectList& aObjectList )
       
   147     {
       
   148     CUniSmilModel* self = NewLC( aFs, aMtm, aData, aObjectList );
       
   149     CleanupStack::Pop( self );
       
   150     return self;
       
   151     }
       
   152 
       
   153 
       
   154 // ---------------------------------------------------------
       
   155 // CUniSmilModel::CUniSmilModel
       
   156 //
       
   157 // Constructor.
       
   158 // ---------------------------------------------------------
       
   159 //
       
   160 CUniSmilModel::CUniSmilModel( RFs& aFs,
       
   161                              CBaseMtm& aMtm,
       
   162                              CUniDataUtils& aData,
       
   163                              CUniObjectList& aObjectList ) :
       
   164     iFs( aFs ),
       
   165     iMtm( aMtm ),
       
   166     iData( aData ),
       
   167     iObjectList( aObjectList ),
       
   168     iSlideLayout( EUniUndefinedLayout ),
       
   169     iSmilParams( 0 ),
       
   170     iScreenSize( 0, 0 ),
       
   171     iSizeEstimateUpToDate( EFalse ),
       
   172     iSizeEstimate( 0 )
       
   173     {
       
   174     }
       
   175 
       
   176 // ---------------------------------------------------------
       
   177 // CUniSmilModel::~CUniSmilModel
       
   178 //
       
   179 // Destructor.
       
   180 // ---------------------------------------------------------
       
   181 //
       
   182 CUniSmilModel::~CUniSmilModel()
       
   183     {   
       
   184     if (iSlideArray)
       
   185         {
       
   186         iSlideArray->ResetAndDestroy();
       
   187         }
       
   188     delete iSlideArray;
       
   189     delete iSmilParams;
       
   190     }
       
   191 
       
   192 // ---------------------------------------------------------
       
   193 // CUniSmilModel::ParseL
       
   194 // 
       
   195 // ---------------------------------------------------------
       
   196 //
       
   197 EXPORT_C TInt CUniSmilModel::ParseL( CMDXMLDocument* aDom )
       
   198     {
       
   199     //MsgDataUTILSLOGGER_ENTERFN( "CUniSmilModel::ParseL()" );
       
   200 
       
   201     Reset();
       
   202 
       
   203     if ( aDom )
       
   204         {
       
   205         TRAPD( error, DoPresentationFromDomL( aDom ) );
       
   206         if ( error )
       
   207             {
       
   208             Reset();
       
   209             User::Leave( error );
       
   210             }
       
   211         else
       
   212             {
       
   213             iParseResult |= EParsedFromSmil;
       
   214             }
       
   215         }
       
   216     else
       
   217         {
       
   218         //  No SMIL -> Do presentation from object list
       
   219         if ( IsMessageSlide() ) 
       
   220             {
       
   221             // Determine layout. Make slide. 
       
   222             DoNoSmilOneSlideL();
       
   223             }
       
   224         else 
       
   225             {
       
   226             // Do slide for each media object
       
   227             DoNoSmilManySlideL();
       
   228             }
       
   229         iParseResult |= EParsedFromList;
       
   230         }
       
   231 
       
   232     return iParseResult;
       
   233     }
       
   234 
       
   235 
       
   236 //**********************************************************
       
   237 //*
       
   238 //* SMIL COMPOSING FUNCTIONS
       
   239 //*
       
   240 //**********************************************************
       
   241 
       
   242 
       
   243 // ---------------------------------------------------------
       
   244 // CUniSmilModel::¨ComposeL
       
   245 //
       
   246 // ---------------------------------------------------------
       
   247 //
       
   248 EXPORT_C CMDXMLDocument* CUniSmilModel::ComposeL()
       
   249     {
       
   250     //MsgDataUTILSLOGGER_ENTERFN( "CUniSmilModel::ComposeL()" );
       
   251 
       
   252     // Reset region id's
       
   253     iTextRegionId.Set( KNullDesC );
       
   254     iImageRegionId.Set( KNullDesC );
       
   255 
       
   256     // Read default smil parameters
       
   257     if( !iSmilParams )
       
   258         {
       
   259         //MsgDataUTILSLOGGER_WRITE( "CUniSmilModel: Creating smil parameter structures." );
       
   260         iSmilParams = CUniSmilParams::NewL( iFs );
       
   261         }
       
   262 
       
   263     //MsgDataUTILSLOGGER_WRITE( "CUniSmilModel: Creating new DOM." );
       
   264     //delete iDom;
       
   265     //iDom = 0;
       
   266     CMDXMLDocument* dom = CMDXMLDocument::NewLC();
       
   267 
       
   268     // Create smil node
       
   269     TPtrC name( KSMILWREleSmil );
       
   270     CMDXMLElement* root = CMDXMLElement::NewLC( ETrue, dom, name );
       
   271     // Append
       
   272     dom->DocumentElement()->AppendChild( root ); // Ownership to dom
       
   273     CleanupStack::Pop( root );
       
   274 
       
   275     // Create Head
       
   276     CreateHeadL( dom, root );
       
   277 
       
   278     // Create Body
       
   279     CreateBodyL( dom, root );
       
   280 
       
   281     // TODO: Move to Document and to use smil list
       
   282     //iObjectList.CreateSmilAttachmentL( smilAttaId, iDom, iFs );
       
   283     CleanupStack::Pop( dom );
       
   284     return dom;
       
   285     }
       
   286 
       
   287 
       
   288 
       
   289 // ---------------------------------------------------------
       
   290 // CUniSmilModel::RemoveEmptySlides
       
   291 //
       
   292 //
       
   293 // ---------------------------------------------------------
       
   294 //
       
   295 EXPORT_C void CUniSmilModel::RemoveEmptySlides()
       
   296     {
       
   297     TInt count = iSlideArray->Count();
       
   298     // Must be done from end to beginning because
       
   299     // slides might be removed.
       
   300     while ( count-- )
       
   301         {
       
   302         if ( !iSlideArray->At( count )->ObjectCount() )
       
   303             {
       
   304             RemoveSlide( count );
       
   305             }
       
   306         }
       
   307     }
       
   308 
       
   309 
       
   310 // ---------------------------------------------------------
       
   311 // CUniSmilModel::AddSlideL
       
   312 //
       
   313 //
       
   314 // ---------------------------------------------------------
       
   315 //
       
   316 EXPORT_C void CUniSmilModel::AddSlideL( TInt aSlideNum )
       
   317     {
       
   318     DoAddSlideL( aSlideNum );
       
   319     }
       
   320 
       
   321 // ---------------------------------------------------------
       
   322 // CUniSmilModel::RemoveSlide
       
   323 //
       
   324 //
       
   325 // ---------------------------------------------------------
       
   326 //
       
   327 EXPORT_C void CUniSmilModel::RemoveSlide( TInt aSlideNum )
       
   328     {
       
   329     if ( !IsSlide( aSlideNum ) )
       
   330         {
       
   331         //__ASSERT_DEBUG( EFalse, DataUtilsPanic( EMmsNotASlide ) );
       
   332         return;
       
   333         }
       
   334     CUniSmilSlide* slide = iSlideArray->At( aSlideNum );
       
   335     if ( slide->ObjectCount() )
       
   336         {
       
   337         //__ASSERT_DEBUG( EFalse, DataUtilsPanic( EMmsSlideNotEmpty ) );
       
   338         return;
       
   339         }
       
   340     
       
   341     iSlideArray->Delete( aSlideNum );
       
   342     delete slide;
       
   343     //MsgDataUTILSLOGGER_WRITE( "CUniSmilModel: Empty slide removed." );
       
   344     iSizeEstimateUpToDate = EFalse;
       
   345     }
       
   346 
       
   347 // ---------------------------------------------------------
       
   348 // CUniSmilModel::MoveSlideL
       
   349 //
       
   350 //
       
   351 // ---------------------------------------------------------
       
   352 //
       
   353 EXPORT_C void CUniSmilModel::MoveSlideL( TInt aSlideToMove, TInt aPlaceToMove ) 
       
   354     {
       
   355     TInt slideCount = iSlideArray->Count();
       
   356     if ( !slideCount
       
   357         || aSlideToMove < 0
       
   358         || aSlideToMove >= slideCount
       
   359         || aSlideToMove == aPlaceToMove )
       
   360         {
       
   361         return;
       
   362         }
       
   363     TInt place = Min( Max( 0, aPlaceToMove ), slideCount - 1 );
       
   364     CUniSmilSlide* slide = iSlideArray->At( aSlideToMove );
       
   365 
       
   366     iSlideArray->Delete( aSlideToMove );
       
   367     iSlideArray->InsertL( place, slide );
       
   368     iSizeEstimateUpToDate = EFalse;
       
   369     }
       
   370 
       
   371 // ---------------------------------------------------------
       
   372 // SortSlidesL
       
   373 // 
       
   374 // Sorts slides accoring to a separate comparison function
       
   375 // called SortSlidesCompare().
       
   376 //
       
   377 // Insertion sort algorithm.
       
   378 //
       
   379 // Notice! Intended to be used with SendAs when there
       
   380 // are multiple slides - each slide containing only 
       
   381 // one object
       
   382 // ---------------------------------------------------------
       
   383 EXPORT_C void CUniSmilModel::SortSlidesL() 
       
   384     {
       
   385     TInt i = 1; // index 1, i.e. second slide
       
   386     TInt count = SlideCount();
       
   387     while ( i < count )
       
   388         {
       
   389         CUniSmilSlide* slide1 = iSlideArray->At( i );
       
   390         TInt j = i - 1;
       
   391         while ( j >= 0 )
       
   392             {
       
   393             CUniSmilSlide* slide2 = iSlideArray->At( j );
       
   394             if ( SortSlidesCompare( slide1, slide2 ) > 0 )
       
   395                 {
       
   396                 break;
       
   397                 }
       
   398             j--;
       
   399             }
       
   400         j++;
       
   401         if ( j < i )
       
   402             {
       
   403             // slide1 was not in the right place
       
   404             iSlideArray->Delete( i );
       
   405             iSlideArray->InsertL( j, slide1 );
       
   406             }
       
   407         i++;
       
   408         }
       
   409     iSizeEstimateUpToDate = EFalse;
       
   410     }
       
   411 
       
   412 
       
   413 // ---------------------------------------------------------
       
   414 // SortSlidesCompare
       
   415 //
       
   416 // Compares slides according to time. Most recent is greatest.
       
   417 //
       
   418 // Empty slides are greater than non-empty slides.
       
   419 // If aSlide1 "is greater than" aSlide2 returns positive value.
       
   420 // If aSlide1 "is smaller than" aSlide2 returns negative value.
       
   421 // If aSlide1 and aSlide2 "are equal" returns zero.
       
   422 // ---------------------------------------------------------
       
   423 //
       
   424 TInt CUniSmilModel::SortSlidesCompare( CUniSmilSlide* aSlide1,
       
   425                                       CUniSmilSlide* aSlide2 )
       
   426     {
       
   427     if ( !aSlide1->ObjectCount() )
       
   428         {
       
   429         //if both are empty returns 0
       
   430         //if slide2 is non-empty -> slide1 "is greater"
       
   431         return aSlide2->ObjectCount();
       
   432         }
       
   433     else if ( !aSlide2->ObjectCount() )
       
   434         {
       
   435         //empty slide is always "greatest"
       
   436         return -1;
       
   437         }
       
   438     else
       
   439         {
       
   440         TTime time1;
       
   441         TTime time2;
       
   442         aSlide1->GetObjectByIndex( 0 )->MediaInfo()->ModificationTime( time1 );
       
   443         aSlide2->GetObjectByIndex( 0 )->MediaInfo()->ModificationTime( time2 );
       
   444         if ( time1 < time2 )
       
   445             {
       
   446             return -1;
       
   447             }
       
   448         else if ( time1 == time2 )
       
   449             {
       
   450             return 0;
       
   451             }
       
   452         else
       
   453             {
       
   454             return 1;
       
   455             }
       
   456         }
       
   457     }
       
   458 
       
   459 // ---------------------------------------------------------
       
   460 // CUniSmilModel::IsSlide
       
   461 //
       
   462 //
       
   463 // ---------------------------------------------------------
       
   464 //
       
   465 EXPORT_C TBool CUniSmilModel::IsSlide( TInt aSlideNum ) const
       
   466     {
       
   467     if( aSlideNum >= 0 &&
       
   468         aSlideNum < iSlideArray->Count() )
       
   469         {
       
   470         return ETrue;
       
   471         }
       
   472     return EFalse;
       
   473     }
       
   474 
       
   475 // ---------------------------------------------------------
       
   476 // CUniSmilModel::AddTextObjectL
       
   477 // 
       
   478 // ---------------------------------------------------------
       
   479 //
       
   480 EXPORT_C CUniTextObject* CUniSmilModel::AddTextObjectL(
       
   481     TInt aSlideNum, 
       
   482     CEikRichTextEditor* aText )
       
   483     {
       
   484     CUniTextObject* obj = CUniTextObject::NewLC( iFs, iMtm, iData, aText );
       
   485     iObjectList.AddObjectL( obj );
       
   486     CleanupStack::Pop( obj );
       
   487     iSlideArray->At(aSlideNum)->AddObjectL( obj );
       
   488     iSizeEstimateUpToDate = EFalse;
       
   489     return obj;
       
   490     }
       
   491 
       
   492 // ---------------------------------------------------------
       
   493 // CUniSmilModel::AddTempObjectL
       
   494 //
       
   495 // ---------------------------------------------------------
       
   496 //
       
   497 /*
       
   498 EXPORT_C CUniObject* CUniSmilModel::AddTempObjectL( TInt aSlideNum,
       
   499                                             CMsgMediaInfo* aMedia )
       
   500     {
       
   501     if ( !IsSlide( aSlideNum ) )
       
   502         {
       
   503         User::Leave( KErrArgument );
       
   504         }
       
   505 
       
   506     CUniObject* obj = CUniObject::NewLC( iFs, iMtm, iData, aMedia );
       
   507 
       
   508     // Update model
       
   509     iObjectList.AddObjectL( obj );
       
   510     CleanupStack::Pop( obj );
       
   511     iSlideArray->At( aSlideNum )->AddObjectL( obj );
       
   512     SetLayoutFromObjectTypeL( obj->MediaType() );
       
   513     iSizeEstimateUpToDate = EFalse;
       
   514     return obj;
       
   515     }
       
   516 */
       
   517 
       
   518 // ---------------------------------------------------------
       
   519 // CUniSmilModel::AddObjectL
       
   520 //
       
   521 // ---------------------------------------------------------
       
   522 //
       
   523 EXPORT_C CUniObject* CUniSmilModel::AddObjectL( MUniObjectSaveObserver& aObserver,
       
   524                                                TInt aSlideNum,
       
   525                                                CMsgMediaInfo* aMedia )
       
   526     {
       
   527     if ( !IsSlide( aSlideNum ) )
       
   528         {
       
   529         User::Leave( KErrArgument );
       
   530         }
       
   531 
       
   532     CUniObject* obj = CUniObject::NewLC( iFs, iMtm, iData, aMedia );
       
   533 
       
   534     // Update model
       
   535     iObjectList.AddObjectL( obj );
       
   536     CleanupStack::Pop( obj );
       
   537     obj->Save( aObserver, CMsvAttachment::EMsvLinkedFile );
       
   538     iSlideArray->At(aSlideNum)->AddObjectL( obj );
       
   539     iSizeEstimateUpToDate = EFalse;
       
   540     return obj;
       
   541     }
       
   542 
       
   543 // ---------------------------------------------------------
       
   544 // CUniSmilModel::AddStoredObjectL
       
   545 //
       
   546 // ---------------------------------------------------------
       
   547 //
       
   548 EXPORT_C CUniObject* CUniSmilModel::AddStoredObjectL( TInt aSlideNum,
       
   549                                                      TMsvAttachmentId aAttachmentId,
       
   550                                                      CMsgMediaInfo* aMedia )
       
   551     {
       
   552     if ( !IsSlide( aSlideNum ) )
       
   553         {
       
   554         User::Leave( KErrArgument );
       
   555         }
       
   556 
       
   557     CMsvStore* store = iMtm.Entry().EditStoreL();
       
   558     CleanupStack::PushL( store );
       
   559     MMsvAttachmentManager& manager = store->AttachmentManagerL();
       
   560     MMsvAttachmentManagerSync& managerSync = store->AttachmentManagerExtensionsL();
       
   561     CMsvAttachment* attachment = manager.GetAttachmentInfoL( aAttachmentId );
       
   562     CleanupStack::PushL( attachment );
       
   563     
       
   564     CUniObject* obj = NULL;
       
   565     
       
   566     if ( aMedia &&
       
   567          aMedia->MediaType() == EMsgMediaText )
       
   568         {
       
   569         CMsgTextInfo* textInfo = static_cast<CMsgTextInfo*>( aMedia );
       
   570         obj = CUniTextObject::NewLC( iFs, iMtm, iData, textInfo, manager, *attachment );
       
   571         }
       
   572     else
       
   573         {
       
   574         obj = CUniObject::NewLC( iFs, iMtm, iData, aMedia, manager, *attachment );
       
   575         }
       
   576     managerSync.ModifyAttachmentInfoL( attachment );
       
   577     CleanupStack::Pop( 2, attachment ); //obj, attachment
       
   578     CleanupStack::PushL( obj );
       
   579     store->CommitL();
       
   580 
       
   581     // Update model
       
   582     iObjectList.AddObjectL( obj );
       
   583     CleanupStack::Pop( obj );
       
   584     CleanupStack::PopAndDestroy( store );
       
   585     iSlideArray->At(aSlideNum)->AddObjectL( obj );
       
   586     iSizeEstimateUpToDate = EFalse;
       
   587     return obj;
       
   588     }
       
   589 
       
   590 // ---------------------------------------------------------
       
   591 // CUniSmilModel::RemoveObjectL
       
   592 //
       
   593 //
       
   594 // ---------------------------------------------------------
       
   595 //
       
   596 EXPORT_C void CUniSmilModel::RemoveObjectL( TInt aSlideNum, 
       
   597                                             CUniObject* aObject, 
       
   598                                             TBool aLeaveToStore/* = EFalse*/ )
       
   599     {
       
   600     if ( !IsSlide( aSlideNum ) ||
       
   601         !iSlideArray->At( aSlideNum )->IsObject( aObject ) )
       
   602         {
       
   603         return;
       
   604         }
       
   605     // TODO: Check that object exists on the slide.
       
   606 
       
   607     //if ( !IsObject( aSlideNum, aObjectType ) )
       
   608     //    {
       
   609     //    return;
       
   610     //    }
       
   611     DoRemoveObjectL( aSlideNum, aObject, aLeaveToStore );
       
   612     }
       
   613 
       
   614 // ---------------------------------------------------------
       
   615 // CUniSmilModel::RemoveObjectByIndexL
       
   616 //
       
   617 //
       
   618 // ---------------------------------------------------------
       
   619 //
       
   620 EXPORT_C void CUniSmilModel::RemoveObjectByIndexL( TInt aSlideNum, TInt aObjectNum )
       
   621     {
       
   622     if ( !IsSlide( aSlideNum ) )
       
   623         {
       
   624         return;
       
   625         }
       
   626     CUniObject* obj = iSlideArray->At( aSlideNum )->GetObjectByIndex( aObjectNum );
       
   627     DoRemoveObjectL( aSlideNum, obj );
       
   628     }
       
   629 
       
   630 // ---------------------------------------------------------
       
   631 // CUniSmilModel::DoRemoveObjectL
       
   632 //
       
   633 //
       
   634 // ---------------------------------------------------------
       
   635 //
       
   636 void CUniSmilModel::DoRemoveObjectL( TInt aSlideNum, CUniObject* aObject, TBool aLeaveToStore/* = EFalse*/ )
       
   637     {
       
   638     //MsgDataUTILSLOGGER_ENTERFN( "CUniSmilModel : DoRemoveObjectL()" );
       
   639 
       
   640     TBool removeObj = ( aObject->ReferenceCount() - 1 <= 0 );
       
   641     //if last reference was (will be) removed, remove from 
       
   642     //attachment list (and msg store)
       
   643     if ( removeObj )
       
   644         {
       
   645         //MsgDataUTILSLOGGER_WRITE( "CUniSmilModel: Removing from atta list and store." );
       
   646         iObjectList.RemoveObjectL( aObject, !aLeaveToStore );
       
   647         }
       
   648 
       
   649     CUniSmilSlide* slide = iSlideArray->At( aSlideNum );
       
   650     slide->RemoveObject( aObject );
       
   651     iSizeEstimateUpToDate = EFalse;
       
   652 
       
   653     if ( removeObj )
       
   654         {
       
   655         delete aObject;
       
   656         }
       
   657 
       
   658     //MsgDataUTILSLOGGER_LEAVEFN( "CUniSmilModel : DoRemoveObjectL()" );
       
   659     }
       
   660 
       
   661 // ---------------------------------------------------------
       
   662 // CUniSmilModel::GetObject
       
   663 //
       
   664 //
       
   665 // ---------------------------------------------------------
       
   666 //
       
   667 EXPORT_C CUniObject* CUniSmilModel::GetObjectByIndex( TInt aSlideNum, 
       
   668                                                      TInt aObjectNum ) const
       
   669     {
       
   670     if( !IsSlide( aSlideNum ) )
       
   671         {
       
   672         return NULL;
       
   673         }
       
   674     return iSlideArray->At( aSlideNum )->GetObjectByIndex( aObjectNum );
       
   675     }
       
   676 
       
   677 // ---------------------------------------------------------
       
   678 // CUniSmilModel::GetObject
       
   679 //
       
   680 //
       
   681 // ---------------------------------------------------------
       
   682 //
       
   683 EXPORT_C CUniObject* CUniSmilModel::GetObject( TInt aSlideNum, 
       
   684                                               TUniRegion aRegion ) const
       
   685     {
       
   686     if( !IsSlide( aSlideNum ) )
       
   687         {
       
   688         return NULL;
       
   689         }
       
   690     return iSlideArray->At( aSlideNum )->GetObject( aRegion );
       
   691     }
       
   692 
       
   693 // ---------------------------------------------------------
       
   694 // CUniSmilModel::SetLayoutL
       
   695 //
       
   696 // Mutator.
       
   697 // ---------------------------------------------------------
       
   698 //
       
   699 EXPORT_C void CUniSmilModel::SetLayoutL( TUniLayout aNewLayout ) 
       
   700     {
       
   701     iSlideLayout = aNewLayout;
       
   702     TUint slideCnt = iSlideArray->Count();
       
   703     for (TUint i = 0; i < slideCnt; i++ )
       
   704         {
       
   705         iSlideArray->At(i)->UpdateLayoutL( iSlideLayout );
       
   706         }   
       
   707     iSizeEstimateUpToDate = EFalse;
       
   708     }
       
   709 
       
   710 // ---------------------------------------------------------
       
   711 // CUniSmilModel::SmilComposeSize()
       
   712 //
       
   713 // Total size
       
   714 // ---------------------------------------------------------
       
   715 //
       
   716 EXPORT_C TInt CUniSmilModel::SmilComposeSize()
       
   717     {
       
   718     TInt slideCount = iSlideArray->Count();
       
   719     if ( !slideCount )
       
   720         {
       
   721         return 0;
       
   722         }
       
   723     if ( !iSizeEstimateUpToDate )
       
   724         {
       
   725         iSizeEstimate = SmilComposeSize(
       
   726             slideCount,
       
   727             iSlideArray->At( slideCount - 1 )->ObjectCount() );
       
   728         iSizeEstimateUpToDate = ETrue;
       
   729         }
       
   730     return iSizeEstimate;
       
   731     }
       
   732 
       
   733 
       
   734 // ---------------------------------------------------------
       
   735 // CUniSmilModel::SmilComposeSize()
       
   736 //
       
   737 // Size from beginning
       
   738 // ---------------------------------------------------------
       
   739 //
       
   740 EXPORT_C TInt CUniSmilModel::SmilComposeSize( TInt aToSlideNum, TInt aToObjectNum )
       
   741     {
       
   742     //__ASSERT_DEBUG(
       
   743     //    ( aToSlideNum > 0 && aToSlideNum <= iSlideArray->Count() ),
       
   744     //    DataUtilsPanic( EMmsIllegalSlide ) );
       
   745     //__ASSERT_DEBUG(
       
   746     //    ( aToObjectNum <= iSlideArray->At( aToSlideNum - 1 )->ObjectCount() ),
       
   747     //    DataUtilsPanic( EMmsIllegalObject ) );
       
   748 
       
   749     TInt size( KSizeMandatorySmilTags );
       
   750     TBool imageRegion = EFalse;
       
   751     TBool textRegion = EFalse;
       
   752 
       
   753     for ( TInt i = 0; i < aToSlideNum; i++ )
       
   754         {
       
   755         CUniSmilSlide* slide = iSlideArray->At( i );
       
   756         TInt toObj = slide->ObjectCount();
       
   757         if ( i == aToSlideNum - 1 )
       
   758             {
       
   759             toObj = aToObjectNum;
       
   760             }
       
   761         if ( !toObj )
       
   762             {
       
   763             //No objects on the slide
       
   764             size += KSizeEmptyPar;
       
   765             }
       
   766         else
       
   767             {
       
   768             //One or more objects
       
   769             size += KSizeNonEmptyPar;
       
   770             }
       
   771         for ( TInt ii = 0; ii < toObj; ii++ )
       
   772             {
       
   773             CUniObject* obj = slide->GetObjectByIndex( ii );
       
   774             switch ( obj->MediaType() )
       
   775                 {
       
   776                 case EMsgMediaAudio:
       
   777                     size += KSizeAudioTag;
       
   778                     break;
       
   779                 case EMsgMediaImage:
       
   780                 case EMsgMediaSvg:
       
   781                     size += KSizeImageTag;
       
   782                     imageRegion = ETrue;
       
   783                     break;
       
   784                 case EMsgMediaText:
       
   785                 case EMsgMediaXhtml:
       
   786                     size += KSizeTextTag;
       
   787                     textRegion = ETrue;
       
   788                     break;
       
   789                 case EMsgMediaVideo:
       
   790                     size += KSizeVideoTag;
       
   791                     imageRegion = ETrue;
       
   792                     break;
       
   793                 default:
       
   794                     //Should never come here
       
   795                     //Don't increase size
       
   796                     break;
       
   797                 }
       
   798             }
       
   799         }
       
   800 
       
   801     TInt regions = 0;
       
   802     if ( imageRegion )
       
   803         {
       
   804         regions++;
       
   805         }
       
   806     if ( textRegion )
       
   807         {
       
   808         regions++;
       
   809         }
       
   810     switch ( regions )
       
   811         {
       
   812         case 1:
       
   813             size += KSizeHeadOneRegion;
       
   814             break;
       
   815         case 2:
       
   816             size += KSizeHeadTwoRegions;
       
   817             break;
       
   818         default:
       
   819             //Should be zero
       
   820             //Don't increase size
       
   821             break;
       
   822         }
       
   823     return size;
       
   824     }
       
   825 
       
   826 
       
   827 // ---------------------------------------------------------
       
   828 // CUniSmilModel::ObjectCount
       
   829 //
       
   830 // Accessor
       
   831 // ---------------------------------------------------------
       
   832 //
       
   833 EXPORT_C TInt CUniSmilModel::ObjectCount() const
       
   834     {
       
   835     TInt objCnt(0);
       
   836 
       
   837     for ( TInt i = iSlideArray->Count(); --i >= 0 ;)
       
   838         {
       
   839         objCnt += iSlideArray->At(i)->ObjectCount();
       
   840         }
       
   841 
       
   842     return objCnt;
       
   843     }
       
   844 
       
   845 
       
   846 // ---------------------------------------------------------
       
   847 // CUniSmilModel::SlideObjectCount
       
   848 //
       
   849 // Accessor
       
   850 // ---------------------------------------------------------
       
   851 //
       
   852 EXPORT_C TInt CUniSmilModel::SlideObjectCount(TInt aSlideNum) const
       
   853     {
       
   854     if ( !IsSlide(aSlideNum) )
       
   855         {
       
   856         return 0;
       
   857         }
       
   858 
       
   859     return iSlideArray->At( aSlideNum )->ObjectCount();
       
   860     }
       
   861 
       
   862 //**********************************************************
       
   863 //*
       
   864 //* CONTRUCTION FUNCTIONS 
       
   865 //*
       
   866 //**********************************************************
       
   867 
       
   868 
       
   869 // ---------------------------------------------------------
       
   870 // CUniSmilModel::ConstructL
       
   871 //
       
   872 // 2nd phase constructor.
       
   873 // ---------------------------------------------------------
       
   874 //
       
   875 void CUniSmilModel::ConstructL()
       
   876     {
       
   877     iSlideArray = new ( ELeave ) CSmilSlideArray( KSlideArrayGranularity );
       
   878     iTextRegionId.Set( KNullDesC );
       
   879     iImageRegionId.Set( KNullDesC );
       
   880 
       
   881     // Set default layout to "Text first"
       
   882     iSlideLayout = EUniTextFirst;
       
   883     
       
   884     // Fix for NSIA-6CKFJA. Sets same screen size that SMIL Player is using. MH
       
   885     TRect appWindowRect;
       
   886     AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EApplicationWindow, appWindowRect );
       
   887     
       
   888     TAknLayoutRect mainPane;
       
   889     mainPane.LayoutRect( appWindowRect, AknLayoutScalable_Avkon::main_pane( 0 ) );   
       
   890     
       
   891     TAknLayoutRect mainSmilPane;
       
   892     mainSmilPane.LayoutRect( mainPane.Rect(), AknLayoutScalable_Apps::main_smil_pane() );
       
   893         
       
   894     iScreenSize = mainSmilPane.Rect().Size();       
       
   895     }
       
   896 
       
   897 // ---------------------------------------------------------
       
   898 // CUniSmilModel::Reset
       
   899 //
       
   900 // 
       
   901 // ---------------------------------------------------------
       
   902 //
       
   903 void CUniSmilModel::Reset()
       
   904     {
       
   905     iParseResult = 0;
       
   906     iSlideLayout = EUniTextFirst;
       
   907     iTextRegionId.Set( KNullDesC );
       
   908     iImageRegionId.Set( KNullDesC );
       
   909     if ( iSlideArray )
       
   910         {
       
   911         // Reset slide array
       
   912         iSlideArray->ResetAndDestroy();
       
   913         }
       
   914     TInt objCount = iObjectList.Count();
       
   915     while ( objCount-- )
       
   916         {
       
   917         iObjectList.GetByIndex( objCount )->SetReferenceCount( 0 );
       
   918         }
       
   919     }
       
   920 
       
   921 // ---------------------------------------------------------
       
   922 // CUniSmilModel::DoPresentationFromDomL
       
   923 //
       
   924 // When this functios is called DOM should be validated as MMS SMIL.
       
   925 // ---------------------------------------------------------
       
   926 //
       
   927 void CUniSmilModel::DoPresentationFromDomL( CMDXMLDocument* aDom )
       
   928     {
       
   929     RemoveMetaTagsAndComments( aDom );
       
   930     // Resolve layout of the slide
       
   931     iSlideLayout = GetMmsSmilLayout( aDom );
       
   932 
       
   933     CMDXMLNode* node = GetNode( aDom, KSMILWREleBody );
       
   934 
       
   935     if ( node && node->FirstChild() )
       
   936         {
       
   937         // Only one slide in the message since no <par> tag found
       
   938         if ( node->FirstChild()->NodeName().Compare( KSMILWRElePar ) != 0 )
       
   939             {
       
   940             // Add slide - the one and only
       
   941             AddSlideFromDomL( node );
       
   942             }
       
   943 
       
   944         // Other node types than <par> not possible as this is MMS SMIL.
       
   945         else
       
   946             {
       
   947             // Traverse through every page
       
   948             CMDXMLNode* page = node->FirstChild();
       
   949             while ( page )
       
   950                 {
       
   951                 AddSlideFromDomL( page );
       
   952                 // Go to next page.
       
   953                 page = page->NextSibling();
       
   954                 }
       
   955             }
       
   956         }
       
   957     }
       
   958 
       
   959 // ---------------------------------------------------------
       
   960 // CUniSmilModel::AddSlideFromDomL
       
   961 //
       
   962 // ---------------------------------------------------------
       
   963 //
       
   964 void CUniSmilModel::AddSlideFromDomL( CMDXMLNode* aPage )
       
   965     {
       
   966     CUniObject* obj = NULL;
       
   967     CUniSmilSlide* slide = DoAddSlideL();
       
   968     CMDXMLNode* node = aPage->FirstChild();
       
   969 
       
   970     // Traverse through every object in page.
       
   971     while ( node )
       
   972         {
       
   973         if ( UniSmilUtils::IsMediaElem( node ) )
       
   974             {
       
   975             obj = iObjectList.GetByNodeL( node );
       
   976             if ( obj )
       
   977                 {
       
   978                 if ( slide )
       
   979                     {
       
   980                     obj->SetMediaTypeBySmilTag( UniSmilUtils::MediaElemType( node ) );
       
   981                     AddObjectFromDomL(
       
   982                         slide,
       
   983                         obj,
       
   984                         GetRegionType( node ) );
       
   985                     }
       
   986                 else
       
   987                     {
       
   988                     iObjectList.RemoveObjectL( obj, ETrue );
       
   989                     delete obj;
       
   990                     iParseResult |= EObjectRemoved;
       
   991                     }
       
   992                 }
       
   993             }
       
   994         node = node->NextSibling();
       
   995         }
       
   996     }
       
   997 
       
   998 
       
   999 // ---------------------------------------------------------
       
  1000 // CUniSmilModel::AddObjectFromDomL
       
  1001 //
       
  1002 // ---------------------------------------------------------
       
  1003 //
       
  1004 void CUniSmilModel::AddObjectFromDomL( CUniSmilSlide* aSlide,
       
  1005                                        CUniObject* aObj,
       
  1006                                        TUniRegion aRegion )
       
  1007     {            
       
  1008     if ( !aObj )
       
  1009         {
       
  1010         // Smil presentation refers to attachment that's not in the message
       
  1011         iParseResult |= EMissingObjects;
       
  1012         // Not actually error that should prevent message viewing.
       
  1013         return; 
       
  1014         }
       
  1015 
       
  1016     TMsgMediaType mediaBySmilTag = aObj->MediaTypeBySmilTag();
       
  1017     TMsgMediaType media = aObj->MediaType();
       
  1018 
       
  1019     if ( media == EMsgMediaSvg )
       
  1020         {
       
  1021         // SVG considered an image.
       
  1022         // (...because "image" tag is used for SVG while composing SMIL.)
       
  1023         media = EMsgMediaImage;
       
  1024         }
       
  1025 
       
  1026     if ( media == EMsgMediaXhtml )
       
  1027         {
       
  1028         // XHTML is considered as a text.
       
  1029         // (...because "text" tag is used for xhtml while composing SMIL.)
       
  1030         media = EMsgMediaText;
       
  1031         }
       
  1032 
       
  1033     if ( !( media == EMsgMediaText ||
       
  1034         media == EMsgMediaImage ||
       
  1035         media == EMsgMediaAudio ||
       
  1036         media == EMsgMediaVideo ) )
       
  1037         {
       
  1038         // Unsupported format
       
  1039         //MsgDataUTILSLOGGER_WRITE( "CUniSmilModel: Parsing: Message has unsupported objects." );
       
  1040         iParseResult |= EUnsupportedObjects;
       
  1041         // Not actually error that should prevent message viewing.
       
  1042         }
       
  1043     
       
  1044     //  NOTE: Smil standard allows <img src="aa.txt"> references, but conformance
       
  1045     //        Data forbids these. 
       
  1046     if ( media != EMsgMediaUnknown &&   //Unknown matches anything
       
  1047          mediaBySmilTag != EMsgMediaRef &&    //<ref> matches anything
       
  1048          media != mediaBySmilTag )
       
  1049         {
       
  1050         // SMIL does not describe content as it should
       
  1051         //MsgDataUTILSLOGGER_WRITE( "CUniSmilModel: Parsing: Smil object type differs from message object type." );
       
  1052         iParseResult |= EBadlyReferencedObjects;
       
  1053         }
       
  1054 
       
  1055     TUniRegion regionBySmilTag = EUniRegionUnresolved;
       
  1056     switch ( mediaBySmilTag )
       
  1057         {
       
  1058         case EMsgMediaAudio:
       
  1059             {
       
  1060             regionBySmilTag = EUniRegionAudio;
       
  1061             break;
       
  1062             }
       
  1063         case EMsgMediaImage:
       
  1064         case EMsgMediaVideo:
       
  1065             {
       
  1066             regionBySmilTag = EUniRegionImage;
       
  1067             break;
       
  1068             }
       
  1069         case EMsgMediaText:
       
  1070             {
       
  1071             regionBySmilTag = EUniRegionText;
       
  1072             break;
       
  1073             }
       
  1074         default:
       
  1075             break;
       
  1076         }
       
  1077 
       
  1078     TUniRegion regionByMediaType = EUniRegionUnresolved;
       
  1079     switch ( media )
       
  1080         {
       
  1081         case EMsgMediaAudio:
       
  1082             {
       
  1083             regionByMediaType = EUniRegionAudio;
       
  1084             break;
       
  1085             }
       
  1086         case EMsgMediaImage:
       
  1087         case EMsgMediaVideo:
       
  1088             {
       
  1089             regionByMediaType = EUniRegionImage;
       
  1090             break;
       
  1091             }
       
  1092         case EMsgMediaText:
       
  1093             {
       
  1094             regionByMediaType = EUniRegionText;
       
  1095             break;
       
  1096             }
       
  1097         default:
       
  1098             break;
       
  1099         }
       
  1100 
       
  1101     // Check that region type matches object media type
       
  1102     if ( aRegion != EUniRegionUnresolved &&
       
  1103         regionByMediaType != EUniRegionUnresolved &&
       
  1104         aRegion != regionByMediaType )
       
  1105         {
       
  1106         iParseResult |= ERegionMediaTypeMismatch;
       
  1107         aRegion = regionByMediaType;
       
  1108         }
       
  1109     else if ( regionByMediaType == EUniRegionUnresolved &&  
       
  1110               aRegion == EUniRegionText )
       
  1111         {
       
  1112         // do not put every possible content into text reqion
       
  1113         iParseResult |= ERegionMediaTypeMismatch;
       
  1114         aRegion = EUniRegionUnresolved;
       
  1115         }
       
  1116     else if ( aRegion == EUniRegionUnresolved )
       
  1117         {
       
  1118         // If region couldn't be resolved from the region tag
       
  1119         // follow the media type. If that's not possible follow
       
  1120         // the smil media tag name. If everything fails
       
  1121         // "aRegion" will remain "unresolved".
       
  1122         aRegion = ( regionByMediaType != EUniRegionUnresolved )
       
  1123             ? regionByMediaType
       
  1124             : regionBySmilTag;
       
  1125         }
       
  1126    
       
  1127     CMsgMediaInfo* mediaInfo = aObj->MediaInfo();
       
  1128     // DRM2 must be put into object view in the viewer
       
  1129     if ( mediaInfo  &&  
       
  1130          ( mediaInfo->HandlerApplicationUid().iUid == 0 ||  
       
  1131            aObj->MediaInfo()->Protection() & EFileProtDrm2 ) )
       
  1132         {
       
  1133         aRegion = EUniRegionUnresolved;
       
  1134         }
       
  1135     // else - should not occur
       
  1136 
       
  1137     if ( aRegion != EUniRegionUnresolved )
       
  1138         {
       
  1139         aSlide->AddObjectL( aObj, aRegion );
       
  1140         iSizeEstimateUpToDate = EFalse;
       
  1141         }
       
  1142     else
       
  1143         {
       
  1144         iParseResult |= EBadlyReferencedObjects;
       
  1145         // -> Something unknown in the SMIL.
       
  1146         // -> Don't add. Will be handled as an attachment.
       
  1147         }
       
  1148     }
       
  1149 
       
  1150 // ---------------------------------------------------------
       
  1151 // CUniSmilModel::IsMessageSlide
       
  1152 //
       
  1153 // ---------------------------------------------------------
       
  1154 //
       
  1155 TBool CUniSmilModel::IsMessageSlide()
       
  1156     {
       
  1157     TInt imageCnt( 0 );
       
  1158     TInt audioCnt( 0 );
       
  1159     TInt textCnt( 0 );
       
  1160     
       
  1161     for ( TInt i = iObjectList.Count(); --i >= 0 ; )
       
  1162         {
       
  1163         switch( iObjectList.GetByIndex(i)->MediaType() )
       
  1164             {
       
  1165             case EMsgMediaSvg:
       
  1166             case EMsgMediaImage:
       
  1167                 imageCnt++;
       
  1168                 break;
       
  1169 
       
  1170             case EMsgMediaAudio:
       
  1171                 audioCnt++;
       
  1172                 break;
       
  1173 
       
  1174             case EMsgMediaText:
       
  1175             case EMsgMediaXhtml:
       
  1176                 textCnt++;
       
  1177                 break;
       
  1178 
       
  1179             case EMsgMediaVideo:
       
  1180                 //always consider video as image + audio
       
  1181                 imageCnt++;
       
  1182                 audioCnt++;
       
  1183                 break;
       
  1184 
       
  1185             case EMsgMediaUnknown:
       
  1186             default:
       
  1187                 //  Unsupported objects will be put into attachment list
       
  1188                 //  in FindAttachmentsL()
       
  1189                 break;
       
  1190             } // switch
       
  1191         } // for     
       
  1192 
       
  1193     if ( imageCnt > 1 || audioCnt > 1 || textCnt  > 1 ) 
       
  1194         {
       
  1195         return EFalse;
       
  1196         }
       
  1197 
       
  1198     return ETrue;
       
  1199     }
       
  1200 
       
  1201 // ---------------------------------------------------------
       
  1202 // DoNoSmilOneSlideL
       
  1203 //
       
  1204 // NOTE: Message should be a valid slide at this point.
       
  1205 // ---------------------------------------------------------
       
  1206 //
       
  1207 void CUniSmilModel::DoNoSmilOneSlideL()
       
  1208     {
       
  1209     CUniSmilSlide* slide = NULL;
       
  1210         
       
  1211     for ( TInt i = 0; i < iObjectList.Count(); i++ )
       
  1212         {
       
  1213         CUniObject* obj = iObjectList.GetByIndex(i);
       
  1214         TMsgMediaType media = obj->MediaType();
       
  1215         CMsgMediaInfo* mediaInfo = obj->MediaInfo();
       
  1216         
       
  1217         // DRM2 must be put into objects view in the viewer
       
  1218         if ( ( media == EMsgMediaText ||
       
  1219                media == EMsgMediaXhtml ||  
       
  1220                media == EMsgMediaImage ||
       
  1221                media == EMsgMediaSvg ||
       
  1222                media == EMsgMediaAudio ||
       
  1223                media == EMsgMediaVideo ) &&
       
  1224              mediaInfo && 
       
  1225              mediaInfo->HandlerApplicationUid().iUid &&
       
  1226              !( obj->MediaInfo()->Protection() & EFileProtDrm2 ) )
       
  1227             {
       
  1228             if ( !slide )
       
  1229                 {
       
  1230                 // Add slide
       
  1231                 slide = DoAddSlideL();
       
  1232                 }
       
  1233             slide->AddObjectL( obj );
       
  1234             }
       
  1235         }
       
  1236     }
       
  1237 
       
  1238 // ---------------------------------------------------------
       
  1239 // DoNoSmilManySlideL
       
  1240 //
       
  1241 //  
       
  1242 // ---------------------------------------------------------
       
  1243 //
       
  1244 void CUniSmilModel::DoNoSmilManySlideL()
       
  1245     {    
       
  1246     for ( TInt i = 0; i < iObjectList.Count(); i++ )
       
  1247         {
       
  1248         CUniObject* obj = iObjectList.GetByIndex(i);
       
  1249         TMsgMediaType media = obj->MediaType();
       
  1250         CMsgMediaInfo* mediaInfo = obj->MediaInfo();
       
  1251         
       
  1252         // DRM2 must be put into objects view in the viewer
       
  1253         if ( ( media == EMsgMediaText ||
       
  1254                media == EMsgMediaXhtml ||  
       
  1255                media == EMsgMediaImage ||
       
  1256                media == EMsgMediaSvg ||
       
  1257                media == EMsgMediaAudio ||
       
  1258                media == EMsgMediaVideo ) && 
       
  1259             mediaInfo && 
       
  1260             mediaInfo->HandlerApplicationUid().iUid &&
       
  1261              !( obj->MediaInfo()->Protection() & EFileProtDrm2 ) )
       
  1262             {
       
  1263             CUniSmilSlide* slide = DoAddSlideL();
       
  1264             if ( slide )
       
  1265                 {
       
  1266                 slide->AddObjectL( obj );
       
  1267                 }
       
  1268             else if ( obj )
       
  1269                 {
       
  1270                 iObjectList.RemoveObjectL( obj, ETrue );
       
  1271                 delete obj;
       
  1272                 iParseResult |= EObjectRemoved;
       
  1273                 i--;
       
  1274                 }
       
  1275             }
       
  1276         }
       
  1277     }
       
  1278 
       
  1279 // ---------------------------------------------------------
       
  1280 // DoAddSlideL
       
  1281 //
       
  1282 // ---------------------------------------------------------
       
  1283 //
       
  1284 CUniSmilSlide* CUniSmilModel::DoAddSlideL( TInt aSlideNum /*= -1*/ )
       
  1285     {
       
  1286     CUniSmilSlide* newSlide = NULL;
       
  1287     if ( iMaxSlideCount == 0 || 
       
  1288          iSlideArray->Count() < iMaxSlideCount )
       
  1289         {
       
  1290         newSlide = CUniSmilSlide::NewLC( iSlideLayout );
       
  1291         if ( aSlideNum == -1 || aSlideNum >= iSlideArray->Count() )
       
  1292             {
       
  1293             // Add to end of array
       
  1294             iSlideArray->AppendL( newSlide );
       
  1295             }
       
  1296         else
       
  1297             {
       
  1298             iSlideArray->InsertL( aSlideNum, newSlide );
       
  1299             }
       
  1300         CleanupStack::Pop( newSlide );  // newSlide
       
  1301         iSizeEstimateUpToDate = EFalse;
       
  1302         }
       
  1303     return newSlide;
       
  1304     }
       
  1305 
       
  1306 // ---------------------------------------------------------
       
  1307 // CUniSmilModel::CreateHeadL
       
  1308 // 
       
  1309 // ---------------------------------------------------------
       
  1310 void CUniSmilModel::CreateHeadL( CMDXMLDocument* aDom, CMDXMLElement* aRoot )
       
  1311     {
       
  1312 
       
  1313     TPtrC name( KSMILWREleHead );
       
  1314     // Create Head node
       
  1315     CMDXMLElement* ele = CMDXMLElement::NewLC( ETrue, aDom, name );
       
  1316     // Append Head in Root node
       
  1317     aRoot->AppendChild( ele );
       
  1318 
       
  1319     // Create Layout
       
  1320     CreateLayoutL( aDom, ele );
       
  1321     CleanupStack::Pop( ele );
       
  1322     }
       
  1323 
       
  1324 // ---------------------------------------------------------
       
  1325 // CUniSmilModel::ChangeLayoutL
       
  1326 // 
       
  1327 // ---------------------------------------------------------
       
  1328 EXPORT_C TBool CUniSmilModel::ChangeLayoutL( CMDXMLDocument* aDom )
       
  1329     {
       
  1330     TBool retVal = EFalse;
       
  1331     if ( aDom )
       
  1332         {
       
  1333         CMDXMLElement* layout = (CMDXMLElement*) GetNode( aDom, KSMILWREleLayout );
       
  1334         if ( !layout )
       
  1335             {
       
  1336             // No layout. Nothing to do without composing
       
  1337             // SMIL from scratch.
       
  1338             return EFalse;
       
  1339             }
       
  1340         CMDXMLElement* head = (CMDXMLElement*) layout->ParentNode();
       
  1341 
       
  1342         // Read default smil parameters
       
  1343         if( !iSmilParams )
       
  1344             {
       
  1345             iSmilParams = CUniSmilParams::NewL( iFs );
       
  1346             }
       
  1347         CMDXMLElement* rootLayout = NULL;
       
  1348         CMDXMLElement* textRegion = NULL;
       
  1349         CMDXMLElement* imageRegion = NULL;
       
  1350 
       
  1351         GetLayoutElements(
       
  1352             layout,
       
  1353             rootLayout,
       
  1354             textRegion,
       
  1355             imageRegion );
       
  1356 
       
  1357         if ( rootLayout )
       
  1358             {
       
  1359             rootLayout->RemoveAttribute( KSMILWRParaWidth );
       
  1360             rootLayout->RemoveAttribute( KSMILWRParaHeight );
       
  1361             }
       
  1362 
       
  1363         if ( textRegion )
       
  1364             {
       
  1365             textRegion->RemoveAttribute( KSMILWRParaFit );
       
  1366             textRegion->RemoveAttribute( KSMILWRParaTop );
       
  1367             textRegion->RemoveAttribute( KSMILWRParaLeft );
       
  1368             textRegion->RemoveAttribute( KSMILWRParaBottom );
       
  1369             textRegion->RemoveAttribute( KSMILWRParaRight );
       
  1370             textRegion->RemoveAttribute( KSMILWRParaHeight );
       
  1371             textRegion->RemoveAttribute( KSMILWRParaWidth );
       
  1372             }
       
  1373         if ( imageRegion )
       
  1374             {
       
  1375             imageRegion->RemoveAttribute( KSMILWRParaFit );
       
  1376             imageRegion->RemoveAttribute( KSMILWRParaTop );
       
  1377             imageRegion->RemoveAttribute( KSMILWRParaLeft );
       
  1378             imageRegion->RemoveAttribute( KSMILWRParaBottom );
       
  1379             imageRegion->RemoveAttribute( KSMILWRParaRight );
       
  1380             imageRegion->RemoveAttribute( KSMILWRParaHeight );
       
  1381             imageRegion->RemoveAttribute( KSMILWRParaWidth );
       
  1382             }
       
  1383 
       
  1384         CreateLayoutL( aDom, head, rootLayout, layout, textRegion, imageRegion );
       
  1385         retVal = ETrue;
       
  1386         }
       
  1387     return retVal;
       
  1388     }
       
  1389 
       
  1390 // ---------------------------------------------------------
       
  1391 // CUniSmilModel::CorrectTimingL
       
  1392 // 
       
  1393 // ---------------------------------------------------------
       
  1394 EXPORT_C TBool CUniSmilModel::CorrectTimingL( CMDXMLDocument* aDom )
       
  1395     {
       
  1396     if ( aDom )
       
  1397         {
       
  1398         CMDXMLElement* body = static_cast<CMDXMLElement*>( GetNode( aDom, KSMILWREleBody ) );
       
  1399         if ( !body )
       
  1400             {
       
  1401             // No body. Nothing to do without composing
       
  1402             // SMIL from scratch.
       
  1403             return EFalse;
       
  1404             }
       
  1405         
       
  1406         if ( body && body->FirstChild() )
       
  1407             {
       
  1408             // Only one slide in the message since no <par> tag found
       
  1409             if ( body->FirstChild()->NodeName().Compare( KSMILWRElePar ) != 0 &&
       
  1410                  !body->FirstChild()->NextSibling() )
       
  1411                 {
       
  1412                 // Correct slide timing to the one and only slide
       
  1413                 CorrectSlideTimingL( body );
       
  1414                 }
       
  1415             // Other node types than <par> not possible as this is MMS SMIL.
       
  1416             else
       
  1417                 {
       
  1418                 // Traverse through every page
       
  1419                 CMDXMLNode* page = body->FirstChild();
       
  1420                 
       
  1421                 while ( page != NULL )
       
  1422                     {
       
  1423                     if ( page->NodeName().Compare( KSMILWRElePar ) == 0 &&
       
  1424                          page->NodeType() == CMDXMLNode::EElementNode )
       
  1425                         {
       
  1426                         CMDXMLElement* pageElement = static_cast<CMDXMLElement*>( page );
       
  1427                         if ( !TimingSpecified( pageElement ) )
       
  1428                             {
       
  1429                             CorrectSlideTimingL( pageElement );
       
  1430                             }
       
  1431                         }
       
  1432                     // Go to next page.
       
  1433                     page = page->NextSibling();
       
  1434                     }
       
  1435                 }
       
  1436             }
       
  1437         }
       
  1438         
       
  1439     return ETrue;
       
  1440     }
       
  1441 
       
  1442 // ---------------------------------------------------------
       
  1443 // CUniSmilModel::IsSupportedMediaType
       
  1444 // 
       
  1445 // ---------------------------------------------------------
       
  1446 EXPORT_C TBool CUniSmilModel::IsSupportedMediaType( TMsgMediaType aMediaType ) const
       
  1447     {
       
  1448     if ( aMediaType == EMsgMediaAudio || 
       
  1449          aMediaType == EMsgMediaImage ||
       
  1450          aMediaType == EMsgMediaSvg ||
       
  1451          aMediaType == EMsgMediaXhtml ||
       
  1452          aMediaType == EMsgMediaVideo ||
       
  1453          aMediaType == EMsgMediaText )
       
  1454         {
       
  1455         return ETrue;
       
  1456         }
       
  1457     else
       
  1458         {
       
  1459         return EFalse;
       
  1460         }
       
  1461     }
       
  1462 
       
  1463 
       
  1464 // ---------------------------------------------------------
       
  1465 // CUniSmilModel::CreateLayoutL
       
  1466 // 
       
  1467 // ---------------------------------------------------------
       
  1468 void CUniSmilModel::CreateLayoutL( CMDXMLDocument* aDom,
       
  1469                                   CMDXMLElement* aRoot,
       
  1470                                   CMDXMLElement* aRootLayout,
       
  1471                                   CMDXMLElement* aLayout,
       
  1472                                   CMDXMLElement* aTextRegion,
       
  1473                                   CMDXMLElement* aImageRegion )
       
  1474     {
       
  1475 
       
  1476     TPtrC name( KSMILWREleLayout );
       
  1477     // Create Layout node
       
  1478     if ( !aLayout )
       
  1479         {
       
  1480         aLayout = CMDXMLElement::NewLC( ETrue, aDom, name );
       
  1481         // Append Layout in Head
       
  1482         aRoot->InsertBefore( NULL, aLayout );
       
  1483         CleanupStack::Pop(); // layout
       
  1484         }
       
  1485 
       
  1486     // Do we have images and text-objects on a slide with other media objects and
       
  1487     // do we have any video
       
  1488     TInt hasVideo( 0 );
       
  1489     TInt hasImage( 0 );
       
  1490     TInt hasText( 0 );
       
  1491     
       
  1492     // Do we have media, which is alone on a slide? Also calculate how medias are alone on a slide.
       
  1493     // Video overrides any image region, it is not needed
       
  1494     TInt hasImageOneAndOnly( 0 );
       
  1495     TInt hasTextOneAndOnly( 0 );
       
  1496 
       
  1497     for( TInt i = 0; i < iSlideArray->Count(); i++ )
       
  1498         {
       
  1499         CUniSmilSlide* s = iSlideArray->At( i );
       
  1500         TBool hasVideoOnThisSlide = EFalse;
       
  1501         TBool hasImageOnThisSlide = EFalse;
       
  1502         TBool hasTextOnThisSlide = EFalse;
       
  1503 
       
  1504         CUniObject* imageRegionObj = s->GetObject( EUniRegionImage );
       
  1505         if ( imageRegionObj )
       
  1506             {
       
  1507             if ( imageRegionObj->MediaType() == EMsgMediaVideo )
       
  1508                 {
       
  1509                 hasVideoOnThisSlide = ETrue;
       
  1510                 hasVideo++;
       
  1511                 }
       
  1512             else
       
  1513                 {
       
  1514                 hasImageOnThisSlide = ETrue;
       
  1515                 hasImage++;
       
  1516                 }
       
  1517             }
       
  1518         if ( s->GetObject( EUniRegionText ) )
       
  1519             {
       
  1520             hasTextOnThisSlide = ETrue;
       
  1521             hasText++;
       
  1522             }
       
  1523             
       
  1524         if (    !hasVideoOnThisSlide
       
  1525             &&  hasImageOnThisSlide 
       
  1526             &&  !hasTextOnThisSlide )
       
  1527             {
       
  1528             hasImageOneAndOnly++;
       
  1529             }
       
  1530         if (    !hasVideoOnThisSlide
       
  1531             &&  !hasImageOnThisSlide 
       
  1532             &&  hasTextOnThisSlide )
       
  1533             {
       
  1534             hasTextOneAndOnly++;
       
  1535             }
       
  1536         }
       
  1537         
       
  1538     // we know:
       
  1539     // how many media objects of each type there are totally in the message and
       
  1540     // whether some regions have alone on a slide
       
  1541     // we conclude:
       
  1542     // if a media object has been alone on the slide and there is 
       
  1543     // only one media object in the whole message
       
  1544     // or if there are several images without other content or several texts on several slides
       
  1545     // without other content then the media object is alone on a slide
       
  1546     // and is only one of its type in the message
       
  1547     // but: video is exception. It handling is ignored here. Following big if() statement handles it
       
  1548     // by handling video before exception case resolved 
       
  1549     if ( hasImageOneAndOnly == hasImage )
       
  1550         {
       
  1551         // image does not occur with some other region
       
  1552         hasImage = 0;
       
  1553         }
       
  1554     else
       
  1555         {
       
  1556         // image occurs with some other region on some slide
       
  1557         hasImageOneAndOnly = 0;
       
  1558         }
       
  1559 
       
  1560     if ( hasTextOneAndOnly ==  hasText )
       
  1561         {
       
  1562         // text does not occur with some other region
       
  1563         hasText = 0;
       
  1564         }
       
  1565     else
       
  1566         {
       
  1567         // text occurs with some other region on some slide
       
  1568         hasTextOneAndOnly = 0;
       
  1569         }
       
  1570     
       
  1571 
       
  1572     TBool isLandscape( Layout_Meta_Data::IsLandscapeOrientation() );
       
  1573     
       
  1574     TBool useSubQCIF( EFalse);
       
  1575     
       
  1576     TRect appWin;
       
  1577     AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EApplicationWindow, appWin );
       
  1578     TAknLayoutRect mainPane;
       
  1579     
       
  1580     if ( isLandscape )
       
  1581         {
       
  1582         mainPane.LayoutRect(
       
  1583             appWin,
       
  1584             AknLayoutScalable_Apps::main_pane( 4 ).LayoutLine() );
       
  1585         }
       
  1586     else
       
  1587         {
       
  1588         mainPane.LayoutRect(
       
  1589             appWin,
       
  1590             AknLayoutScalable_Apps::main_pane( 6 ).LayoutLine() );
       
  1591         }
       
  1592     
       
  1593     if ( isLandscape &&
       
  1594          appWin.Height() == KSizeLowResWidth &&
       
  1595          appWin.Width() == KSizeLowResHeight )
       
  1596         {
       
  1597         useSubQCIF = ETrue;
       
  1598         }
       
  1599         
       
  1600     TAknLayoutRect smilLayout;
       
  1601     smilLayout.LayoutRect(
       
  1602         mainPane.Rect(),
       
  1603         AknLayoutScalable_Apps::main_smil2_pane().LayoutLine() );
       
  1604     
       
  1605     TAknLayoutRect rootLayout;
       
  1606     TAknLayoutRect textLayout;
       
  1607     TAknLayoutRect imageLayout;
       
  1608     TAknLayoutRect videoLayout;
       
  1609 
       
  1610     // For reader about notation:
       
  1611     //             x + y == x and y are on the different slide
       
  1612     //             x,y == x and y are on the same slide
       
  1613     //             { <item> } item can occur 0 or more times
       
  1614     if ( hasText && hasImage && !hasVideo ) // text, image - no video
       
  1615         {
       
  1616         if ( isLandscape ) // landscape text & image
       
  1617             {
       
  1618             if ( iSlideLayout == EUniTextFirst )
       
  1619                 {
       
  1620                 rootLayout.LayoutRect(
       
  1621                     smilLayout.Rect(),
       
  1622                     AknLayoutScalable_Apps::smil2_root_pane( 4 ).LayoutLine() );
       
  1623                 textLayout.LayoutRect(
       
  1624                     smilLayout.Rect(),
       
  1625                     AknLayoutScalable_Apps::smil2_text_pane( 4 ).LayoutLine() );
       
  1626                 imageLayout.LayoutRect(
       
  1627                     smilLayout.Rect(),
       
  1628                     AknLayoutScalable_Apps::smil2_image_pane( 3 ).LayoutLine() );
       
  1629                 }
       
  1630             else
       
  1631                 {
       
  1632                 rootLayout.LayoutRect(
       
  1633                     smilLayout.Rect(),
       
  1634                     AknLayoutScalable_Apps::smil2_root_pane( 2 ).LayoutLine() );
       
  1635                 textLayout.LayoutRect(
       
  1636                     smilLayout.Rect(),
       
  1637                     AknLayoutScalable_Apps::smil2_text_pane( 2 ).LayoutLine() );                    
       
  1638                 imageLayout.LayoutRect(
       
  1639                     smilLayout.Rect(),
       
  1640                     AknLayoutScalable_Apps::smil2_image_pane( 1 ).LayoutLine() );
       
  1641                 }
       
  1642             }
       
  1643         else // portrait text & image
       
  1644             {
       
  1645             if ( iSlideLayout == EUniTextFirst )
       
  1646                 {
       
  1647 		        // Option 3 in the layout spec
       
  1648                 rootLayout.LayoutRect(
       
  1649                     smilLayout.Rect(),
       
  1650                     AknLayoutScalable_Apps::smil2_root_pane( 3 ).LayoutLine() );
       
  1651                 textLayout.LayoutRect(
       
  1652                     smilLayout.Rect(),
       
  1653                     AknLayoutScalable_Apps::smil2_text_pane( 3 ).LayoutLine() );
       
  1654                 imageLayout.LayoutRect(
       
  1655                     smilLayout.Rect(),
       
  1656                     AknLayoutScalable_Apps::smil2_image_pane( 2 ).LayoutLine() );
       
  1657                 }
       
  1658             else
       
  1659                 {
       
  1660 		        // Option 1
       
  1661                 rootLayout.LayoutRect(
       
  1662                     smilLayout.Rect(),
       
  1663                     AknLayoutScalable_Apps::smil2_root_pane( 1 ).LayoutLine() );
       
  1664                 textLayout.LayoutRect(
       
  1665                     smilLayout.Rect(),
       
  1666                     AknLayoutScalable_Apps::smil2_text_pane( 1 ).LayoutLine() );                    
       
  1667                 imageLayout.LayoutRect(
       
  1668                     smilLayout.Rect(),
       
  1669                     AknLayoutScalable_Apps::smil2_image_pane( 0 ).LayoutLine() );
       
  1670                 }
       
  1671             }
       
  1672         }
       
  1673     else if ( hasText && hasVideo ) // text, video or text, image + video
       
  1674         {
       
  1675         if ( isLandscape && useSubQCIF ) // landscape subQCIF text & video
       
  1676             {
       
  1677             if ( iSlideLayout == EUniTextFirst )
       
  1678                 {
       
  1679                 rootLayout.LayoutRect(
       
  1680                     smilLayout.Rect(),
       
  1681                     AknLayoutScalable_Apps::smil2_root_pane( 13 ).LayoutLine() );
       
  1682                 textLayout.LayoutRect(
       
  1683                     smilLayout.Rect(),
       
  1684                     AknLayoutScalable_Apps::smil2_text_pane( 10 ).LayoutLine() );
       
  1685                 videoLayout.LayoutRect(
       
  1686                     smilLayout.Rect(),
       
  1687                     AknLayoutScalable_Apps::smil2_video_pane( 7 ).LayoutLine() );
       
  1688                 }
       
  1689             else
       
  1690                 {
       
  1691                 rootLayout.LayoutRect(
       
  1692                     smilLayout.Rect(),
       
  1693                     AknLayoutScalable_Apps::smil2_root_pane( 12 ).LayoutLine() );
       
  1694                 textLayout.LayoutRect(
       
  1695                     smilLayout.Rect(),
       
  1696                     AknLayoutScalable_Apps::smil2_text_pane( 9 ).LayoutLine() );
       
  1697                 videoLayout.LayoutRect(
       
  1698                     smilLayout.Rect(),
       
  1699                     AknLayoutScalable_Apps::smil2_video_pane( 6 ).LayoutLine() );
       
  1700                 }
       
  1701             }
       
  1702         else if ( isLandscape && !useSubQCIF ) // landscape QCIF text & video
       
  1703             {
       
  1704             if ( iSlideLayout == EUniTextFirst )
       
  1705                 {
       
  1706                 rootLayout.LayoutRect(
       
  1707                     smilLayout.Rect(),
       
  1708                     AknLayoutScalable_Apps::smil2_root_pane( 10 ).LayoutLine() );
       
  1709                 textLayout.LayoutRect(
       
  1710                     smilLayout.Rect(),
       
  1711                     AknLayoutScalable_Apps::smil2_text_pane( 8 ).LayoutLine() );
       
  1712                 videoLayout.LayoutRect(
       
  1713                     smilLayout.Rect(),
       
  1714                     AknLayoutScalable_Apps::smil2_video_pane( 4 ).LayoutLine() );
       
  1715                 }
       
  1716             else
       
  1717                 {
       
  1718                 rootLayout.LayoutRect(
       
  1719                     smilLayout.Rect(),
       
  1720                     AknLayoutScalable_Apps::smil2_root_pane( 9 ).LayoutLine() );
       
  1721                 textLayout.LayoutRect(
       
  1722                     smilLayout.Rect(),
       
  1723                     AknLayoutScalable_Apps::smil2_text_pane( 7 ).LayoutLine() );
       
  1724                 videoLayout.LayoutRect(
       
  1725                     smilLayout.Rect(),
       
  1726                     AknLayoutScalable_Apps::smil2_video_pane( 3 ).LayoutLine() );
       
  1727                 }
       
  1728             }
       
  1729         else // portrait QCIF text & video
       
  1730             {
       
  1731             if ( iSlideLayout == EUniTextFirst )
       
  1732                 {
       
  1733 		        // Option 8
       
  1734                 rootLayout.LayoutRect(
       
  1735                     smilLayout.Rect(),
       
  1736                     AknLayoutScalable_Apps::smil2_root_pane( 8 ).LayoutLine() );
       
  1737                 textLayout.LayoutRect(
       
  1738                     smilLayout.Rect(),
       
  1739                     AknLayoutScalable_Apps::smil2_text_pane( 6 ).LayoutLine() );
       
  1740                 videoLayout.LayoutRect(
       
  1741                     smilLayout.Rect(),
       
  1742                     AknLayoutScalable_Apps::smil2_video_pane( 2 ).LayoutLine() );
       
  1743                 }
       
  1744             else
       
  1745                 {
       
  1746 		        // Option 6
       
  1747                 rootLayout.LayoutRect(
       
  1748                     smilLayout.Rect(),
       
  1749                     AknLayoutScalable_Apps::smil2_root_pane( 6 ).LayoutLine() );
       
  1750                 textLayout.LayoutRect(
       
  1751                     smilLayout.Rect(),
       
  1752                     AknLayoutScalable_Apps::smil2_text_pane( 5 ).LayoutLine() );
       
  1753                 videoLayout.LayoutRect(
       
  1754                     smilLayout.Rect(),
       
  1755                     AknLayoutScalable_Apps::smil2_video_pane( 0 ).LayoutLine() );
       
  1756                 }
       
  1757             }
       
  1758         }
       
  1759     // cases left:
       
  1760     // - 1) text {+ text} 
       
  1761     // - 2) text {+ text} + video
       
  1762     // - 3) text {+ text} + image { + image }
       
  1763     // - 4) image {+ image} + video, no text 
       
  1764     // - 5) image {+ image}
       
  1765     // - 6) video
       
  1766     // - no visual media content
       
  1767     else if ( hasVideo ) 
       
  1768         {
       
  1769         // 2) 'text {+ text} + video',  4) 'image {+ image} + video, no text' or 6) 'video'        
       
  1770         if ( isLandscape )
       
  1771             {
       
  1772             rootLayout.LayoutRect(
       
  1773                 smilLayout.Rect(),
       
  1774                 AknLayoutScalable_Apps::smil2_root_pane( 11 ).LayoutLine() );
       
  1775             videoLayout.LayoutRect(
       
  1776                 smilLayout.Rect(),
       
  1777                 AknLayoutScalable_Apps::smil2_video_pane( 5 ).LayoutLine() );
       
  1778             }
       
  1779         else
       
  1780             {
       
  1781             // Option 7
       
  1782             rootLayout.LayoutRect(
       
  1783                 smilLayout.Rect(),
       
  1784                 AknLayoutScalable_Apps::smil2_root_pane( 7 ).LayoutLine() );
       
  1785             videoLayout.LayoutRect(
       
  1786                 smilLayout.Rect(),
       
  1787                 AknLayoutScalable_Apps::smil2_video_pane( 1 ).LayoutLine() );
       
  1788             }
       
  1789 
       
  1790         if ( hasTextOneAndOnly ) // + text
       
  1791             {
       
  1792             // Option 0
       
  1793             rootLayout.LayoutRect(
       
  1794                 smilLayout.Rect(),
       
  1795                 AknLayoutScalable_Apps::smil2_root_pane( 0 ).LayoutLine() );
       
  1796             textLayout.LayoutRect(
       
  1797                 smilLayout.Rect(),
       
  1798                 AknLayoutScalable_Apps::smil2_text_pane( 0 ).LayoutLine() );
       
  1799             }
       
  1800 
       
  1801         }
       
  1802     else if (   hasTextOneAndOnly
       
  1803             ||  hasImageOneAndOnly )
       
  1804         {
       
  1805         // 1) text {+ text}, 3) text {+ text} + image { + image ), 5) image {+ image}
       
  1806         if ( hasTextOneAndOnly ) // text
       
  1807             {
       
  1808             // Option 0
       
  1809             rootLayout.LayoutRect(
       
  1810                 smilLayout.Rect(),
       
  1811                 AknLayoutScalable_Apps::smil2_root_pane( 0 ).LayoutLine() );
       
  1812             textLayout.LayoutRect(
       
  1813                 smilLayout.Rect(),
       
  1814                 AknLayoutScalable_Apps::smil2_text_pane( 0 ).LayoutLine() );
       
  1815             }
       
  1816 
       
  1817         // no else - rootLayouts are same
       
  1818         if ( hasImageOneAndOnly ) // image
       
  1819             {
       
  1820             // Option 5
       
  1821             rootLayout.LayoutRect(
       
  1822                 smilLayout.Rect(),
       
  1823                 AknLayoutScalable_Apps::smil2_root_pane( 5 ).LayoutLine() );
       
  1824             imageLayout.LayoutRect(
       
  1825                 smilLayout.Rect(),
       
  1826                 AknLayoutScalable_Apps::smil2_image_pane( 4 ).LayoutLine() );
       
  1827             }
       
  1828         }
       
  1829     else    // empty
       
  1830         {
       
  1831         rootLayout.LayoutRect(
       
  1832             smilLayout.Rect(),
       
  1833             AknLayoutScalable_Apps::smil2_root_pane( 0 ).LayoutLine() );
       
  1834         textLayout.LayoutRect(
       
  1835             smilLayout.Rect(),
       
  1836             AknLayoutScalable_Apps::smil2_text_pane( 0 ).LayoutLine() );        
       
  1837         }
       
  1838 
       
  1839     iSmilParams->iComposeParams->iDisplayHeight = rootLayout.Rect().Height();
       
  1840     iSmilParams->iComposeParams->iDisplayWidth = rootLayout.Rect().Width();
       
  1841 
       
  1842     // it does not matter anymore whether object is alone on the slide.
       
  1843     // Use one variable only in the if() statements
       
  1844     if ( hasImage || hasImageOneAndOnly )
       
  1845         {
       
  1846         hasImage = 1;
       
  1847         }
       
  1848     if ( hasText || hasTextOneAndOnly )
       
  1849         {
       
  1850         hasText = 1;
       
  1851         }
       
  1852 
       
  1853     if ( hasText )
       
  1854         {
       
  1855         iSmilParams->iTextRegionParams->iSize = textLayout.Rect().Size();
       
  1856         iSmilParams->iTextRegionParams->iTopLeft = 
       
  1857             textLayout.Rect().iTl - rootLayout.Rect().iTl;
       
  1858         }
       
  1859     if ( hasImage || hasVideo )
       
  1860         {
       
  1861         if ( hasVideo )
       
  1862             {
       
  1863             iSmilParams->iImageRegionParams->iSize = videoLayout.Rect().Size();
       
  1864             iSmilParams->iImageRegionParams->iTopLeft = 
       
  1865                 videoLayout.Rect().iTl - rootLayout.Rect().iTl;
       
  1866             }
       
  1867         else
       
  1868             {
       
  1869             iSmilParams->iImageRegionParams->iSize = imageLayout.Rect().Size();
       
  1870             iSmilParams->iImageRegionParams->iTopLeft = 
       
  1871                 imageLayout.Rect().iTl - rootLayout.Rect().iTl;
       
  1872             }
       
  1873         }
       
  1874 
       
  1875     // Set Region IDs to defaults
       
  1876     if ( !iImageRegionId.Length() )
       
  1877         {
       
  1878         iImageRegionId.Set( KSMILWRRegIDImage );
       
  1879         }
       
  1880     if ( !iTextRegionId.Length() )
       
  1881         {
       
  1882         iTextRegionId.Set( KSMILWRRegIDText );
       
  1883         }
       
  1884 
       
  1885     // Create root layout
       
  1886     name.Set( KSMILWREleRoot_layout );
       
  1887     TBool rlPop = EFalse;
       
  1888     if ( !aRootLayout )
       
  1889         {
       
  1890         aRootLayout = CMDXMLElement::NewLC( EFalse, aDom, name );
       
  1891         rlPop = ETrue;
       
  1892         }
       
  1893     // Set root layout parameters (attributes)
       
  1894     TBuf16<20> val;
       
  1895     val.Zero();
       
  1896     val.Format( KSmilIntFormat, iSmilParams->iComposeParams->iDisplayWidth );
       
  1897     aRootLayout->SetAttributeL( KSMILWRParaWidth,val );
       
  1898     val.Zero();
       
  1899     val.Format( KSmilIntFormat, iSmilParams->iComposeParams->iDisplayHeight );
       
  1900     aRootLayout->SetAttributeL( KSMILWRParaHeight, val );
       
  1901     if ( rlPop )
       
  1902         {
       
  1903         // Append root layout in Layout
       
  1904         aLayout->AppendChild( aRootLayout );
       
  1905         CleanupStack::Pop( aRootLayout );
       
  1906         }
       
  1907 
       
  1908     // Create Image region (if needed)
       
  1909     name.Set( KSMILWREleRegion );
       
  1910     if ( hasImage || hasVideo )
       
  1911         {
       
  1912         TBool imgPop = EFalse;
       
  1913         if ( !aImageRegion )
       
  1914             {
       
  1915             aImageRegion = CMDXMLElement::NewLC( EFalse, aDom, name );
       
  1916             imgPop = ETrue;
       
  1917             }
       
  1918         // Set Image region attributes
       
  1919         aImageRegion->SetAttributeL( KSMILWRParaId, iImageRegionId );
       
  1920         val.Zero();
       
  1921         val.Format( KSmilIntFormat, iSmilParams->iImageRegionParams->Width() );
       
  1922         aImageRegion->SetAttributeL( KSMILWRParaWidth, val );
       
  1923         val.Zero();
       
  1924         val.Format( KSmilIntFormat, iSmilParams->iImageRegionParams->Height() );
       
  1925         aImageRegion->SetAttributeL( KSMILWRParaHeight, val );
       
  1926         val.Zero();
       
  1927         val.Format( KSmilIntFormat, iSmilParams->iImageRegionParams->Top() );
       
  1928         aImageRegion->SetAttributeL( KSMILWRParaTop, val );
       
  1929         val.Zero();
       
  1930         val.Format( KSmilIntFormat, iSmilParams->iImageRegionParams->Left() );
       
  1931         aImageRegion->SetAttributeL( KSMILWRParaLeft, val );
       
  1932         aImageRegion->SetAttributeL( KSMILWRParaFit, iSmilParams->iImageRegionParams->iFit->Des() );
       
  1933         if ( imgPop )
       
  1934             {
       
  1935             // Append region in Layout
       
  1936             aLayout->AppendChild( aImageRegion ); // Ownership to dom
       
  1937             CleanupStack::Pop( aImageRegion );
       
  1938             }
       
  1939         }
       
  1940 
       
  1941     // Create Text region (if needed)
       
  1942     if ( hasText )
       
  1943         {
       
  1944         TBool txtPop = EFalse;
       
  1945         if ( !aTextRegion )
       
  1946             {
       
  1947             aTextRegion = CMDXMLElement::NewLC( EFalse, aDom, name );
       
  1948             txtPop = ETrue;
       
  1949             }
       
  1950         // Set Text region attributes
       
  1951         aTextRegion->SetAttributeL( KSMILWRParaId, iTextRegionId );
       
  1952         val.Zero();
       
  1953         val.Format( KSmilIntFormat, iSmilParams->iTextRegionParams->Width() );
       
  1954         aTextRegion->SetAttributeL( KSMILWRParaWidth, val );
       
  1955         val.Zero();
       
  1956         val.Format( KSmilIntFormat, iSmilParams->iTextRegionParams->Height() );
       
  1957         aTextRegion->SetAttributeL( KSMILWRParaHeight, val );
       
  1958         val.Zero();
       
  1959         val.Format( KSmilIntFormat, iSmilParams->iTextRegionParams->Top() );
       
  1960         aTextRegion->SetAttributeL( KSMILWRParaTop, val );
       
  1961         val.Zero();
       
  1962         val.Format( KSmilIntFormat, iSmilParams->iTextRegionParams->Left() );
       
  1963         aTextRegion->SetAttributeL( KSMILWRParaLeft, val );
       
  1964         aTextRegion->SetAttributeL( KSMILWRParaFit, iSmilParams->iTextRegionParams->iFit->Des() );
       
  1965         if ( txtPop )
       
  1966             {
       
  1967             // Append region in Layout
       
  1968             aLayout->AppendChild( aTextRegion ); // Ownership to dom
       
  1969             CleanupStack::Pop( aTextRegion );
       
  1970             }
       
  1971         }
       
  1972     }
       
  1973 
       
  1974 // ---------------------------------------------------------
       
  1975 // CUniSmilModel::CreateBodyL
       
  1976 // 
       
  1977 // ---------------------------------------------------------
       
  1978 void CUniSmilModel::CreateBodyL( CMDXMLDocument* aDom, CMDXMLElement* aRoot )
       
  1979     {
       
  1980     TPtrC name( KSMILWREleBody );
       
  1981     // Create Body node
       
  1982     CMDXMLElement* body = CMDXMLElement::NewLC( ETrue, aDom, name );
       
  1983     // Append
       
  1984     aRoot->AppendChild( body );
       
  1985     CleanupStack::Pop( body );
       
  1986 
       
  1987     // For each slide
       
  1988     for( TInt slide = 0; slide < iSlideArray->Count(); slide++ )
       
  1989         {
       
  1990         // Create par
       
  1991         CreateParL( aDom, body, slide );
       
  1992         }
       
  1993 
       
  1994     }
       
  1995 
       
  1996 // ---------------------------------------------------------
       
  1997 // CUniSmilModel::CreateParL
       
  1998 // 
       
  1999 // ---------------------------------------------------------
       
  2000 void CUniSmilModel::CreateParL( CMDXMLDocument* aDom, CMDXMLElement* aRoot, TInt aSlide )
       
  2001     {
       
  2002     TPtrC name( KSMILWRElePar );
       
  2003     // Create par node
       
  2004     CMDXMLElement* ele = CMDXMLElement::NewLC( ETrue, aDom, name );
       
  2005     // Append
       
  2006 
       
  2007     // Get default page duration.
       
  2008     TInt slideDur = iSmilParams->iComposeParams->iSlideDuration;
       
  2009     TInt objDur = 0;
       
  2010     TBool unresolvedDur = EFalse;
       
  2011 
       
  2012     CUniSmilSlide* s = iSlideArray->At( aSlide );
       
  2013 
       
  2014     // For each object in slide
       
  2015     for ( TInt i = s->ObjectCount(); --i >= 0; )
       
  2016         {
       
  2017         // Create Item
       
  2018         CUniObject* obj = s->GetObjectByIndex( i );
       
  2019         objDur = CreateItemL( aDom, ele, obj );
       
  2020         if ( !obj->MediaInfo()->Parsed() &&
       
  2021             ( obj->MediaType() == EMsgMediaAudio ||
       
  2022             obj->MediaType() == EMsgMediaVideo ) )
       
  2023             {
       
  2024             unresolvedDur = ETrue;
       
  2025             }
       
  2026         else 
       
  2027             {
       
  2028             slideDur = Max( slideDur, objDur );
       
  2029             }
       
  2030         }
       
  2031 
       
  2032     if ( !unresolvedDur )
       
  2033         {
       
  2034         TBuf16<20> val;
       
  2035         val.Zero();
       
  2036         val.Format( KSmilMsecFormat, slideDur );
       
  2037 
       
  2038         // Set par attributes
       
  2039         ele->SetAttributeL( KSMILWRParaDur, val );
       
  2040         }
       
  2041     aRoot->AppendChild( ele ); // Ownership to dom
       
  2042     CleanupStack::Pop( ele );
       
  2043     }
       
  2044 
       
  2045 // ---------------------------------------------------------
       
  2046 // CUniSmilModel::CreateItemL
       
  2047 // 
       
  2048 // ---------------------------------------------------------
       
  2049 TInt CUniSmilModel::CreateItemL( CMDXMLDocument* aDom, CMDXMLElement* aRoot, CUniObject* aObj )
       
  2050     {
       
  2051     CMDXMLElement* ele = NULL;
       
  2052     TPtrC name( KNullDesC );
       
  2053 
       
  2054     // Create mediaobject node
       
  2055     switch ( aObj->Region() )
       
  2056         {
       
  2057         case EUniRegionImage:
       
  2058             {
       
  2059             if ( aObj->MediaType() == EMsgMediaVideo )
       
  2060                 {
       
  2061                 name.Set( KSMILWREleVideo );
       
  2062                 ele = CMDXMLElement::NewLC( EFalse, aDom, name );
       
  2063                 ele->SetAttributeL( KSMILWRParaRegion, KSMILWRRegIDImage );
       
  2064                 }
       
  2065             else
       
  2066                 {
       
  2067                 // Considered an image - includes also SVG
       
  2068                 name.Set( KSMILWREleImg );
       
  2069                 ele = CMDXMLElement::NewLC( EFalse, aDom, name );
       
  2070                 ele->SetAttributeL( KSMILWRParaRegion, KSMILWRRegIDImage );
       
  2071                 }
       
  2072             }
       
  2073             break;
       
  2074         case EUniRegionText:
       
  2075             {
       
  2076             name.Set( KSMILWREleText );
       
  2077             ele = CMDXMLElement::NewLC( EFalse, aDom, name );
       
  2078             ele->SetAttributeL( KSMILWRParaRegion, KSMILWRRegIDText );
       
  2079             }
       
  2080             break;
       
  2081         case EUniRegionAudio:
       
  2082             {
       
  2083             name.Set( KSMILWREleAudio );
       
  2084             ele = CMDXMLElement::NewLC( EFalse, aDom, name );
       
  2085             }
       
  2086             break;
       
  2087         default:
       
  2088             {
       
  2089             User::Leave( KErrNotSupported );
       
  2090             }
       
  2091         }
       
  2092 
       
  2093     // Set MediaObject node attributes
       
  2094     ele->SetAttributeL( KSMILWRParaSrc, aObj->MimeInfo()->ContentLocation() );
       
  2095     
       
  2096     // Append
       
  2097     aRoot->AppendChild( ele ); // Ownership to dom
       
  2098     CleanupStack::Pop( ele );
       
  2099 
       
  2100     return aObj->MediaInfo()->Duration();
       
  2101     }
       
  2102 
       
  2103 // ---------------------------------------------------------
       
  2104 // CUniSmilModel::GetMediaElemRegionIDs
       
  2105 // 
       
  2106 // ---------------------------------------------------------
       
  2107 void CUniSmilModel::GetMediaElemRegionIDs( CMDXMLNode* aPage )
       
  2108     {
       
  2109     CMDXMLNode* txtEle = NULL;
       
  2110     CMDXMLNode* imgEle = NULL;
       
  2111     CMDXMLNode* obj = aPage->FirstChild();
       
  2112 
       
  2113     // Traverse through every object in page.
       
  2114     while ( obj )
       
  2115         {
       
  2116         if( UniSmilUtils::IsMediaElem( obj ) )
       
  2117             {
       
  2118             TMsgMediaType type = UniSmilUtils::MediaElemType( obj );
       
  2119             switch ( type )
       
  2120                 {
       
  2121                 case EMsgMediaImage:
       
  2122                 case EMsgMediaVideo:
       
  2123                     imgEle = obj;
       
  2124                     break;
       
  2125 
       
  2126                 case EMsgMediaText:
       
  2127                 case EMsgMediaXhtml:
       
  2128                     txtEle = obj;
       
  2129                     break;
       
  2130 
       
  2131                 // TODO: REF
       
  2132                 default:
       
  2133                     break;
       
  2134                 }
       
  2135             }
       
  2136         obj = obj->NextSibling();
       
  2137         }
       
  2138 
       
  2139     // Resolve ID:s
       
  2140     if ( !iTextRegionId.Length() && txtEle )
       
  2141         {
       
  2142         UniSmilUtils::GetRegionId( txtEle, iTextRegionId );
       
  2143         }
       
  2144     if ( !iImageRegionId.Length() && imgEle )
       
  2145         {
       
  2146         UniSmilUtils::GetRegionId( imgEle, iImageRegionId );
       
  2147         }
       
  2148     }
       
  2149 
       
  2150 // ---------------------------------------------------------
       
  2151 // CUniSmilModel::GetLayoutElements
       
  2152 // 
       
  2153 // ---------------------------------------------------------
       
  2154 void CUniSmilModel::GetLayoutElements( CMDXMLNode* aLayout,
       
  2155                                        CMDXMLElement*& aRlEle,
       
  2156                                        CMDXMLElement*& aTxtEle,
       
  2157                                        CMDXMLElement*& aImgEle )
       
  2158     {
       
  2159     if ( !aLayout )
       
  2160         {
       
  2161         return;
       
  2162         }
       
  2163 
       
  2164     TPtrC value( KNullDesC );
       
  2165     CMDXMLNode* node = aLayout->FirstChild();
       
  2166     
       
  2167     // Search REGIONS & RootLayout
       
  2168     while ( node )
       
  2169         {
       
  2170         // REGION PARAMETERS
       
  2171         if ( node->NodeName().CompareF( KSMILWREleRegion ) == 0 )
       
  2172             {
       
  2173             
       
  2174             //UniSmilUtils::GetRegionId( node, value );
       
  2175             if( ((CMDXMLElement*) node)->IsAttributeSpecified( KSMILWRParaId ) )
       
  2176                 {
       
  2177                 ((CMDXMLElement*) node)->GetAttribute( KSMILWRParaId, value );
       
  2178                 }
       
  2179             else
       
  2180                 {
       
  2181                 value.Set( KNullDesC );
       
  2182                 }
       
  2183             
       
  2184             // IMAGE REGION
       
  2185             if ( value.CompareF( iImageRegionId ) == 0 )
       
  2186                 {
       
  2187                 aImgEle = (CMDXMLElement*) node;
       
  2188                 }
       
  2189             
       
  2190             // TEXT REGION
       
  2191             else if ( value.CompareF( iTextRegionId ) == 0 )
       
  2192                 {
       
  2193                 aTxtEle = (CMDXMLElement*) node;
       
  2194                 }
       
  2195             
       
  2196             }
       
  2197         else if ( node->NodeName().CompareF( KSMILWREleRoot_layout ) == 0 )
       
  2198             {
       
  2199             aRlEle = (CMDXMLElement*) node;
       
  2200             }
       
  2201         
       
  2202         node = node->NextSibling();
       
  2203         
       
  2204         }
       
  2205     }
       
  2206 
       
  2207 // ---------------------------------------------------------
       
  2208 // CUniSmilModel::GetMmsSmilLayout
       
  2209 // 
       
  2210 // ---------------------------------------------------------
       
  2211 TUniLayout CUniSmilModel::GetMmsSmilLayout( CMDXMLDocument* aDom )
       
  2212     {
       
  2213     TUniLayout rval = EUniUndefinedLayout;
       
  2214 
       
  2215     iTextRegionId.Set( KNullDesC );
       
  2216     iImageRegionId.Set( KNullDesC );
       
  2217 
       
  2218     // --------------------------------------------
       
  2219     // Resolve region IDs used in media elements
       
  2220     // --------------------------------------------
       
  2221     CMDXMLNode* node = GetNode( aDom, KSMILWREleBody );
       
  2222     if ( !node )
       
  2223         {
       
  2224         return rval;
       
  2225         }
       
  2226 
       
  2227     // Only one slide in the message since no <par> tag found
       
  2228     // Other node types than <par> not possible as this is MMS SMIL.
       
  2229     if ( node->FirstChild() )
       
  2230         {
       
  2231         if ( node->FirstChild()->NodeName().CompareF( KSMILWRElePar ) != 0 )
       
  2232             {
       
  2233             GetMediaElemRegionIDs( node );
       
  2234             }
       
  2235         else
       
  2236             {
       
  2237             CMDXMLNode* page = node->FirstChild();
       
  2238             while ( page )
       
  2239                 {
       
  2240                 GetMediaElemRegionIDs( page );
       
  2241 
       
  2242                 // Go to next page.
       
  2243                 page = page->NextSibling();
       
  2244                 }
       
  2245             }
       
  2246         }
       
  2247 
       
  2248     // -------------------------------------
       
  2249     // Search layout elements
       
  2250     // -------------------------------------
       
  2251     node = GetNode( aDom, KSMILWREleLayout );
       
  2252     CMDXMLElement* rootLayout = NULL;
       
  2253     CMDXMLElement* textRegion = NULL;
       
  2254     CMDXMLElement* imageRegion = NULL;
       
  2255     GetLayoutElements( node, rootLayout, textRegion, imageRegion );
       
  2256 
       
  2257     // ------------------------------
       
  2258     // Resolve Root Layout
       
  2259     // ------------------------------
       
  2260     TSize rootSize( 0, 0 );
       
  2261     GetRootLayoutSize( rootLayout, rootSize );
       
  2262 
       
  2263     // ------------------------------------
       
  2264     // Resolve region parameters
       
  2265     // ------------------------------------
       
  2266     TRect imgRect( 0, 0, 0, 0 );
       
  2267     TRect txtRect( 0, 0, 0, 0 );
       
  2268     GetRegionRect( imageRegion, rootSize, imgRect );
       
  2269     GetRegionRect( textRegion, rootSize, txtRect );
       
  2270 
       
  2271     // ------------------------------------
       
  2272     // Layout decision
       
  2273     // ------------------------------------
       
  2274     if ( textRegion && imageRegion )
       
  2275         {
       
  2276         if( imgRect.iTl.iY < txtRect.iTl.iY )
       
  2277             {
       
  2278             rval =  EUniImageFirst;
       
  2279             }
       
  2280         else if ( imgRect.iTl.iY > txtRect.iTl.iY )
       
  2281             {
       
  2282             rval = EUniTextFirst;
       
  2283             }
       
  2284         else
       
  2285             {
       
  2286             if ( imgRect.iTl.iX <= txtRect.iTl.iX )
       
  2287                 {
       
  2288                 rval = EUniImageFirst;
       
  2289                 }
       
  2290             else
       
  2291                 {
       
  2292                 rval = EUniTextFirst;
       
  2293                 }
       
  2294             }
       
  2295         }
       
  2296     else if ( textRegion )
       
  2297         {
       
  2298         rval = EUniTextFirst;
       
  2299         }
       
  2300     else // if ( iImgEle ) or none
       
  2301         {
       
  2302         rval = EUniImageFirst;
       
  2303         }
       
  2304 
       
  2305     return rval;
       
  2306 
       
  2307     }
       
  2308 
       
  2309 // ---------------------------------------------------------
       
  2310 // CUniSmilModel::GetRootLayoutSize
       
  2311 // 
       
  2312 // ---------------------------------------------------------
       
  2313 
       
  2314 void CUniSmilModel::GetRootLayoutSize( CMDXMLElement* aRl, TSize& aSize )
       
  2315     {
       
  2316     TPtrC value( KNullDesC );
       
  2317 
       
  2318     if ( aRl )
       
  2319         {
       
  2320         if( aRl->IsAttributeSpecified( KSMILWRParaWidth ) )
       
  2321             {
       
  2322             aRl->GetAttribute( KSMILWRParaWidth, value );
       
  2323             aSize.iWidth = UniSmilUtils::StringToIntValue( value, 0 );
       
  2324             }
       
  2325         else
       
  2326             {
       
  2327             aSize.iWidth = iScreenSize.iWidth;
       
  2328             }
       
  2329         
       
  2330         if( aRl->IsAttributeSpecified( KSMILWRParaHeight ) )
       
  2331             {
       
  2332             aRl->GetAttribute( KSMILWRParaHeight, value );
       
  2333             aSize.iHeight = UniSmilUtils::StringToIntValue( value, 0 );
       
  2334             }
       
  2335         else
       
  2336             {
       
  2337             aSize.iHeight = iScreenSize.iHeight;
       
  2338             }
       
  2339         }
       
  2340     else
       
  2341         {
       
  2342         aSize = iScreenSize;
       
  2343         }
       
  2344     }
       
  2345 
       
  2346 // ---------------------------------------------------------
       
  2347 // CUniSmilModel::GetRegionRect
       
  2348 // 
       
  2349 // ---------------------------------------------------------
       
  2350 
       
  2351 void CUniSmilModel::GetRegionRect( CMDXMLElement* aRegion, TSize aRoot, TRect& aRect )
       
  2352     {
       
  2353     TPtrC value;
       
  2354 
       
  2355     TInt width = 0;
       
  2356     TInt height = 0;
       
  2357 
       
  2358     if ( aRegion )
       
  2359         {
       
  2360         if( aRegion->IsAttributeSpecified( KSMILWRParaWidth ) )
       
  2361             {
       
  2362             aRegion->GetAttribute( KSMILWRParaWidth, value );
       
  2363             width = UniSmilUtils::StringToIntValue( value, 0 ) ;
       
  2364             if ( value.Locate( '%' ) != KErrNotFound )
       
  2365                 {
       
  2366                 width = width * aRoot.iWidth / 100;
       
  2367                 }
       
  2368             }
       
  2369         
       
  2370         if( aRegion->IsAttributeSpecified( KSMILWRParaHeight ) )
       
  2371             {
       
  2372             aRegion->GetAttribute( KSMILWRParaHeight, value );
       
  2373             height = UniSmilUtils::StringToIntValue( value, 0 ) ;
       
  2374             if ( value.Locate( '%' ) != KErrNotFound )
       
  2375                 {
       
  2376                 height = height * aRoot.iHeight / 100;
       
  2377                 }
       
  2378             }
       
  2379 
       
  2380         if( aRegion->IsAttributeSpecified( KSMILWRParaTop ) )
       
  2381             {
       
  2382             aRegion->GetAttribute( KSMILWRParaTop, value );
       
  2383             aRect.iTl.iY = UniSmilUtils::StringToIntValue( value, 0 );
       
  2384             if ( value.Locate( '%' ) != KErrNotFound )
       
  2385                 {
       
  2386                 aRect.iTl.iY = aRect.iTl.iY * aRoot.iHeight / 100;
       
  2387                 }
       
  2388             }
       
  2389         else
       
  2390             {
       
  2391             aRect.iTl.iY = 0;
       
  2392             }
       
  2393 
       
  2394         if( aRegion->IsAttributeSpecified( KSMILWRParaLeft ) )
       
  2395             {
       
  2396             aRegion->GetAttribute( KSMILWRParaLeft, value );
       
  2397             aRect.iTl.iX = UniSmilUtils::StringToIntValue( value, 0 );
       
  2398             if ( value.Locate( '%' ) != KErrNotFound )
       
  2399                 {
       
  2400                 aRect.iTl.iX = aRect.iTl.iX * aRoot.iWidth / 100;
       
  2401                 }
       
  2402             }
       
  2403         else
       
  2404             {
       
  2405             aRect.iTl.iX = 0;
       
  2406             }
       
  2407 
       
  2408         aRect.iBr.iY = aRect.iTl.iY + height;
       
  2409         aRect.iBr.iX = aRect.iTl.iX + width;
       
  2410 
       
  2411         }
       
  2412     else
       
  2413         {
       
  2414         aRect = TRect( 0, 0, 0, 0 );
       
  2415         }
       
  2416     }
       
  2417 
       
  2418 // ---------------------------------------------------------
       
  2419 // CUniSmilModel::GetRegionType
       
  2420 // ---------------------------------------------------------
       
  2421 //
       
  2422 TUniRegion CUniSmilModel::GetRegionType( CMDXMLNode* aNodePtr ) 
       
  2423     {
       
  2424     if ( iImageRegionId.CompareF( iTextRegionId ) == 0 )
       
  2425         {
       
  2426         // Image and text regions are the same!
       
  2427         // Literally taken this is agains MMS SMIL, but
       
  2428         // we should still tolerate it.
       
  2429         iParseResult |= ETextAndImageRegionsSame;
       
  2430         return EUniRegionUnresolved;
       
  2431         }
       
  2432     TPtrC regId;
       
  2433     TInt err = UniSmilUtils::GetRegionId( aNodePtr, regId );
       
  2434     if ( !err )
       
  2435         {
       
  2436         if ( regId.CompareF( iImageRegionId ) == 0 )
       
  2437             {
       
  2438             return EUniRegionImage;
       
  2439             }
       
  2440         else if ( regId.CompareF( iTextRegionId ) == 0 )
       
  2441             {
       
  2442             return EUniRegionText;
       
  2443             }
       
  2444         else
       
  2445             {
       
  2446             return EUniRegionUnresolved;
       
  2447             }
       
  2448         }
       
  2449     else
       
  2450         {
       
  2451         return EUniRegionUnresolved;
       
  2452         }
       
  2453     }
       
  2454 
       
  2455 
       
  2456 // ---------------------------------------------------------
       
  2457 // CUniSmilModel::GetNode
       
  2458 // 
       
  2459 // ---------------------------------------------------------
       
  2460 CMDXMLNode* CUniSmilModel::GetNode( CMDXMLDocument* aDom, const TDesC& aName )
       
  2461     {
       
  2462     CMDXMLNode* node = aDom->DocumentElement()->FirstChild();
       
  2463     while ( node )
       
  2464         {
       
  2465         if ( node->NodeName().CompareF( aName ) == 0 )
       
  2466             {
       
  2467             break;
       
  2468             }
       
  2469         else 
       
  2470             {
       
  2471             node = UniSmilUtils::NextNode( node );
       
  2472             }
       
  2473         }
       
  2474     return node;
       
  2475     }
       
  2476 
       
  2477 // ---------------------------------------------------------
       
  2478 // CUniSmilModel::RemoveMetaTagsAndComments
       
  2479 // 
       
  2480 // ---------------------------------------------------------
       
  2481 void CUniSmilModel::RemoveMetaTagsAndComments( CMDXMLDocument* aDom )
       
  2482     {
       
  2483     CMDXMLNode* node = aDom->DocumentElement()->FirstChild();
       
  2484     while ( node )
       
  2485         {
       
  2486         if ( node->NodeType() == CMDXMLNode::ECommentNode ||
       
  2487             node->NodeName().CompareF( KSMILWREleMeta ) == 0 )
       
  2488             {
       
  2489             CMDXMLNode* removeNode = node;
       
  2490             node = removeNode->ParentNode();
       
  2491             /*TInt ignore =*/ node->RemoveChild( removeNode );
       
  2492             delete removeNode;
       
  2493             }
       
  2494         node = UniSmilUtils::NextNode( node );
       
  2495         }
       
  2496     }
       
  2497 
       
  2498 // ---------------------------------------------------------
       
  2499 // CUniSmilModel::CorrectSlideTimingL
       
  2500 // 
       
  2501 // ---------------------------------------------------------
       
  2502 void CUniSmilModel::CorrectSlideTimingL( CMDXMLElement* aPage ) 
       
  2503     {
       
  2504     CMDXMLNode* node = aPage->FirstChild();
       
  2505     
       
  2506     // Traverse through every object in page.
       
  2507     while ( node != NULL )
       
  2508         {
       
  2509         if ( UniSmilUtils::IsMediaElem( node ) )
       
  2510             {
       
  2511             CMDXMLElement* nodeElement = static_cast<CMDXMLElement*>( node );
       
  2512                    
       
  2513             CUniObject* obj = iObjectList.GetByNodeL( node );
       
  2514             
       
  2515             if( !obj ||
       
  2516                 !obj->MediaInfo() ||
       
  2517                 obj->MediaInfo()->Duration() != 0 ||
       
  2518                 TimingSpecified( nodeElement ) )
       
  2519                 {
       
  2520                 // Return as non-static media was found from the page.
       
  2521                 return;
       
  2522                 }
       
  2523             else if ( nodeElement->IsAttributeSpecified( KSMILWRParaBegin ) )
       
  2524                 {
       
  2525                 // Remove invalid Begin element since no End or Dur attributes is specified.
       
  2526                 nodeElement->RemoveAttribute( KSMILWRParaBegin );
       
  2527                 }
       
  2528             else if ( nodeElement->IsAttributeSpecified( KSMILWRParaEnd ) )
       
  2529                 {
       
  2530                 // Remove invalid End element since no Begin or Dur attributes is specified.
       
  2531                 nodeElement->RemoveAttribute( KSMILWRParaEnd );
       
  2532                 }
       
  2533             }
       
  2534             
       
  2535         node = node->NextSibling();
       
  2536         }
       
  2537     
       
  2538     // Read default smil parameters
       
  2539     if ( !iSmilParams )
       
  2540         {
       
  2541         iSmilParams = CUniSmilParams::NewL( iFs );
       
  2542         }
       
  2543             
       
  2544     TBuf16<20> defaultVal;
       
  2545     defaultVal.Zero();
       
  2546     defaultVal.Format( KSmilMsecFormat, iSmilParams->iComposeParams->iSlideDuration );
       
  2547    
       
  2548     aPage->SetAttributeL( KSMILWRParaDur, defaultVal );
       
  2549     }
       
  2550     
       
  2551 // ---------------------------------------------------------
       
  2552 // CUniSmilModel::TimingSpecified
       
  2553 // 
       
  2554 // ---------------------------------------------------------
       
  2555 TBool CUniSmilModel::TimingSpecified( CMDXMLElement* aNodePrt )
       
  2556     {
       
  2557     TBool result( EFalse );
       
  2558     
       
  2559     // Timing is set if dur or begin & end parameters are found
       
  2560     if ( aNodePrt &&
       
  2561          ( aNodePrt->IsAttributeSpecified( KSMILWRParaDur ) ||
       
  2562            ( aNodePrt->IsAttributeSpecified( KSMILWRParaBegin ) &&
       
  2563              aNodePrt->IsAttributeSpecified( KSMILWRParaEnd ) ) ) )
       
  2564             {
       
  2565             result = ETrue;
       
  2566             }
       
  2567             
       
  2568     return result;
       
  2569     }
       
  2570 
       
  2571 // End of file