svgtopt/SVG/SVGImpl/src/SVGDocumentImpl.cpp
author hgs
Wed, 03 Nov 2010 18:56:10 +0200
changeset 46 88edb906c587
permissions -rw-r--r--
201044
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  SVG Implementation source file
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include <utf.h>
hgs
parents:
diff changeset
    20
#include <s32mem.h>
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include "SVGContentHandler.h"
hgs
parents:
diff changeset
    23
#include "Svgdecoder.h"
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#include  "SVGDocumentImpl.h"
hgs
parents:
diff changeset
    26
#include  "SVGEngineImpl.h"
hgs
parents:
diff changeset
    27
#include  "SVGSvgElementImpl.h"
hgs
parents:
diff changeset
    28
#include  "SVGLineElementImpl.h"
hgs
parents:
diff changeset
    29
#include  "SVGRectElementImpl.h"
hgs
parents:
diff changeset
    30
#include  "SVGCircleElementImpl.h"
hgs
parents:
diff changeset
    31
#include  "SVGEllipseElementImpl.h"
hgs
parents:
diff changeset
    32
#include  "SVGPolylineElementImpl.h"
hgs
parents:
diff changeset
    33
#include  "SVGGElementImpl.h"
hgs
parents:
diff changeset
    34
#include  "SVGPathElementImpl.h"
hgs
parents:
diff changeset
    35
#include  "SVGMpathElementImpl.h"
hgs
parents:
diff changeset
    36
#include  "SVGSchemaData.h"
hgs
parents:
diff changeset
    37
#include  "SVGTextElementImpl.h"
hgs
parents:
diff changeset
    38
#include  "SVGImageElementImpl.h"
hgs
parents:
diff changeset
    39
#include  "SVGUseElementImpl.h"
hgs
parents:
diff changeset
    40
#include  "SVGAElementImpl.h"
hgs
parents:
diff changeset
    41
#include  "SVGStyleElementImpl.h"
hgs
parents:
diff changeset
    42
#include  "SVGForeignObjectElementImpl.h"
hgs
parents:
diff changeset
    43
#include  "SVGSetElementImpl.h"
hgs
parents:
diff changeset
    44
#include  "SVGAnimateTransformElementImpl.h"
hgs
parents:
diff changeset
    45
#include  "SVGAnimateElementImpl.h"
hgs
parents:
diff changeset
    46
#include  "SVGAnimateMotionElementImpl.h"
hgs
parents:
diff changeset
    47
#include  "SVGAnimationElementImpl.h"
hgs
parents:
diff changeset
    48
#include  "SVGMetadataElementImpl.h"
hgs
parents:
diff changeset
    49
#include  "SVGDescElementImpl.h"
hgs
parents:
diff changeset
    50
#include  "SVGDefsElementImpl.h"
hgs
parents:
diff changeset
    51
#include  "SVGTitleElementImpl.h"
hgs
parents:
diff changeset
    52
#include  "SVGFontElementImpl.h"
hgs
parents:
diff changeset
    53
#include  "SVGFontFaceElementImpl.h"
hgs
parents:
diff changeset
    54
#include  "SVGGlyphElementImpl.h"
hgs
parents:
diff changeset
    55
#include  "SVGMissingGlyphElementImpl.h"
hgs
parents:
diff changeset
    56
#include  "SvgHkernelementimpl.h"
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
#include "SVGLinearGradientElementImpl.h"
hgs
parents:
diff changeset
    59
#include "SVGRadialGradientElementImpl.h"
hgs
parents:
diff changeset
    60
#include "SvgStopElementImpl.h"
hgs
parents:
diff changeset
    61
#include "SVGDiscardElementImpl.h"
hgs
parents:
diff changeset
    62
#include "SVGScriptElementImpl.h"
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
#include "SVGAudioElementImpl.h"
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
//#ifdef RD_SVGT_MEDIAANIMATION_SUPPORT
hgs
parents:
diff changeset
    67
#include "SVGMediaAnimationElementImpl.h"
hgs
parents:
diff changeset
    68
//#endif
hgs
parents:
diff changeset
    69
#include "SVGTextAreaElementImpl.h"
hgs
parents:
diff changeset
    70
#include "SVGSolidColorElementImpl.h"
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
#include "SVGFloatCssValueImpl.h"
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
#include "SVGEventHandler.h"
hgs
parents:
diff changeset
    75
#include "SVGErrorImpl.h"
hgs
parents:
diff changeset
    76
#include "SVGFontHashMap.h"
hgs
parents:
diff changeset
    77
#include "SVGTimeContainer.h"
hgs
parents:
diff changeset
    78
#include <ezgzip.h>
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
#include <caf/caf.h>
hgs
parents:
diff changeset
    81
#include <bautils.h>
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
// ==========================================================================
hgs
parents:
diff changeset
    84
// Need method description
hgs
parents:
diff changeset
    85
// ==========================================================================
hgs
parents:
diff changeset
    86
CSvgDocumentImpl* CSvgDocumentImpl::NewL( CSvgBitmapFontProvider* aSvgBitmapFontProvider, const TBool aHasParent,
hgs
parents:
diff changeset
    87
    const TSvgSyncBehaviour aSyncBehavDefault,
hgs
parents:
diff changeset
    88
    const TInt32 aSyncTolDefault )
hgs
parents:
diff changeset
    89
    {
hgs
parents:
diff changeset
    90
    CSvgDocumentImpl*   self    = new ( ELeave ) CSvgDocumentImpl(aSvgBitmapFontProvider, 
hgs
parents:
diff changeset
    91
        aHasParent, aSyncBehavDefault, aSyncTolDefault );
hgs
parents:
diff changeset
    92
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    93
    self->ConstructL();
hgs
parents:
diff changeset
    94
    CleanupStack::Pop();
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
    return self;
hgs
parents:
diff changeset
    97
    }
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
// ==========================================================================
hgs
parents:
diff changeset
   100
// Need method description
hgs
parents:
diff changeset
   101
// ==========================================================================
hgs
parents:
diff changeset
   102
CSvgDocumentImpl* CSvgDocumentImpl::NewLC( CSvgBitmapFontProvider* aSvgBitmapFontProvider, const TBool aHasParent,
hgs
parents:
diff changeset
   103
    const TSvgSyncBehaviour aSyncBehavDefault,
hgs
parents:
diff changeset
   104
    const TInt32 aSyncTolDefault )
hgs
parents:
diff changeset
   105
    {
hgs
parents:
diff changeset
   106
    CSvgDocumentImpl*   self    = new ( ELeave ) CSvgDocumentImpl(aSvgBitmapFontProvider,
hgs
parents:
diff changeset
   107
        aHasParent, aSyncBehavDefault, aSyncTolDefault );
hgs
parents:
diff changeset
   108
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   109
    self->ConstructL();
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
    return self;
hgs
parents:
diff changeset
   112
    }
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
// ==========================================================================
hgs
parents:
diff changeset
   115
// Need method description
hgs
parents:
diff changeset
   116
// ==========================================================================
hgs
parents:
diff changeset
   117
void CSvgDocumentImpl::ConstructL()
hgs
parents:
diff changeset
   118
    {
hgs
parents:
diff changeset
   119
    iSchemaData = CSvgSchemaData::NewL();
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
    iEventHandler = CSvgEventHandler::NewL();
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
    // create CSvgErrorImpl object
hgs
parents:
diff changeset
   125
//   iSvgError = CSvgErrorImpl::NewL();
hgs
parents:
diff changeset
   126
    iIsInteractive = EFalse;
hgs
parents:
diff changeset
   127
    iHasGroupOpacity = EFalse;
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
//	iImageHashMap = CSvgImageHashMap::NewL();
hgs
parents:
diff changeset
   131
	iFontHashMap = CSvgFontHashMap::NewL();
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
	iMemoryManager = CSvgMemoryManager::NewL();
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
		iTimeForJSR226 = 0;
hgs
parents:
diff changeset
   136
    // Create the time container used for Runtime Sync
hgs
parents:
diff changeset
   137
    iTimeContainer = CSvgTimeContainer::NewL( this, iHasParent );
hgs
parents:
diff changeset
   138
    
hgs
parents:
diff changeset
   139
    // Add to the time container
hgs
parents:
diff changeset
   140
    iTimeContainer->AddTimedEntityL( this );
hgs
parents:
diff changeset
   141
    
hgs
parents:
diff changeset
   142
    //set media state to ready as default for document
hgs
parents:
diff changeset
   143
    iTimeContainer->TimedEntityReady( this );
hgs
parents:
diff changeset
   144
    }
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
// ==========================================================================
hgs
parents:
diff changeset
   147
// Need method description
hgs
parents:
diff changeset
   148
// ==========================================================================
hgs
parents:
diff changeset
   149
CSvgDocumentImpl::CSvgDocumentImpl( CSvgBitmapFontProvider* aSvgBitmapFontProvider, const TBool aHasParent,
hgs
parents:
diff changeset
   150
    const TSvgSyncBehaviour aSyncBehavDefault,
hgs
parents:
diff changeset
   151
    const TInt32 aSyncTolDefault ) : 
hgs
parents:
diff changeset
   152
                                       iInitSortList( ETrue ),
hgs
parents:
diff changeset
   153
                                       iReqExReqFtrSysLTested( EFalse ),
hgs
parents:
diff changeset
   154
                                       iFinishedParsing( EFalse ),
hgs
parents:
diff changeset
   155
                                       iFontHashMap( NULL ),
hgs
parents:
diff changeset
   156
                                       iEngine(NULL),
hgs
parents:
diff changeset
   157
                                       iMultipleRendering( EFalse ),
hgs
parents:
diff changeset
   158
                                       iHasGradientElement( EFalse ),
hgs
parents:
diff changeset
   159
                                       iIsThumbNailMode( EFalse ),
hgs
parents:
diff changeset
   160
                                       iIsDRMProtected( EFalse ),
hgs
parents:
diff changeset
   161
                                       iHasParent( aHasParent ),
hgs
parents:
diff changeset
   162
                                       iSyncBehaviorDefault( 
hgs
parents:
diff changeset
   163
                                        aSyncBehavDefault ),
hgs
parents:
diff changeset
   164
                                       iSyncToleranceDefault( 
hgs
parents:
diff changeset
   165
                                        aSyncTolDefault),
hgs
parents:
diff changeset
   166
                                        iSvgBitmapFontProvider(aSvgBitmapFontProvider)
hgs
parents:
diff changeset
   167
                                                                                        
hgs
parents:
diff changeset
   168
                                        
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
    {
hgs
parents:
diff changeset
   171
    SetDRMMode( ETrue );
hgs
parents:
diff changeset
   172
    SetDRMRights( ETrue );
hgs
parents:
diff changeset
   173
    }
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
// ==========================================================================
hgs
parents:
diff changeset
   176
// Need method description
hgs
parents:
diff changeset
   177
// ==========================================================================
hgs
parents:
diff changeset
   178
CSvgDocumentImpl::~CSvgDocumentImpl()
hgs
parents:
diff changeset
   179
    {
hgs
parents:
diff changeset
   180
    if ( iTimeContainer )
hgs
parents:
diff changeset
   181
       {
hgs
parents:
diff changeset
   182
       // Stop timer and reset time
hgs
parents:
diff changeset
   183
       iTimeContainer->UserStop();
hgs
parents:
diff changeset
   184
       iTimeContainer->UserResetTime();
hgs
parents:
diff changeset
   185
       }
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
    if (iPerfText)
hgs
parents:
diff changeset
   188
    {
hgs
parents:
diff changeset
   189
        delete iPerfText;
hgs
parents:
diff changeset
   190
        iPerfText = NULL;
hgs
parents:
diff changeset
   191
    }
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
    if( iSchemaData )
hgs
parents:
diff changeset
   194
        {
hgs
parents:
diff changeset
   195
        delete iSchemaData;
hgs
parents:
diff changeset
   196
        iSchemaData = NULL;
hgs
parents:
diff changeset
   197
        }
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
    if( iEventHandler )
hgs
parents:
diff changeset
   200
        {
hgs
parents:
diff changeset
   201
        delete iEventHandler;
hgs
parents:
diff changeset
   202
        iEventHandler = NULL ;
hgs
parents:
diff changeset
   203
        }
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
//    if( iSvgError )
hgs
parents:
diff changeset
   206
//        {
hgs
parents:
diff changeset
   207
//        delete iSvgError;
hgs
parents:
diff changeset
   208
//        iSvgError = NULL;
hgs
parents:
diff changeset
   209
//        }
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
    if( iRootElement )
hgs
parents:
diff changeset
   212
        {
hgs
parents:
diff changeset
   213
        delete iRootElement;
hgs
parents:
diff changeset
   214
        iRootElement = NULL;
hgs
parents:
diff changeset
   215
        }
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
/*	if ( iImageHashMap )
hgs
parents:
diff changeset
   218
	{
hgs
parents:
diff changeset
   219
		//probably should check to verify that the image ptrs
hgs
parents:
diff changeset
   220
		//in this have had their images deleted somehow to be safe
hgs
parents:
diff changeset
   221
		delete iImageHashMap;
hgs
parents:
diff changeset
   222
		iImageHashMap = NULL;
hgs
parents:
diff changeset
   223
	} */
hgs
parents:
diff changeset
   224
hgs
parents:
diff changeset
   225
	if ( iFontHashMap )
hgs
parents:
diff changeset
   226
	{
hgs
parents:
diff changeset
   227
		delete iFontHashMap;
hgs
parents:
diff changeset
   228
		iFontHashMap = NULL;
hgs
parents:
diff changeset
   229
	}
hgs
parents:
diff changeset
   230
    iSvgMouseListeners.Close();
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
	iSvgAnimations.Close();
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
    if ( iXmlHandler )
hgs
parents:
diff changeset
   235
        {
hgs
parents:
diff changeset
   236
        delete iXmlHandler;
hgs
parents:
diff changeset
   237
        }
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
    if ( iError )
hgs
parents:
diff changeset
   240
        {
hgs
parents:
diff changeset
   241
        delete iError;
hgs
parents:
diff changeset
   242
        }
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
 	if ( iMemoryManager )
hgs
parents:
diff changeset
   245
 		{
hgs
parents:
diff changeset
   246
 		delete iMemoryManager;
hgs
parents:
diff changeset
   247
    	}
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
    delete iTimeContainer;
hgs
parents:
diff changeset
   250
    }
hgs
parents:
diff changeset
   251
hgs
parents:
diff changeset
   252
// ==========================================================================
hgs
parents:
diff changeset
   253
// Need method description
hgs
parents:
diff changeset
   254
// ==========================================================================
hgs
parents:
diff changeset
   255
void CSvgDocumentImpl::SetEngine( CSvgEngineImpl* aEngine )
hgs
parents:
diff changeset
   256
    {
hgs
parents:
diff changeset
   257
    iEngine = aEngine;
hgs
parents:
diff changeset
   258
    // Propogate this to all child documentsas well
hgs
parents:
diff changeset
   259
    // Only animation elements currently possess a new document
hgs
parents:
diff changeset
   260
    // Locate all the active animation elements
hgs
parents:
diff changeset
   261
    RPointerArray<CSvgElementImpl> lAnimationEleList;
hgs
parents:
diff changeset
   262
    
hgs
parents:
diff changeset
   263
    FindAllElements( 
hgs
parents:
diff changeset
   264
            (CSvgElementImpl* )RootElement(),
hgs
parents:
diff changeset
   265
            KSvgMediaAnimationElement, lAnimationEleList );
hgs
parents:
diff changeset
   266
    // Set the engine on the child documents associated with the animation elements as well
hgs
parents:
diff changeset
   267
    TInt lAnimationEleCnt = lAnimationEleList.Count();
hgs
parents:
diff changeset
   268
    for ( TInt lCurAnimationEle = 0; lCurAnimationEle < lAnimationEleCnt; lCurAnimationEle++ )
hgs
parents:
diff changeset
   269
        {
hgs
parents:
diff changeset
   270
        CSvgMediaAnimationElementImpl* lAnimationElement = 
hgs
parents:
diff changeset
   271
            (CSvgMediaAnimationElementImpl* )lAnimationEleList[ lCurAnimationEle ];
hgs
parents:
diff changeset
   272
        CSvgDocumentImpl* lChildDoc = lAnimationElement->GetChildDocument();
hgs
parents:
diff changeset
   273
        if ( lChildDoc )
hgs
parents:
diff changeset
   274
            {
hgs
parents:
diff changeset
   275
            lChildDoc->SetEngine( aEngine );
hgs
parents:
diff changeset
   276
            }
hgs
parents:
diff changeset
   277
        }
hgs
parents:
diff changeset
   278
    lAnimationEleList.Close();
hgs
parents:
diff changeset
   279
    }
hgs
parents:
diff changeset
   280
hgs
parents:
diff changeset
   281
// ==========================================================================
hgs
parents:
diff changeset
   282
// Need method description
hgs
parents:
diff changeset
   283
// ==========================================================================
hgs
parents:
diff changeset
   284
CSvgEngineImpl* CSvgDocumentImpl::Engine()
hgs
parents:
diff changeset
   285
    {
hgs
parents:
diff changeset
   286
    return iEngine;
hgs
parents:
diff changeset
   287
    }
hgs
parents:
diff changeset
   288
hgs
parents:
diff changeset
   289
//***********************************************************************
hgs
parents:
diff changeset
   290
// From MXmlDocument
hgs
parents:
diff changeset
   291
//
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293
// ==========================================================================
hgs
parents:
diff changeset
   294
// Need method description
hgs
parents:
diff changeset
   295
// ==========================================================================
hgs
parents:
diff changeset
   296
MXmlElement* CSvgDocumentImpl::CreateElementL( const TDesC& aTagName )
hgs
parents:
diff changeset
   297
    {
hgs
parents:
diff changeset
   298
hgs
parents:
diff changeset
   299
    TInt position = iSchemaData->GetSVGElementId(aTagName);
hgs
parents:
diff changeset
   300
hgs
parents:
diff changeset
   301
    if ( position == KErrNotFound )
hgs
parents:
diff changeset
   302
        {
hgs
parents:
diff changeset
   303
        return NULL;
hgs
parents:
diff changeset
   304
        }
hgs
parents:
diff changeset
   305
hgs
parents:
diff changeset
   306
    	return CreateElementL( position );
hgs
parents:
diff changeset
   307
hgs
parents:
diff changeset
   308
    }
hgs
parents:
diff changeset
   309
hgs
parents:
diff changeset
   310
    // ==========================================================================
hgs
parents:
diff changeset
   311
// Need method description
hgs
parents:
diff changeset
   312
// ==========================================================================
hgs
parents:
diff changeset
   313
