svgtviewer/SvgtViewerPlugin/SVGCodecSrc/SVGCodec.cpp
branchRCL_3
changeset 14 20b99a6d6175
parent 0 632761c941a7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svgtviewer/SvgtViewerPlugin/SVGCodecSrc/SVGCodec.cpp	Wed Sep 01 12:29:59 2010 +0100
@@ -0,0 +1,967 @@
+/*
+* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  This file implements the read codec for the SVG presentation
+*
+*/
+
+
+#include "SVGCodec.h"
+
+// INCLUDE FILES
+#include <uri16.h>
+#include <coeutils.h>
+#include <SVGEngineInterfaceImpl.h>
+#include <gdi.h>
+#include <pathconfiguration.hrh>
+// User Includes
+#include <SVGTUIControlDbgFlags.hrh>
+#include <imcvcodc.h>
+#include <utf.h>
+
+#ifdef RD_MULTIPLE_DRIVE    
+#include <pathinfo.h>
+#include <driveinfo.h>
+#endif
+
+// General Constants
+const TInt KSccConstZero = 0;
+const TUint KSccBackground = 0xffffffff;
+// SMIL Fit Value
+_LIT( KSccSmilFitValue,"meet" );
+
+//
+_LIT( KWww, "www" );
+_LIT( KHttp, "http://");
+_LIT( KDotDot, ".." );
+_LIT( KBSlashStr, "/" );
+_LIT( KSlashStr, "\\" );
+_LIT( KDotSlashStr, ".\\" );
+_LIT( KColonStr, ":" );
+
+_LIT(KJpg,   ".jpg" );
+_LIT(KJpeg,  ".jpeg" );
+_LIT(KPng,   ".png" );
+_LIT(KBmp,   ".bmp" );
+_LIT(KSvg,   ".svg" );
+_LIT(KSvgz,  ".svgz" );
+//
+
+enum TSVGCodecPanic
+    {
+    ECouldNotGenerateThumbnail
+    };
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSvgReadCodec::CSvgReadCodec
+// Default constructor. 
+// -----------------------------------------------------------------------------
+//
+CSvgReadCodec::CSvgReadCodec( const TSize& aSize ): iImagesPresent(EFalse),
+                                                    iImagesLoaded (EFalse),
+                                                    iOriginalSize(aSize)
+
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgReadCodec::NewL
+// Static constructor. Returns the pointer to the CSvgReadCodec
+// -----------------------------------------------------------------------------
+//
+CSvgReadCodec* CSvgReadCodec::NewL( const TSize& aSize )
+    {
+    CSvgReadCodec* self = new(ELeave) CSvgReadCodec( aSize );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self); 
+    return self;
+    }
+    
+void CSvgReadCodec::ConstructL()
+    {
+    iSvgModule = NULL;
+    iSVGTBitMapDummy = NULL;
+    InitializeEngineL();
+    }
+
+void CSvgReadCodec::InitializeEngineL()
+    {
+    if ( !iSvgModule )
+       {
+       TFontSpec spec;
+
+       if ( !iSVGTBitMapDummy )
+           {
+           // For thumbnails, the user provided bitmap is used,
+           // Have to give some dummy bitmap to the engine in the constructor.
+           iSVGTBitMapDummy  = new( ELeave ) CFbsBitmap;
+           User::LeaveIfError( 
+                iSVGTBitMapDummy->Create( 
+                    TSize( KSccConstZero, KSccConstZero ), 
+                    EGray2 ) );
+           }
+
+       iSvgModule = CSvgEngineInterfaceImpl::NewL( iSVGTBitMapDummy, this, spec );
+// 0xffffffff is the default color.
+       iSvgModule->SetBackgroundColor( KSccBackground );
+       iSvgModule->AddListener(static_cast<MSvgLoadingListener*>(this),
+            ESvgLoadingListener);
+
+       }
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgReadCodec::~CSvgReadCodec
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CSvgReadCodec::~CSvgReadCodec()
+    {
+    DeleteEngine();
+
+    // Dummy bitmap
+    delete iSVGTBitMapDummy;
+
+    // SVG file data
+    delete iFileData;
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgReadCodec::SetFileDataL
+// Sets the SVG presentation data
+// -----------------------------------------------------------------------------
+//
+void CSvgReadCodec::SetFileDataL( const TDesC8& aFileData )
+    {
+    delete iFileData;
+    iFileData = NULL;
+    
+   	// For files which are in UTF-16 or unicode format the first 2 bytes
+	// will be FF and FE. In UTF-16 and unicode format every single character
+	// is represented by two bytes. 
+	
+    HBufC8* binaryBuffer=NULL;
+  	binaryBuffer = HBufC8::NewL( aFileData.Length() ); 
+  	
+  	TPtr8 binaryBufferPtr = binaryBuffer->Des();
+	binaryBufferPtr = aFileData;
+	
+	TInt hichar = (CEditableText::EReversedByteOrderMark & 0xFF00)>>8;
+	TInt lochar = CEditableText::EReversedByteOrderMark & 0x00FF;
+	TInt bytesPerChar = 1;
+    
+    if(binaryBufferPtr[0] == hichar && binaryBufferPtr[1] == lochar)
+    	{
+    	bytesPerChar = 2;
+
+    	HBufC* dataBuffer=NULL;
+        TInt fileSize = aFileData.Length();
+    	dataBuffer = HBufC::New(aFileData.Length()/bytesPerChar);
+    	if ( !dataBuffer)
+    		{
+        	//_LIT( KErrorMsg, "Failed to Load Svg Content: Out of memory");
+        	delete binaryBuffer;
+        	return;
+    		}
+
+    	TPtr dataBufferPtr = dataBuffer->Des();
+    	
+    	// Skip two bytes and set the pointer to the next location
+    	// from where the actual data starts.
+    	dataBufferPtr.Set((TUint16*)binaryBufferPtr.Ptr()+1,
+    						fileSize/bytesPerChar-1, 
+    						fileSize/bytesPerChar-1);
+    		
+    	HBufC8* outputBuffer= NULL;
+    	outputBuffer=HBufC8::New(fileSize);
+    	if(!outputBuffer)
+    		{
+    		//_LIT( KErrorMsg, "Failed to Load Svg Content: Out of memory");
+        	delete dataBuffer;
+        	delete binaryBuffer;
+        	return ;
+    		}
+    	TPtr8 outputBufferptr=outputBuffer->Des();
+    	CnvUtfConverter::ConvertFromUnicodeToUtf8(
+            							outputBufferptr,   // Destination
+            							dataBufferPtr );
+        
+        iFileData = HBufC8::NewL(fileSize);
+        iFileData->Des().Copy(outputBufferptr);
+        
+        delete dataBuffer;
+        delete outputBuffer;
+        
+    	}
+    else
+        {
+        iFileData = HBufC8::NewL(aFileData.Length());
+        iFileData->Des().Copy( aFileData );
+        }
+        delete binaryBuffer;
+    }
+    
+// -----------------------------------------------------------------------------
+// CSvgReadCodec::ProcessFrameL
+// Processes the frame data contained in aSrc.
+// -----------------------------------------------------------------------------
+//
+TFrameState CSvgReadCodec::ProcessFrameL(TBufPtr8& aSrc )
+    {
+    aSrc.Shift( 1 );
+    TFrameState lRetVal = EFrameComplete;
+    DoProcessL();
+    
+    if(iImagesPresent && !iImagesLoaded)
+        {
+        lRetVal = EFrameIncompleteRepositionRequest;
+        }
+    
+    return lRetVal;
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgReadCodec::DoProcessL
+// Processes the SVG presentation file data. Called by ProcessFrameL()
+// -----------------------------------------------------------------------------
+//
+void CSvgReadCodec::DoProcessL()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgReadCodec::InitFrameL
+// Processes the SVG presentation file data. Called by ProcessFrameL()
+// -----------------------------------------------------------------------------
+//
+void CSvgReadCodec::InitFrameL(TFrameInfo& /* aFrameInfo*/, 
+    CFrameImageData& /*aFrameImageData*/, 
+    TBool /*aDisableErrorDiffusion */, 
+    CFbsBitmap& aFrame, 
+    CFbsBitmap* /* aDestinationMask */ )
+    {
+        GenerateThumbnailL(&aFrame, NULL);
+    }
+
+void CSvgReadCodec::UpdateScreen()
+    {
+    }
+
+TBool CSvgReadCodec::ScriptCall( const TDesC& /*aScript*/, CSvgElementImpl* /*aCallerElement*/ )
+    {
+    return EFalse;
+    }
+
+TInt  CSvgReadCodec::FetchImage( const TDesC& aUri, RFs& aSession, RFile& aFileHandle )
+    {
+    TInt errorCode = KErrNotFound;
+    TInt ret = 0;
+    TRAPD(err, ret = IsDownloadNeededL(aUri));
+    if(err==KErrNone)
+        {
+        if( ret == ELocalImageFile)
+            {
+            TFileName fileName;
+
+#ifdef RD_MULTIPLE_DRIVE    
+
+//    RFs fsSession;
+            HBufC* fullImagesPathBuf = HBufC::New( KMaxPath );
+            if (fullImagesPathBuf)
+                {
+                TPtr fullImagesPathPtr = fullImagesPathBuf->Des();
+                TInt intDrive;
+                DriveInfo::TDriveArray driveArray;
+
+//    fsSession.Connect();
+    
+                TInt err1=DriveInfo::GetUserVisibleDrives( aSession, driveArray );
+                if(err1==KErrNone)
+                    {
+                    for(TInt i=0; i < driveArray.Count(); i++)
+                        {
+                        TChar driveLetter = driveArray.LetterAt(i);
+                        TInt err2=RFs::CharToDrive(driveLetter, intDrive);
+                        if(err2==KErrNone)
+                            {
+                            TInt err3=PathInfo::GetRootPath(fullImagesPathPtr, intDrive);
+                            if(err3==KErrNone)
+                                {
+                                fullImagesPathPtr.Append( PathInfo::ImagesPath() );
+                                if(GetLocalFile( aUri, fileName, fullImagesPathPtr))
+                                    {
+                                    errorCode = aFileHandle.Open( aSession, fileName, EFileShareAny );
+                                    break;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            delete fullImagesPathBuf;
+            fullImagesPathBuf=NULL;
+          
+//    fsSession.Close();
+        
+#else
+
+            HBufC* phoneMemImagesPath = GetImagesPath(EPhoneMemory);
+            TPtr ptrphoneMemImagesPath(phoneMemImagesPath->Des());
+            HBufC* memCardImagesPath = GetImagesPath(EMemoryCard);
+            TPtr ptrMemCardImagesPath(memCardImagesPath->Des());
+        
+            if(GetLocalFile( aUri, fileName, ptrphoneMemImagesPath))
+                errorCode = aFileHandle.Open( aSession, fileName, EFileShareAny );
+            else if(GetLocalFile( aUri, fileName, ptrMemCardImagesPath))
+                errorCode = aFileHandle.Open( aSession, fileName, EFileShareAny );
+        
+            delete memCardImagesPath;
+            delete phoneMemImagesPath;
+#endif        
+            }
+        }
+    return errorCode;
+}
+
+TInt CSvgReadCodec::FetchFont( const TDesC& /* aUri */, 
+                                    RFs& /* aSession */, RFile& /* aFileHandle */ )
+    {
+    return KErrNotSupported;
+    }
+	   
+    
+void CSvgReadCodec::GetSmilFitValue( TDes& aSmilValue )
+    {
+    aSmilValue.Copy( KSccSmilFitValue );
+    }
+
+void  CSvgReadCodec::UpdatePresentation( const TInt32& /* aNoOfAnimation */ )
+    {
+    }
+    
+void CSvgReadCodec::PrepareEngine()
+    {
+    iPrepareDomResult = iSvgModule->PrepareDom( *iFileData, iThumbnailHandle );
+    TInt err = iPrepareDomResult->HasError();
+    iSvgModule->UseDom( iThumbnailHandle, NULL);
+    iContentSize = iSvgModule->GetSvgBoundingBox().Size();
+    if(iContentSize.iHeight < 1)
+        {
+        iContentSize.iHeight = 1;
+        }
+    if(iContentSize.iWidth < 1)
+        {
+        iContentSize.iWidth = 1;
+        }
+    }
+    
+TSize CSvgReadCodec::ContentSize() const
+    {
+    return iContentSize;
+    }
+
+void CSvgReadCodec::GenerateThumbnailL(CFbsBitmap* aFrame, CFbsBitmap* /*aFrameMask*/)
+    {
+    if ( iSvgModule )
+        {
+        // NULL is returned, possible out of memory when create error object.
+        User::LeaveIfNull( iPrepareDomResult );
+        User::LeaveIfError(iPrepareDomResult->HasError());
+#ifdef SVGTUICONTROL_DBG_DRM_THUMBNAIL_API_ENABLE        
+        iSvgModule->SetThumbNailMode( ETrue );            // Set thumbnail mode On
+#endif // SVGTUICONTROL_DBG_DRM_THUMBNAIL_API_ENABLE
+        
+        // Setup the engine to use the DOM
+        MSvgError* pResult = iSvgModule->UseDom( iThumbnailHandle, aFrame );
+        if ( pResult->HasError() && !pResult->IsWarning() )
+            {                
+            User::Leave( KErrGeneral );
+            }
+        
+        // View Box define for Dom associated frame
+        iSvgModule->ChooseViewBoxIfNotSet(iThumbnailHandle);
+        
+        // Setup the frame size as the one obtained from 
+        // creator of codec.
+        const TSize frameSize = aFrame->SizeInPixels();
+        // Get the Display mode for bitmap
+        TDisplayMode lFrameDispMode = aFrame->DisplayMode();
+        // Get the Displaymode for mask
+            iSvgModule->InitializeEngine();
+            iSvgModule->RenderFrame( NULL, 0);
+      // render static content as well
+       if ( iFrameList.Count() )
+            {
+            CFbsBitGc* bitmapContext=NULL;
+            CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL( aFrame );
+            CleanupStack::PushL( bitmapDevice );
+            User::LeaveIfError( bitmapDevice->CreateContext( bitmapContext ) );
+            CleanupStack::PushL( bitmapContext );
+            bitmapContext->BitBlt( TPoint(0,0),iFrameList[ 0 ] );
+            CleanupStack::PopAndDestroy(2);
+            } 
+       
+#ifdef SVGTUICONTROL_DBG_DRM_THUMBNAIL_API_ENABLE        
+        iSvgModule->SetThumbNailMode( EFalse );       // Set thumbnail mode Off 
+#endif // SVGTUICONTROL_DBG_DRM_THUMBNAIL_API_ENABLE
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgReadCodec::DeleteEngine
+// Deletes the structures associated with the engine
+// viz. The Frame List, Mask List, Delay Interval List, 
+// The DOM for the content and the Engine Implementation itself
+// -----------------------------------------------------------------------------
+//  
+void CSvgReadCodec::DeleteEngine()
+    {       
+    // Cleanup elements in the frame list
+    for ( TInt i = 0; i < iFrameList.Count(); i++ )
+        {
+        delete iFrameList[i];
+        }        
+
+    // Cleanup elements in the mask list
+    for ( TInt i = 0; i < iMaskList.Count(); i++ )
+        {
+        delete iMaskList[i];
+        }        
+    
+    // Cleanup the memory used for storing the pointers/values
+    iFrameList.Reset();
+    iMaskList.Reset();
+    iDelayList.Reset();
+    
+    // Close the resources
+    iFrameList.Close();
+    iMaskList.Close();
+    iDelayList.Close();
+
+    // Delete the DOM created for the content    
+    //if ( iThumbnailHandle )
+    //    {
+    //    iSvgModule->DeleteDom( iThumbnailHandle );
+    //    iThumbnailHandle = 0;
+    //    }
+    
+    // Delete the Engine module 
+    delete iSvgModule;    
+    iSvgModule = NULL;
+    }   
+
+CSvgReadCodec::TDownloadNeeded CSvgReadCodec::IsDownloadNeededL( const TDesC& aUri ) const
+    {
+
+    TUriParser UriParser;
+    
+    TBuf<KMaxFileName> localUri;
+    // url starts with www so append http://
+    if ( !aUri.Left( 4 ).Compare( KWww ) )     
+        {
+        localUri.Append( KHttp );
+        localUri.Append( aUri );
+        User::LeaveIfError( UriParser.Parse( localUri ) );   
+        }
+    else
+        {
+        User::LeaveIfError( UriParser.Parse( aUri ) );   
+        }
+    
+    if ( UriParser.IsPresent( EUriHost ) )
+        {
+        // Extract the Path, filename and extension from the uri
+        TFileName filename = UriParser.Extract( EUriPath ); 
+        TParsePtrC fileParser( filename );
+    
+        if ( fileParser.NamePresent() && fileParser.ExtPresent() )
+            {                        
+            if ( fileParser.Ext().Compare( KJpg ) == 0  ||  
+                 fileParser.Ext().Compare( KJpeg ) == 0 ||
+                 fileParser.Ext().Compare( KBmp ) == 0  ||
+                 fileParser.Ext().Compare( KPng ) == 0  ||
+                 fileParser.Ext().Compare( KSvg ) == 0  ||
+                 fileParser.Ext().Compare( KSvgz ) == 0 )
+                {
+                // file name and ext present and 
+                // it is amy of the supported image types
+                return ERemoteImageFile;         
+                }
+            else
+                {
+                //file Extension present but not a supported image ext,
+                //may be some html file
+                return ENotAnImageFile;
+                }
+            } 
+        else
+            {
+            //Should be a domain name so return ENotAnImageFile
+            return ENotAnImageFile;
+            }
+        }
+    else
+        {     
+        return ELocalImageFile;
+        }                        
+    }
+
+TBool CSvgReadCodec::GetLocalFile( const TDesC& aUri, 
+                                    TDes& aFileName ,
+                                    const TDesC& aRefPath ) const
+    {
+    aFileName.Zero();
+    TBuf<KMaxFileName> copyUri = aUri;
+    // Before giving the uri to the file parser,
+    // convert '/' to '\'.          
+    TInt pos;
+    while( KErrNotFound != ( pos = copyUri.FindF( KBSlashStr ) ) )
+        {
+        copyUri.Replace(pos,1,KSlashStr );
+        }
+
+    // if the uri starts with ".\" remove ".\"
+    if ( copyUri.Left( 2 ).Compare( KDotSlashStr ) == 0 ) 
+        {
+        copyUri = copyUri.Right( copyUri.Length() - KDotSlashStr().Length() );
+        }   
+        
+    // If the second letter is not ':' 
+    // and if it is not starting with '\',
+    // and if the path has '/',
+    // then prepend slash to it.
+    if ( copyUri.Length() >= 2 && 
+         copyUri.Mid( 1, 1 ).Compare( KColonStr ) != 0 && 
+         copyUri.Mid( 0, 1 ).Compare( KSlashStr ) != 0 &&
+         ( copyUri.Find( KSlashStr ) != KErrNotFound ) )
+        {
+        copyUri.Insert( 0, KSlashStr );
+        }       
+    
+    TParse fileParser;
+    if( fileParser.Set( copyUri, NULL, NULL ) != KErrNone )
+        {
+        return EFalse;
+        } 
+            
+    if ( fileParser.DrivePresent() )
+        {
+        // The uri is an absolute path
+        aFileName.Append( fileParser.Drive() ); 
+        // Append path, file name and extension from the uri.
+        if ( fileParser.PathPresent() )
+            {
+            aFileName.Append( fileParser.Path() );              
+            }
+        if ( fileParser.NamePresent() )
+            {
+            aFileName.Append( fileParser.Name() );              
+            }
+        if ( fileParser.ExtPresent() )
+            {
+            aFileName.Append( fileParser.Ext() );
+            }
+            
+        if ( !ConeUtils::FileExists( aFileName  ) )
+            {
+            return EFalse;
+            }            
+        return ETrue;
+        }
+    else
+        {
+        
+        TParse svgFilenameParser;
+        if ( svgFilenameParser.Set( aRefPath,NULL,NULL ) != KErrNone )
+            {
+            return EFalse;
+            }
+        
+        if ( svgFilenameParser.DrivePresent() )
+            {
+            aFileName.Append( svgFilenameParser.Drive() );               
+            }
+        
+        TInt dotdotPos = copyUri.Find( KDotDot );
+        TInt rightPos = 0;        
+        
+        if ( dotdotPos != KErrNotFound )
+            {
+            // If ".." is present collapse it with the parent path
+            if ( svgFilenameParser.PathPresent() )
+                {                  
+                do   
+                    {
+                    if ( dotdotPos > 1 )
+                        {
+                        svgFilenameParser.AddDir( copyUri.Left(dotdotPos - 1) );
+                        }
+                                                          
+                    if ( svgFilenameParser.PopDir() != KErrNone )
+                        {
+                        return EFalse;
+                        }               
+                        
+                    rightPos = (copyUri.Length()) - (dotdotPos + 3);
+                    
+                    if ( rightPos > 0 )
+                        {                       
+                        copyUri = copyUri.Right( rightPos );    
+                        }
+                                                                                                   
+                    }while ( (dotdotPos  = copyUri.Find( KDotDot ) ) 
+                                   != KErrNotFound ); 
+                                   
+                aFileName.Append( svgFilenameParser.Path() );
+                aFileName.Append( copyUri );             
+                }
+            else
+                {
+                return EFalse;
+                }                       
+            }
+        else
+            {
+            if ( svgFilenameParser.PathPresent() )
+                {
+                aFileName.Append( svgFilenameParser.Path() );
+                }           
+        
+            // Append path, file name and extension from the uri.    
+            if ( fileParser.PathPresent() )
+                {
+                TFileName path(fileParser.Path() );
+                path.Copy(path.Right(path.Length()-1));
+                aFileName.Append( path );
+                
+                }
+                                
+            if ( fileParser.NamePresent() )
+                {
+                aFileName.Append( fileParser.Name() );              
+                }
+            if ( fileParser.ExtPresent() )
+                {
+                aFileName.Append( fileParser.Ext() );
+                }
+            }  
+        if ( !ConeUtils::FileExists( aFileName  ) )
+            {
+            return EFalse;
+            }
+        return ETrue;   
+        }                                  
+    }
+               
+HBufC* CSvgReadCodec::GetImagesPath( 
+                        CSvgReadCodec::TImagesLocation aImagesLocation) const
+    {
+    HBufC* fullImagesPath = HBufC::New( KMaxPath );
+    if(fullImagesPath)
+        {
+        TPtr ptrFullImagesPath(fullImagesPath->Des());
+    
+        TPtrC8 ptrImagesPath((TText8*)text_images_path);
+        TFileName imagesPath16;
+        imagesPath16.Copy(ptrImagesPath);
+    
+        switch( aImagesLocation )
+            {
+            case EPhoneMemory:
+                {
+                TPtrC8 ptrRootPhoneMemPath((TText8*)text_phone_memory_root_path);
+                ptrFullImagesPath.Copy(ptrRootPhoneMemPath);
+                }
+                break;
+            case EMemoryCard:
+                {
+                TPtrC8 ptrRootMemCardPath((TText8*)text_memory_card_root_path);
+                ptrFullImagesPath.Copy(ptrRootMemCardPath);
+                }   
+                break;
+            default:
+                break;    
+            }
+        ptrFullImagesPath.Append(imagesPath16);
+        }
+    return fullImagesPath;
+    }
+    
+    //------------------------------------------------------------------------
+//From MsvgLoadingListener
+/**
+     * Query the listener if every element is to be reported or only
+     * the children of <svg> tag.
+     *
+     * @since 1.0
+     * @return : ETrue if every element is to be reported, otherwise
+     *           only the children of <svg> are reported.
+     */
+    TBool CSvgReadCodec::ReportAllElements()
+        {
+        return ETrue;
+        }
+
+    /**
+     * Query the listener if client will call 'AssignImageData' to decode images
+     * separately from parsing.  This is used to avoid non-thread-safe calls in
+     * creating bitmap and decoding images, which must be executed in the main thread.
+     *
+     * @since 1.0
+     * @return : ETrue to use 'ImageDataReference' instead of 'FetchImage'.
+     */
+    TBool CSvgReadCodec::WillAssignImageData()
+        {
+        return ETrue;
+        }
+
+    /**
+     * Callback when the href:xlink attribute is encountered for the <image>
+     * element.  This method is used to notify clients of image data references
+     * needed by <image> element.  This method is called only when 'WillAssignImageData'
+     * returns ETrue.
+     *
+     * @since 1.0
+     * @return : none.
+     */
+    void CSvgReadCodec::ImageDataReference( const TDesC& aUri )
+        {
+        iImagesPresent = ETrue;
+        
+        HBufC8* lImageData = NULL;
+        
+        TInt errorCode = KErrNotFound;
+        TInt ret = 0;
+        TRAPD(err, ret = IsDownloadNeededL(aUri));
+        if(err==KErrNone)
+            {
+            if( ret != ELocalImageFile)
+                {
+                lImageData = HBufC8::New(0);
+                if(lImageData)
+                    {
+                    iSvgModule->AssignImageData(aUri , lImageData );
+                    }
+            
+                return;
+                }
+        
+            _LIT(KEncodedImage,"data:image");
+        
+            if( ! ( aUri.Left(10).Compare(KEncodedImage) ))
+                {
+                _LIT(KBase,"Base64");
+                if(aUri.FindF(KBase) != KErrNotFound)
+                    {
+                    TInt startIndex = aUri.Locate( ';' );
+                    TInt endIndex = aUri.Locate( ',' );
+                    // find index of first character after white-space
+                    TInt index = endIndex + 1;
+                    while ( index < aUri.Length() && TChar( aUri[index] ).IsSpace() )
+                        index++;
+                    // must be 8-bit
+                    TInt length = aUri.Length() - index;
+                    HBufC8* encoded = HBufC8::New( length );
+                    if(encoded)
+                        {
+                        encoded->Des().Copy( aUri.Right( length ) );
+                        // Assign to member variable to destroy after image is process.
+                        lImageData = HBufC8::New( length );
+                        if(lImageData)
+                            {
+                            TPtr8 decodedDes = lImageData->Des();
+                            // decode
+                            TImCodecB64 encodingBase64;
+                            TInt decodeError = encodingBase64.Decode( *encoded, decodedDes );
+                            delete encoded;
+                            encoded = NULL;
+                            }
+                        }
+                    }            
+                else
+                    {
+                    //lImageData = HBufC8::NewL(0);
+                    }            
+                }
+            else
+                {
+                RFile lSvgFile;
+                TFileName lFileName;
+                RFs session;
+        
+                TInt Connecterror = session.Connect();
+        
+                HBufC* phoneMemImagesPath = GetImagesPath(EPhoneMemory);
+                TPtr ptrphoneMemImagesPath(phoneMemImagesPath->Des());
+                HBufC* memCardImagesPath = GetImagesPath(EMemoryCard);
+                TPtr ptrMemCardImagesPath(memCardImagesPath->Des());
+            
+                if(GetLocalFile( aUri, lFileName, ptrphoneMemImagesPath))
+                    errorCode = lSvgFile.Open( session, lFileName, EFileShareAny );
+                else if(GetLocalFile( aUri, lFileName, ptrMemCardImagesPath))
+                    errorCode = lSvgFile.Open( session, lFileName, EFileShareAny );
+            
+                delete memCardImagesPath;
+                delete phoneMemImagesPath;
+            
+                if(errorCode == KErrNone)
+                    {
+                    // Get the size of the data to create read buffer
+                    TInt lFileSize = 0;
+                    TInt sizeError = lSvgFile.Size(lFileSize) ;
+                    // Create buffer that will contain the file data
+                    lImageData = HBufC8::New(lFileSize);
+                    if(lImageData)
+                        {
+                        TPtr8 lFileDataPtr(lImageData->Des());
+                
+                        // Read from the file
+                        TInt ReadError = lSvgFile.Read(lFileDataPtr);
+                        }
+                    }
+                else
+                    {
+                    lImageData = HBufC8::New(0);
+                    }
+                lSvgFile.Close();
+                session.Close();
+                }
+            if(lImageData)
+                {
+                iSvgModule->AssignImageData(aUri , lImageData );                
+                }
+            }
+        }
+
+    /**
+     * Notified when the start of a svg document(<svg> tag) is encountered.
+     *
+     * @since 1.0
+     * @return : For future use.  Value is ignored.
+     */
+    TBool CSvgReadCodec::DocumentStart()
+        {
+        return EFalse;
+        }
+
+    /**
+     * Notified when the end of a svg document(</svg> tag) is encountered.
+     *
+     * @since 1.0
+     * @return : For future use.  Value is ignored.
+     */
+    TBool CSvgReadCodec::DocumentEnd()
+        {
+        return ETrue;
+        }
+
+    /**
+     * Notified when the start of a svg element is encountered.
+     *
+     * @since 1.0
+     * @param : aTagName -- name of svg tag
+     * @param : aAttributeList -- attribute list.
+     * @return : For future use.  Value is ignored.
+     */
+    TBool CSvgReadCodec::ElementStart( const TDesC& /*aTagName*/,
+                                MSvgAttributeList& /*aAttributeList*/)
+        {
+        return ETrue;
+        }
+
+    /**
+     * Notified when the end of a svg element is encountered.
+     * activated.
+     *
+     * @since 1.0
+     * @param : aTagName -- name of svg tag
+     * @return : For future use.  Value is ignored.
+     */
+    TBool CSvgReadCodec::ElementEnd( const TDesC& /*aTagName*/ )
+        {
+        return ETrue;
+        }
+
+    /**
+     * Notified when an external data is needed by the svg document,
+     * such as a image-file or an embedded svg-file.
+     *
+     * @since 1.0
+     * @param : aUri -- URI string of external data
+     * @return : For future use.  Value is ignored.
+     */
+    TBool CSvgReadCodec::ExternalDataRequested( const TDesC& /*aUri*/ )
+        {
+        return EFalse;
+        }
+
+    /**
+     * Notified when an external data has been retrieved,
+     * such as a image-file or an embedded svg-file.
+     *
+     * @since 1.0
+     * @param : aUri -- URI string of external data
+     * @return : For future use.  Value is ignored.
+     */
+    TBool CSvgReadCodec::ExternalDataReceived( const TDesC& /*aUri*/ )
+        {
+        return EFalse;
+        }
+
+    /**
+     * Notified when an external data request has failed.
+     *
+     * @since 1.0
+     * @param : aUri -- URI string of external data
+     * @return : For future use.  Value is ignored.
+     */
+    TBool CSvgReadCodec::ExternalDataRequestFailed( const TDesC& /*aUri*/ )
+        {
+        return EFalse;
+        }
+
+    /**
+     * Notified when an unsupported element is encountered.
+     *
+     * @since 1.0
+     * @param : aTagName -- tag name of element
+     * @param : aAttributeList -- attribute list.
+     * @return : For future use.  Value is ignored.
+     */
+    TBool CSvgReadCodec::UnsupportedElement( const TDesC& /*aTagName*/,
+                                      MSvgAttributeList& /*aAttributeList*/ )
+        {
+        return EFalse;
+        }
+
+    
+    void CSvgReadCodec::ImagesLoaded(TInt /*aError*/)
+        {
+        iImagesLoaded = ETrue;
+        iImagesPresent = EFalse;
+        }
+
+void CSvgReadCodec::GetNewDataPosition(TInt& aPosition, TInt& /*aLength*/)
+    {
+    // Reset position to force seek to beginning
+    aPosition =0;
+        }
+
+
+
+
+
+//End of file