--- a/imagehandlingutilities/thumbnailmanager/plugins/image/src/thumbnailimagedecoder.cpp Tue Feb 02 00:23:15 2010 +0200
+++ b/imagehandlingutilities/thumbnailmanager/plugins/image/src/thumbnailimagedecoder.cpp Fri Feb 19 23:07:36 2010 +0200
@@ -338,7 +338,7 @@
// 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() crete exif decoder" );
+ TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() create exif decoder" );
TRAPD( err, CreateExifDecoderL( aFlags ));
thumbFound = ( err == KErrNone );
iEXIF = ETrue;
@@ -347,7 +347,7 @@
if ( !thumbFound )
{
iEXIF = EFalse;
- TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() crete normal decoder" );
+ TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() create normal decoder" );
delete iDecoder;
iDecoder = NULL;
@@ -362,12 +362,12 @@
if ( aFlags == CThumbnailManager::EOptimizeForQuality )
{
options = ( CImageDecoder::TOptions )( CImageDecoder
- ::EOptionNoDither );
+ ::EOptionNoDither | CImageDecoder::EOptionAlwaysThread );
}
else
{
- options = ( CImageDecoder::TOptions )( CImageDecoder
- ::EOptionNoDither | CImageDecoder::EPreferFastDecode );
+ options = ( CImageDecoder::TOptions )( CImageDecoder
+ ::EOptionNoDither | CImageDecoder::EPreferFastDecode | CImageDecoder::EOptionAlwaysThread );
}
if ( IsSvg())
@@ -407,11 +407,15 @@
if ( decErr != KErrNone )
{
+ TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder error %d", decErr );
+ LeaveIfCorruptL(decErr);
+
// don't force any mime type
TRAPD( decErr, iDecoder = CImageDecoder::DataNewL( iFs, *iBuffer, options ) );
+
if ( decErr != KErrNone )
{
- TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - error 2" );
+ TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder no mime error %d", decErr );
User::Leave( decErr );
}
@@ -422,7 +426,6 @@
}
else
{
-
if ( !iBuffer )
{
TRAPD( decErr, iDecoder = CExtJpegDecoder::FileNewL(
@@ -430,12 +433,24 @@
if ( decErr != KErrNone )
{
+ TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - HW CExtJpegDecoder failed %d", decErr);
+ LeaveIfCorruptL(decErr);
+
TRAP( decErr, iDecoder = CExtJpegDecoder::FileNewL(
CExtJpegDecoder::ESwImplementation, iFs, fullName, options) );
if ( decErr != KErrNone )
{
- iDecoder = CImageDecoder::FileNewL( iFile, ContentAccess::EPeek, options );
+ TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - SW CExtJpegDecoder failed %d", decErr);
+ LeaveIfCorruptL(decErr);
+
+ TRAP( decErr, iDecoder = CImageDecoder::FileNewL( iFile, ContentAccess::EPeek, options ));
+
+ if( decErr != KErrNone)
+ {
+ TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder failed %d", decErr);
+ User::Leave( decErr );
+ }
TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder created" );
}
@@ -456,21 +471,28 @@
if ( decErr != KErrNone )
{
+ TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - HW CExtJpegDecoder failed %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);
+ LeaveIfCorruptL(decErr);
TRAPD( decErr, iDecoder = CImageDecoder::DataNewL( iFs, *iBuffer, iMimeType.Des8(), options) );
if ( decErr != KErrNone )
{
+ TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder failed %d", decErr);
+ LeaveIfCorruptL(decErr);
// don't force any mime type
TRAPD( decErr, iDecoder = CImageDecoder::DataNewL( iFs, *iBuffer, options ) );
+
if ( decErr != KErrNone )
{
- TN_DEBUG1( "CThumbnailImageDecoder::CreateDecoderL() - error 3" );
-
+ TN_DEBUG2( "CThumbnailImageDecoder::CreateDecoderL() - CImageDecoder no mime failed %d", decErr);
User::Leave( decErr );
}
}
@@ -540,12 +562,12 @@
CImageDecoder::TOptions options;
if ( aFlags == CThumbnailManager::EOptimizeForQuality )
{
- options = ( CImageDecoder::TOptions )( CImageDecoder::EOptionNoDither );
+ options = ( CImageDecoder::TOptions )( CImageDecoder::EOptionNoDither | CImageDecoder::EOptionAlwaysThread );
}
else
{
options = ( CImageDecoder::TOptions )( CImageDecoder::EOptionNoDither |
- CImageDecoder::EPreferFastDecode );
+ CImageDecoder::EPreferFastDecode | CImageDecoder::EOptionAlwaysThread );
}
TRAPD( err, iDecoder = CExtJpegDecoder::DataNewL( iFs, * iExifThumbImage,
@@ -588,4 +610,18 @@
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