MXmlElement* CSvgDocumentImpl::CreateElementL(const TUint8 aTagName )
hgs
parents:
diff changeset
   314
    {
hgs
parents:
diff changeset
   315
hgs
parents:
diff changeset
   316
    TInt position = (TInt) aTagName;
hgs
parents:
diff changeset
   317
hgs
parents:
diff changeset
   318
    //##4 this uses the rearrangement of elements, all these elements are same as g element
hgs
parents:
diff changeset
   319
    // same constructor
hgs
parents:
diff changeset
   320
    //
hgs
parents:
diff changeset
   321
    // =====> creating fake G elements to take the place of others...
hgs
parents:
diff changeset
   322
    //
hgs
parents:
diff changeset
   323
    //need to remove G elements as place holders that is a bad idea
hgs
parents:
diff changeset
   324
hgs
parents:
diff changeset
   325
    if( position >= KSvgAltglyphElement && position <= KSvgViewElement )
hgs
parents:
diff changeset
   326
        {
hgs
parents:
diff changeset
   327
        return ( MXmlElement * ) CSvgGElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   328
        }
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
    switch ( position )
hgs
parents:
diff changeset
   331
        {
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
        case KSvgPathElement:
hgs
parents:
diff changeset
   334
            // path
hgs
parents:
diff changeset
   335
            return ( MXmlElement * ) CSvgPathElementImpl::NewL(  (TUint8) position, this );
hgs
parents:
diff changeset
   336
hgs
parents:
diff changeset
   337
        case KSvgStopElement:
hgs
parents:
diff changeset
   338
        	// stop
hgs
parents:
diff changeset
   339
            return ( MXmlElement * ) CSvgStopElementImpl::NewL((TUint8) position,this);
hgs
parents:
diff changeset
   340
hgs
parents:
diff changeset
   341
        case KSvgLinearGradientElement:
hgs
parents:
diff changeset
   342
        	// linearGradient
hgs
parents:
diff changeset
   343
            return ( MXmlElement * ) CSvgLinearGradientElementImpl::NewL((TUint8) position,this);
hgs
parents:
diff changeset
   344
hgs
parents:
diff changeset
   345
        case KSvgRectElement:
hgs
parents:
diff changeset
   346
            // rect
hgs
parents:
diff changeset
   347
            return ( MXmlElement * ) CSvgRectElementImpl::NewL(  (TUint8) position, this );
hgs
parents:
diff changeset
   348
hgs
parents:
diff changeset
   349
        case KSvgPolygonElement:
hgs
parents:
diff changeset
   350
        	// polygon
hgs
parents:
diff changeset
   351
            return ( MXmlElement * ) CSvgPolylineElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   352
hgs
parents:
diff changeset
   353
        case KSvgSvgElement:
hgs
parents:
diff changeset
   354
            // svg
hgs
parents:
diff changeset
   355
            return ( MXmlElement * ) CSvgSvgElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   356
hgs
parents:
diff changeset
   357
        case KSvgRadialGradientElement:
hgs
parents:
diff changeset
   358
        	// radialGradient
hgs
parents:
diff changeset
   359
            return ( MXmlElement * ) CSvgRadialGradientElementImpl::NewL((TUint8) position,this);
hgs
parents:
diff changeset
   360
hgs
parents:
diff changeset
   361
        case KSvgCircleElement:
hgs
parents:
diff changeset
   362
            // circle
hgs
parents:
diff changeset
   363
            return ( MXmlElement * ) CSvgCircleElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   364
hgs
parents:
diff changeset
   365
        case KSvgLineElement:
hgs
parents:
diff changeset
   366
            // line
hgs
parents:
diff changeset
   367
            return ( MXmlElement * ) CSvgLineElementImpl::NewL( (TUint8) position,this );
hgs
parents:
diff changeset
   368
hgs
parents:
diff changeset
   369
        case KSvgPolylineElement:
hgs
parents:
diff changeset
   370
            // polyline
hgs
parents:
diff changeset
   371
            return ( MXmlElement * ) CSvgPolylineElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   372
hgs
parents:
diff changeset
   373
        case KSvgEllipseElement:
hgs
parents:
diff changeset
   374
            // ellipse
hgs
parents:
diff changeset
   375
            return ( MXmlElement * ) CSvgEllipseElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   376
hgs
parents:
diff changeset
   377
        case KSvgDefsElement:
hgs
parents:
diff changeset
   378
			// defs
hgs
parents:
diff changeset
   379
        	return ( MXmlElement * ) CSvgDefsElementImpl::NewL((TUint8) position, this);
hgs
parents:
diff changeset
   380
hgs
parents:
diff changeset
   381
		case KSvgForeignObjectElement:
hgs
parents:
diff changeset
   382
			// foreignObject
hgs
parents:
diff changeset
   383
    		return ( MXmlElement * ) CSvgForeignObjectElementImpl::NewL((TUint8) position, this);
hgs
parents:
diff changeset
   384
hgs
parents:
diff changeset
   385
        case KSvgStyleElement:
hgs
parents:
diff changeset
   386
            // style
hgs
parents:
diff changeset
   387
            return ( MXmlElement * ) CSvgStyleElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   388
hgs
parents:
diff changeset
   389
        case KSvgUseElement:
hgs
parents:
diff changeset
   390
            // use
hgs
parents:
diff changeset
   391
            return ( MXmlElement * ) CSvgUseElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   392
hgs
parents:
diff changeset
   393
        case KSvgImageElement:
hgs
parents:
diff changeset
   394
            // image
hgs
parents:
diff changeset
   395
            return ( MXmlElement * ) CSvgImageElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   396
hgs
parents:
diff changeset
   397
        case KSvgAnimateColorElement:
hgs
parents:
diff changeset
   398
            // animateColor
hgs
parents:
diff changeset
   399
        case KSvgAnimateElement:
hgs
parents:
diff changeset
   400
            {
hgs
parents:
diff changeset
   401
            // animate
hgs
parents:
diff changeset
   402
            CSvgAnimateElementImpl* lAnimateElement = CSvgAnimateElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   403
            iSvgAnimations.Append(lAnimateElement);
hgs
parents:
diff changeset
   404
            return ( MXmlElement * ) lAnimateElement;
hgs
parents:
diff changeset
   405
            }
hgs
parents:
diff changeset
   406
hgs
parents:
diff changeset
   407
        case KSvgSetElement:
hgs
parents:
diff changeset
   408
            // set
hgs
parents:
diff changeset
   409
            return ( MXmlElement * ) CSvgSetElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   410
hgs
parents:
diff changeset
   411
        case KSvgMpathElement:
hgs
parents:
diff changeset
   412
        	// mPath
hgs
parents:
diff changeset
   413
            return ( MXmlElement * ) CSvgMpathElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   414
hgs
parents:
diff changeset
   415
        case KSvgDiscardElement:
hgs
parents:
diff changeset
   416
  			// discard
hgs
parents:
diff changeset
   417
            return ( MXmlElement * ) CSvgDiscardElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   418
hgs
parents:
diff changeset
   419
 /*       case KSvgAnimationElement:
hgs
parents:
diff changeset
   420
            {
hgs
parents:
diff changeset
   421
            // animation
hgs
parents:
diff changeset
   422
            CSvgAnimationElementImpl* lAnimationElementImpl = CSvgAnimationElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   423
            iSvgAnimations.Append( lAnimationElementImpl );
hgs
parents:
diff changeset
   424
            return ( MXmlElement * ) lAnimationElementImpl;
hgs
parents:
diff changeset
   425
            }
hgs
parents:
diff changeset
   426
*/
hgs
parents:
diff changeset
   427
        case KSvgScriptElement:
hgs
parents:
diff changeset
   428
            {
hgs
parents:
diff changeset
   429
            // script
hgs
parents:
diff changeset
   430
            return ( MXmlElement * ) CSvgScriptElementImpl::NewL((TUint8) position,this);
hgs
parents:
diff changeset
   431
            }
hgs
parents:
diff changeset
   432
hgs
parents:
diff changeset
   433
        case KSvgSolidColorElement:
hgs
parents:
diff changeset
   434
            // solidColor
hgs
parents:
diff changeset
   435
            return ( MXmlElement * ) CSvgSolidColorElementImpl::NewL((TUint8) position,this);
hgs
parents:
diff changeset
   436
hgs
parents:
diff changeset
   437
        case KSvgMetadataElement:
hgs
parents:
diff changeset
   438
        	// metaData
hgs
parents:
diff changeset
   439
        	return ( MXmlElement * ) CSvgMetadataElementImpl::NewL((TUint8) position, this);
hgs
parents:
diff changeset
   440
hgs
parents:
diff changeset
   441
        case KSvgDescElement:
hgs
parents:
diff changeset
   442
        	// desc
hgs
parents:
diff changeset
   443
        	return ( MXmlElement * ) CSvgDescElementImpl::NewL((TUint8) position, this);
hgs
parents:
diff changeset
   444
hgs
parents:
diff changeset
   445
        case KSvgTitleElement:
hgs
parents:
diff changeset
   446
        	// title
hgs
parents:
diff changeset
   447
        	return ( MXmlElement * ) CSvgTitleElementImpl::NewL((TUint8) position, this);
hgs
parents:
diff changeset
   448
hgs
parents:
diff changeset
   449
        case KSvgTextElement:
hgs
parents:
diff changeset
   450
            // text
hgs
parents:
diff changeset
   451
            //add in the boolean thing here....
hgs
parents:
diff changeset
   452
            return ( MXmlElement * ) CSvgTextElementImpl::NewL(  (TUint8) position, this );
hgs
parents:
diff changeset
   453
hgs
parents:
diff changeset
   454
        case KSvgTextAreaElement:
hgs
parents:
diff changeset
   455
            {
hgs
parents:
diff changeset
   456
            // textArea
hgs
parents:
diff changeset
   457
            return ( MXmlElement * ) CSvgTextAreaElementImpl::NewL((TUint8) position,this);
hgs
parents:
diff changeset
   458
            }
hgs
parents:
diff changeset
   459
hgs
parents:
diff changeset
   460
        case KSvgAnimateMotionElement:
hgs
parents:
diff changeset
   461
            {
hgs
parents:
diff changeset
   462
            // animateMotion
hgs
parents:
diff changeset
   463
            CSvgAnimateMotionElementImpl* lAnimateMotionElement = CSvgAnimateMotionElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   464
            iSvgAnimations.Append(lAnimateMotionElement);
hgs
parents:
diff changeset
   465
            return ( MXmlElement * ) lAnimateMotionElement;
hgs
parents:
diff changeset
   466
            }
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
        case KSvgAnimateTransformElement:
hgs
parents:
diff changeset
   469
            {
hgs
parents:
diff changeset
   470
            // animateTransform
hgs
parents:
diff changeset
   471
            CSvgAnimateTransformElementImpl* lAnimateTransformElement = CSvgAnimateTransformElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   472
            iSvgAnimations.Append(lAnimateTransformElement);
hgs
parents:
diff changeset
   473
            return ( MXmlElement * ) lAnimateTransformElement;
hgs
parents:
diff changeset
   474
            }
hgs
parents:
diff changeset
   475
hgs
parents:
diff changeset
   476
        case KSvgGlyphElement:
hgs
parents:
diff changeset
   477
            // glyph
hgs
parents:
diff changeset
   478
#ifdef SVG_FONTS_INCLUDE
hgs
parents:
diff changeset
   479
            return ( MXmlElement * ) CSvgGlyphElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   480
#else
hgs
parents:
diff changeset
   481
            return ( MXmlElement * ) CSvgGElementImpl::NewL( _L( "g" ),(TUint8) position, this );
hgs
parents:
diff changeset
   482
#endif
hgs
parents:
diff changeset
   483
        case KSvgFontElement:
hgs
parents:
diff changeset
   484
            // font
hgs
parents:
diff changeset
   485
#ifdef SVG_FONTS_INCLUDE
hgs
parents:
diff changeset
   486
            return ( MXmlElement * ) CSvgFontElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   487
#else
hgs
parents:
diff changeset
   488
            return ( MXmlElement * ) CSvgGElementImpl::NewL( _L( "g" ),(TUint8) position, this );
hgs
parents:
diff changeset
   489
#endif
hgs
parents:
diff changeset
   490
hgs
parents:
diff changeset
   491
        case KSvgAElement:
hgs
parents:
diff changeset
   492
            // a
hgs
parents:
diff changeset
   493
            return ( MXmlElement * ) CSvgAElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   494
hgs
parents:
diff changeset
   495
        case KSvgFontfaceElement:
hgs
parents:
diff changeset
   496
            // font-face
hgs
parents:
diff changeset
   497
#ifdef SVG_FONTS_INCLUDE
hgs
parents:
diff changeset
   498
            return ( MXmlElement * ) CSvgFontFaceElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   499
#else
hgs
parents:
diff changeset
   500
            return ( MXmlElement * ) CSvgGElementImpl::NewL( _L( "g" )(TUint8) position, this );
hgs
parents:
diff changeset
   501
#endif
hgs
parents:
diff changeset
   502
hgs
parents:
diff changeset
   503
        case KSvgMissingglyphElement:
hgs
parents:
diff changeset
   504
            // missing-glyph
hgs
parents:
diff changeset
   505
#ifdef SVG_FONTS_INCLUDE
hgs
parents:
diff changeset
   506
            return ( MXmlElement * ) CSvgMissingGlyphElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   507
#else
hgs
parents:
diff changeset
   508
            return ( MXmlElement * ) CSvgGElementImpl::NewL( _L( "g" )(TUint8) position, this );
hgs
parents:
diff changeset
   509
#endif
hgs
parents:
diff changeset
   510
hgs
parents:
diff changeset
   511
        case KSvgHkernElement:
hgs
parents:
diff changeset
   512
            // hkern
hgs
parents:
diff changeset
   513
#ifdef SVG_FONTS_INCLUDE
hgs
parents:
diff changeset
   514
            return ( MXmlElement * ) CSvgHkernElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   515
#else
hgs
parents:
diff changeset
   516
            return ( MXmlElement * ) CSvgGElementImpl::NewL( _L( "g" )(TUint8) position, this );
hgs
parents:
diff changeset
   517
#endif
hgs
parents:
diff changeset
   518
hgs
parents:
diff changeset
   519
        case KSvgAudioElement:
hgs
parents:
diff changeset
   520
            {
hgs
parents:
diff changeset
   521
            CSvgAudioElementImpl* lAudioElement = CSvgAudioElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   522
            iSvgAnimations.Append(lAudioElement);
hgs
parents:
diff changeset
   523
            return ( MXmlElement * ) lAudioElement;
hgs
parents:
diff changeset
   524
            }
hgs
parents:
diff changeset
   525
//#ifdef RD_SVGT_MEDIAANIMATION_SUPPORT
hgs
parents:
diff changeset
   526
        case KSvgMediaAnimationElement:
hgs
parents:
diff changeset
   527
            {
hgs
parents:
diff changeset
   528
            CSvgMediaAnimationElementImpl* lMediaAnimationElement = CSvgMediaAnimationElementImpl::NewL( (TUint8) position, this );
hgs
parents:
diff changeset
   529
            iSvgAnimations.Append(lMediaAnimationElement);
hgs
parents:
diff changeset
   530
            return ( MXmlElement * ) lMediaAnimationElement;
hgs
parents:
diff changeset
   531
            }
hgs
parents:
diff changeset
   532
//#endif
hgs
parents:
diff changeset
   533
hgs
parents:
diff changeset
   534
        } // for switch
hgs
parents:
diff changeset
   535
hgs
parents:
diff changeset
   536
        return NULL;
hgs
parents:
diff changeset
   537
    }
hgs
parents:
diff changeset
   538
hgs
parents:
diff changeset
   539
// ==========================================================================
hgs
parents:
diff changeset
   540
// Need method description
hgs
parents:
diff changeset
   541
// ==========================================================================
hgs
parents:
diff changeset
   542
TInt CSvgDocumentImpl::CreateAttribute( const TDesC& /* aName */ )
hgs
parents:
diff changeset
   543
    {
hgs
parents:
diff changeset
   544
    return KErrNone;
hgs
parents:
diff changeset
   545
    }
hgs
parents:
diff changeset
   546
hgs
parents:
diff changeset
   547
// ==========================================================================
hgs
parents:
diff changeset
   548
// Need method description
hgs
parents:
diff changeset
   549
// ==========================================================================
hgs
parents:
diff changeset
   550
MXmlElement* CSvgDocumentImpl::GetElementById( const TDesC& aElementId )
hgs
parents:
diff changeset
   551
    {
hgs
parents:
diff changeset
   552
    if(iRootElement)
hgs
parents:
diff changeset
   553
        {
hgs
parents:
diff changeset
   554
            const TDesC* myId = iRootElement->Id();
hgs
parents:
diff changeset
   555
hgs
parents:
diff changeset
   556
                if (myId)
hgs
parents:
diff changeset
   557
                {
hgs
parents:
diff changeset
   558
                    if (myId->Length() > 0)
hgs
parents:
diff changeset
   559
                    {
hgs
parents:
diff changeset
   560
                        if ( *myId == aElementId )
hgs
parents:
diff changeset
   561
                        {
hgs
parents:
diff changeset
   562
                            return iRootElement;
hgs
parents:
diff changeset
   563
                        }
hgs
parents:
diff changeset
   564
                    }
hgs
parents:
diff changeset
   565
                }
hgs
parents:
diff changeset
   566
hgs
parents:
diff changeset
   567
    MXmlElement* element = SearchElementById( iRootElement, aElementId );
hgs
parents:
diff changeset
   568
hgs
parents:
diff changeset
   569
    return element;
hgs
parents:
diff changeset
   570
        }
hgs
parents:
diff changeset
   571
    else
hgs
parents:
diff changeset
   572
        {
hgs
parents:
diff changeset
   573
        return NULL;
hgs
parents:
diff changeset
   574
        }
hgs
parents:
diff changeset
   575
    }
hgs
parents:
diff changeset
   576
hgs
parents:
diff changeset
   577
// ==========================================================================
hgs
parents:
diff changeset
   578
// Need method description
hgs
parents:
diff changeset
   579
// ==========================================================================
hgs
parents:
diff changeset
   580
TInt CSvgDocumentImpl::GetNumberOfIds(MXmlElement* aElement)
hgs
parents:
diff changeset
   581
{
hgs
parents:
diff changeset
   582
    TInt count = 0;
hgs
parents:
diff changeset
   583
hgs
parents:
diff changeset
   584
    CSvgElementImpl* child = ( CSvgElementImpl* ) aElement->FirstChild();
hgs
parents:
diff changeset
   585
    while ( child != NULL )
hgs
parents:
diff changeset
   586
        {
hgs
parents:
diff changeset
   587
            const TDesC* lPtr = child->Id();
hgs
parents:
diff changeset
   588
hgs
parents:
diff changeset
   589
            if (lPtr)
hgs
parents:
diff changeset
   590
            {
hgs
parents:
diff changeset
   591
                count++;
hgs
parents:
diff changeset
   592
            }
hgs
parents:
diff changeset
   593
                // search children
hgs
parents:
diff changeset
   594
                TInt inside_count = GetNumberOfIds( child );
hgs
parents:
diff changeset
   595
                if ( inside_count > 0 )
hgs
parents:
diff changeset
   596
                {
hgs
parents:
diff changeset
   597
                    count = count + inside_count;
hgs
parents:
diff changeset
   598
                }
hgs
parents:
diff changeset
   599
                // search siblings
hgs
parents:
diff changeset
   600
hgs
parents:
diff changeset
   601
                child = ( CSvgElementImpl * ) child->NextSibling();
hgs
parents:
diff changeset
   602
        }
hgs
parents:
diff changeset
   603
hgs
parents:
diff changeset
   604
   return count;
hgs
parents:
diff changeset
   605
}
hgs
parents:
diff changeset
   606
hgs
parents:
diff changeset
   607
// ==========================================================================
hgs
parents:
diff changeset
   608
// Need method description
hgs
parents:
diff changeset
   609
// ==========================================================================
hgs
parents:
diff changeset
   610
TDesC* CSvgDocumentImpl::GetId(TInt index)
hgs
parents:
diff changeset
   611
{
hgs
parents:
diff changeset
   612
				TDesC* id = NULL;
hgs
parents:
diff changeset
   613
        RPointerArray<TDesC> ids;
hgs
parents:
diff changeset
   614
hgs
parents:
diff changeset
   615
        FindAllIds( (CSvgElementImpl*)RootElement(), ids );
hgs
parents:
diff changeset
   616
hgs
parents:
diff changeset
   617
        if (index < ids.Count())
hgs
parents:
diff changeset
   618
        {
hgs
parents:
diff changeset
   619
            id = ids[index];
hgs
parents:
diff changeset
   620
        }
hgs
parents:
diff changeset
   621
hgs
parents:
diff changeset
   622
        ids.Close();
hgs
parents:
diff changeset
   623
hgs
parents:
diff changeset
   624
    return id;
hgs
parents:
diff changeset
   625
}
hgs
parents:
diff changeset
   626
hgs
parents:
diff changeset
   627
// ==========================================================================
hgs
parents:
diff changeset
   628
// // Return all elements of the given type
hgs
parents:
diff changeset
   629
// ==========================================================================
hgs
parents:
diff changeset
   630
void CSvgDocumentImpl::FindAllIds( CSvgElementImpl* aStartElement, RPointerArray<TDesC>& aList )
hgs
parents:
diff changeset
   631
{
hgs
parents:
diff changeset
   632
    if ( aStartElement == NULL )
hgs
parents:
diff changeset
   633
        return;
hgs
parents:
diff changeset
   634
hgs
parents:
diff changeset
   635
    CSvgElementImpl* child = (CSvgElementImpl*)aStartElement->FirstChild();
hgs
parents:
diff changeset
   636
    while ( child != NULL )
hgs
parents:
diff changeset
   637
    {
hgs
parents:
diff changeset
   638
        // add to list if child is found
hgs
parents:
diff changeset
   639
        const TDesC* myId = child->Id();
hgs
parents:
diff changeset
   640
hgs
parents:
diff changeset
   641
        if ( myId )
hgs
parents:
diff changeset
   642
            aList.Append( myId );
hgs
parents:
diff changeset
   643
hgs
parents:
diff changeset
   644
        // find in grandchildren
hgs
parents:
diff changeset
   645
        FindAllIds( child, aList );
hgs
parents:
diff changeset
   646
        child = (CSvgElementImpl*)child->NextSibling();
hgs
parents:
diff changeset
   647
    }
hgs
parents:
diff changeset
   648
}
hgs
parents:
diff changeset
   649
hgs
parents:
diff changeset
   650
hgs
parents:
diff changeset
   651
//***********************************************************************
hgs
parents:
diff changeset
   652
// From MSvgDocument
hgs
parents:
diff changeset
   653
//
hgs
parents:
diff changeset
   654
hgs
parents:
diff changeset
   655
hgs
parents:
diff changeset
   656
hgs
parents:
diff changeset
   657
//
hgs
parents:
diff changeset
   658
// ==========================================================================
hgs
parents:
diff changeset
   659
// Need method description
hgs
parents:
diff changeset
   660
// ==========================================================================
hgs
parents:
diff changeset
   661
TDesC& CSvgDocumentImpl::GetUrl()
hgs
parents:
diff changeset
   662
    {
hgs
parents:
diff changeset
   663
    return iUri;
hgs
parents:
diff changeset
   664
    }
hgs
parents:
diff changeset
   665
hgs
parents:
diff changeset
   666
// ==========================================================================
hgs
parents:
diff changeset
   667
// // Returns the value of the current focus index. 
hgs
parents:
diff changeset
   668
// ==========================================================================
hgs
parents:
diff changeset
   669
hgs
parents:
diff changeset
   670
TInt32 CSvgDocumentImpl::GetCurFocusIndex()
hgs
parents:
diff changeset
   671
{
hgs
parents:
diff changeset
   672
	return iCurObjIdx;
hgs
parents:
diff changeset
   673
}
hgs
parents:
diff changeset
   674
hgs
parents:
diff changeset
   675
hgs
parents:
diff changeset
   676
// ==========================================================================
hgs
parents:
diff changeset
   677
// // Increment the focus index by one value
hgs
parents:
diff changeset
   678
// ==========================================================================
hgs
parents:
diff changeset
   679
hgs
parents:
diff changeset
   680
TInt32 CSvgDocumentImpl::IncCurFocusIndex()
hgs
parents:
diff changeset
   681
{
hgs
parents:
diff changeset
   682
	return ++iCurObjIdx;
hgs
parents:
diff changeset
   683
}
hgs
parents:
diff changeset
   684
hgs
parents:
diff changeset
   685
// ==========================================================================
hgs
parents:
diff changeset
   686
// // Decrement the focus index by one value
hgs
parents:
diff changeset
   687
// ==========================================================================
hgs
parents:
diff changeset
   688
TInt32 CSvgDocumentImpl::DecCurFocusIndex()
hgs
parents:
diff changeset
   689
{
hgs
parents:
diff changeset
   690
	return --iCurObjIdx;
hgs
parents:
diff changeset
   691
}
hgs
parents:
diff changeset
   692
hgs
parents:
diff changeset
   693
// ==========================================================================
hgs
parents:
diff changeset
   694
// // Sets the focus index to the given value
hgs
parents:
diff changeset
   695
// ==========================================================================
hgs
parents:
diff changeset
   696
void CSvgDocumentImpl::SetCurFocusIndex(TInt32 aVal)
hgs
parents:
diff changeset
   697
{
hgs
parents:
diff changeset
   698
	iCurObjIdx = aVal;
hgs
parents:
diff changeset
   699
}
hgs
parents:
diff changeset
   700
hgs
parents:
diff changeset
   701
// ==========================================================================
hgs
parents:
diff changeset
   702
// // Returns the current focus object
hgs
parents:
diff changeset
   703
// ==========================================================================
hgs
parents:
diff changeset
   704
CSvgElementImpl* CSvgDocumentImpl::GetCurFocusObject()
hgs
parents:
diff changeset
   705
{
hgs
parents:
diff changeset
   706
	return iCurrentFocusObject;
hgs
parents:
diff changeset
   707
}
hgs
parents:
diff changeset
   708
hgs
parents:
diff changeset
   709
// ==========================================================================
hgs
parents:
diff changeset
   710
// // Sets the current focus element to the element specified
hgs
parents:
diff changeset
   711
// ==========================================================================
hgs
parents:
diff changeset
   712
void CSvgDocumentImpl::SetCurFocusObject(CSvgElementImpl* aElement)
hgs
parents:
diff changeset
   713
{
hgs
parents:
diff changeset
   714
	iCurrentFocusObject = aElement;
hgs
parents:
diff changeset
   715
}
hgs
parents:
diff changeset
   716
hgs
parents:
diff changeset
   717
//
hgs
parents:
diff changeset
   718
// ==========================================================================
hgs
parents:
diff changeset
   719
// Need method description
hgs
parents:
diff changeset
   720
// ==========================================================================
hgs
parents:
diff changeset
   721
EXPORT_C MXmlElement* CSvgDocumentImpl::RootElement()
hgs
parents:
diff changeset
   722
    {
hgs
parents:
diff changeset
   723
    return iRootElement;
hgs
parents:
diff changeset
   724
    }
hgs
parents:
diff changeset
   725
hgs
parents:
diff changeset
   726
//***********************************************************************
hgs
parents:
diff changeset
   727
//
hgs
parents:
diff changeset
   728
//
hgs
parents:
diff changeset
   729
