imagehandlingutilities/thumbnailmanager/plugins/image/src/thumbnailimagedecoder.cpp
changeset 54 48dd0f169f0d
parent 42 2e2a89493e2b
--- a/imagehandlingutilities/thumbnailmanager/plugins/image/src/thumbnailimagedecoder.cpp	Fri Sep 03 10:29:37 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,674 +0,0 @@
-/*
-* Copyright (c) 2006-2007 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:  Image thumbnail decoder
- *
-*/
-
-
-
-//INCLUDE FILES
-#include <e32base.h>
-#include <imageconversion.h>
-#include <ExifRead.h>
-#include <e32math.h>
-
-#include <IclExtJpegApi.h>
-#include "thumbnailimagedecoder.h"
-#include "thumbnaillog.h"
-#include "thumbnailpanic.h"
-#include "OstTraceDefinitions.h"
-#ifdef OST_TRACE_COMPILER_IN_USE
-#include "thumbnailimagedecoderTraces.h"
-#endif
-
-
-const TUid KImageTypeSVGUid = 
-    {
-    0x102073E7
-};
-
-// CImageDecoder supports up to 1/8 size reduction if EFullyScaleable is
-// not set.
-const TInt KMaximumReductionFactor = 8;
-
-// Matchers for recognizing JPEG files
-_LIT( KJpegMime, "image/jpeg" );
-
-// Matcher for recognizing SVG files
-_LIT( KSvgMime, "image/svg+xml" );
-
-
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// ---------------------------------------------------------------------------
-// CThumbnailImageDecoder::CThumbnailImageDecoder()
-// C++ default constructor can NOT contain any code, that might leave.
-// ---------------------------------------------------------------------------
-//
-CThumbnailImageDecoder::CThumbnailImageDecoder( RFs& aFs ): 
-    CActive(EPriorityStandard ), iBitmap( NULL ), iJpegReadBuffer( NULL ),  
-    iExifThumbImage( NULL ), iFs( aFs ), iBuffer( NULL )
-    {
-    CActiveScheduler::Add( this );
-    }
-
-
-// ---------------------------------------------------------------------------
-// CThumbnailImageDecoder::~CThumbnailImageDecoder()
-// Destructor.
-// ---------------------------------------------------------------------------
-//
-CThumbnailImageDecoder::~CThumbnailImageDecoder()
-    {
-    Release();
-    }
-
-
-// -----------------------------------------------------------------------------
-// CThumbnailImageDecoder::CreateL()
-// Creates thumbnail of image
-// -----------------------------------------------------------------------------
-//
-void CThumbnailImageDecoder::CreateL( RFile64& aFile, MThumbnailProviderObserver&
-    aObserver, const CThumbnailManager::TThumbnailQualityPreference aQualityPreference, const
-    TDataType& aMimeType, const TSize& aSize)
-    {
-    TN_DEBUG1( "CThumbnailImageDecoder::CreateL() start" );
-    OstTrace0( TRACE_NORMAL, CTHUMBNAILIMAGEDECODER_CREATEL, "CThumbnailImageDecoder::CreateL - start" );
-
-    iBuffer = NULL;
-    iSize = aSize;
-    iMimeType = aMimeType;
-    iObserver = &aObserver;
-    iFile = aFile;
-
-    CreateDecoderL( aQualityPreference );
-
-    const TFrameInfo info( iDecoder->FrameInfo());
-    if (( info.iOverallSizeInPixels.iWidth < 1 ) || (
-        info.iOverallSizeInPixels.iHeight < 1 ))
-        {
-        User::Leave( KErrCorrupt );
-        }
-    iFrameInfoFlags = info.iFlags;
-    iOriginalSize = info.iOverallSizeInPixels;
-    
-    TN_DEBUG1( "CThumbnailImageDecoder::CreateL() end" );
-    OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILIMAGEDECODER_CREATEL, "CThumbnailImageDecoder::CreateL - end" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CThumbnailImageDecoder::CreateL()
-// Creates thumbnail of image
-// -----------------------------------------------------------------------------
-//
-void CThumbnailImageDecoder::CreateL( const TDesC8* aBuffer, MThumbnailProviderObserver&
-    aObserver, const CThumbnailManager::TThumbnailQualityPreference aQualityPreference, const
-    TDataType& aMimeType, const TSize& aSize)
-    {
-    TN_DEBUG1( "CThumbnailImageDecoder::CreateL() start" );
-    OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILIMAGEDECODER_CREATEL, "CThumbnailImageDecoder::CreateL - start" );
-
-    iSize = aSize;
-    iMimeType = aMimeType;
-    iObserver = &aObserver;
-    iBuffer = aBuffer;
-    
-    CreateDecoderL( aQualityPreference );
-
-    const TFrameInfo info( iDecoder->FrameInfo());
-    if (( info.iOverallSizeInPixels.iWidth < 1 ) || (
-        info.iOverallSizeInPixels.iHeight < 1 ))
-        {
-        User::Leave( KErrCorrupt );
-        }
-    iFrameInfoFlags = info.iFlags;
-    iOriginalSize = info.iOverallSizeInPixels;
-    
-    TN_DEBUG1( "CThumbnailImageDecoder::CreateL() end" );
-    OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILIMAGEDECODER_CREATEL, "CThumbnailImageDecoder::CreateL - end" );
-    }
-
-// -----------------------------------------------------------------------------
-// CThumbnailImageDecoder::DecodeL()
-// Decode the thumbnail image
-// -----------------------------------------------------------------------------
-//
-void CThumbnailImageDecoder::DecodeL( const TDisplayMode aDisplayMode, const CThumbnailManager::TThumbnailFlags aFlags)
-    {
-    TN_DEBUG1( "CThumbnailImageDecoder::DecodeL() start" );
-    OstTrace0( TRACE_NORMAL, CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL - start" );
-    
-    // Create the bitmap
-    if ( !iBitmap )
-        {
-        iBitmap = new( ELeave )CFbsBitmap();
-        }
-    
-    TN_DEBUG3( "CThumbnailImageDecoder::DecodeL() %d x %d", iSize.iWidth, iSize.iHeight );
-    OstTraceExt2( TRACE_NORMAL, DUP1_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL;iSize.iWidth=%d;iSize.iHeight=%d", iSize.iWidth, iSize.iHeight );
-    if( iOriginalSize.iWidth < iOriginalSize.iHeight )
-        {
-        TInt height = iSize.iHeight;
-        iSize.iHeight = iSize.iWidth;
-        iSize.iWidth = height;
-        iPortrait = ETrue;
-        TN_DEBUG3( "CThumbnailImageDecoder::DecodeL() %d x %d", iSize.iWidth, iSize.iHeight );
-        OstTraceExt2( TRACE_NORMAL, DUP2_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL;iSize.iWidth=%d;iSize.iHeight=%d", iSize.iWidth, iSize.iHeight );
-        }
-    else
-        {
-        iPortrait = EFalse;
-        }
-    
-    TN_DEBUG3( "CThumbnailImageDecoder::DecodeL() iOriginalSize = %d x %d", iOriginalSize.iWidth, iOriginalSize.iHeight );
-    OstTraceExt2( TRACE_NORMAL, DUP3_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL;iOriginalSize.iWidth=%d;iOriginalSize.iHeight=%d", iOriginalSize.iWidth, iOriginalSize.iHeight );
-
-    //Size in both x and y dimension must be non-zero, positive value
-    TSize loadSize( iOriginalSize) ;
-    
-    if(iOriginalSize.iHeight < iSize.iHeight || iOriginalSize.iWidth < iSize.iWidth )
-        {
-        loadSize = iOriginalSize;
-        TN_DEBUG1( "CThumbnailImageDecoder::DecodeL() LoadSize is OriginalSize" );
-        OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL - LoadSize is OriginalSize" );
-        }
-    else if((iFrameInfoFlags& TFrameInfo::EFullyScaleable || IsSvg()) && aFlags == !CThumbnailManager::ECropToAspectRatio)
-        {
-        loadSize = iSize;
-        TN_DEBUG1( "CThumbnailImageDecoder::DecodeL() EFullyScaleable start" );
-        OstTrace0( TRACE_NORMAL, DUP5_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL - EFullyScaleable start" );
-        const TReal32 srcAspect = static_cast < TReal32 > (
-              iOriginalSize.iWidth ) / iOriginalSize.iHeight;
-
-          // set loadsize to maximum size within target size 
-          if ( (loadSize.iHeight * srcAspect) <= loadSize.iWidth )
-              {
-              TReal trg = 0;
-              TReal src( loadSize.iHeight * srcAspect );
-              Math::Round( trg, src, 0 );
-              loadSize.SetSize( trg, loadSize.iHeight );
-              }
-          else
-              {
-              TReal trg;
-              TReal src( loadSize.iWidth / srcAspect );
-              Math::Round( trg, src, 0 );
-              loadSize.SetSize( loadSize.iWidth, trg );
-              }
-        
-        TN_DEBUG3( "CThumbnailImageDecoder::DecodeL() EFullyScaleable loadSize = %d x %d", loadSize.iWidth, loadSize.iHeight );
-        OstTraceExt2( TRACE_NORMAL, DUP6_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL - EFullyScaleable;loadSize.iWidth=%d;loadSize.iHeight=%d", loadSize.iWidth, loadSize.iHeight );
-        }
-    else 
-        {
-        
-        // Size reduction factor. 1/1, 1/2, 1/4, and 1/8 are possible values for all
-        // plug-ins. SVG graphics can be rendered at any size.
-        TInt reductionFactor = 1;
-        while ( reductionFactor < KMaximumReductionFactor && ( iSize.iWidth <
-            loadSize.iWidth / 2 ) && ( iSize.iHeight < loadSize.iHeight / 2 ))
-            {
-            // magic: use loadSize that is half of previous size
-            loadSize.iWidth /= 2;
-            loadSize.iHeight /= 2;
-            reductionFactor *= 2;
-            }
-        // If original size is not an exact multiple of reduction factor,
-        // we need to round loadSize up
-        if ( reductionFactor && iOriginalSize.iWidth % reductionFactor )
-            {
-            loadSize.iWidth++;
-            }
-        if ( reductionFactor && iOriginalSize.iHeight % reductionFactor )
-            {
-            loadSize.iHeight++;
-            }
-        TN_DEBUG4( 
-            "CThumbnailImageDecoder::DecodeL() - loadSize = (%d,%d) reduction = 1/%d ", loadSize.iWidth, loadSize.iHeight, reductionFactor );
-        OstTraceExt3( TRACE_NORMAL, DUP7_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL;loadSize.iWidth=%d;loadSize.iHeight=%d;reductionFactor=%d", loadSize.iWidth, loadSize.iHeight, reductionFactor );
-        }
-
-    TInt err = iBitmap->Create( loadSize, aDisplayMode );
-    if (err != KErrNone)
-        {
-        delete iBitmap;
-        iBitmap = NULL;
-        User::Leave(err);
-        }
-
-    iDecoder->Convert( &iStatus, * iBitmap );
-    
-    SetActive();
-    
-    TN_DEBUG1( "CThumbnailImageDecoder::DecodeL() end" );
-    OstTrace0( TRACE_NORMAL, DUP8_CTHUMBNAILIMAGEDECODER_DECODEL, "CThumbnailImageDecoder::DecodeL - end" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CThumbnailImageDecoder::Release()
-// Releases resources
-// -----------------------------------------------------------------------------
-//
-void CThumbnailImageDecoder::Release()
-    {
-    Cancel();
-   
-    delete iDecoder;
-    iDecoder = NULL;
-    
-    delete iBitmap;
-    iBitmap = NULL;
-    delete iJpegReadBuffer;
-    iJpegReadBuffer = NULL;
-    delete iExifThumbImage;
-    iExifThumbImage = NULL;
-    
-    iBuffer = NULL; // we don't own the buffer
-    }
-
-
-// -----------------------------------------------------------------------------
-// CThumbnailImageDecoder::DoCancel()
-// -----------------------------------------------------------------------------
-//
-void CThumbnailImageDecoder::DoCancel()
-    {
-    if ( iDecoder )
-        {
-        iDecoder->Cancel();
-        delete iDecoder;
-        iDecoder = NULL;
-        }
-    
-    delete iBitmap;
-    iBitmap = NULL;
-    delete iJpegReadBuffer;
-    iJpegReadBuffer = NULL;
-    delete iExifThumbImage;
-    iExifThumbImage = NULL;
-    
-    iBuffer = NULL; // we don't own the buffer
-    }
-
-
-// -----------------------------------------------------------------------------
-// CThumbnailImageDecoder::RunL()
-// -----------------------------------------------------------------------------
-//
-void CThumbnailImageDecoder::RunL()
-    {
-    // This call takes ownership of iBitmap
-    iObserver->ThumbnailProviderReady( iStatus.Int(), iBitmap, iOriginalSize, iEXIF, iPortrait );
-
-    iBitmap = NULL; // owned by server now
-    iBuffer = NULL; // we don't own the buffer
-    
-    Release();
-    }
-
-
-// -----------------------------------------------------------------------------
-// CThumbnailImageDecoder::IsJpeg()
-// -----------------------------------------------------------------------------
-//
-TBool CThumbnailImageDecoder::IsJpeg()
-    {
-    __ASSERT_DEBUG(( iMimeType.Des() != KNullDesC ), ThumbnailPanic(
-        EThumbnailEmptyDescriptor ));
-
-    if ( KJpegMime() == iMimeType.Des())
-        {
-        return ETrue;
-        }
-    return EFalse;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CThumbnailImageDecoder::IsSvg()
-// -----------------------------------------------------------------------------
-//
-TBool CThumbnailImageDecoder::IsSvg()
-    {
-    __ASSERT_DEBUG(( iMimeType.Des() != KNullDesC ), ThumbnailPanic(
-        EThumbnailEmptyDescriptor ));
-
-    if ( KSvgMime() == iMimeType.Des())
-        {
-        return ETrue;
-        }
-    return EFalse;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CThumbnailImageDecoder::CreateDecoderL
-// Creates image decoder
-// -----------------------------------------------------------------------------
-//
-void CThumbnailImageDecoder::CreateDecoderL( CThumbnailManager::TThumbnailQualityPreference
-    aFlags )
-    {
-    TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() start" );
-    OstTrace0( TRACE_NORMAL, CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - start" );
-    
-    TBool thumbFound( EFalse );
-    
-    // If the image is in jpeg format, try to get thumbnail from EXIF data (if EOptimizeForQuality not set)
-    if ( IsJpeg() && !( aFlags == CThumbnailManager::EOptimizeForQuality ))
-        {
-        TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() create exif decoder" );
-        OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - create exif decoder" );
-        TRAPD( err, CreateExifDecoderL( aFlags ));
-        thumbFound = ( err == KErrNone );
-        iEXIF = ETrue;
-        }
-
-    if ( !thumbFound )
-        {
-        iEXIF = EFalse;
-        TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() create normal decoder" );
-        OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - create normal decoder" );
-        
-        delete iDecoder;
-        iDecoder = NULL;
-        
-        TFileName fullName;
-        if ( !iBuffer )
-            {
-            iFile.FullName( fullName );
-            }
-        
-        CImageDecoder::TOptions options;
-        if ( aFlags == CThumbnailManager::EOptimizeForQuality )
-            {
-            options = ( CImageDecoder::TOptions )( CImageDecoder
-                ::EOptionNoDither );
-            }
-        else
-            {
-            options  = ( CImageDecoder::TOptions )( CImageDecoder
-                ::EOptionNoDither | CImageDecoder::EPreferFastDecode );
-            }
-
-        if ( IsSvg())
-            {
-            if ( !iBuffer )
-                {
-                iDecoder = CImageDecoder::FileNewL( iFile, ContentAccess::EPeek, 
-                        options, KImageTypeSVGUid, KNullUid, KNullUid );
-                
-                TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder created" );
-                OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder created" );
-                }
-            else
-                {
-                TRAPD( decErr, iDecoder = CImageDecoder::DataNewL( iFs, *iBuffer, options, KImageTypeSVGUid ) );
-                
-                if ( decErr != KErrNone )
-                    {
-                    TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - error 1" );
-                    OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - error 1" );
-                    
-                    User::Leave( decErr );
-                    }
-                
-                TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder created" );
-                OstTrace0( TRACE_NORMAL, DUP5_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder created" );
-                }
-            }
-        else if ( !IsJpeg())
-            {
-            if ( !iBuffer )
-                {
-                iDecoder = CImageDecoder::FileNewL( iFile, ContentAccess::EPeek, options );
-                
-                TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder created" );
-                OstTrace0( TRACE_NORMAL, DUP6_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder created" );
-                }
-            else
-                {
-                TRAPD( decErr, iDecoder = CImageDecoder::DataNewL( iFs, *iBuffer, iMimeType.Des8(), options) );
-                
-                if ( decErr != KErrNone )
-                    {                        
-                    TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder error %d", decErr );
-                    OstTrace1( TRACE_NORMAL, DUP7_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder error;decErr=%d", decErr );
-                    LeaveIfCorruptL(decErr);
-                    
-                    // don't force any mime type
-                    TRAPD( decErr, iDecoder = CImageDecoder::DataNewL( iFs, *iBuffer, options ) );
-                    
-                    if ( decErr != KErrNone )
-                        {                        
-                        TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder no mime error %d", decErr );
-                        OstTrace1( TRACE_NORMAL, DUP8_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder no mime error;decErr=%d", decErr );
-                        
-                        User::Leave( decErr );
-                        }
-                    }
-                
-                TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder created" );
-                OstTrace0( TRACE_NORMAL, DUP9_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder created" );
-                }
-            }
-        else
-            {
-            if ( !iBuffer )
-                {
-                TRAPD( decErr, iDecoder = CExtJpegDecoder::FileNewL(
-                        CExtJpegDecoder::EHwImplementation, iFs, fullName, options) );
-                
-                if ( decErr != KErrNone )
-                    {
-                    TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - HW CExtJpegDecoder failed %d", decErr);
-                    OstTrace1( TRACE_NORMAL, DUP10_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL;decErr=%d - HW CExtJpegDecoder failed ", decErr );
-                    LeaveIfCorruptL(decErr);
-                    
-                    TRAP( decErr, iDecoder = CExtJpegDecoder::FileNewL(
-                            CExtJpegDecoder::ESwImplementation, iFs, fullName, options) );
-                    
-                    if ( decErr != KErrNone )
-                        {
-                        TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - SW CExtJpegDecoder failed %d", decErr);
-                        OstTrace1( TRACE_NORMAL, DUP11_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - SW CExtJpegDecoder failed;decErr=%d", decErr );
-                        LeaveIfCorruptL(decErr);
-                        
-                        TRAP( decErr, iDecoder = CImageDecoder::FileNewL( iFile, ContentAccess::EPeek, options ));
-                        
-                        if( decErr != KErrNone)
-                            {
-                            TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder failed %d", decErr);
-                            OstTrace1( TRACE_NORMAL, DUP12_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder failed ;decErr=%d", decErr );
-                            User::Leave( decErr );
-                            }
-                        
-                        TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder created" );
-                        OstTrace0( TRACE_NORMAL, DUP13_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder created" );
-                        }
-                    else
-                        {
-                        TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - SW CExtJpegDecoder created" );
-                        OstTrace0( TRACE_NORMAL, DUP14_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - SW CExtJpegDecoder created" );
-                        }
-                    }
-                else 
-                    {
-                    TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - HW CExtJpegDecoder created" );
-                    OstTrace0( TRACE_NORMAL, DUP15_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL" );
-                    }
-                }
-            else
-                {
-                TRAPD( decErr, iDecoder = CExtJpegDecoder::DataNewL(
-                        CExtJpegDecoder::EHwImplementation, iFs, *iBuffer, options ));
-                
-                if ( decErr != KErrNone )
-                    {
-                    TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - HW CExtJpegDecoder failed %d", decErr);
-                    OstTrace1( TRACE_NORMAL, DUP16_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - HW CExtJpegDecoder failed;decErr=%d", decErr );
-                    LeaveIfCorruptL(decErr);
-                    
-                    TRAP( decErr, iDecoder = CExtJpegDecoder::DataNewL(
-                            CExtJpegDecoder::ESwImplementation, iFs, *iBuffer, options ));
-                    
-                    if ( decErr != KErrNone )
-                        {                       
-                        TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - SW CExtJpegDecoder failed %d", decErr);
-                        OstTrace1( TRACE_NORMAL, DUP17_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - SW CExtJpegDecoder failed;decErr=%d", decErr );
-                        LeaveIfCorruptL(decErr);
-                        TRAPD( decErr, iDecoder = CImageDecoder::DataNewL( iFs, *iBuffer, iMimeType.Des8(), options) );
-                        
-                        if ( decErr != KErrNone )
-                            {                        
-                            TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder failed %d", decErr);
-                            OstTrace1( TRACE_NORMAL, DUP18_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder failed;decErr=%d", decErr );
-                            LeaveIfCorruptL(decErr);
-                            // don't force any mime type
-                            TRAPD( decErr, iDecoder = CImageDecoder::DataNewL( iFs, *iBuffer, options ) );
-
-                            if ( decErr != KErrNone )
-                                {                                
-                                TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder no mime failed %d", decErr);
-                                OstTrace1( TRACE_NORMAL, DUP19_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder no mime failed;decErr=%d", decErr );
-                                User::Leave( decErr );
-                                }
-                            }
-                        
-                        TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder created" );
-                        OstTrace0( TRACE_NORMAL, DUP20_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - CImageDecoder created" );
-                        }
-                    else
-                        {
-                        TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - SW CExtJpegDecoder created" );
-                        OstTrace0( TRACE_NORMAL, DUP21_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - SW CExtJpegDecoder created" );
-                        }               
-                    }
-                else
-                    {
-                    TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - HW CExtJpegDecoder created" );
-                    OstTrace0( TRACE_NORMAL, DUP22_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - HW CExtJpegDecoder created" );
-                    }               
-                }
-            }
-        }
-    
-    TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() end" );
-    OstTrace0( TRACE_NORMAL, DUP23_CTHUMBNAILIMAGEDECODER_CREATEDECODERL, "CThumbnailImageDecoder::CreateDecoderL - end" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CThumbnailImageDecoder::CreateExifDecoderL()
-// -----------------------------------------------------------------------------
-//
-void CThumbnailImageDecoder::CreateExifDecoderL( CThumbnailManager
-    ::TThumbnailQualityPreference aFlags )
-    {
-    TN_DEBUG1( "CThumbnailImageDecoder::CreateExifDecoderL() start" );
-    OstTrace0( TRACE_NORMAL, CTHUMBNAILIMAGEDECODER_CREATEEXIFDECODERL, "CThumbnailImageDecoder::CreateExifDecoderL - start" );
-    
-    // If the image is in jpeg format, try to get thumbnail from EXIF data.
-    CExifRead* reader = NULL;
-    
-    if ( !iBuffer )
-        {    
-        TInt64 size( 0 );
-        User::LeaveIfError( iFile.Size( size ));
-    
-        TInt readSize = Min( size, KJpegLoadBufferSize );
-    
-        delete iJpegReadBuffer;
-        iJpegReadBuffer = NULL;
-        iJpegReadBuffer = HBufC8::NewL( readSize );
-        TPtr8 localBuffer = iJpegReadBuffer->Des();
-    
-        User::LeaveIfError( iFile.Read( localBuffer, readSize ));
-        reader = CExifRead::NewL( localBuffer, CExifRead::ENoJpeg );
-        }
-    else
-        {
-        reader = CExifRead::NewL( *iBuffer, CExifRead::ENoJpeg );
-        }
-    
-    CleanupStack::PushL( reader );
-
-    iExifThumbImage = reader->GetThumbnailL();
-    CleanupStack::PopAndDestroy( reader );
-
-    User::LeaveIfNull( iExifThumbImage );
-
-    delete iDecoder;
-    iDecoder = NULL;
-
-    CImageDecoder::TOptions options;
-    if ( aFlags == CThumbnailManager::EOptimizeForQuality )
-        {
-        options = ( CImageDecoder::TOptions )( CImageDecoder::EOptionNoDither );
-        }
-    else
-        {
-        options = ( CImageDecoder::TOptions )( CImageDecoder::EOptionNoDither |
-            CImageDecoder::EPreferFastDecode  );
-        }
-
-    TRAPD( err, iDecoder = CExtJpegDecoder::DataNewL( iFs, * iExifThumbImage, options ));
-
-    if ( err == KErrNotFound || err == KErrNotSupported )
-        {
-        delete iDecoder;
-        iDecoder = NULL;
-
-        iDecoder = CImageDecoder::DataNewL( iFs, * iExifThumbImage, options );
-        }
-    else
-        {
-        TN_DEBUG2( "CThumbnailImageDecoder::CreateExifDecoderL() - CExtJpegDecoder err == %d", err );
-        User::LeaveIfError( err );
-        }
-
-    TN_DEBUG1( "CThumbnailImageDecoder::CreateExifDecoderL() end" );
-    OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILIMAGEDECODER_CREATEEXIFDECODERL, "CThumbnailImageDecoder::CreateExifDecoderL - end" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CThumbnailImageDecoder::CreateExifDecoderL()
-// Returns size of original image
-// -----------------------------------------------------------------------------
-//
-const TSize& CThumbnailImageDecoder::OriginalSize()const
-    {
-    return iOriginalSize;
-    }
-
-// -----------------------------------------------------------------------------
-// CThumbnailImageDecoder::LeaveIfCorruptL()
-// Leave is image is corrupted
-// -----------------------------------------------------------------------------
-//
-void CThumbnailImageDecoder::LeaveIfCorruptL(const TInt aError )
-    {
-    //no sense to try other codecs if image is corrupted
-    if( aError == KErrCorrupt || aError == KErrUnderflow)
-        {
-        User::Leave( aError );
-        }
-    }
-
-//End of file