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