hgs
parents:
diff changeset
   730
// ==========================================================================
hgs
parents:
diff changeset
   731
// Need method description
hgs
parents:
diff changeset
   732
// ==========================================================================
hgs
parents:
diff changeset
   733
MXmlElement* CSvgDocumentImpl::SearchElementById( MXmlElement* aElement,
hgs
parents:
diff changeset
   734
                                                  const TDesC& aElementId )
hgs
parents:
diff changeset
   735
    {
hgs
parents:
diff changeset
   736
    CSvgElementImpl* child = ( CSvgElementImpl* ) aElement->FirstChild();
hgs
parents:
diff changeset
   737
    while ( child != NULL )
hgs
parents:
diff changeset
   738
        {
hgs
parents:
diff changeset
   739
            const TDesC* lPtr = child->Id();
hgs
parents:
diff changeset
   740
hgs
parents:
diff changeset
   741
            if (lPtr)
hgs
parents:
diff changeset
   742
            {
hgs
parents:
diff changeset
   743
                if ( *lPtr == aElementId )
hgs
parents:
diff changeset
   744
                {
hgs
parents:
diff changeset
   745
                    return child;
hgs
parents:
diff changeset
   746
                }
hgs
parents:
diff changeset
   747
            }
hgs
parents:
diff changeset
   748
                // search children
hgs
parents:
diff changeset
   749
                MXmlElement* childrenMatch = SearchElementById( child, aElementId );
hgs
parents:
diff changeset
   750
                if ( childrenMatch != NULL )
hgs
parents:
diff changeset
   751
                {
hgs
parents:
diff changeset
   752
                    return childrenMatch;
hgs
parents:
diff changeset
   753
                }
hgs
parents:
diff changeset
   754
                // search siblings
hgs
parents:
diff changeset
   755
hgs
parents:
diff changeset
   756
                child = ( CSvgElementImpl * ) child->NextSibling();
hgs
parents:
diff changeset
   757
hgs
parents:
diff changeset
   758
        }
hgs
parents:
diff changeset
   759
    return NULL;
hgs
parents:
diff changeset
   760
    }
hgs
parents:
diff changeset
   761
hgs
parents:
diff changeset
   762
hgs
parents:
diff changeset
   763
hgs
parents:
diff changeset
   764
hgs
parents:
diff changeset
   765
// ==========================================================================
hgs
parents:
diff changeset
   766
// Need method description
hgs
parents:
diff changeset
   767
// ==========================================================================
hgs
parents:
diff changeset
   768
MXmlElement* CSvgDocumentImpl::AppendChildL( MXmlElement* aNewChild )
hgs
parents:
diff changeset
   769
    {
hgs
parents:
diff changeset
   770
hgs
parents:
diff changeset
   771
    if ( aNewChild && ((CXmlElementImpl*)aNewChild)->ElemID() == KSvgSvgElement )
hgs
parents:
diff changeset
   772
hgs
parents:
diff changeset
   773
        {
hgs
parents:
diff changeset
   774
        // Set new node as the root element, if it is
hgs
parents:
diff changeset
   775
        if ( iRootElement )
hgs
parents:
diff changeset
   776
            {
hgs
parents:
diff changeset
   777
            return NULL;
hgs
parents:
diff changeset
   778
            }
hgs
parents:
diff changeset
   779
        iRootElement = (CSvgElementImpl *) aNewChild;
hgs
parents:
diff changeset
   780
hgs
parents:
diff changeset
   781
        // Set the new node's next sibling
hgs
parents:
diff changeset
   782
        aNewChild->SetNextSibling( NULL );
hgs
parents:
diff changeset
   783
        }
hgs
parents:
diff changeset
   784
    else
hgs
parents:
diff changeset
   785
        {
hgs
parents:
diff changeset
   786
        return NULL;
hgs
parents:
diff changeset
   787
        }
hgs
parents:
diff changeset
   788
hgs
parents:
diff changeset
   789
    return aNewChild;
hgs
parents:
diff changeset
   790
    }
hgs
parents:
diff changeset
   791
hgs
parents:
diff changeset
   792
hgs
parents:
diff changeset
   793
// ==========================================================================
hgs
parents:
diff changeset
   794
// Need method description
hgs
parents:
diff changeset
   795
// ==========================================================================
hgs
parents:
diff changeset
   796
CSvgSchemaData* CSvgDocumentImpl::SchemaData()
hgs
parents:
diff changeset
   797
    {
hgs
parents:
diff changeset
   798
    return iSchemaData;
hgs
parents:
diff changeset
   799
    }
hgs
parents:
diff changeset
   800
hgs
parents:
diff changeset
   801
hgs
parents:
diff changeset
   802
// ==========================================================================
hgs
parents:
diff changeset
   803
// Need method description
hgs
parents:
diff changeset
   804
// ==========================================================================
hgs
parents:
diff changeset
   805
void CSvgDocumentImpl::SetUri( const TDesC& aUri )
hgs
parents:
diff changeset
   806
    {
hgs
parents:
diff changeset
   807
    iUri.Zero();
hgs
parents:
diff changeset
   808
    iUri.Copy(aUri);
hgs
parents:
diff changeset
   809
    }
hgs
parents:
diff changeset
   810
hgs
parents:
diff changeset
   811
// ==========================================================================
hgs
parents:
diff changeset
   812
// Need method description
hgs
parents:
diff changeset
   813
// ==========================================================================
hgs
parents:
diff changeset
   814
void CSvgDocumentImpl::GetUri( TDes& aUri )
hgs
parents:
diff changeset
   815
    {
hgs
parents:
diff changeset
   816
    aUri.Zero();
hgs
parents:
diff changeset
   817
    aUri.Copy(iUri);
hgs
parents:
diff changeset
   818
    }
hgs
parents:
diff changeset
   819
hgs
parents:
diff changeset
   820
// ==========================================================================
hgs
parents:
diff changeset
   821
// Register an element for receiving events using the event mask
hgs
parents:
diff changeset
   822
// ==========================================================================
hgs
parents:
diff changeset
   823
void CSvgDocumentImpl::AddToEventReceiverListL( MSvgEventReceiver* aElement,
hgs
parents:
diff changeset
   824
                                             TUint8 aEventMask)
hgs
parents:
diff changeset
   825
    {
hgs
parents:
diff changeset
   826
    if (iEventHandler != NULL)
hgs
parents:
diff changeset
   827
    iEventHandler->AddToEventReceiverListL( aElement, aEventMask );
hgs
parents:
diff changeset
   828
    }
hgs
parents:
diff changeset
   829
hgs
parents:
diff changeset
   830
// ==========================================================================
hgs
parents:
diff changeset
   831
// Register an element for receiving events and events using the event mask
hgs
parents:
diff changeset
   832
// ==========================================================================
hgs
parents:
diff changeset
   833
void CSvgDocumentImpl::AddToEventReceiverListL( MSvgEventReceiver* aElement,
hgs
parents:
diff changeset
   834
                                                TSvgEvent aEvent,
hgs
parents:
diff changeset
   835
                                             TUint8 aEventMask)
hgs
parents:
diff changeset
   836
    {
hgs
parents:
diff changeset
   837
    if (iEventHandler != NULL)
hgs
parents:
diff changeset
   838
    iEventHandler->AddToEventReceiverListL( aElement,aEvent,aEventMask );
hgs
parents:
diff changeset
   839
    }
hgs
parents:
diff changeset
   840
hgs
parents:
diff changeset
   841
// ==========================================================================
hgs
parents:
diff changeset
   842
// Unregister an element for receiving events using the event mask
hgs
parents:
diff changeset
   843
// ==========================================================================
hgs
parents:
diff changeset
   844
void CSvgDocumentImpl::RemoveFromEventReceiverList( MSvgEventReceiver* aElement )
hgs
parents:
diff changeset
   845
    {
hgs
parents:
diff changeset
   846
    if (iEventHandler != NULL)
hgs
parents:
diff changeset
   847
    iEventHandler->RemoveFromEventReceiverList( aElement );
hgs
parents:
diff changeset
   848
    }
hgs
parents:
diff changeset
   849
hgs
parents:
diff changeset
   850
// ==========================================================================
hgs
parents:
diff changeset
   851
// Provide event handler the event timing information for the
hgs
parents:
diff changeset
   852
// completion of event.
hgs
parents:
diff changeset
   853
// ==========================================================================
hgs
parents:
diff changeset
   854
void CSvgDocumentImpl::AddEventBeginTime(MSvgEventReceiver* aElement, TUint32 aTime, MSvgEventReceiver* aTargetElement )
hgs
parents:
diff changeset
   855
    {
hgs
parents:
diff changeset
   856
    if (iEventHandler != NULL)
hgs
parents:
diff changeset
   857
    iEventHandler->AddEventBeginTime( aElement, aTime, aTargetElement );
hgs
parents:
diff changeset
   858
    }
hgs
parents:
diff changeset
   859
hgs
parents:
diff changeset
   860
// ==========================================================================
hgs
parents:
diff changeset
   861
// Sort the events in a time scale according to their absolute start
hgs
parents:
diff changeset
   862
// and finish times
hgs
parents:
diff changeset
   863
// ==========================================================================
hgs
parents:
diff changeset
   864
void CSvgDocumentImpl::SortEventList()
hgs
parents:
diff changeset
   865
    {
hgs
parents:
diff changeset
   866
    if (iEventHandler != NULL)
hgs
parents:
diff changeset
   867
    iEventHandler->SortEventList();
hgs
parents:
diff changeset
   868
    }
hgs
parents:
diff changeset
   869
hgs
parents:
diff changeset
   870
//
hgs
parents:
diff changeset
   871
// ==========================================================================
hgs
parents:
diff changeset
   872
// Returns an element that is registered for the given event mask and
hgs
parents:
diff changeset
   873
// is the first one starting from the given index (either up or down the
hgs
parents:
diff changeset
   874
// list based on the aNext parameter)
hgs
parents:
diff changeset
   875
// ==========================================================================
hgs
parents:
diff changeset
   876
CSvgElementImpl* CSvgDocumentImpl::GetEventReceiverElement(TInt32 aIndex, TBool aNext, TUint8 aEventMask, TInt32& aNewIndex)
hgs
parents:
diff changeset
   877
    {
hgs
parents:
diff changeset
   878
    if (iEventHandler != NULL)
hgs
parents:
diff changeset
   879
    {
hgs
parents:
diff changeset
   880
            return (CSvgElementImpl*)iEventHandler->GetEventReceiver(aIndex, aNext, aEventMask, aNewIndex);
hgs
parents:
diff changeset
   881
    }
hgs
parents:
diff changeset
   882
    else
hgs
parents:
diff changeset
   883
    return NULL;
hgs
parents:
diff changeset
   884
hgs
parents:
diff changeset
   885
    }
hgs
parents:
diff changeset
   886
hgs
parents:
diff changeset
   887
// ==========================================================================
hgs
parents:
diff changeset
   888
// Is Animation file
hgs
parents:
diff changeset
   889
// ==========================================================================
hgs
parents:
diff changeset
   890
TBool CSvgDocumentImpl::IsAnimationFile()
hgs
parents:
diff changeset
   891
    {
hgs
parents:
diff changeset
   892
    if( (iEventHandler != NULL) && iEventHandler->Count() )
hgs
parents:
diff changeset
   893
        return ETrue;
hgs
parents:
diff changeset
   894
    else
hgs
parents:
diff changeset
   895
        return EFalse;
hgs
parents:
diff changeset
   896
    }
hgs
parents:
diff changeset
   897
    
hgs
parents:
diff changeset
   898
// ==========================================================================
hgs
parents:
diff changeset
   899
// IsValidSubEventMask
hgs
parents:
diff changeset
   900
// ==========================================================================
hgs
parents:
diff changeset
   901
TBool CSvgDocumentImpl::IsValidSubEventMask(TUint16 aSubEventMask)
hgs
parents:
diff changeset
   902
    {
hgs
parents:
diff changeset
   903
    if(iEventHandler)
hgs
parents:
diff changeset
   904
        {
hgs
parents:
diff changeset
   905
        return(iEventHandler->IsValidSubEventMask(aSubEventMask));
hgs
parents:
diff changeset
   906
        }
hgs
parents:
diff changeset
   907
    else
hgs
parents:
diff changeset
   908
        {
hgs
parents:
diff changeset
   909
        return EFalse;    
hgs
parents:
diff changeset
   910
        }
hgs
parents:
diff changeset
   911
    }
hgs
parents:
diff changeset
   912
// ==========================================================================
hgs
parents:
diff changeset
   913
// Set DRM Mode
hgs
parents:
diff changeset
   914
// ==========================================================================
hgs
parents:
diff changeset
   915
hgs
parents:
diff changeset
   916
void CSvgDocumentImpl::SetDRMMode(TBool aEnable)
hgs
parents:
diff changeset
   917
    {
hgs
parents:
diff changeset
   918
    iDrmEnable = aEnable;
hgs
parents:
diff changeset
   919
    }
hgs
parents:
diff changeset
   920
// ==========================================================================
hgs
parents:
diff changeset
   921
// Set DRM Mode
hgs
parents:
diff changeset
   922
// ==========================================================================
hgs
parents:
diff changeset
   923
void CSvgDocumentImpl::Reset(MSvgEvent *aEvent)
hgs
parents:
diff changeset
   924
    {
hgs
parents:
diff changeset
   925
    if ( iAnimationResetNeeded && iEventHandler != NULL )
hgs
parents:
diff changeset
   926
        {
hgs
parents:
diff changeset
   927
        iEventHandler->Reset( aEvent );
hgs
parents:
diff changeset
   928
        iAnimationResetNeeded = EFalse;
hgs
parents:
diff changeset
   929
        }
hgs
parents:
diff changeset
   930
    }
hgs
parents:
diff changeset
   931
// ==========================================================================
hgs
parents:
diff changeset
   932
// Set DRM Mode
hgs
parents:
diff changeset
   933
// ==========================================================================
hgs
parents:
diff changeset
   934
TBool CSvgDocumentImpl::SvgElementPresent(CSvgElementImpl* aElement)
hgs
parents:
diff changeset
   935
{
hgs
parents:
diff changeset
   936
    if(iRootElement == NULL) return EFalse;
hgs
parents:
diff changeset
   937
    if ( ( ( CSvgElementImpl * ) iRootElement ) == aElement )
hgs
parents:
diff changeset
   938
        {
hgs
parents:
diff changeset
   939
        return ETrue;
hgs
parents:
diff changeset
   940
        }
hgs
parents:
diff changeset
   941
hgs
parents:
diff changeset
   942
    return SearchByPointer(iRootElement, aElement);
hgs
parents:
diff changeset
   943
hgs
parents:
diff changeset
   944
}
hgs
parents:
diff changeset
   945
// ==========================================================================
hgs
parents:
diff changeset
   946
// Set DRM Mode
hgs
parents:
diff changeset
   947
// ==========================================================================
hgs
parents:
diff changeset
   948
TBool CSvgDocumentImpl::SearchByPointer(CSvgElementImpl* aParent, CSvgElementImpl* aElement)
hgs
parents:
diff changeset
   949
{
hgs
parents:
diff changeset
   950
    CSvgElementImpl* child = ( CSvgElementImpl* ) aParent->FirstChild();
hgs
parents:
diff changeset
   951
    while ( child != NULL )
hgs
parents:
diff changeset
   952
        {
hgs
parents:
diff changeset
   953
hgs
parents:
diff changeset
   954
        if ( child  == aElement )
hgs
parents:
diff changeset
   955
            {
hgs
parents:
diff changeset
   956
            return ETrue;
hgs
parents:
diff changeset
   957
            }
hgs
parents:
diff changeset
   958
        // search children
hgs
parents:
diff changeset
   959
        TBool result = SearchByPointer( child, aElement );
hgs
parents:
diff changeset
   960
        if (result)
hgs
parents:
diff changeset
   961
            {
hgs
parents:
diff changeset
   962
            return ETrue;
hgs
parents:
diff changeset
   963
            }
hgs
parents:
diff changeset
   964
        // search siblings
hgs
parents:
diff changeset
   965
        child = ( CSvgElementImpl * ) child->NextSibling();
hgs
parents:
diff changeset
   966
        }
hgs
parents:
diff changeset
   967
    return EFalse;
hgs
parents:
diff changeset
   968
}
hgs
parents:
diff changeset
   969
// ==========================================================================
hgs
parents:
diff changeset
   970
// Set DRM Mode
hgs
parents:
diff changeset
   971
// ==========================================================================
hgs
parents:
diff changeset
   972
void CSvgDocumentImpl::SetFocusElement(CXmlElementImpl* aElement )
hgs
parents:
diff changeset
   973
{
hgs
parents:
diff changeset
   974
    iCurrentFocusObject = (CSvgElementImpl*)aElement;
hgs
parents:
diff changeset
   975
}
hgs
parents:
diff changeset
   976
// ==========================================================================
hgs
parents:
diff changeset
   977
// Set DRM Mode
hgs
parents:
diff changeset
   978
// ==========================================================================
hgs
parents:
diff changeset
   979
CXmlElementImpl* CSvgDocumentImpl::GetFocusElement()
hgs
parents:
diff changeset
   980
{
hgs
parents:
diff changeset
   981
    return (CXmlElementImpl*) iCurrentFocusObject;
hgs
parents:
diff changeset
   982
}
hgs
parents:
diff changeset
   983
hgs
parents:
diff changeset
   984
// ==========================================================================
hgs
parents:
diff changeset
   985
// Need method description
hgs
parents:
diff changeset
   986
// ==========================================================================
hgs
parents:
diff changeset
   987
void CSvgDocumentImpl::ReInitialize()
hgs
parents:
diff changeset
   988
    {
hgs
parents:
diff changeset
   989
    if(iMultipleRendering)
hgs
parents:
diff changeset
   990
        {
hgs
parents:
diff changeset
   991
        if (iEventHandler != NULL)
hgs
parents:
diff changeset
   992
        iEventHandler->ReInitialize();
hgs
parents:
diff changeset
   993
        }
hgs
parents:
diff changeset
   994
    else
hgs
parents:
diff changeset
   995
        {
hgs
parents:
diff changeset
   996
        iMultipleRendering= ETrue;
hgs
parents:
diff changeset
   997
        }
hgs
parents:
diff changeset
   998
    }
hgs
parents:
diff changeset
   999
hgs
parents:
diff changeset
  1000
// ==========================================================================
hgs
parents:
diff changeset
  1001
// Need method description
hgs
parents:
diff changeset
  1002
// ==========================================================================
hgs
parents:
diff changeset
  1003
void CSvgDocumentImpl::Load( const TDesC& aFileName, CSvgErrorImpl& aError )
hgs
parents:
diff changeset
  1004
{
hgs
parents:
diff changeset
  1005
    aError.SetErrorCode( ESvgNoError );
hgs
parents:
diff changeset
  1006
hgs
parents:
diff changeset
  1007
    RFs session;
hgs
parents:
diff changeset
  1008
    OpenSession( session, aError );
hgs
parents:
diff changeset
  1009
    if ( aError.HasError() )
hgs
parents:
diff changeset
  1010
        return;
hgs
parents:
diff changeset
  1011
hgs
parents:
diff changeset
  1012
    RFile fileHandle;
hgs
parents:
diff changeset
  1013
    TInt openError = fileHandle.Open( session, aFileName, EFileRead );
hgs
parents:
diff changeset
  1014
    if ( openError != KErrNone )
hgs
parents:
diff changeset
  1015
    {
hgs
parents:
diff changeset
  1016
        PrepareError( aError, ESvgUnknown, openError,
hgs
parents:
diff changeset
  1017
                      _L( "Fail to open file for reading: " ), aFileName );
hgs
parents:
diff changeset
  1018
        session.Close();
hgs
parents:
diff changeset
  1019
        return;
hgs
parents:
diff changeset
  1020
    }
hgs
parents:
diff changeset
  1021
    else
hgs
parents:
diff changeset
  1022
    {
hgs
parents:
diff changeset
  1023
        Load( fileHandle, aError );
hgs
parents:
diff changeset
  1024
        session.Close();
hgs
parents:
diff changeset
  1025
    }
hgs
parents:
diff changeset
  1026
}
hgs
parents:
diff changeset
  1027
hgs
parents:
diff changeset
  1028
// ==========================================================================
hgs
parents:
diff changeset
  1029
// Need method description
hgs
parents:
diff changeset
  1030
// ==========================================================================
hgs
parents:
diff changeset
  1031
void CSvgDocumentImpl::Load( const TDesC8& aByteData, CSvgErrorImpl& aError, TBool aRemoveFalseSwitchElements )
hgs
parents:
diff changeset
  1032
{
hgs
parents:
diff changeset
  1033
    aError.SetErrorCode( ESvgNoError );
hgs
parents:
diff changeset
  1034
hgs
parents:
diff changeset
  1035
    //-------------------------------------------------------------------
hgs
parents:
diff changeset
  1036
    // Byte array is gzipped and/or drm:
hgs
parents:
diff changeset
  1037
    // Write buffer to file:
hgs
parents:
diff changeset
  1038
    // a) GZip only has filename function to unzip
hgs
parents:
diff changeset
  1039
    // b) Drm only has file-handle to decrypt
hgs
parents:
diff changeset
  1040
    //-------------------------------------------------------------------
hgs
parents:
diff changeset
  1041
    if ( IsGzipContent( aByteData ) ||
hgs
parents:
diff changeset
  1042
         ( iDrmEnable && IsDRMContent( aByteData ) ) )
hgs
parents:
diff changeset
  1043
    {
hgs
parents:
diff changeset
  1044
        RFs session;
hgs
parents:
diff changeset
  1045
        OpenSession( session, aError );
hgs
parents:
diff changeset
  1046
        if ( aError.HasError() )
hgs
parents:
diff changeset
  1047
            return;
hgs
parents:
diff changeset
  1048
hgs
parents:
diff changeset
  1049
        // Write byte-array to temp file
hgs
parents:
diff changeset
  1050
        TFileName zippedTempFilename;
hgs
parents:
diff changeset
  1051
        if ( WriteToTempFile( session, aByteData, zippedTempFilename, aError ) != KErrNone )
hgs
parents:
diff changeset
  1052
        {
hgs
parents:
diff changeset
  1053
            session.Close();
hgs
parents:
diff changeset
  1054
            return;
hgs
parents:
diff changeset
  1055
        }
hgs
parents:
diff changeset
  1056
        Load( zippedTempFilename, aError );
hgs
parents:
diff changeset
  1057
        session.Delete( zippedTempFilename );
hgs
parents:
diff changeset
  1058
        session.Close();
hgs
parents:
diff changeset
  1059
    }
hgs
parents:
diff changeset
  1060
    //-------------------------------------------------------------------
hgs
parents:
diff changeset
  1061
    // byte-array is neither gzipped nor DRM encrypted
hgs
parents:
diff changeset
  1062
    //-------------------------------------------------------------------
hgs
parents:
diff changeset
  1063
    else
hgs
parents:
diff changeset
  1064
    {
hgs
parents:
diff changeset
  1065
        iIsDRMProtected = EFalse;
hgs
parents:
diff changeset
  1066
        iEventHandler->Reset();
hgs
parents:
diff changeset
  1067
        TRAPD(error,ProcessSvgContentL( aByteData, aError, aRemoveFalseSwitchElements ));
hgs
parents:
diff changeset
  1068
        if ( error != KErrNone )
hgs
parents:
diff changeset
  1069
        {
hgs
parents:
diff changeset
  1070
            PrepareError( aError, ESvgNoMemory, error,
hgs
parents:
diff changeset
  1071
                          _L( "Out of Memory: " ),
hgs
parents:
diff changeset
  1072
                          _L( "Instantiating Parser" ) );
hgs
parents:
diff changeset
  1073
        }
hgs
parents:
diff changeset
  1074
hgs
parents:
diff changeset
  1075
        iInitialDrawFlag = ETrue;
hgs
parents:
diff changeset
  1076
        iFinishedParsing = ETrue;
hgs
parents:
diff changeset
  1077
hgs
parents:
diff changeset
  1078
    }
hgs
parents:
diff changeset
  1079
}
hgs
parents:
diff changeset
  1080
