diff -r 235a7fc86938 -r 2edacbf5d3f9 imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailgeneratetask.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailgeneratetask.cpp Tue Feb 02 00:23:15 2010 +0200 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailgeneratetask.cpp Fri Mar 19 09:35:30 2010 +0200 @@ -20,7 +20,6 @@ #include #include - #include "thumbnailgeneratetask.h" #include "thumbnailscaletask.h" #include "thumbnailprovider.h" @@ -42,12 +41,12 @@ const TDataType* aMimeType, CThumbnailManager::TThumbnailFlags aFlags, const TSize& aSize, TDisplayMode aDisplayMode, TInt aPriority, RArray < TThumbnailPersistentSize >* aMissingSizes, const TDesC& aTargetUri, - TThumbnailSize aThumbnailSize, const TThumbnailId aThumbnailId, + TThumbnailSize aThumbnailSize, const TInt64 aModified, const CThumbnailManager::TThumbnailQualityPreference aQualityPreference ): CThumbnailTask( aProcessor, aPriority ), iServer( aServer ), iFlags( aFlags ), iSize( aSize ), iDisplayMode( aDisplayMode ), iMissingSizes( aMissingSizes ), iTargetUri( aTargetUri ), - iThumbnailSize( aThumbnailSize ), iThumbnailId(aThumbnailId), + iThumbnailSize( aThumbnailSize ), iModified(aModified), iQualityPreference( aQualityPreference ) { TN_DEBUG2( "CThumbnailGenerateTask(0x%08x)::CThumbnailGenerateTask()", this); @@ -158,17 +157,23 @@ { iProvider->SetTargetSize( croppedTargetSize ); } - + + TInt providerErr; + if ( !iBuffer ) { - iProvider->GetThumbnailL( iServer.Fs(), iFile, iMimeType, iFlags, - iDisplayMode, iQualityPreference ); + TRAP(providerErr, iProvider->GetThumbnailL( iServer.Fs(), iFile, iMimeType, iFlags, + iDisplayMode, iQualityPreference ) ); } else { - iProvider->GetThumbnailL( iServer.Fs(), iBuffer, iMimeType, iFlags, - iDisplayMode, iQualityPreference ); + TRAP( providerErr, iProvider->GetThumbnailL( iServer.Fs(), iBuffer, iMimeType, iFlags, + iDisplayMode, iQualityPreference )); } + + DoBlacklisting( providerErr, TSize(0,0) ); + + User::LeaveIfError( providerErr ); } @@ -277,23 +282,9 @@ { delete aBitmap; aBitmap = NULL; - // Create a temporary bitmap of size 1 for storing blacklisted thumbnail - // Because no actual bitmap data is generated, there is no reason to - // add bitmap to server bitmap pool. Completion of client request with - // error code just results in applications showing their default bitmap. - if( iFilename != KNullDesC || iTargetUri != KNullDesC ) - { - if ( aError == KErrNotSupported || - aError == KErrCorrupt || - aError == KErrCompletion) - { - TRAPD( err, CreateBlackListedL( aOriginalSize ) ); - if (err != KErrNone) - { - TN_DEBUG2( "CThumbnailGenerateTask::ThumbnailProviderReady() - blacklisting failed with code %d", err ); - } - } - } + + DoBlacklisting( aError, aOriginalSize ); + Complete( aError ); } else @@ -324,7 +315,7 @@ __ASSERT_DEBUG(( aBitmap ), ThumbnailPanic( EThumbnailNullPointer )); CleanupStack::PushL( aBitmap ); - iServer.AddBitmapToPoolL( iRequestId.iSession, aBitmap ); + iServer.AddBitmapToPoolL( iRequestId.iSession, aBitmap, iRequestId ); // Keep pointer so we can delete bitmap from pool iBitmap = aBitmap; @@ -363,7 +354,7 @@ CThumbnailScaleTask* scaleTask = CThumbnailScaleTask::NewL( iProcessor, iServer, iFilename, iBitmap, iOriginalSize, (*iMissingSizes)[ i ].iSize, (*iMissingSizes)[ i ].iCrop, iDisplayMode, - KMaxPriority, iTargetUri, (*iMissingSizes)[ i ].iType, iThumbnailId, iScaledBitmapToPool, iEXIF ); + KMaxPriority, iTargetUri, (*iMissingSizes)[ i ].iType, iModified, iScaledBitmapToPool, iEXIF ); CleanupStack::PushL( scaleTask ); TInt err1 = KErrNone; @@ -420,7 +411,7 @@ complTask = CThumbnailScaleTask::NewL( iProcessor, iServer, iFilename, iBitmap, iOriginalSize, iSize, iFlags& CThumbnailManager ::ECropToAspectRatio, iDisplayMode, KMaxPriority, iTargetUri, - iThumbnailSize, iThumbnailId, iScaledBitmapToPool, iEXIF ); + iThumbnailSize, iModified, iScaledBitmapToPool, iEXIF ); CleanupStack::PushL( complTask ); TInt err1 = KErrNone; @@ -476,6 +467,7 @@ // void CThumbnailGenerateTask::CreateBlackListedL( const TSize& aOriginalSize ) { + TN_DEBUG1( "CThumbnailGenerateTask::CreateBlackListedL()"); CFbsBitmap* tempBitmap = 0; tempBitmap = new (ELeave) CFbsBitmap(); CleanupStack::PushL( tempBitmap ); @@ -486,16 +478,70 @@ // consider blacklisting all sizes (hence the changes are needed in thumbnail fetching logic too). // However, decoding of source to thumnail could succeed in other sizes, which makes blacklisting // of requested size only meaningful. + if(iFilename != KNullDesC) { iServer.StoreForPathL( iFilename )->StoreThumbnailL( - iFilename, tempBitmap, aOriginalSize, EFalse, iThumbnailSize, iThumbnailId, EFalse, ETrue ); + iFilename, tempBitmap, aOriginalSize, EFalse, iThumbnailSize, iModified, EFalse, ETrue ); } else if(iTargetUri != KNullDesC) { iServer.StoreForPathL( iTargetUri )->StoreThumbnailL( - iTargetUri, tempBitmap, aOriginalSize, EFalse, iThumbnailSize, iThumbnailId, EFalse, ETrue ); + iTargetUri, tempBitmap, aOriginalSize, EFalse, iThumbnailSize, iModified, EFalse, ETrue ); } CleanupStack::PopAndDestroy( tempBitmap ); } + +// --------------------------------------------------------------------------- +// Checks is blacklisting needed +// --------------------------------------------------------------------------- +// +void CThumbnailGenerateTask::DoBlacklisting( const TInt aError, const TSize& aOriginalSize ) + { + TN_DEBUG1( "CThumbnailGenerateTask::DoBlacklisting()"); + // Create a temporary bitmap of size 1 for storing blacklisted thumbnail + // Because no actual bitmap data is generated, there is no reason to + // add bitmap to server bitmap pool. Completion of client request with + // error code just results in applications showing their default bitmap. + if( aError != KErrNone && (iFilename != KNullDesC || iTargetUri != KNullDesC )) + { + if (aError == KErrNotFound || + aError == KErrNotSupported || + aError == KErrCorrupt || + aError == KErrCompletion || + aError == KErrUnderflow || + aError == KErrNotReady) + { + + if(iMissingSizes) + { + TN_DEBUG2( "CThumbnailGenerateTask::DoBlacklisting() - blacklist missing sizes count = %d", iMissingSizes->Count() ); + + for ( TInt i( 0 ); i < iMissingSizes->Count(); i++ ) + { + iThumbnailSize = (*iMissingSizes)[ i ].iType; + TRAPD( err, CreateBlackListedL( aOriginalSize ) ); + if (err != KErrNone) + { + TN_DEBUG3( "CThumbnailGenerateTask::DoBlacklisting() - blacklisting missing size %d failed with code %d", iThumbnailSize, err ); + } + } + return; + } + else + { + TN_DEBUG1( "CThumbnailGenerateTask::DoBlacklisting() - blacklist single size" ); + TRAPD( err, CreateBlackListedL( aOriginalSize ) ); + if (err != KErrNone) + { + TN_DEBUG2( "CThumbnailGenerateTask::DoBlacklisting() - blacklisting failed with code %d", err ); + } + return; + } + } + TN_DEBUG1( "CThumbnailGenerateTask::DoBlacklisting() - not blacklisted " ); + } +} + +