hgs
parents:
diff changeset
  1081
// ==========================================================================
hgs
parents:
diff changeset
  1082
// Need method description
hgs
parents:
diff changeset
  1083
// ==========================================================================
hgs
parents:
diff changeset
  1084
void CSvgDocumentImpl::Load( RFile& aFileHandle, CSvgErrorImpl& aError )
hgs
parents:
diff changeset
  1085
{
hgs
parents:
diff changeset
  1086
    aError.SetErrorCode( ESvgNoError );
hgs
parents:
diff changeset
  1087
hgs
parents:
diff changeset
  1088
    RFs session;
hgs
parents:
diff changeset
  1089
    OpenSession( session, aError );
hgs
parents:
diff changeset
  1090
    if ( !aError.HasError() )
hgs
parents:
diff changeset
  1091
    {
hgs
parents:
diff changeset
  1092
        Load( session, aFileHandle, aError );
hgs
parents:
diff changeset
  1093
        session.Close();
hgs
parents:
diff changeset
  1094
    }
hgs
parents:
diff changeset
  1095
}
hgs
parents:
diff changeset
  1096
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1097
// CSvgDocumentImpl::ParentTimeContainerTick
hgs
parents:
diff changeset
  1098
// From MSvgTimedEntityInterface
hgs
parents:
diff changeset
  1099
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1100
//
hgs
parents:
diff changeset
  1101
void CSvgDocumentImpl::ParentTimeContainerTick( 
hgs
parents:
diff changeset
  1102
    TSvgTick aTick ) // Current tick information 
hgs
parents:
diff changeset
  1103
    {
hgs
parents:
diff changeset
  1104
    TBool lDoRedraw = ETrue;
hgs
parents:
diff changeset
  1105
    if ( iHasParent )
hgs
parents:
diff changeset
  1106
        {
hgs
parents:
diff changeset
  1107
        // Do not redraw in child document to avoid
hgs
parents:
diff changeset
  1108
        // double redraws.
hgs
parents:
diff changeset
  1109
        lDoRedraw = EFalse;
hgs
parents:
diff changeset
  1110
        }
hgs
parents:
diff changeset
  1111
    // Create timer event and propogate to engine
hgs
parents:
diff changeset
  1112
    TSvgTimerEvent lTimerEvent( aTick.iParentTcTick );
hgs
parents:
diff changeset
  1113
    // Send to engine to process the timer event
hgs
parents:
diff changeset
  1114
    TRAPD( lProcEvtErr, Engine()->ProcessEventL( 
hgs
parents:
diff changeset
  1115
        this, &lTimerEvent, lDoRedraw ) );
hgs
parents:
diff changeset
  1116
    if ( lProcEvtErr != KErrNone )
hgs
parents:
diff changeset
  1117
        {
hgs
parents:
diff changeset
  1118
        // Error Processing
hgs
parents:
diff changeset
  1119
        }
hgs
parents:
diff changeset
  1120
    }
hgs
parents:
diff changeset
  1121
    
hgs
parents:
diff changeset
  1122
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1123
// CSvgDocumentImpl::GetEntitySyncBehavior
hgs
parents:
diff changeset
  1124
// From MSvgTimedEntityInterface
hgs
parents:
diff changeset
  1125
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1126
//        
hgs
parents:
diff changeset
  1127
TSvgSyncBehaviour CSvgDocumentImpl::GetEntitySyncBehavior()
hgs
parents:
diff changeset
  1128
    {
hgs
parents:
diff changeset
  1129
    // Document is locked with the parent tc timeline
hgs
parents:
diff changeset
  1130
    return ESvgSyncLocked; 
hgs
parents:
diff changeset
  1131
    }
hgs
parents:
diff changeset
  1132
        
hgs
parents:
diff changeset
  1133
hgs
parents:
diff changeset
  1134
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1135
// CSvgDocumentImpl::GetEntityCurrentTime
hgs
parents:
diff changeset
  1136
// From MSvgTimedEntityInterface
hgs
parents:
diff changeset
  1137
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1138
//        
hgs
parents:
diff changeset
  1139
void CSvgDocumentImpl::GetEntityCurrentTime( TUint32& 
hgs
parents:
diff changeset
  1140
            /* aEntityCurTime */) // Current Entity Time in msecs. 
hgs
parents:
diff changeset
  1141
    {
hgs
parents:
diff changeset
  1142
    }
hgs
parents:
diff changeset
  1143
hgs
parents:
diff changeset
  1144
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1145
// CSvgDocumentImpl::GetCnfSyncMasterStatus
hgs
parents:
diff changeset
  1146
// From MSvgTimedEntityInterface
hgs
parents:
diff changeset
  1147
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1148
//        
hgs
parents:
diff changeset
  1149
void CSvgDocumentImpl::GetCnfSyncMasterStatus( 
hgs
parents:
diff changeset
  1150
            TBool& aIsSyncMaster ) // Indicates whether the element is configured as 
hgs
parents:
diff changeset
  1151
                                   // Sync Master. 
hgs
parents:
diff changeset
  1152
    {
hgs
parents:
diff changeset
  1153
    // Document can never be a sync master
hgs
parents:
diff changeset
  1154
    aIsSyncMaster = EFalse;
hgs
parents:
diff changeset
  1155
    }                                   
hgs
parents:
diff changeset
  1156
hgs
parents:
diff changeset
  1157
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1158
// CSvgDocumentImpl::GetCurSyncMasterStatus
hgs
parents:
diff changeset
  1159
// From MSvgTimedEntityInterface
hgs
parents:
diff changeset
  1160
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1161
void CSvgDocumentImpl::GetCurSyncMasterStatus( 
hgs
parents:
diff changeset
  1162
            TBool& aIsSyncMaster ) // Indicates whether the element is currrently 
hgs
parents:
diff changeset
  1163
                                  // Sync Master. 
hgs
parents:
diff changeset
  1164
    {
hgs
parents:
diff changeset
  1165
    // Document can never be a sync master
hgs
parents:
diff changeset
  1166
    aIsSyncMaster = EFalse;
hgs
parents:
diff changeset
  1167
    }        
hgs
parents:
diff changeset
  1168
hgs
parents:
diff changeset
  1169
hgs
parents:
diff changeset
  1170
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1171
// CSvgDocumentImpl::SetCurSyncMasterStatus
hgs
parents:
diff changeset
  1172
// From MSvgTimedEntityInterface
hgs
parents:
diff changeset
  1173
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1174
void CSvgDocumentImpl::SetCurSyncMasterStatus( 
hgs
parents:
diff changeset
  1175
    TBool /*aSyncMasterStatus */) // Indicates whether the element is 
hgs
parents:
diff changeset
  1176
                                  // currrently Sync Master.
hgs
parents:
diff changeset
  1177
    {
hgs
parents:
diff changeset
  1178
    // Document sync master status is always false as it can never be 
hgs
parents:
diff changeset
  1179
    // a sync master
hgs
parents:
diff changeset
  1180
    }
hgs
parents:
diff changeset
  1181
hgs
parents:
diff changeset
  1182
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1183
// CSvgDocumentImpl::CanGenerateTick
hgs
parents:
diff changeset
  1184
// From MSvgTimedEntityInterface
hgs
parents:
diff changeset
  1185
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1186
TBool CSvgDocumentImpl::CanGenerateTick()
hgs
parents:
diff changeset
  1187
    {
hgs
parents:
diff changeset
  1188
    // Document cannot generate tick, as it is not a inherently timed element
hgs
parents:
diff changeset
  1189
    return EFalse;
hgs
parents:
diff changeset
  1190
    }
hgs
parents:
diff changeset
  1191
hgs
parents:
diff changeset
  1192
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1193
// CSvgDocumentImpl::CanUseParentTick
hgs
parents:
diff changeset
  1194
// From MSvgTimedEntityInterface
hgs
parents:
diff changeset
  1195
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1196
TBool CSvgDocumentImpl::CanUseParentTick()
hgs
parents:
diff changeset
  1197
    {
hgs
parents:
diff changeset
  1198
    // Return True as document can always use parent tick to 
hgs
parents:
diff changeset
  1199
    // advance itself
hgs
parents:
diff changeset
  1200
    return ( ETrue );
hgs
parents:
diff changeset
  1201
    }
hgs
parents:
diff changeset
  1202
    
hgs
parents:
diff changeset
  1203
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1204
// CSvgDocumentImpl::ResyncTimedEntity
hgs
parents:
diff changeset
  1205
// From MSvgTimedEntityInterface
hgs
parents:
diff changeset
  1206
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1207
void CSvgDocumentImpl::ResyncTimedEntity( 
hgs
parents:
diff changeset
  1208
            TUint32 /*aSynctime*/ ) // Time for resync in msecs.
hgs
parents:
diff changeset
  1209
    {
hgs
parents:
diff changeset
  1210
    }
hgs
parents:
diff changeset
  1211
    
hgs
parents:
diff changeset
  1212
hgs
parents:
diff changeset
  1213
hgs
parents:
diff changeset
  1214
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1215
// CSvgDocumentImpl::PauseTimedEntity
hgs
parents:
diff changeset
  1216
// From MSvgTimedEntityInterface
hgs
parents:
diff changeset
  1217
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1218
void CSvgDocumentImpl::PauseTimedEntity()
hgs
parents:
diff changeset
  1219
    {
hgs
parents:
diff changeset
  1220
    
hgs
parents:
diff changeset
  1221
    }
hgs
parents:
diff changeset
  1222
hgs
parents:
diff changeset
  1223
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1224
// CSvgDocumentImpl::ResumeTimedEntity
hgs
parents:
diff changeset
  1225
// From MSvgTimedEntityInterface
hgs
parents:
diff changeset
  1226
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1227
void CSvgDocumentImpl::ResumeTimedEntity()
hgs
parents:
diff changeset
  1228
    {
hgs
parents:
diff changeset
  1229
    
hgs
parents:
diff changeset
  1230
    }
hgs
parents:
diff changeset
  1231
hgs
parents:
diff changeset
  1232
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1233
// CSvgDocumentImpl::StopTimedEntity
hgs
parents:
diff changeset
  1234
// From MSvgTimedEntityInterface
hgs
parents:
diff changeset
  1235
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1236
void CSvgDocumentImpl::StopTimedEntity()
hgs
parents:
diff changeset
  1237
    {
hgs
parents:
diff changeset
  1238
    iEventHandler->ResetTimes();
hgs
parents:
diff changeset
  1239
    }
hgs
parents:
diff changeset
  1240
hgs
parents:
diff changeset
  1241
hgs
parents:
diff changeset
  1242
//From MSvgTimedEntityInterface
hgs
parents:
diff changeset
  1243
TSvgObjectType CSvgDocumentImpl::ObjectType()
hgs
parents:
diff changeset
  1244
{
hgs
parents:
diff changeset
  1245
	return ESvgDocumentElement;	
hgs
parents:
diff changeset
  1246
}
hgs
parents:
diff changeset
  1247
hgs
parents:
diff changeset
  1248
hgs
parents:
diff changeset
  1249
//returns the child time container of the element 
hgs
parents:
diff changeset
  1250
//used in timecontainer
hgs
parents:
diff changeset
  1251
CSvgTimeContainer* CSvgDocumentImpl::GetChildTimeContainer()
hgs
parents:
diff changeset
  1252
{
hgs
parents:
diff changeset
  1253
    return NULL;
hgs
parents:
diff changeset
  1254
}
hgs
parents:
diff changeset
  1255
    
hgs
parents:
diff changeset
  1256
hgs
parents:
diff changeset
  1257
//if node has a child
hgs
parents:
diff changeset
  1258
//		visit the child call postorder on that
hgs
parents:
diff changeset
  1259
//add current node
hgs
parents:
diff changeset
  1260
//if there are siblings 
hgs
parents:
diff changeset
  1261
//		visit all siblings
hgs
parents:
diff changeset
  1262
void CSvgDocumentImpl::ParsePostOrderMediaElements( CSvgElementImpl* aRoot, 
hgs
parents:
diff changeset
  1263
    RPointerArray<CSvgElementImpl>& aPostOrderList)
hgs
parents:
diff changeset
  1264
    {
hgs
parents:
diff changeset
  1265
    if ( !aRoot )
hgs
parents:
diff changeset
  1266
        {
hgs
parents:
diff changeset
  1267
        return;
hgs
parents:
diff changeset
  1268
        }
hgs
parents:
diff changeset
  1269
        
hgs
parents:
diff changeset
  1270
	CSvgElementImpl* lNodePtr = ( CSvgElementImpl* )aRoot->FirstChild();
hgs
parents:
diff changeset
  1271
	while ( lNodePtr != NULL )
hgs
parents:
diff changeset
  1272
	    {
hgs
parents:
diff changeset
  1273
	    ParsePostOrderMediaElements( lNodePtr, aPostOrderList );
hgs
parents:
diff changeset
  1274
        lNodePtr = (CSvgElementImpl* )(lNodePtr->NextSibling() );
hgs
parents:
diff changeset
  1275
	    }
hgs
parents:
diff changeset
  1276
	
hgs
parents:
diff changeset
  1277
	// Add only media elements, currently animation and audio
hgs
parents:
diff changeset
  1278
	if ( aRoot->ElemID() == KSvgMediaAnimationElement || 
hgs
parents:
diff changeset
  1279
	    aRoot->ElemID() == KSvgAudioElement )	
hgs
parents:
diff changeset
  1280
	    {
hgs
parents:
diff changeset
  1281
	    aPostOrderList.Append( aRoot );	    
hgs
parents:
diff changeset
  1282
	    }
hgs
parents:
diff changeset
  1283
    }
hgs
parents:
diff changeset
  1284
hgs
parents:
diff changeset
  1285
// ==========================================================================
hgs
parents:
diff changeset
  1286
// Need method description
hgs
parents:
diff changeset
  1287
// ==========================================================================
hgs
parents:
diff changeset
  1288
void CSvgDocumentImpl::Load( RFs& aSession, RFile& aFileHandle, CSvgErrorImpl& aError )
hgs
parents:
diff changeset
  1289
{
hgs
parents:
diff changeset
  1290
    iEventHandler->Reset();
hgs
parents:
diff changeset
  1291
hgs
parents:
diff changeset
  1292
    RFile ungzippedFile;
hgs
parents:
diff changeset
  1293
    RFile* fileHandle = &aFileHandle;
hgs
parents:
diff changeset
  1294
    TFileName tempFilename;
hgs
parents:
diff changeset
  1295
    TBool needToDeleteTempFile = EFalse;
hgs
parents:
diff changeset
  1296
    iIsDRMProtected = EFalse;
hgs
parents:
diff changeset
  1297
hgs
parents:
diff changeset
  1298
    //************************************************
hgs
parents:
diff changeset
  1299
    // Check for gzip format: write to temp file
hgs
parents:
diff changeset
  1300
    //************************************************
hgs
parents:
diff changeset
  1301
    // Ignore Gzip content due to platform security: uncompressed file must be created
hgs
parents:
diff changeset
  1302
    if ( IsGzipContent( aFileHandle ) )
hgs
parents:
diff changeset
  1303
    {
hgs
parents:
diff changeset
  1304
        //************************************************
hgs
parents:
diff changeset
  1305
        // Ungzipped content may be DRM or txt-svg or binary-svg
hgs
parents:
diff changeset
  1306
        //************************************************
hgs
parents:
diff changeset
  1307
        needToDeleteTempFile = ETrue;
hgs
parents:
diff changeset
  1308
        if ( !ProcessGZipContent( aSession, aFileHandle, tempFilename, aError ) )
hgs
parents:
diff changeset
  1309
            return;
hgs
parents:
diff changeset
  1310
hgs
parents:
diff changeset
  1311
        // Open ungzipped file
hgs
parents:
diff changeset
  1312
        TInt openError = ungzippedFile.Open( aSession, tempFilename, EFileRead );
hgs
parents:
diff changeset
  1313
        if ( openError != KErrNone )
hgs
parents:
diff changeset
  1314
        {
hgs
parents:
diff changeset
  1315
            // couldn't open temp file for writing
hgs
parents:
diff changeset
  1316
            PrepareError( aError, ESvgUnknown, openError,
hgs
parents:
diff changeset
  1317
                          _L( "Loading GZipped SVG File failed: " ),
hgs
parents:
diff changeset
  1318
                          _L( "Error Opening Temp File for Reading." ) );
hgs
parents:
diff changeset
  1319
hgs
parents:
diff changeset
  1320
            // Delete uncompress temp file if needed
hgs
parents:
diff changeset
  1321
            if ( needToDeleteTempFile )
hgs
parents:
diff changeset
  1322
                aSession.Delete( tempFilename );
hgs
parents:
diff changeset
  1323
            return;
hgs
parents:
diff changeset
  1324
        }
hgs
parents:
diff changeset
  1325
        fileHandle = &ungzippedFile;
hgs
parents:
diff changeset
  1326
    }
hgs
parents:
diff changeset
  1327
hgs
parents:
diff changeset
  1328
    HBufC8* svgByteArray = NULL;
hgs
parents:
diff changeset
  1329
    //************************************************
hgs
parents:
diff changeset
  1330
    // Decrypt DRM
hgs
parents:
diff changeset
  1331
    //************************************************
hgs
parents:
diff changeset
  1332
    if ( iDrmEnable && IsDRMContent( *fileHandle ) )
hgs
parents:
diff changeset
  1333
    {
hgs
parents:
diff changeset
  1334
        TRAPD( drmError, svgByteArray = ProcessDRMContentL( *fileHandle, aError ) );
hgs
parents:
diff changeset
  1335
        if ( drmError != KErrNone )
hgs
parents:
diff changeset
  1336
        {
hgs
parents:
diff changeset
  1337
            PrepareError( aError, ESvgNoMemory, drmError,
hgs
parents:
diff changeset
  1338
                          _L( "Out of Memory: " ),
hgs
parents:
diff changeset
  1339
                          _L( "Instantiating DRM Decoder" ) );
hgs
parents:
diff changeset
  1340
            return;
hgs
parents:
diff changeset
  1341
        }
hgs
parents:
diff changeset
  1342
        // drm failed, error should already be set
hgs
parents:
diff changeset
  1343
        else if ( svgByteArray == NULL )
hgs
parents:
diff changeset
  1344
        {
hgs
parents:
diff changeset
  1345
            return;
hgs
parents:
diff changeset
  1346
        }
hgs
parents:
diff changeset
  1347
hgs
parents:
diff changeset
  1348
        if ( needToDeleteTempFile && ( drmError || svgByteArray == NULL ) )
hgs
parents:
diff changeset
  1349
        {
hgs
parents:
diff changeset
  1350
            aSession.Delete( tempFilename );
hgs
parents:
diff changeset
  1351
        }
hgs
parents:
diff changeset
  1352
        iIsDRMProtected = ETrue;
hgs
parents:
diff changeset
  1353
    }
hgs
parents:
diff changeset
  1354
    // Read Non encrypted data
hgs
parents:
diff changeset
  1355
    else
hgs
parents:
diff changeset
  1356
    {
hgs
parents:
diff changeset
  1357
        //************************************************
hgs
parents:
diff changeset
  1358
        // Read plain file: txt-svg or binary-svg
hgs
parents:
diff changeset
  1359
        //************************************************
hgs
parents:
diff changeset
  1360
        TInt fileLength = 0;
hgs
parents:
diff changeset
  1361
        fileHandle->Size( fileLength );
hgs
parents:
diff changeset
  1362
        TRAPD( error, svgByteArray = HBufC8::NewL( fileLength ) );
hgs
parents:
diff changeset
  1363
        if ( error != NULL )
hgs
parents:
diff changeset
  1364
        {
hgs
parents:
diff changeset
  1365
            PrepareError( aError, ESvgNoMemory, error,
hgs
parents:
diff changeset
  1366
                          _L( "Out of Memory" ),
hgs
parents:
diff changeset
  1367
                          _L( "Allocating byte-array for data" ) );
hgs
parents:
diff changeset
  1368
            if ( needToDeleteTempFile )
hgs
parents:
diff changeset
  1369
            {
hgs
parents:
diff changeset
  1370
                aSession.Delete( tempFilename );
hgs
parents:
diff changeset
  1371
            }
hgs
parents:
diff changeset
  1372
            return;
hgs
parents:
diff changeset
  1373
        }
hgs
parents:
diff changeset
  1374
        TInt pos = 0;
hgs
parents:
diff changeset
  1375
        fileHandle->Seek( ESeekStart, pos );
hgs
parents:
diff changeset
  1376
        TPtr8 des = svgByteArray->Des();
hgs
parents:
diff changeset
  1377
        TInt readError = fileHandle->Read( des );
hgs
parents:
diff changeset
  1378
        if ( readError != KErrNone )
hgs
parents:
diff changeset
  1379
        {
hgs
parents:
diff changeset
  1380
            PrepareError( aError, ESvgUnknown, readError,
hgs
parents:
diff changeset
  1381
                          _L( "Reading SVG File Failed." ), _L( "" ) );
hgs
parents:
diff changeset
  1382
            delete svgByteArray;
hgs
parents:
diff changeset
  1383
            if ( needToDeleteTempFile )
hgs
parents:
diff changeset
  1384
            {
hgs
parents:
diff changeset
  1385
                aSession.Delete( tempFilename );
hgs
parents:
diff changeset
  1386
            }
hgs
parents:
diff changeset
  1387
            return;
hgs
parents:
diff changeset
  1388
        }
hgs
parents:
diff changeset
  1389
    }
hgs
parents:
diff changeset
  1390
hgs
parents:
diff changeset
  1391
    //************************************************
hgs
parents:
diff changeset
  1392
    // Parser binary or plain svg content
hgs
parents:
diff changeset
  1393
    //************************************************
hgs
parents:
diff changeset
  1394
    TRAPD( svgError, ProcessSvgContentL( *svgByteArray, aError ) );
hgs
parents:
diff changeset
  1395
    if ( svgError != KErrNone || ( aError.HasError() && !aError.IsWarning() ) )
hgs
parents:
diff changeset
  1396
    {
hgs
parents:
diff changeset
  1397
        delete svgByteArray;
hgs
parents:
diff changeset
  1398
        if ( !aError.HasError() )
hgs
parents:
diff changeset
  1399
        {
hgs
parents:
diff changeset
  1400
            PrepareError( aError, ESvgNoMemory, svgError,
hgs
parents:
diff changeset
  1401
                           _L( "Out of Memory: " ),
hgs
parents:
diff changeset
  1402
                           _L( "Instantiating SVG ContentHandler/Decoder" ) );
hgs
parents:
diff changeset
  1403
        }
hgs
parents:
diff changeset
  1404
        if ( needToDeleteTempFile )
hgs
parents:
diff changeset
  1405
            aSession.Delete( tempFilename );
hgs
parents:
diff changeset
  1406
        return;
hgs
parents:
diff changeset
  1407
    }
hgs
parents:
diff changeset
  1408
hgs
parents:
diff changeset
  1409
    iInitialDrawFlag = ETrue;
hgs
parents:
diff changeset
  1410
    iFinishedParsing = ETrue;
hgs
parents:
diff changeset
  1411
hgs
parents:
diff changeset
  1412
    delete svgByteArray;
hgs
parents:
diff changeset
  1413
hgs
parents:
diff changeset
  1414
hgs
parents:
diff changeset
  1415
    // Delete uncompress temp file if needed
hgs
parents:
diff changeset
  1416
    if ( needToDeleteTempFile )
hgs
parents:
diff changeset
  1417
    {
hgs
parents:
diff changeset
  1418
        // Close only when file handle is for temp file
hgs
parents:
diff changeset
  1419
        fileHandle->Close();
hgs
parents:
diff changeset
  1420
        aSession.Delete( tempFilename );
hgs
parents:
diff changeset
  1421
    }
hgs
parents:
diff changeset
  1422
hgs
parents:
diff changeset
  1423
    // Prepare engine to draw document
hgs
parents:
diff changeset
  1424
    LoadingCompleted();
hgs
parents:
diff changeset
  1425
}
hgs
parents:
diff changeset
  1426
hgs
parents:
diff changeset
  1427
// ==========================================================================
hgs
parents:
diff changeset
  1428
// Need method description
hgs
parents:
diff changeset
  1429
// Leaves only when allocating memory fails
hgs
parents:
diff changeset
  1430
// Reports other errors
hgs
parents:
diff changeset
  1431
// ==========================================================================
hgs
parents:
diff changeset
  1432
void CSvgDocumentImpl::ProcessSvgContentL( const TDesC8& aByteArray, CSvgErrorImpl& aError, TBool aRemoveFalseSwitchElements )
hgs
parents:
diff changeset
  1433
{
hgs
parents:
diff changeset
  1434
    //************************************************
hgs
parents:
diff changeset
  1435
    // Determine binary or xml svg file
hgs
parents:
diff changeset
  1436
    //************************************************
hgs
parents:
diff changeset
  1437
    if ( IsBinarySvg( aByteArray ) )
hgs
parents:
diff changeset
  1438
    {
hgs
parents:
diff changeset
  1439
        TInt error = KErrNone;
hgs
parents:
diff changeset
  1440
        CSvgDecoder* decoder = CSvgDecoder::NewL( aByteArray );
hgs
parents:
diff changeset
  1441
hgs
parents:
diff changeset
  1442
        TRAP( error, iRootElement = decoder->StartDecodingL( this, aError ) );
hgs
parents:
diff changeset
  1443
        if ( error != KErrNone || iRootElement == NULL && !aError.HasError() )
hgs
parents:
diff changeset
  1444
        {
hgs
parents:
diff changeset
  1445
            if ( error != KErrNone )
hgs
parents:
diff changeset
  1446
            {
hgs
parents:
diff changeset
  1447
                PrepareError( aError, ESvgbFileNotValid, error,
hgs
parents:
diff changeset
  1448
                              _L( "Invalid binary file." ), _L( "" ) );
hgs
parents:
diff changeset
  1449
            }
hgs
parents:
diff changeset
  1450
        }
hgs
parents:
diff changeset
  1451
        delete decoder;
hgs
parents:
diff changeset
  1452
    }
hgs
parents:
diff changeset
  1453
    else
hgs
parents:
diff changeset
  1454
    {
hgs
parents:
diff changeset
  1455
        iXmlHandler = CSvgContentHandler::NewL( aRemoveFalseSwitchElements );
hgs
parents:
diff changeset
  1456
        iRootElement = iXmlHandler->ParseByteData( this, aByteArray, aError );
hgs
parents:
diff changeset
  1457
        delete iXmlHandler;
hgs
parents:
diff changeset
  1458
        iXmlHandler = NULL;
hgs
parents:
diff changeset
  1459
    }
hgs
parents:
diff changeset
  1460
}
hgs
parents:
diff changeset
  1461
hgs
parents:
diff changeset
  1462
// ==========================================================================
hgs
parents:
diff changeset
  1463
// JSR226 only!!
hgs
parents:
diff changeset
  1464
// Allows filling of document from JSR side with 16 bit string instead of 8
hgs
parents:
diff changeset
  1465
//
hgs
parents:
diff changeset
  1466
// ==========================================================================
hgs
parents:
diff changeset
  1467
void CSvgDocumentImpl::Load16BitString( const TDesC16& aSvgString, CSvgErrorImpl& aError, TBool aRemoveFalseSwitchElements )
hgs
parents:
diff changeset
  1468
{
hgs
parents:
diff changeset
  1469
    aError.SetErrorCode( ESvgNoError );
hgs
parents:
diff changeset
  1470
hgs
parents:
diff changeset
  1471
    iIsDRMProtected = EFalse;
hgs
parents:
diff changeset
  1472
hgs
parents:
diff changeset
  1473
    if (iEventHandler)
hgs
parents:
diff changeset
  1474
    iEventHandler->Reset();
hgs
parents:
diff changeset
  1475
    TRAPD(error,Process16BitSvgContentL( aSvgString, aError, aRemoveFalseSwitchElements ));
hgs
parents:
diff changeset
  1476
    if ( error != KErrNone )
hgs
parents:
diff changeset
  1477
    {
hgs
parents:
diff changeset
  1478
    	PrepareError( aError, ESvgNoMemory, error,
hgs
parents:
diff changeset
  1479
                          _L( "Out of Memory: " ),
hgs
parents:
diff changeset
  1480
                          _L( "Instantiating Parser" ) );
hgs
parents:
diff changeset
  1481
    }
hgs
parents:
diff changeset
  1482
hgs
parents:
diff changeset
  1483
    iInitialDrawFlag = ETrue;
hgs
parents:
diff changeset
  1484
    iFinishedParsing = ETrue;
hgs
parents:
diff changeset
  1485
}
hgs
parents:
diff changeset
  1486
hgs
parents:
diff changeset
  1487
void CSvgDocumentImpl::Process16BitSvgContentL( const TDesC16& aSvgString, CSvgErrorImpl& aError, TBool aRemoveFalseSwitchElements )
hgs
parents:
diff changeset
  1488
{
hgs
parents:
diff changeset
  1489
    iXmlHandler = CSvgContentHandler::NewL( aRemoveFalseSwitchElements );
hgs
parents:
diff changeset
  1490
    iRootElement = iXmlHandler->Parse16BitData( this, aSvgString, aError );
hgs
parents:
diff changeset
  1491
    delete iXmlHandler;
hgs
parents:
diff changeset
  1492
    iXmlHandler = NULL;
hgs
parents:
diff changeset
  1493
}
hgs
parents:
diff changeset
  1494
// END OF JSR226 ONLY
hgs
parents:
diff changeset
  1495
// ==========================================================================
hgs
parents:
diff changeset
  1496
hgs
parents:
diff changeset
  1497
// ==========================================================================
hgs
parents:
diff changeset
  1498
void CSvgDocumentImpl::CancelParsing()
hgs
parents:
diff changeset
  1499
    {
hgs
parents:
diff changeset
  1500
    // Check if there is animation element in the parent svg
hgs
parents:
diff changeset
  1501
    RPointerArray<CSvgElementImpl> lAnimationEleList;
hgs
parents:
diff changeset
  1502
    FindAllElements((CSvgElementImpl* )RootElement(),
hgs
parents:
diff changeset
  1503
               KSvgMediaAnimationElement, lAnimationEleList );
hgs
parents:
diff changeset
  1504
    TInt lAnimationEleCnt = lAnimationEleList.Count();    
hgs
parents:
diff changeset
  1505
    for ( TInt lCurAnimationEle = 0; 
hgs
parents:
diff changeset
  1506
            lCurAnimationEle < lAnimationEleCnt; lCurAnimationEle++ )
hgs
parents:
diff changeset
  1507
        {
hgs
parents:
diff changeset
  1508
        CSvgMediaAnimationElementImpl* lAnimationElement = 
hgs
parents:
diff changeset
  1509
            (CSvgMediaAnimationElementImpl* )lAnimationEleList[ lCurAnimationEle ];
hgs
parents:
diff changeset
  1510
        CSvgDocumentImpl* lChildDoc = lAnimationElement->GetChildDocument();
hgs
parents:
diff changeset
  1511
        if ( lChildDoc )
hgs
parents:
diff changeset
  1512
            {
hgs
parents:
diff changeset
  1513
            lChildDoc->CancelParsing(); // Cancel parsing on child svg
hgs
parents:
diff changeset
  1514
            }
hgs
parents:
diff changeset
  1515
        }
hgs
parents:
diff changeset
  1516
    lAnimationEleList.Close();    
hgs
parents:
diff changeset
  1517
    if ( iXmlHandler )
hgs
parents:
diff changeset
  1518
        {
hgs
parents:
diff changeset
  1519
        iXmlHandler->CancelParsing();
hgs
parents:
diff changeset
  1520
        }
hgs
parents:
diff changeset
  1521
    }
hgs
parents:
diff changeset
  1522
hgs
parents:
diff changeset
  1523
// ==========================================================================
hgs
parents:
diff changeset
  1524
TBool CSvgDocumentImpl::IsParsing()
hgs
parents:
diff changeset
  1525
    {
hgs
parents:
diff changeset
  1526
    // xml handler is set to NULL after parsing
hgs
parents:
diff changeset
  1527
    return iXmlHandler != NULL;
hgs
parents:
diff changeset
  1528
    }
hgs
parents:
diff changeset
  1529
hgs
parents:
diff changeset
  1530
//***************************************************************************
hgs
parents:
diff changeset
  1531
// The function isGroupOpacity checks to see if there is a valid opacity
hgs
parents:
diff changeset
  1532
// attribute.
hgs
parents:
diff changeset
  1533
//***************************************************************************
hgs
parents:
diff changeset
  1534
hgs
parents:
diff changeset
  1535
TBool CSvgDocumentImpl::isGroupOpacity( CSvgElementImpl* aElement )
hgs
parents:
diff changeset
  1536
{
hgs
parents:
diff changeset
  1537
	TBool lReturnValue = EFalse;
hgs
parents:
diff changeset
  1538
    CCssValue*  lCssValue = NULL;
hgs
parents:
diff changeset
  1539
hgs
parents:
diff changeset
  1540
    aElement->FindProperty( KCSS_ATTR_GROUP_OPACITY, lCssValue, aElement );
hgs
parents:
diff changeset
  1541
    if ( lCssValue )
hgs
parents:
diff changeset
  1542
       {
hgs
parents:
diff changeset
  1543
        if ( ((CFloatCssValueImpl*)lCssValue)->Value() != KFloatFixOne )
hgs
parents:
diff changeset
  1544
           {
hgs
parents:
diff changeset
  1545
           // valid opacity value
hgs
parents:
diff changeset
  1546
            lReturnValue = ETrue;
hgs
parents:
diff changeset
  1547
            }
hgs
parents:
diff changeset
  1548
        }
hgs
parents:
diff changeset
  1549
hgs
parents:
diff changeset
  1550
    return lReturnValue;
hgs
parents:
diff changeset
  1551
}
hgs
parents:
diff changeset
  1552
hgs
parents:
diff changeset
  1553
hgs
parents:
diff changeset
  1554
// ==========================================================================
hgs
parents:
diff changeset
  1555
// Pre-condition: content is DRM
hgs
parents:
diff changeset
  1556
// The content of a DRM may be svg-text or svg-bin
hgs
parents:
diff changeset
  1557
// Leaves only for memory allocation failure
hgs
parents:
diff changeset
  1558
// ==========================================================================
hgs
parents:
diff changeset
  1559
HBufC8* CSvgDocumentImpl::ProcessDRMContentL( RFile& aFileHandle, CSvgErrorImpl& aError )
hgs
parents:
diff changeset
  1560
{
hgs
parents:
diff changeset
  1561
    // Open File Content and Data
hgs
parents:
diff changeset
  1562
    ContentAccess::CContent* content = ContentAccess::CContent::NewLC( 
hgs
parents:
diff changeset
  1563
            aFileHandle );
hgs
parents:
diff changeset
  1564
    // Note: very important to use EView and NOT EPlay
hgs
parents:
diff changeset
  1565
    ContentAccess::CData* data = content->OpenContentLC( ContentAccess::EView );
hgs
parents:
diff changeset
  1566
hgs
parents:
diff changeset
  1567
    // Read Length of Content
hgs
parents:
diff changeset
  1568
    TInt length = 0;
hgs
parents:
diff changeset
  1569
    TRAPD( sizeError, data->DataSizeL( length ) );
hgs
parents:
diff changeset
  1570
    // Cannot get length of data
hgs
parents:
diff changeset
  1571
    if ( sizeError != KErrNone )
hgs
parents:
diff changeset
  1572
    {
hgs
parents:
diff changeset
  1573
        ProcessDRMError( sizeError, aError );
hgs
parents:
diff changeset
  1574
        CleanupStack::PopAndDestroy( 2 );
hgs
parents:
diff changeset
  1575
        return NULL;
hgs
parents:
diff changeset
  1576
    }
hgs
parents:
diff changeset
  1577
hgs
parents:
diff changeset
  1578
    // Allocate Memory for Content: no leavable command after this
hgs
parents:
diff changeset
  1579
    // so, pushing onto cleanup stack not needed
hgs
parents:
diff changeset
  1580
    HBufC8* buffer = HBufC8::NewL( length );
hgs
parents:
diff changeset
  1581
hgs
parents:
diff changeset
  1582
    TPtr8 des = buffer->Des();
hgs
parents:
diff changeset
  1583
    TInt readError = data->Read( des );
hgs
parents:
diff changeset
  1584
hgs
parents:
diff changeset
  1585
    // Check for read error
hgs
parents:
diff changeset
  1586
    if ( readError != KErrNone )
hgs
parents:
diff changeset
  1587
    {
hgs
parents:
diff changeset
  1588
        ProcessDRMError( readError, aError );
hgs
parents:
diff changeset
  1589
        CleanupStack::PopAndDestroy( 2 );
hgs
parents:
diff changeset
  1590
        delete buffer;
hgs
parents:
diff changeset
  1591
        return NULL;
hgs
parents:
diff changeset
  1592
    }
hgs
parents:
diff changeset
  1593
    // Only consume rights when not in thumb nail mode
hgs
parents:
diff changeset
  1594
    else if ( !iIsThumbNailMode )
hgs
parents:
diff changeset
  1595
    {
hgs
parents:
diff changeset
  1596
        // Do not consume drm rights if iDrmRightsConsumptionEnabled is EFalse
hgs
parents:
diff changeset
  1597
        if(iDrmRightsConsumptionEnabled)
hgs
parents:
diff changeset
  1598
        {
hgs
parents:
diff changeset
  1599
        TInt intentError = data->ExecuteIntent( ContentAccess::EView );
hgs
parents:
diff changeset
  1600
        if ( intentError != KErrNone )
hgs
parents:
diff changeset
  1601
        {
hgs
parents:
diff changeset
  1602
            ProcessDRMError( readError, aError );
hgs
parents:
diff changeset
  1603
            aError.SetIsWarning( ETrue );
hgs
parents:
diff changeset
  1604
            }
hgs
parents:
diff changeset
  1605
        }
hgs
parents:
diff changeset
  1606
    }
hgs
parents:
diff changeset
  1607
    CleanupStack::PopAndDestroy( 2 );
hgs
parents:
diff changeset
  1608
    return buffer;
hgs
parents:
diff changeset
  1609
}
hgs
parents:
diff changeset
  1610
hgs
parents:
diff changeset
  1611
// ==========================================================================
hgs
parents:
diff changeset
  1612
// Un-gzip to a temp file and return the name of temp file
hgs
parents:
diff changeset
  1613
// ==========================================================================
hgs
parents:
diff changeset
  1614
TBool CSvgDocumentImpl::ProcessGZipContent( RFs& aSession,
hgs
parents:
diff changeset
  1615
                                            RFile& aGZipFileHandle,
hgs
parents:
diff changeset
  1616
                                            TFileName& aUnzippedFileName ,
hgs
parents:
diff changeset
  1617
                                            CSvgErrorImpl& aError )
hgs
parents:
diff changeset
  1618
{
hgs
parents:
diff changeset
  1619
    // Write data to temp file: gzip does not have function to read RFile
hgs
parents:
diff changeset
  1620
    TFileName gzipFilename;
hgs
parents:
diff changeset
  1621
    if ( WriteToTempFile( aSession, aGZipFileHandle, gzipFilename, aError ) != KErrNone )
hgs
parents:
diff changeset
  1622
        return EFalse;
hgs
parents:
diff changeset
  1623
hgs
parents:
diff changeset
  1624
    TBool result = ProcessGZipContent( aSession, gzipFilename, aUnzippedFileName, aError );
hgs
parents:
diff changeset
  1625
hgs
parents:
diff changeset
  1626
    // Delete temp gzipped file
hgs
parents:
diff changeset
  1627
    aSession.Delete( gzipFilename );
hgs
parents:
diff changeset
  1628
hgs
parents:
diff changeset
  1629
    return result;
hgs
parents:
diff changeset
  1630
}
hgs
parents:
diff changeset
  1631
hgs
parents:
diff changeset
  1632
// ==========================================================================
hgs
parents:
diff changeset
  1633
// Uncompress to a temporary file
hgs
parents:
diff changeset
  1634
// ==========================================================================
hgs
parents:
diff changeset
  1635
TBool CSvgDocumentImpl::ProcessGZipContent( RFs& aSession,
hgs
parents:
diff changeset
  1636
                                            TFileName& aZippedFileName,
hgs
parents:
diff changeset
  1637
                                            TFileName& aUnzippedFileName ,
hgs
parents:
diff changeset
  1638
                                            CSvgErrorImpl& aError )
hgs
parents:
diff changeset
  1639
{
hgs
parents:
diff changeset
  1640
    // Create ungzipped temp file
hgs
parents:
diff changeset
  1641
    TFileName path;
hgs
parents:
diff changeset
  1642
    GetProcessPrivatePath( aSession, path );
hgs
parents:
diff changeset
  1643
    RFile gzipOutputFile;
hgs
parents:
diff changeset
  1644
    TInt replaceError = gzipOutputFile.Temp( aSession, path, aUnzippedFileName, EFileWrite );
hgs
parents:
diff changeset
  1645
    if ( replaceError != KErrNone )
hgs
parents:
diff changeset
  1646
    {
hgs
parents:
diff changeset
  1647
        // couldn't open temp file for writing
hgs
parents:
diff changeset
  1648
        PrepareError( aError, ESvgUnknown, replaceError,
hgs
parents:
diff changeset
  1649
                      _L( "Failed to create file or unGZip: " ), aUnzippedFileName );
hgs
parents:
diff changeset
  1650
        return EFalse;
hgs
parents:
diff changeset
  1651
    }
hgs
parents:
diff changeset
  1652
hgs
parents:
diff changeset
  1653
    // okay so far, uncompressing
hgs
parents:
diff changeset
  1654
    CEZGZipToFile* uncompressor = NULL;
hgs
parents:
diff changeset
  1655
    TRAPD( uncompressorError,
hgs
parents:
diff changeset
  1656
           uncompressor = CEZGZipToFile::NewL( aSession, aZippedFileName, gzipOutputFile ) )
hgs
parents:
diff changeset
  1657
    if ( uncompressorError != KErrNone )
hgs
parents:
diff changeset
  1658
    {
hgs
parents:
diff changeset
  1659
        PrepareError( aError, ESvgUnknown, uncompressorError,
hgs
parents:
diff changeset
  1660
                      _L( "Out of memory: " ),
hgs
parents:
diff changeset
  1661
                      _L( "Instantiating GZip decompressor" ) );
hgs
parents:
diff changeset
  1662
        gzipOutputFile.Close();
hgs
parents:
diff changeset
  1663
        aSession.Delete( aUnzippedFileName );
hgs
parents:
diff changeset
  1664
hgs
parents:
diff changeset
  1665
        return EFalse;
hgs
parents:
diff changeset
  1666
    }
hgs
parents:
diff changeset
  1667
hgs
parents:
diff changeset
  1668
    // Decompress file
hgs
parents:
diff changeset
  1669
    TBool done = EFalse;
hgs
parents:
diff changeset
  1670
    while ( !done )
hgs
parents:
diff changeset
  1671
    {
hgs
parents:
diff changeset
  1672
        TRAPD( inflateError, done = !uncompressor->InflateL() );
hgs
parents:
diff changeset
  1673
        if ( inflateError != KErrNone )
hgs
parents:
diff changeset
  1674
        {
hgs
parents:
diff changeset
  1675
            PrepareError( aError, ESvgUnknown, inflateError,
hgs
parents:
diff changeset
  1676
                          _L( "Uncompressing GZip file failed." ), _L( "" ) );
hgs
parents:
diff changeset
  1677
            delete uncompressor;
hgs
parents:
diff changeset
  1678
            gzipOutputFile.Close();
hgs
parents:
diff changeset
  1679
            aSession.Delete( aUnzippedFileName );
hgs
parents:
diff changeset
  1680
hgs
parents:
diff changeset
  1681
            return EFalse;
hgs
parents:
diff changeset
  1682
        }
hgs
parents:
diff changeset
  1683
    }
hgs
parents:
diff changeset
  1684
hgs
parents:
diff changeset
  1685
    gzipOutputFile.Close();
hgs
parents:
diff changeset
  1686
    delete uncompressor;
hgs
parents:
diff changeset
  1687
hgs
parents:
diff changeset
  1688
    return ETrue;
hgs
parents:
diff changeset
  1689
}
hgs
parents:
diff changeset
  1690
hgs
parents:
diff changeset
  1691
// ==========================================================================
hgs
parents:
diff changeset
  1692
// Error codes taken from caf/content.h
hgs
parents:
diff changeset
  1693
// ==========================================================================
hgs
parents:
diff changeset
  1694
void CSvgDocumentImpl::ProcessDRMError( TInt errorCode, CSvgErrorImpl& aError )
hgs
parents:
diff changeset
  1695
{
hgs
parents:
diff changeset
  1696
    if ( errorCode == KErrNone )
hgs
parents:
diff changeset
  1697
        return;
hgs
parents:
diff changeset
  1698
hgs
parents:
diff changeset
  1699
    if ( errorCode == KErrNotFound )
hgs
parents:
diff changeset
  1700
    {
hgs
parents:
diff changeset
  1701
        aError.SetDescription( _L( "Content Not Found" ) );
hgs
parents:
diff changeset
  1702
    }
hgs
parents:
diff changeset
  1703
    else if ( errorCode == KErrCAPendingRights )
hgs
parents:
diff changeset
  1704
    {
hgs
parents:
diff changeset
  1705
        aError.SetDescription( _L( "Rights Have Not Arrived" ) );
hgs
parents:
diff changeset
  1706
    }
hgs
parents:
diff changeset
  1707
    else if ( errorCode == KErrCANoPermission )
hgs
parents:
diff changeset
  1708
    {
hgs
parents:
diff changeset
  1709
        aError.SetDescription( _L( "No Permission to Play Content" ) );
hgs
parents:
diff changeset
  1710
    }
hgs
parents:
diff changeset
  1711
    else if ( errorCode == KErrCANoRights )
hgs
parents:
diff changeset
  1712
    {
hgs
parents:
diff changeset
  1713
        aError.SetDescription( _L( "No Rights Exists for Content" ) );
hgs
parents:
diff changeset
  1714
    }
hgs
parents:
diff changeset
  1715
    else if ( errorCode == KErrCANotSupported )
hgs
parents:
diff changeset
  1716
    {
hgs
parents:
diff changeset
  1717
        aError.SetDescription( _L( "Unable to Open Content" ) );
hgs
parents:
diff changeset
  1718
    }
hgs
parents:
diff changeset
  1719
    else if ( errorCode == KErrPermissionDenied )
hgs
parents:
diff changeset
  1720
    {
hgs
parents:
diff changeset
  1721
        aError.SetDescription( _L( "No Permission to Open Content" ) );
hgs
parents:
diff changeset
  1722
    }
hgs
parents:
diff changeset
  1723
    else if ( errorCode == KErrAccessDenied )
hgs
parents:
diff changeset
  1724
    {
hgs
parents:
diff changeset
  1725
        aError.SetDescription( _L( "Content Already in Use or No DRM Capability" ) );
hgs
parents:
diff changeset
  1726
    }
hgs
parents:
diff changeset
  1727
    else if ( errorCode == KErrCASizeNotDetermined )
hgs
parents:
diff changeset
  1728
    {
hgs
parents:
diff changeset
  1729
        aError.SetDescription( _L( "Cannot Determine Size of Content" ) );
hgs
parents:
diff changeset
  1730
    }
hgs
parents:
diff changeset
  1731
    else
hgs
parents:
diff changeset
  1732
    {
hgs
parents:
diff changeset
  1733
        aError.SetDescription( _L( "Unknown DRM Error" ) );
hgs
parents:
diff changeset
  1734
    }
hgs
parents:
diff changeset
  1735
    aError.SetIsWarning( EFalse );
hgs
parents:
diff changeset
  1736
    aError.SetErrorCode( ESvgDRMFailure );
hgs
parents:
diff changeset
  1737
    aError.SetSystemErrorCode( errorCode );
hgs
parents:
diff changeset
  1738
}
hgs
parents:
diff changeset
  1739
hgs
parents:
diff changeset
  1740
// ==========================================================================
hgs
parents:
diff changeset
  1741
// Returns true if the first two bytes of the given file could be a gzip file.
hgs
parents:
diff changeset
  1742
// This function is modified from the function in EZGZipFile class.
hgs
parents:
diff changeset
  1743
// ==========================================================================
hgs
parents:
diff changeset
  1744
TBool CSvgDocumentImpl::IsGzipContent( RFile& aFileHandle )
hgs
parents:
diff changeset
  1745
{
hgs
parents:
diff changeset
  1746
    TUint8 ids[2];
hgs
parents:
diff changeset
  1747
    TPtr8 des( ids, 0, sizeof( TUint8 ) * 2 );
hgs
parents:
diff changeset
  1748
hgs
parents:
diff changeset
  1749
    if ( aFileHandle.Read( des ) != KErrNone )
hgs
parents:
diff changeset
  1750
        return EFalse;
hgs
parents:
diff changeset
  1751
hgs
parents:
diff changeset
  1752
    // reset to start of file
hgs
parents:
diff changeset
  1753
    TInt zero = 0;
hgs
parents:
diff changeset
  1754
    aFileHandle.Seek( ESeekStart, zero );
hgs
parents:
diff changeset
  1755
    return ( ids[0] == 31 && ids[1] == 139 );
hgs
parents:
diff changeset
  1756
//    return ( ids[0] == EZGZipFile::ID1 && ids[1] == EZGZipFile::ID2 );
hgs
parents:
diff changeset
  1757
}
hgs
parents:
diff changeset
  1758
hgs
parents:
diff changeset
  1759
// ==========================================================================
hgs
parents:
diff changeset
  1760
// Returns whether the byte-array header matches a GZIP signature
hgs
parents:
diff changeset
  1761
// ==========================================================================
hgs
parents:
diff changeset
  1762
TBool CSvgDocumentImpl::IsGzipContent( const TDesC8& aByteArray )
hgs
parents:
diff changeset
  1763
{
hgs
parents:
diff changeset
  1764
    return aByteArray.Length() >= 2 &&
hgs
parents:
diff changeset
  1765
           aByteArray[0] == 31 && aByteArray[1] == 139;
hgs
parents:
diff changeset
  1766
//           aByteArray[0] == EZGZipFile::ID1 && aByteArray[1] == EZGZipFile::ID2;
hgs
parents:
diff changeset
  1767
}
hgs
parents:
diff changeset
  1768
hgs
parents:
diff changeset
  1769
// ==========================================================================
hgs
parents:
diff changeset
  1770
// Returns whether the byte-array header matches a SVG binary signature
hgs
parents:
diff changeset
  1771
// ==========================================================================
hgs
parents:
diff changeset
  1772
TBool CSvgDocumentImpl::IsBinarySvg( const TDesC8& aByteArray )
hgs
parents:
diff changeset
  1773
{
hgs
parents:
diff changeset
  1774
	//const TUint32 KBinaryFile          = 66737868;
hgs
parents:
diff changeset
  1775
	//const TUint32 KBinaryFile2         = 66737869;
hgs
parents:
diff changeset
  1776
hgs
parents:
diff changeset
  1777
	if ((aByteArray.Length() >= 4 &&
hgs
parents:
diff changeset
  1778
           aByteArray[0] == 0xCC && aByteArray[1] == 0x56 &&
hgs
parents:
diff changeset
  1779
           aByteArray[2] == 0xFA && aByteArray[3] == 0x03) ||
hgs
parents:
diff changeset
  1780
        (aByteArray.Length() >= 4 &&
hgs
parents:
diff changeset
  1781
           aByteArray[0] == 0xCD && aByteArray[1] == 0x56 &&
hgs
parents:
diff changeset
  1782
           aByteArray[2] == 0xFA && aByteArray[3] == 0x03) ||
hgs
parents:
diff changeset
  1783
        (aByteArray.Length() >= 4 &&
hgs
parents:
diff changeset
  1784
           aByteArray[0] == 0xCE && aByteArray[1] == 0x56 &&
hgs
parents:
diff changeset
  1785
           aByteArray[2] == 0xFA && aByteArray[3] == 0x03) ||
hgs
parents:
diff changeset
  1786
        (aByteArray.Length() >= 4 &&
hgs
parents:
diff changeset
  1787
           aByteArray[0] == 0xCF && aByteArray[1] == 0x56 &&
hgs
parents:
diff changeset
  1788
           aByteArray[2] == 0xFA && aByteArray[3] == 0x03) )
hgs
parents:
diff changeset
  1789
	{
hgs
parents:
diff changeset
  1790
		return ETrue;
hgs
parents:
diff changeset
  1791
	}
hgs
parents:
diff changeset
  1792
    else
hgs
parents:
diff changeset
  1793
    {
hgs
parents:
diff changeset
  1794
    	return EFalse;
hgs
parents:
diff changeset
  1795
    }
hgs
parents:
diff changeset
  1796
}
hgs
parents:
diff changeset
  1797
hgs
parents:
diff changeset
  1798
// ==========================================================================
hgs
parents:
diff changeset
  1799
// Returns whether the file header matches a DRM signature
hgs
parents:
diff changeset
  1800
// ==========================================================================
hgs
parents:
diff changeset
  1801
TBool CSvgDocumentImpl::IsDRMContent( RFile& aFileHandle )
hgs
parents:
diff changeset
  1802
{
hgs
parents:
diff changeset
  1803
    TUint8 ids[2];
hgs
parents:
diff changeset
  1804
    TPtr8 des( ids, 0, sizeof( TUint8 ) * 2 );
hgs
parents:
diff changeset
  1805
hgs
parents:
diff changeset
  1806
    if ( aFileHandle.Read( des ) != KErrNone )
hgs
parents:
diff changeset
  1807
        return EFalse;
hgs
parents:
diff changeset
  1808
hgs
parents:
diff changeset
  1809
    // reset to start of file
hgs
parents:
diff changeset
  1810
    TInt zero = 0;
hgs
parents:
diff changeset
  1811
    aFileHandle.Seek( ESeekStart, zero );
hgs
parents:
diff changeset
  1812
    return ( ids[0] == 0x01 && ids[1] == 0x0D );
hgs
parents:
diff changeset
  1813
}
hgs
parents:
diff changeset
  1814
hgs
parents:
diff changeset
  1815
// ==========================================================================
hgs
parents:
diff changeset
  1816
// Returns whether the file header matches a DRM signature
hgs
parents:
diff changeset
  1817
// ==========================================================================
hgs
parents:
diff changeset
  1818
TBool CSvgDocumentImpl::IsDRMContent( const TDesC8& aByteArray )
hgs
parents:
diff changeset
  1819
{
hgs
parents:
diff changeset
  1820
    return ( aByteArray.Length() > 1 && aByteArray[0] == 0x01 && aByteArray[1] == 0x0D );
hgs
parents:
diff changeset
  1821
}
hgs
parents:
diff changeset
  1822
hgs
parents:
diff changeset
  1823
// ==========================================================================
hgs
parents:
diff changeset
  1824
// Generate the "c:/private/<sid>" directory name
hgs
parents:
diff changeset
  1825
// ==========================================================================
hgs
parents:
diff changeset
  1826
TInt CSvgDocumentImpl::GetProcessPrivatePath( RFs& aSession, TFileName& aPath )
hgs
parents:
diff changeset
  1827
{
hgs
parents:
diff changeset
  1828
    aSession.PrivatePath( aPath );
hgs
parents:
diff changeset
  1829
    aPath.Insert( 0, _L( "c:" ) );
hgs
parents:
diff changeset
  1830
    return KErrNone;
hgs
parents:
diff changeset
  1831
}
hgs
parents:
diff changeset
  1832
hgs
parents:
diff changeset
  1833
// ==========================================================================
hgs
parents:
diff changeset
  1834
// Create "c:/private/<sid>" directory if it does not already exist
hgs
parents:
diff changeset
  1835
// ==========================================================================
hgs
parents:
diff changeset
  1836
TInt CSvgDocumentImpl::CreateProcessPrivateDirectory( RFs& aSession, TFileName& aPath )
hgs
parents:
diff changeset
  1837
{
hgs
parents:
diff changeset
  1838
    GetProcessPrivatePath( aSession, aPath );
hgs
parents:
diff changeset
  1839
    return ( !BaflUtils::FolderExists( aSession, aPath ) ) ? aSession.MkDir( aPath ) : KErrNone;
hgs
parents:
diff changeset
  1840
}
hgs
parents:
diff changeset
  1841
hgs
parents:
diff changeset
  1842
// ==========================================================================
hgs
parents:
diff changeset
  1843
// Open a file session, error is indicated in aError
hgs
parents:
diff changeset
  1844
// ==========================================================================
hgs
parents:
diff changeset
  1845
void CSvgDocumentImpl::OpenSession( RFs& aSession, CSvgErrorImpl& aError )
hgs
parents:
diff changeset
  1846
{
hgs
parents:
diff changeset
  1847
    TInt error = aSession.Connect();
hgs
parents:
diff changeset
  1848
    if ( error != KErrNone )
hgs
parents:
diff changeset
  1849
    {
hgs
parents:
diff changeset
  1850
        // couldn't open temp file for writing
hgs
parents:
diff changeset
  1851
        PrepareError( aError, ESvgUnknown, error,
hgs
parents:
diff changeset
  1852
                      _L( "Connecting File Session Failed." ), _L( "" ) );
hgs
parents:
diff changeset
  1853
    }
hgs
parents:
diff changeset
  1854
}
hgs
parents:
diff changeset
  1855
hgs
parents:
diff changeset
  1856
// ==========================================================================
hgs
parents:
diff changeset
  1857
// Session must be opened successfully
hgs
parents:
diff changeset
  1858
// File name of temp file is store in aFilename
hgs
parents:
diff changeset
  1859
// ==========================================================================
hgs
parents:
diff changeset
  1860
TInt CSvgDocumentImpl::WriteToTempFile( RFs& aSession, const TDesC8& aByteArray,
hgs
parents:
diff changeset
  1861
                                        TFileName& aFilename, CSvgErrorImpl& aError )
hgs
parents:
diff changeset
  1862
{
hgs
parents:
diff changeset
  1863
    // Create temporary file for byte-array
hgs
parents:
diff changeset
  1864
    TFileName path;
hgs
parents:
diff changeset
  1865
    CreateProcessPrivateDirectory( aSession, path );
hgs
parents:
diff changeset
  1866
    RFile writeFile;
hgs
parents:
diff changeset
  1867
    TInt tempError = writeFile.Temp( aSession, path, aFilename, EFileWrite );
hgs
parents:
diff changeset
  1868
    if ( tempError != KErrNone )
hgs
parents:
diff changeset
  1869
    {
hgs
parents:
diff changeset
  1870
        PrepareError( aError, ESvgUnknown, tempError,
hgs
parents:
diff changeset
  1871
                      _L( "Failed open temp file to write data." ), aFilename );
hgs
parents:
diff changeset
  1872
        return tempError;
hgs
parents:
diff changeset
  1873
    }
hgs
parents:
diff changeset
  1874
hgs
parents:
diff changeset
  1875
    // Write byte-array to file
hgs
parents:
diff changeset
  1876
    TInt writeError = writeFile.Write( aByteArray );
hgs
parents:
diff changeset
  1877
    if ( writeError != KErrNone )
hgs
parents:
diff changeset
  1878
    {
hgs
parents:
diff changeset
  1879
        PrepareError( aError, ESvgUnknown, writeError,
hgs
parents:
diff changeset
  1880
                      _L( "Failed to write data to temp file." ), aFilename );
hgs
parents:
diff changeset
  1881
        writeFile.Close();
hgs
parents:
diff changeset
  1882
        aSession.Delete( aFilename );
hgs
parents:
diff changeset
  1883
        return writeError;
hgs
parents:
diff changeset
  1884
    }
hgs
parents:
diff changeset
  1885
    writeFile.Flush();
hgs
parents:
diff changeset
  1886
    writeFile.Close();
hgs
parents:
diff changeset
  1887
hgs
parents:
diff changeset
  1888
    return KErrNone;
hgs
parents:
diff changeset
  1889
}
hgs
parents:
diff changeset
  1890
hgs
parents:
diff changeset
  1891
// ==========================================================================
hgs
parents:
diff changeset
  1892
// Session must be opened successfully
hgs
parents:
diff changeset
  1893
// File name of temp file is store in aFilename
hgs
parents:
diff changeset
  1894
// ==========================================================================
hgs
parents:
diff changeset
  1895
TInt CSvgDocumentImpl::WriteToTempFile( RFs& aSession, RFile& aFileHandle,
hgs
parents:
diff changeset
  1896
                                        TFileName& aFilename, CSvgErrorImpl& aError )
hgs
parents:
diff changeset
  1897
{
hgs
parents:
diff changeset
  1898
    // Create temporary file for byte-array
hgs
parents:
diff changeset
  1899
    TFileName path;
hgs
parents:
diff changeset
  1900
    CreateProcessPrivateDirectory( aSession, path );
hgs
parents:
diff changeset
  1901
    RFile writeFile;
hgs
parents:
diff changeset
  1902
    TInt tempError = writeFile.Temp( aSession, path, aFilename, EFileWrite );
hgs
parents:
diff changeset
  1903
    if ( tempError != KErrNone )
hgs
parents:
diff changeset
  1904
    {
hgs
parents:
diff changeset
  1905
        PrepareError( aError, ESvgUnknown, tempError,
hgs
parents:
diff changeset
  1906
                      _L( "Failed open temp file to write data." ), path );
hgs
parents:
diff changeset
  1907
        return tempError;
hgs
parents:
diff changeset
  1908
    }
hgs
parents:
diff changeset
  1909
hgs
parents:
diff changeset
  1910
    // Write data to temp file
hgs
parents:
diff changeset
  1911
    TInt size;
hgs
parents:
diff changeset
  1912
    TInt sizeError = aFileHandle.Size( size );
hgs
parents:
diff changeset
  1913
    if ( sizeError != KErrNone )
hgs
parents:
diff changeset
  1914
    {
hgs
parents:
diff changeset
  1915
        PrepareError( aError, ESvgUnknown, sizeError,
hgs
parents:
diff changeset
  1916
                      _L( "Failed to get data length of file." ), aFilename );
hgs
parents:
diff changeset
  1917
        aSession.Delete( aFilename );
hgs
parents:
diff changeset
  1918
        return sizeError;
hgs
parents:
diff changeset
  1919
    }
hgs
parents:
diff changeset
  1920
hgs
parents:
diff changeset
  1921
    TBuf8<1024> buffer;
hgs
parents:
diff changeset
  1922
    TInt bytesCopied = 0;
hgs
parents:
diff changeset
  1923
    while ( bytesCopied < size )
hgs
parents:
diff changeset
  1924
    {
hgs
parents:
diff changeset
  1925
        buffer.Zero();
hgs
parents:
diff changeset
  1926
        TInt bytesToCopy = ( size - bytesCopied < 1024 ) ? size - bytesCopied : 1024;
hgs
parents:
diff changeset
  1927
        // read data
hgs
parents:
diff changeset
  1928
        TInt readError = aFileHandle.Read( buffer, bytesToCopy );
hgs
parents:
diff changeset
  1929
        if ( readError != KErrNone )
hgs
parents:
diff changeset
  1930
        {
hgs
parents:
diff changeset
  1931
            PrepareError( aError, ESvgUnknown, readError,
hgs
parents:
diff changeset
  1932
                          _L( "Failed to read data to copy to temp file: " ), aFilename );
hgs
parents:
diff changeset
  1933
            writeFile.Close();
hgs
parents:
diff changeset
  1934
            aSession.Delete( aFilename );
hgs
parents:
diff changeset
  1935
            return readError;
hgs
parents:
diff changeset
  1936
        }
hgs
parents:
diff changeset
  1937
        // write data
hgs
parents:
diff changeset
  1938
        TInt writeError = writeFile.Write( buffer, bytesToCopy );
hgs
parents:
diff changeset
  1939
        if ( writeError != KErrNone )
hgs
parents:
diff changeset
  1940
        {
hgs
parents:
diff changeset
  1941
            PrepareError( aError, ESvgUnknown, writeError,
hgs
parents:
diff changeset
  1942
                          _L( "Failed to write to temp file: " ), aFilename );
hgs
parents:
diff changeset
  1943
            writeFile.Close();
hgs
parents:
diff changeset
  1944
            aSession.Delete( aFilename );
hgs
parents:
diff changeset
  1945
            return writeError;
hgs
parents:
diff changeset
  1946
        }
hgs
parents:
diff changeset
  1947
        bytesCopied += bytesToCopy;
hgs
parents:
diff changeset
  1948
    }
hgs
parents:
diff changeset
  1949
hgs
parents:
diff changeset
  1950
    writeFile.Flush();
hgs
parents:
diff changeset
  1951
    writeFile.Close();
hgs
parents:
diff changeset
  1952
hgs
parents:
diff changeset
  1953
    return KErrNone;
hgs
parents:
diff changeset
  1954
}
hgs
parents:
diff changeset
  1955
hgs
parents:
diff changeset
  1956
// ==========================================================================
hgs
parents:
diff changeset
  1957
// Need method description
hgs
parents:
diff changeset
  1958
// ==========================================================================
hgs
parents:
diff changeset
  1959
void CSvgDocumentImpl::PrepareError( CSvgErrorImpl& aError,
hgs
parents:
diff changeset
  1960
                                     TSvgErrorCode aSvgErrorCode,
hgs
parents:
diff changeset
  1961
                                     TInt aSystemErrorCode,
hgs
parents:
diff changeset
  1962
                                     const TDesC& aMsg1,
hgs
parents:
diff changeset
  1963
                                     const TDesC& aMsg2 )
hgs
parents:
diff changeset
  1964
{
hgs
parents:
diff changeset
  1965
    aError.SetDescription( aMsg1, aMsg2 );
hgs
parents:
diff changeset
  1966
    aError.SetErrorCode( aSvgErrorCode );
hgs
parents:
diff changeset
  1967
    aError.SetSystemErrorCode( aSystemErrorCode );
hgs
parents:
diff changeset
  1968
    aError.SetIsWarning( EFalse );
hgs
parents:
diff changeset
  1969
}
hgs
parents:
diff changeset
  1970
hgs
parents:
diff changeset
  1971
// ==========================================================================
hgs
parents:
diff changeset
  1972
// Need method description
hgs
parents:
diff changeset
  1973
// ==========================================================================
hgs
parents:
diff changeset
  1974
void CSvgDocumentImpl::LoadingCompleted()
hgs
parents:
diff changeset
  1975
{
hgs
parents:
diff changeset
  1976
    if ( iEngine != NULL && iEngine->GraphicsContext() != NULL )
hgs
parents:
diff changeset
  1977
    {
hgs
parents:
diff changeset
  1978
        iEngine->GraphicsContext()->SetDoDithering( iHasGradientElement );
hgs
parents:
diff changeset
  1979
    }
hgs
parents:
diff changeset
  1980
}
hgs
parents:
diff changeset
  1981
hgs
parents:
diff changeset
  1982
// ==========================================================================
hgs
parents:
diff changeset
  1983
// Need method description
hgs
parents:
diff changeset
  1984
// ==========================================================================
hgs
parents:
diff changeset
  1985
void CSvgDocumentImpl::SetThumbNailMode( TBool aThumbNailMode )
hgs
parents:
diff changeset
  1986
{
hgs
parents:
diff changeset
  1987
    iIsThumbNailMode = aThumbNailMode;
hgs
parents:
diff changeset
  1988
}
hgs
parents:
diff changeset
  1989
hgs
parents:
diff changeset
  1990
//==========================================================================
hgs
parents:
diff changeset
  1991
// CSvgDocumentImpl::SetDRMRights( TBool aEnable )
hgs
parents:
diff changeset
  1992
//==========================================================================
hgs
parents:
diff changeset
  1993
void CSvgDocumentImpl::SetDRMRights( TBool aEnable)
hgs
parents:
diff changeset
  1994
{
hgs
parents:
diff changeset
  1995
	iDrmRightsConsumptionEnabled = aEnable;
hgs
parents:
diff changeset
  1996
}
hgs
parents:
diff changeset
  1997
// ==========================================================================
hgs
parents:
diff changeset
  1998
// Need method description
hgs
parents:
diff changeset
  1999
// ==========================================================================
hgs
parents:
diff changeset
  2000
TBool CSvgDocumentImpl::IsThumbNailOnly()
hgs
parents:
diff changeset
  2001
{
hgs
parents:
diff changeset
  2002
    return iIsThumbNailMode && iIsDRMProtected;
hgs
parents:
diff changeset
  2003
}
hgs
parents:
diff changeset
  2004
hgs
parents:
diff changeset
  2005
// ==========================================================================
hgs
parents:
diff changeset
  2006
// Need method description
hgs
parents:
diff changeset
  2007
// ==========================================================================
hgs
parents:
diff changeset
  2008
void CSvgDocumentImpl::SetWasPrepared( TBool aBool )
hgs
parents:
diff changeset
  2009
{
hgs
parents:
diff changeset
  2010
    iWasPrepared = aBool;
hgs
parents:
diff changeset
  2011
hgs
parents:
diff changeset
  2012
}
hgs
parents:
diff changeset
  2013
hgs
parents:
diff changeset
  2014
// ==========================================================================
hgs
parents:
diff changeset
  2015
// Need method description
hgs
parents:
diff changeset
  2016
// ==========================================================================
hgs
parents:
diff changeset
  2017
TBool CSvgDocumentImpl::WasPrepared()
hgs
parents:
diff changeset
  2018
{
hgs
parents:
diff changeset
  2019
    return iWasPrepared;
hgs
parents:
diff changeset
  2020
}
hgs
parents:
diff changeset
  2021
hgs
parents:
diff changeset
  2022
// ==========================================================================
hgs
parents:
diff changeset
  2023
// Need method description
hgs
parents:
diff changeset
  2024
// ==========================================================================
hgs
parents:
diff changeset
  2025
void CSvgDocumentImpl::SetLoadingListeners( const RPointerArray<MSvgLoadingListener>* aList )
hgs
parents:
diff changeset
  2026
    {
hgs
parents:
diff changeset
  2027
    iLoadingListeners = aList;
hgs
parents:
diff changeset
  2028
    }
hgs
parents:
diff changeset
  2029
hgs
parents:
diff changeset
  2030
// ==========================================================================
hgs
parents:
diff changeset
  2031
// Need method description
hgs
parents:
diff changeset
  2032
// ==========================================================================
hgs
parents:
diff changeset
  2033
const RPointerArray<MSvgLoadingListener>* CSvgDocumentImpl::GetLoadingListeners()
hgs
parents:
diff changeset
  2034
    {
hgs
parents:
diff changeset
  2035
    return iLoadingListeners;
hgs
parents:
diff changeset
  2036
    }
hgs
parents:
diff changeset
  2037
hgs
parents:
diff changeset
  2038
/*---------------------------MouseListener---------------------------*/
hgs
parents:
diff changeset
  2039
hgs
parents:
diff changeset
  2040
// ==========================================================================
hgs
parents:
diff changeset
  2041
// Need method description
hgs
parents:
diff changeset
  2042
// ==========================================================================
hgs
parents:
diff changeset
  2043
void CSvgDocumentImpl::AddInternalMouseListener( const MSvgMouseListener* aListener )
hgs
parents:
diff changeset
  2044
    {
hgs
parents:
diff changeset
  2045
    TInt index = iSvgMouseListeners.Find( aListener );
hgs
parents:
diff changeset
  2046
    if ( aListener != NULL && index == KErrNotFound )
hgs
parents:
diff changeset
  2047
        {
hgs
parents:
diff changeset
  2048
        iSvgMouseListeners.Append( aListener );
hgs
parents:
diff changeset
  2049
        }
hgs
parents:
diff changeset
  2050
    }
hgs
parents:
diff changeset
  2051
hgs
parents:
diff changeset
  2052
// ==========================================================================
hgs
parents:
diff changeset
  2053
// Need method description
hgs
parents:
diff changeset
  2054
// ==========================================================================
hgs
parents:
diff changeset
  2055
void CSvgDocumentImpl::RemoveInternalMouseListener( const MSvgMouseListener* aListener )
hgs
parents:
diff changeset
  2056
    {
hgs
parents:
diff changeset
  2057
    TInt index = iSvgMouseListeners.Find( aListener );
hgs
parents:
diff changeset
  2058
    if ( index != KErrNotFound )
hgs
parents:
diff changeset
  2059
        {
hgs
parents:
diff changeset
  2060
        iSvgMouseListeners.Remove( index );
hgs
parents:
diff changeset
  2061
        }
hgs
parents:
diff changeset
  2062
    }
hgs
parents:
diff changeset
  2063
hgs
parents:
diff changeset
  2064
// ==========================================================================
hgs
parents:
diff changeset
  2065
// Need method description
hgs
parents:
diff changeset
  2066
// ==========================================================================
hgs
parents:
diff changeset
  2067
TInt CSvgDocumentImpl::MouseInternalListenerCount()
hgs
parents:
diff changeset
  2068
    {
hgs
parents:
diff changeset
  2069
    return iSvgMouseListeners.Count();
hgs
parents:
diff changeset
  2070
    }
hgs
parents:
diff changeset
  2071
hgs
parents:
diff changeset
  2072
// ==========================================================================
hgs
parents:
diff changeset
  2073
// Need method description
hgs
parents:
diff changeset
  2074
// ==========================================================================
hgs
parents:
diff changeset
  2075
void CSvgDocumentImpl::NotifyInternalMousePressed( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2076
                                          TInt aX, TInt aY )
hgs
parents:
diff changeset
  2077
    {
hgs
parents:
diff changeset
  2078
hgs
parents:
diff changeset
  2079
    for ( TInt i = 0; i < iSvgMouseListeners.Count(); i++ )
hgs
parents:
diff changeset
  2080
        {
hgs
parents:
diff changeset
  2081
        iSvgMouseListeners[i]->MousePressed( aElements, aX, aY );
hgs
parents:
diff changeset
  2082
        }
hgs
parents:
diff changeset
  2083
    }
hgs
parents:
diff changeset
  2084
hgs
parents:
diff changeset
  2085
// ==========================================================================
hgs
parents:
diff changeset
  2086
// Need method description
hgs
parents:
diff changeset
  2087
// ==========================================================================
hgs
parents:
diff changeset
  2088
void CSvgDocumentImpl::NotifyInternalMouseReleased( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2089
                                          TInt aX, TInt aY )
hgs
parents:
diff changeset
  2090
    {
hgs
parents:
diff changeset
  2091
hgs
parents:
diff changeset
  2092
    for ( TInt i = 0; i < iSvgMouseListeners.Count(); i++ )
hgs
parents:
diff changeset
  2093
        {
hgs
parents:
diff changeset
  2094
        iSvgMouseListeners[i]->MouseReleased( aElements, aX, aY );
hgs
parents:
diff changeset
  2095
        }
hgs
parents:
diff changeset
  2096
    }
hgs
parents:
diff changeset
  2097
hgs
parents:
diff changeset
  2098
// ==========================================================================
hgs
parents:
diff changeset
  2099
// Need method description
hgs
parents:
diff changeset
  2100
// ==========================================================================
hgs
parents:
diff changeset
  2101
void CSvgDocumentImpl::NotifyInternalMouseEntered( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2102
                                          TInt aX, TInt aY )
hgs
parents:
diff changeset
  2103
    {
hgs
parents:
diff changeset
  2104
hgs
parents:
diff changeset
  2105
    for ( TInt i = 0; i < iSvgMouseListeners.Count(); i++ )
hgs
parents:
diff changeset
  2106
        {
hgs
parents:
diff changeset
  2107
        iSvgMouseListeners[i]->MouseEntered( aElements, aX, aY );
hgs
parents:
diff changeset
  2108
        }
hgs
parents:
diff changeset
  2109
    }
hgs
parents:
diff changeset
  2110
hgs
parents:
diff changeset
  2111
// ==========================================================================
hgs
parents:
diff changeset
  2112
// Need method description
hgs
parents:
diff changeset
  2113
// ==========================================================================
hgs
parents:
diff changeset
  2114
void CSvgDocumentImpl::NotifyInternalMouseExited( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2115
                                          TInt aX, TInt aY )
hgs
parents:
diff changeset
  2116
    {
hgs
parents:
diff changeset
  2117
hgs
parents:
diff changeset
  2118
    for ( TInt i = 0; i < iSvgMouseListeners.Count(); i++ )
hgs
parents:
diff changeset
  2119
        {
hgs
parents:
diff changeset
  2120
        iSvgMouseListeners[i]->MouseExited( aElements, aX, aY );
hgs
parents:
diff changeset
  2121
        }
hgs
parents:
diff changeset
  2122
    }
hgs
parents:
diff changeset
  2123
hgs
parents:
diff changeset
  2124
// ==========================================================================
hgs
parents:
diff changeset
  2125
// Need method description
hgs
parents:
diff changeset
  2126
// ==========================================================================
hgs
parents:
diff changeset
  2127
void CSvgDocumentImpl::NotifyInternalMouseMoved( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2128
                                          TInt aX, TInt aY )
hgs
parents:
diff changeset
  2129
    {
hgs
parents:
diff changeset
  2130
hgs
parents:
diff changeset
  2131
    for ( TInt i = 0; i < iSvgMouseListeners.Count(); i++ )
hgs
parents:
diff changeset
  2132
        {
hgs
parents:
diff changeset
  2133
        iSvgMouseListeners[i]->MouseMoved( aElements, aX, aY );
hgs
parents:
diff changeset
  2134
        }
hgs
parents:
diff changeset
  2135
    }
hgs
parents:
diff changeset
  2136
hgs
parents:
diff changeset
  2137
// ==========================================================================
hgs
parents:
diff changeset
  2138
// Need method description
hgs
parents:
diff changeset
  2139
// ==========================================================================
hgs
parents:
diff changeset
  2140
void CSvgDocumentImpl::NotifyDocumentStart()
hgs
parents:
diff changeset
  2141
    {
hgs
parents:
diff changeset
  2142
    if ( iLoadingListeners != NULL )
hgs
parents:
diff changeset
  2143
        {
hgs
parents:
diff changeset
  2144
        TInt loadingListenersCnt = iLoadingListeners->Count();
hgs
parents:
diff changeset
  2145
        for ( TInt i = 0; i < loadingListenersCnt; i++ )
hgs
parents:
diff changeset
  2146
            {
hgs
parents:
diff changeset
  2147
            (*iLoadingListeners)[i]->DocumentStart();
hgs
parents:
diff changeset
  2148
            }
hgs
parents:
diff changeset
  2149
        }
hgs
parents:
diff changeset
  2150
    }
hgs
parents:
diff changeset
  2151
hgs
parents:
diff changeset
  2152
// ==========================================================================
hgs
parents:
diff changeset
  2153
// Need method description
hgs
parents:
diff changeset
  2154
// ==========================================================================
hgs
parents:
diff changeset
  2155
void CSvgDocumentImpl::NotifyDocumentEnd()
hgs
parents:
diff changeset
  2156
    {
hgs
parents:
diff changeset
  2157
    if ( iLoadingListeners != NULL )
hgs
parents:
diff changeset
  2158
        {
hgs
parents:
diff changeset
  2159
        TInt loadingListenersCnt = iLoadingListeners->Count();
hgs
parents:
diff changeset
  2160
        for ( TInt i = 0; i < loadingListenersCnt; i++ )
hgs
parents:
diff changeset
  2161
            {
hgs
parents:
diff changeset
  2162
            (*iLoadingListeners)[i]->DocumentEnd();
hgs
parents:
diff changeset
  2163
            }
hgs
parents:
diff changeset
  2164
        }
hgs
parents:
diff changeset
  2165
    }
hgs
parents:
diff changeset
  2166
hgs
parents:
diff changeset
  2167
// ==========================================================================
hgs
parents:
diff changeset
  2168
// Need method description
hgs
parents:
diff changeset
  2169
// ==========================================================================
hgs
parents:
diff changeset
  2170
void CSvgDocumentImpl::NotifyElementStart( const TDesC& aTagName,
hgs
parents:
diff changeset
  2171
                                           MSvgAttributeList& aAttributeList,
hgs
parents:
diff changeset
  2172
                                           TBool aIsSvgChild )
hgs
parents:
diff changeset
  2173
    {
hgs
parents:
diff changeset
  2174
    // Do not send back attribute list if content was decrypted
hgs
parents:
diff changeset
  2175
    // from DRM protected content.
hgs
parents:
diff changeset
  2176
    if ( iLoadingListeners != NULL && !iIsDRMProtected )
hgs
parents:
diff changeset
  2177
        {
hgs
parents:
diff changeset
  2178
        TInt loadingListenersCnt = iLoadingListeners->Count();
hgs
parents:
diff changeset
  2179
        for ( TInt i = 0; i < loadingListenersCnt; i++ )
hgs
parents:
diff changeset
  2180
            {
hgs
parents:
diff changeset
  2181
            if ( aIsSvgChild || (*iLoadingListeners)[i]->ReportAllElements() )
hgs
parents:
diff changeset
  2182
                {
hgs
parents:
diff changeset
  2183
                (*iLoadingListeners)[i]->ElementStart( aTagName, aAttributeList );
hgs
parents:
diff changeset
  2184
                }
hgs
parents:
diff changeset
  2185
            }
hgs
parents:
diff changeset
  2186
        }
hgs
parents:
diff changeset
  2187
    }
hgs
parents:
diff changeset
  2188
hgs
parents:
diff changeset
  2189
// ==========================================================================
hgs
parents:
diff changeset
  2190
// Need method description
hgs
parents:
diff changeset
  2191
// ==========================================================================
hgs
parents:
diff changeset
  2192
void CSvgDocumentImpl::NotifyElementEnd( const TDesC& aTagName, TBool aIsSvgChild )
hgs
parents:
diff changeset
  2193
    {
hgs
parents:
diff changeset
  2194
    if ( iLoadingListeners != NULL )
hgs
parents:
diff changeset
  2195
        {
hgs
parents:
diff changeset
  2196
        TInt loadingListenersCnt = iLoadingListeners->Count();
hgs
parents:
diff changeset
  2197
        for ( TInt i = 0; i < loadingListenersCnt; i++ )
hgs
parents:
diff changeset
  2198
            {
hgs
parents:
diff changeset
  2199
            if ( aIsSvgChild || (*iLoadingListeners)[i]->ReportAllElements() )
hgs
parents:
diff changeset
  2200
                {
hgs
parents:
diff changeset
  2201
                (*iLoadingListeners)[i]->ElementEnd( aTagName );
hgs
parents:
diff changeset
  2202
                }
hgs
parents:
diff changeset
  2203
            }
hgs
parents:
diff changeset
  2204
        }
hgs
parents:
diff changeset
  2205
    }
hgs
parents:
diff changeset
  2206
hgs
parents:
diff changeset
  2207
// ==========================================================================
hgs
parents:
diff changeset
  2208
// Need method description
hgs
parents:
diff changeset
  2209
// ==========================================================================
hgs
parents:
diff changeset
  2210
void CSvgDocumentImpl::NotifyUnsupportedElement( const TDesC& aTagName,
hgs
parents:
diff changeset
  2211
                                                 MSvgAttributeList& aAttributeList )
hgs
parents:
diff changeset
  2212
    {
hgs
parents:
diff changeset
  2213
    if ( iLoadingListeners != NULL )
hgs
parents:
diff changeset
  2214
        {
hgs
parents:
diff changeset
  2215
        TInt loadingListenersCnt = iLoadingListeners->Count();
hgs
parents:
diff changeset
  2216
        for ( TInt i = 0; i < loadingListenersCnt; i++ )
hgs
parents:
diff changeset
  2217
            {
hgs
parents:
diff changeset
  2218
            (*iLoadingListeners)[i]->UnsupportedElement( aTagName, aAttributeList );
hgs
parents:
diff changeset
  2219
            }
hgs
parents:
diff changeset
  2220
        }
hgs
parents:
diff changeset
  2221
    }
hgs
parents:
diff changeset
  2222
hgs
parents:
diff changeset
  2223
// ==========================================================================
hgs
parents:
diff changeset
  2224
// Need method description
hgs
parents:
diff changeset
  2225
// ==========================================================================
hgs
parents:
diff changeset
  2226
void CSvgDocumentImpl::NotifyExternalDataRequested( const TDesC& aUri )
hgs
parents:
diff changeset
  2227
    {
hgs
parents:
diff changeset
  2228
    if ( iLoadingListeners != NULL )
hgs
parents:
diff changeset
  2229
        {
hgs
parents:
diff changeset
  2230
        TInt loadingListenersCnt = iLoadingListeners->Count();
hgs
parents:
diff changeset
  2231
        for ( TInt i = 0; i < loadingListenersCnt; i++ )
hgs
parents:
diff changeset
  2232
            {
hgs
parents:
diff changeset
  2233
            (*iLoadingListeners)[i]->ExternalDataRequested( aUri );
hgs
parents:
diff changeset
  2234
            }
hgs
parents:
diff changeset
  2235
        }
hgs
parents:
diff changeset
  2236
    }
hgs
parents:
diff changeset
  2237
hgs
parents:
diff changeset
  2238
// ==========================================================================
hgs
parents:
diff changeset
  2239
// Need method description
hgs
parents:
diff changeset
  2240
// ==========================================================================
hgs
parents:
diff changeset
  2241
void CSvgDocumentImpl::NotifyExternalDataReceived( const TDesC& aUri )
hgs
parents:
diff changeset
  2242
    {
hgs
parents:
diff changeset
  2243
    if ( iLoadingListeners != NULL )
hgs
parents:
diff changeset
  2244
        {
hgs
parents:
diff changeset
  2245
        TInt loadingListenersCnt = iLoadingListeners->Count();
hgs
parents:
diff changeset
  2246
        for ( TInt i = 0; i < loadingListenersCnt; i++ )
hgs
parents:
diff changeset
  2247
            {
hgs
parents:
diff changeset
  2248
            (*iLoadingListeners)[i]->ExternalDataReceived( aUri );
hgs
parents:
diff changeset
  2249
            }
hgs
parents:
diff changeset
  2250
        }
hgs
parents:
diff changeset
  2251
    }
hgs
parents:
diff changeset
  2252
hgs
parents:
diff changeset
  2253
// ==========================================================================
hgs
parents:
diff changeset
  2254
// Need method description
hgs
parents:
diff changeset
  2255
// ==========================================================================
hgs
parents:
diff changeset
  2256
void CSvgDocumentImpl::NotifyExternalDataRequestFailed( const TDesC& aUri )
hgs
parents:
diff changeset
  2257
    {
hgs
parents:
diff changeset
  2258
    if ( iLoadingListeners != NULL )
hgs
parents:
diff changeset
  2259
        {
hgs
parents:
diff changeset
  2260
        TInt loadingListenersCnt = iLoadingListeners->Count();
hgs
parents:
diff changeset
  2261
        for ( TInt i = 0; i < loadingListenersCnt; i++ )
hgs
parents:
diff changeset
  2262
            {
hgs
parents:
diff changeset
  2263
            (*iLoadingListeners)[i]->ExternalDataRequestFailed( aUri );
hgs
parents:
diff changeset
  2264
            }
hgs
parents:
diff changeset
  2265
        }
hgs
parents:
diff changeset
  2266
    }
hgs
parents:
diff changeset
  2267
hgs
parents:
diff changeset
  2268
// ==========================================================================
hgs
parents:
diff changeset
  2269
// Need method description
hgs
parents:
diff changeset
  2270
// ==========================================================================
hgs
parents:
diff changeset
  2271
TUint32 CSvgDocumentImpl::IsIndefiniteAnimation()
hgs
parents:
diff changeset
  2272
    {
hgs
parents:
diff changeset
  2273
    if ( !iCheckedAnimationDuration )
hgs
parents:
diff changeset
  2274
        {
hgs
parents:
diff changeset
  2275
        AnimationDuration();
hgs
parents:
diff changeset
  2276
        }
hgs
parents:
diff changeset
  2277
    // special value for indefinite animation
hgs
parents:
diff changeset
  2278
    return ( iAnimationDuration == KIndefiniteAnimationDuration );
hgs
parents:
diff changeset
  2279
    }
hgs
parents:
diff changeset
  2280
hgs
parents:
diff changeset
  2281
// ==========================================================================
hgs
parents:
diff changeset
  2282
// Need method description
hgs
parents:
diff changeset
  2283
// ==========================================================================
hgs
parents:
diff changeset
  2284
TUint32 CSvgDocumentImpl::AnimationDuration()
hgs
parents:
diff changeset
  2285
    {
hgs
parents:
diff changeset
  2286
    if ( iCheckedAnimationDuration )
hgs
parents:
diff changeset
  2287
        {
hgs
parents:
diff changeset
  2288
        return IsIndefiniteAnimation() ? 0xFFFFFFFF : iAnimationDuration;
hgs
parents:
diff changeset
  2289
        }
hgs
parents:
diff changeset
  2290
    else if ( iRootElement == NULL )
hgs
parents:
diff changeset
  2291
        {
hgs
parents:
diff changeset
  2292
        return 0;
hgs
parents:
diff changeset
  2293
        }
hgs
parents:
diff changeset
  2294
hgs
parents:
diff changeset
  2295
    if ( iIsInteractive )
hgs
parents:
diff changeset
  2296
        {
hgs
parents:
diff changeset
  2297
        // If there is interactivity in the content, set the animation
hgs
parents:
diff changeset
  2298
        // duration to indefinite so that the timer continues to run.
hgs
parents:
diff changeset
  2299
        iAnimationDuration = KIndefiniteAnimationDuration;
hgs
parents:
diff changeset
  2300
        }
hgs
parents:
diff changeset
  2301
    else
hgs
parents:
diff changeset
  2302
        {
hgs
parents:
diff changeset
  2303
        iAnimationDuration = SubtreeDuration( iRootElement );
hgs
parents:
diff changeset
  2304
        }
hgs
parents:
diff changeset
  2305
hgs
parents:
diff changeset
  2306
    iCheckedAnimationDuration = ETrue;
hgs
parents:
diff changeset
  2307
    return IsIndefiniteAnimation() ? 0xFFFFFFFF : iAnimationDuration;
hgs
parents:
diff changeset
  2308
    }
hgs
parents:
diff changeset
  2309
hgs
parents:
diff changeset
  2310
// ==========================================================================
hgs
parents:
diff changeset
  2311
// Return the longest animation in subtree
hgs
parents:
diff changeset
  2312
// ==========================================================================
hgs
parents:
diff changeset
  2313
TUint32 CSvgDocumentImpl::SubtreeDuration( CSvgElementImpl* aRootElement )
hgs
parents:
diff changeset
  2314
    {
hgs
parents:
diff changeset
  2315
    TUint dur = 0;
hgs
parents:
diff changeset
  2316
		
hgs
parents:
diff changeset
  2317
    if ( aRootElement->IsAnimatedElement() )
hgs
parents:
diff changeset
  2318
        {
hgs
parents:
diff changeset
  2319
        dur = ( ( CSvgAnimationBase * ) aRootElement )->CompleteDuration();
hgs
parents:
diff changeset
  2320
        }
hgs
parents:
diff changeset
  2321
hgs
parents:
diff changeset
  2322
	else if ( aRootElement->ElemID() == KSvgDiscardElement )
hgs
parents:
diff changeset
  2323
		{
hgs
parents:
diff changeset
  2324
			dur = ((CSvgDiscardElementImpl*)aRootElement)->AbsoluteBeginTime();
hgs
parents:
diff changeset
  2325
		}
hgs
parents:
diff changeset
  2326
		
hgs
parents:
diff changeset
  2327
    // check child duration
hgs
parents:
diff changeset
  2328
    TUint childDur;
hgs
parents:
diff changeset
  2329
    CSvgElementImpl* child = (CSvgElementImpl*)aRootElement->FirstChild();
hgs
parents:
diff changeset
  2330
    while ( child != NULL )
hgs
parents:
diff changeset
  2331
        {
hgs
parents:
diff changeset
  2332
        childDur = SubtreeDuration( child );
hgs
parents:
diff changeset
  2333
        if ( childDur > dur )
hgs
parents:
diff changeset
  2334
            {
hgs
parents:
diff changeset
  2335
            dur = childDur;
hgs
parents:
diff changeset
  2336
            }
hgs
parents:
diff changeset
  2337
        child = (CSvgElementImpl*)child->NextSibling();
hgs
parents:
diff changeset
  2338
        }
hgs
parents:
diff changeset
  2339
    return dur;
hgs
parents:
diff changeset
  2340
    }
hgs
parents:
diff changeset
  2341
hgs
parents:
diff changeset
  2342
// ==========================================================================
hgs
parents:
diff changeset
  2343
// notified from outside (AppendChild/RemoveChild)
hgs
parents:
diff changeset
  2344
// ==========================================================================
hgs
parents:
diff changeset
  2345
void CSvgDocumentImpl::ElementAppendedOrRemoved()
hgs
parents:
diff changeset
  2346
    {
hgs
parents:
diff changeset
  2347
    // Clear flag to retrieve animation duration on AnimationDuration() call
hgs
parents:
diff changeset
  2348
    iCheckedAnimationDuration = EFalse;
hgs
parents:
diff changeset
  2349
    }
hgs
parents:
diff changeset
  2350
hgs
parents:
diff changeset
  2351
// ==========================================================================
hgs
parents:
diff changeset
  2352
// Return all elements of the given type
hgs
parents:
diff changeset
  2353
// or all of the elements if the type = -1
hgs
parents:
diff changeset
  2354
// ==========================================================================
hgs
parents:
diff changeset
  2355
void CSvgDocumentImpl::FindAllElements( CSvgElementImpl* aStartElement, TInt aElementId,
hgs
parents:
diff changeset
  2356
                                      RPointerArray<CSvgElementImpl>& aList,
hgs
parents:
diff changeset
  2357
                                      TSvgSearchFlags aFlags )
hgs
parents:
diff changeset
  2358
    {
hgs
parents:
diff changeset
  2359
    if ( aStartElement == NULL )
hgs
parents:
diff changeset
  2360
        return;
hgs
parents:
diff changeset
  2361
hgs
parents:
diff changeset
  2362
    CSvgElementImpl* child = (CSvgElementImpl*)aStartElement->FirstChild();
hgs
parents:
diff changeset
  2363
    while ( child != NULL )
hgs
parents:
diff changeset
  2364
        {
hgs
parents:
diff changeset
  2365
        // add to list if child is found
hgs
parents:
diff changeset
  2366
        if ( child->ElemID() == aElementId || aElementId == -1 )
hgs
parents:
diff changeset
  2367
            aList.Append( child );
hgs
parents:
diff changeset
  2368
hgs
parents:
diff changeset
  2369
        // find in grandchildren
hgs
parents:
diff changeset
  2370
        if ( aFlags & ESvgSearchExcludeUseSubtree )
hgs
parents:
diff changeset
  2371
            {
hgs
parents:
diff changeset
  2372
            // If Exclude Use Subtree, ignore the subtree under use element
hgs
parents:
diff changeset
  2373
            if ( child->ElemID() != KSvgUseElement )
hgs
parents:
diff changeset
  2374
                {
hgs
parents:
diff changeset
  2375
                FindAllElements( child, aElementId, aList, aFlags );
hgs
parents:
diff changeset
  2376
                }
hgs
parents:
diff changeset
  2377
            }
hgs
parents:
diff changeset
  2378
        else
hgs
parents:
diff changeset
  2379
            {
hgs
parents:
diff changeset
  2380
            FindAllElements( child, aElementId, aList, aFlags );
hgs
parents:
diff changeset
  2381
            }
hgs
parents:
diff changeset
  2382
        child = (CSvgElementImpl*)child->NextSibling();
hgs
parents:
diff changeset
  2383
        }
hgs
parents:
diff changeset
  2384
    }
hgs
parents:
diff changeset
  2385
hgs
parents:
diff changeset
  2386
// ==========================================================================
hgs
parents:
diff changeset
  2387
// ImageLoadingObserver interface method
hgs
parents:
diff changeset
  2388
// ==========================================================================
hgs
parents:
diff changeset
  2389
void CSvgDocumentImpl::ImageLoadingCompleted( TInt aError )
hgs
parents:
diff changeset
  2390
    {
hgs
parents:
diff changeset
  2391
    iImageElementCnt--;
hgs
parents:
diff changeset
  2392
    
hgs
parents:
diff changeset
  2393
    if ( iLoadingListeners != NULL && iImageElementCnt == 0)
hgs
parents:
diff changeset
  2394
        {
hgs
parents:
diff changeset
  2395
        TInt loadingListenersCnt = iLoadingListeners->Count();
hgs
parents:
diff changeset
  2396
        for ( TInt i = 0; i < loadingListenersCnt; i++ )
hgs
parents:
diff changeset
  2397
            {
hgs
parents:
diff changeset
  2398
            (*iLoadingListeners)[i]->ImagesLoaded(aError);
hgs
parents:
diff changeset
  2399
            }
hgs
parents:
diff changeset
  2400
        }
hgs
parents:
diff changeset
  2401
    
hgs
parents:
diff changeset
  2402
hgs
parents:
diff changeset
  2403
    }
hgs
parents:
diff changeset
  2404
hgs
parents:
diff changeset
  2405
// ==========================================================================
hgs
parents:
diff changeset
  2406
// Loops through the tree and prints out all of the elements
hgs
parents:
diff changeset
  2407
// (almost regenerating the DOM tree)
hgs
parents:
diff changeset
  2408
//
hgs
parents:
diff changeset
  2409
// ==========================================================================
hgs
parents:
diff changeset
  2410
void CSvgDocumentImpl::PrintAllElements( CSvgElementImpl* aStartElement )
hgs
parents:
diff changeset
  2411
{
hgs
parents:
diff changeset
  2412
	if ( aStartElement == NULL )
hgs
parents:
diff changeset
  2413
        return;
hgs
parents:
diff changeset
  2414
hgs
parents:
diff changeset
  2415
	aStartElement->Print( EFalse );
hgs
parents:
diff changeset
  2416
	//===> comment the styles out to generate true SVG content
hgs
parents:
diff changeset
  2417
	//	aStartElement->PrintStyleProperties();
hgs
parents:
diff changeset
  2418
hgs
parents:
diff changeset
  2419
	CSvgElementImpl* child = (CSvgElementImpl*)aStartElement->FirstChild();
hgs
parents:
diff changeset
  2420
	PrintAllElements( child );
hgs
parents:
diff changeset
  2421
hgs
parents:
diff changeset
  2422
	child = (CSvgElementImpl*)aStartElement->NextSibling();
hgs
parents:
diff changeset
  2423
	PrintAllElements( child );
hgs
parents:
diff changeset
  2424
}
hgs
parents:
diff changeset
  2425
hgs
parents:
diff changeset
  2426
TBool CSvgDocumentImpl::HasError()
hgs
parents:
diff changeset
  2427
    {
hgs
parents:
diff changeset
  2428
    return iError && iError->HasError();
hgs
parents:
diff changeset
  2429
    }
hgs
parents:
diff changeset
  2430
hgs
parents:
diff changeset
  2431
MSvgError* CSvgDocumentImpl::GetError()
hgs
parents:
diff changeset
  2432
    {
hgs
parents:
diff changeset
  2433
    return iError;
hgs
parents:
diff changeset
  2434
    }
hgs
parents:
diff changeset
  2435
hgs
parents:
diff changeset
  2436
void CSvgDocumentImpl::SetIsWarning( TBool aIsWarning )
hgs
parents:
diff changeset
  2437
{
hgs
parents:
diff changeset
  2438
	if (iError)
hgs
parents:
diff changeset
  2439
	{
hgs
parents:
diff changeset
  2440
		iError->SetIsWarning( aIsWarning );
hgs
parents:
diff changeset
  2441
	}
hgs
parents:
diff changeset
  2442
}
hgs
parents:
diff changeset
  2443
void CSvgDocumentImpl::SetError( TInt aErrorType, const TDesC& aMsg1, const TDesC& aMsg2 )
hgs
parents:
diff changeset
  2444
    {
hgs
parents:
diff changeset
  2445
    if ( !iError )
hgs
parents:
diff changeset
  2446
        {
hgs
parents:
diff changeset
  2447
        TRAPD( error, iError = CSvgErrorImpl::NewL() );
hgs
parents:
diff changeset
  2448
        if ( error != KErrNone )
hgs
parents:
diff changeset
  2449
            {
hgs
parents:
diff changeset
  2450
            return;
hgs
parents:
diff changeset
  2451
            }
hgs
parents:
diff changeset
  2452
        PrepareError( *iError, ESvgUnknown, aErrorType, aMsg1, aMsg2 );
hgs
parents:
diff changeset
  2453
        iError->SetIsWarning( ETrue );
hgs
parents:
diff changeset
  2454
        }
hgs
parents:
diff changeset
  2455
    }
hgs
parents:
diff changeset
  2456
hgs
parents:
diff changeset
  2457
hgs
parents:
diff changeset
  2458
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2459
// Accessor funciton for SyncBehaviorDefault value
hgs
parents:
diff changeset
  2460
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2461
TSvgSyncBehaviour CSvgDocumentImpl::SyncBehaviorDefault()
hgs
parents:
diff changeset
  2462
    {
hgs
parents:
diff changeset
  2463
    return iSyncBehaviorDefault;
hgs
parents:
diff changeset
  2464
    }
hgs
parents:
diff changeset
  2465
hgs
parents:
diff changeset
  2466
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2467
// Accessor funciton for SyncBehaviorDefault value
hgs
parents:
diff changeset
  2468
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2469
TUint32 CSvgDocumentImpl::SyncToleranceDefault()
hgs
parents:
diff changeset
  2470
    {
hgs
parents:
diff changeset
  2471
    return iSyncToleranceDefault;
hgs
parents:
diff changeset
  2472
    }
hgs
parents:
diff changeset
  2473
hgs
parents:
diff changeset
  2474
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2475
// CSvgDocumentImpl::SetCurrentTime
hgs
parents:
diff changeset
  2476
// Set Function for the document's current time
hgs
parents:
diff changeset
  2477
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2478
void CSvgDocumentImpl::SetCurrentTime( TInt32 aCurTime )
hgs
parents:
diff changeset
  2479
    {
hgs
parents:
diff changeset
  2480
    if ( iTimeContainer )
hgs
parents:
diff changeset
  2481
        {
hgs
parents:
diff changeset
  2482
        iTimeContainer->SetCurrentTime( aCurTime );
hgs
parents:
diff changeset
  2483
        }
hgs
parents:
diff changeset
  2484
    }
hgs
parents:
diff changeset
  2485
hgs
parents:
diff changeset
  2486
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2487
// CSvgDocumentImpl::CurrentTime
hgs
parents:
diff changeset
  2488
// Accessor for the Document's current time
hgs
parents:
diff changeset
  2489
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2490
TInt32 CSvgDocumentImpl::CurrentTime()
hgs
parents:
diff changeset
  2491
    {
hgs
parents:
diff changeset
  2492
    if ( iTimeContainer )
hgs
parents:
diff changeset
  2493
        {
hgs
parents:
diff changeset
  2494
        return iTimeContainer->CurrentTime();
hgs
parents:
diff changeset
  2495
        }
hgs
parents:
diff changeset
  2496
    return KErrGeneral;
hgs
parents:
diff changeset
  2497
    }
hgs
parents:
diff changeset
  2498
hgs
parents:
diff changeset
  2499
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2500
// CSvgDocumentImpl::SetSyncBehavior
hgs
parents:
diff changeset
  2501
// Set the Synchronised behaviour for the time container
hgs
parents:
diff changeset
  2502
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2503
void CSvgDocumentImpl::SetTCSyncBehavior( const TSvgSyncBehaviour aValue )
hgs
parents:
diff changeset
  2504
    {
hgs
parents:
diff changeset
  2505
    if ( iTimeContainer )
hgs
parents:
diff changeset
  2506
        {
hgs
parents:
diff changeset
  2507
        iTimeContainer->SetSyncBehavior( aValue );
hgs
parents:
diff changeset
  2508
        }
hgs
parents:
diff changeset
  2509
    }
hgs
parents:
diff changeset
  2510
hgs
parents:
diff changeset
  2511
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2512
// CSvgDocumentImpl::SetSyncTolerance
hgs
parents:
diff changeset
  2513
// Set the Synchronised Tolerance for the time container
hgs
parents:
diff changeset
  2514
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2515
void CSvgDocumentImpl::SetTCSyncTolerance( const TUint32 aValue )
hgs
parents:
diff changeset
  2516
    {
hgs
parents:
diff changeset
  2517
    if ( iTimeContainer )
hgs
parents:
diff changeset
  2518
        {    
hgs
parents:
diff changeset
  2519
        iTimeContainer->SetSyncTolerance( aValue );
hgs
parents:
diff changeset
  2520
        }
hgs
parents:
diff changeset
  2521
    }
hgs
parents:
diff changeset
  2522
hgs
parents:
diff changeset
  2523
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2524
// CSvgDocumentImpl::SetSyncMaster
hgs
parents:
diff changeset
  2525
// Set the time container as Synchronised Master
hgs
parents:
diff changeset
  2526
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2527
void CSvgDocumentImpl::SetTCSyncMaster( const TBool aValue )
hgs
parents:
diff changeset
  2528
    {
hgs
parents:
diff changeset
  2529
    if ( iTimeContainer )
hgs
parents:
diff changeset
  2530
        {    
hgs
parents:
diff changeset
  2531
        iTimeContainer->SetSyncMaster( aValue );
hgs
parents:
diff changeset
  2532
        }
hgs
parents:
diff changeset
  2533
    }
hgs
parents:
diff changeset
  2534
hgs
parents:
diff changeset
  2535
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2536
// CSvgDocumentImpl::TimeContainer
hgs
parents:
diff changeset
  2537
// Accessor for time container
hgs
parents:
diff changeset
  2538
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2539
//
hgs
parents:
diff changeset
  2540
CSvgTimeContainer* CSvgDocumentImpl::TimeContainer()    
hgs
parents:
diff changeset
  2541
    {
hgs
parents:
diff changeset
  2542
    return iTimeContainer;
hgs
parents:
diff changeset
  2543
    }
hgs
parents:
diff changeset
  2544
hgs
parents:
diff changeset
  2545
void CSvgDocumentImpl::DocumentTransform(TGfxAffineTransform& aTr)
hgs
parents:
diff changeset
  2546
    {
hgs
parents:
diff changeset
  2547
        iTransformMatrix = aTr;
hgs
parents:
diff changeset
  2548
    }
hgs
parents:
diff changeset
  2549
hgs
parents:
diff changeset
  2550
TGfxAffineTransform CSvgDocumentImpl::GetDocumentTransform()
hgs
parents:
diff changeset
  2551
    {
hgs
parents:
diff changeset
  2552
        return iTransformMatrix;
hgs
parents:
diff changeset
  2553
    }
hgs
parents:
diff changeset
  2554
    
hgs
parents:
diff changeset
  2555
    
hgs
parents:
diff changeset
  2556
CSvgBitmapFontProvider * CSvgDocumentImpl::GetBitmapFontProvider()
hgs
parents:
diff changeset
  2557
{
hgs
parents:
diff changeset
  2558
	return iSvgBitmapFontProvider ;
hgs
parents:
diff changeset
  2559
}
hgs
parents:
diff changeset
  2560
hgs
parents:
diff changeset
  2561
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2562
// CSvgDocumentImpl::SvgHasAnimationElement
hgs
parents:
diff changeset
  2563
// Checks if Document has Animation Element
hgs
parents:
diff changeset
  2564
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2565
hgs
parents:
diff changeset
  2566
TBool CSvgDocumentImpl::SvgHasAnimationElement()
hgs
parents:
diff changeset
  2567
    {
hgs
parents:
diff changeset
  2568
        RPointerArray<CSvgElementImpl> lAnimationEleList;
hgs
parents:
diff changeset
  2569
        FindAllElements((CSvgElementImpl* )RootElement(),
hgs
parents:
diff changeset
  2570
                   KSvgMediaAnimationElement, lAnimationEleList );
hgs
parents:
diff changeset
  2571
        TInt lAnimationEleCnt = lAnimationEleList.Count();    
hgs
parents:
diff changeset
  2572
        lAnimationEleList.Close();
hgs
parents:
diff changeset
  2573
        if ( lAnimationEleCnt > 0 )
hgs
parents:
diff changeset
  2574
            {
hgs
parents:
diff changeset
  2575
            return ETrue;
hgs
parents:
diff changeset
  2576
            }
hgs
parents:
diff changeset
  2577
       
hgs
parents:
diff changeset
  2578
        return EFalse;     
hgs
parents:
diff changeset
  2579
       
hgs
parents:
diff changeset
  2580
    }
hgs
parents:
diff changeset
  2581
hgs
parents:
diff changeset
  2582
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2583
// CSvgDocumentImpl::IsDocumentContentInteractive
hgs
parents:
diff changeset
  2584
// Checks if Document content is InterActive 
hgs
parents:
diff changeset
  2585
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2586
hgs
parents:
diff changeset
  2587
TBool CSvgDocumentImpl::IsDocumentContentInteractive()
hgs
parents:
diff changeset
  2588
    {
hgs
parents:
diff changeset
  2589
        RPointerArray<CSvgElementImpl> elements;
hgs
parents:
diff changeset
  2590
        FindAllElements( (CSvgElementImpl* )RootElement(),
hgs
parents:
diff changeset
  2591
                                     KSvgAElement, elements );
hgs
parents:
diff changeset
  2592
        if ( elements.Count() != 0 )
hgs
parents:
diff changeset
  2593
        {
hgs
parents:
diff changeset
  2594
            elements.Close();
hgs
parents:
diff changeset
  2595
            return ETrue;
hgs
parents:
diff changeset
  2596
        }
hgs
parents:
diff changeset
  2597
        elements.Close();
hgs
parents:
diff changeset
  2598
       
hgs
parents:
diff changeset
  2599
        if ( iIsInteractive )
hgs
parents:
diff changeset
  2600
            return ETrue;
hgs
parents:
diff changeset
  2601
        
hgs
parents:
diff changeset
  2602
        // Check if animation element is there 
hgs
parents:
diff changeset
  2603
        RPointerArray<CSvgElementImpl> lAnimationEleList;
hgs
parents:
diff changeset
  2604
        FindAllElements((CSvgElementImpl* )RootElement(),
hgs
parents:
diff changeset
  2605
                   KSvgMediaAnimationElement, lAnimationEleList );
hgs
parents:
diff changeset
  2606
                   
hgs
parents:
diff changeset
  2607
        // If no animation element is present then return EFalse           
hgs
parents:
diff changeset
  2608
        TInt lAnimationEleCnt = lAnimationEleList.Count();  
hgs
parents:
diff changeset
  2609
        if ( lAnimationEleCnt == 0 ) 
hgs
parents:
diff changeset
  2610
        {
hgs
parents:
diff changeset
  2611
           lAnimationEleList.Close();  
hgs
parents:
diff changeset
  2612
           return EFalse; 
hgs
parents:
diff changeset
  2613
        }
hgs
parents:
diff changeset
  2614
        
hgs
parents:
diff changeset
  2615
        // Check all animation element and if any child svg has ..
hgs
parents:
diff changeset
  2616
        // interactive content then return ETrue   
hgs
parents:
diff changeset
  2617
        for ( TInt lCurAnimationEle = 0; 
hgs
parents:
diff changeset
  2618
                lCurAnimationEle < lAnimationEleCnt; lCurAnimationEle++ )
hgs
parents:
diff changeset
  2619
        {
hgs
parents:
diff changeset
  2620
           CSvgMediaAnimationElementImpl* lAnimationElement = 
hgs
parents:
diff changeset
  2621
            (CSvgMediaAnimationElementImpl* )lAnimationEleList[ lCurAnimationEle ];
hgs
parents:
diff changeset
  2622
           CSvgDocumentImpl* lChildDoc = lAnimationElement->GetChildDocument();
hgs
parents:
diff changeset
  2623
           // if child svg has interavitve content then return
hgs
parents:
diff changeset
  2624
           if(lChildDoc && lChildDoc->iIsInteractive)
hgs
parents:
diff changeset
  2625
           {
hgs
parents:
diff changeset
  2626
           		lAnimationEleList.Close();                
hgs
parents:
diff changeset
  2627
           		return ETrue;
hgs
parents:
diff changeset
  2628
           }
hgs
parents:
diff changeset
  2629
        }  
hgs
parents:
diff changeset
  2630
        
hgs
parents:
diff changeset
  2631
        lAnimationEleList.Close();                
hgs
parents:
diff changeset
  2632
        return EFalse;   
hgs
parents:
diff changeset
  2633
hgs
parents:
diff changeset
  2634
    }
hgs
parents:
diff changeset
  2635
hgs
parents:
diff changeset
  2636
hgs
parents:
diff changeset
  2637
void CSvgDocumentImpl::SetImageElementsCount(TInt aCnt)
hgs
parents:
diff changeset
  2638
    {
hgs
parents:
diff changeset
  2639
    iImageElementCnt = aCnt;
hgs
parents:
diff changeset
  2640
    }
hgs
parents:
diff changeset
  2641
hgs
parents:
diff changeset
  2642
TInt CSvgDocumentImpl::GetImageElementsCount()
hgs
parents:
diff changeset
  2643
    {
hgs
parents:
diff changeset
  2644
    return iImageElementCnt;
hgs
parents:
diff changeset
  2645
    }
hgs
parents:
diff changeset
  2646
// End of file
hgs
parents:
diff changeset
  2647