imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailgeneratetask.cpp
changeset 14 2edacbf5d3f9
parent 1 235a7fc86938
child 15 7197e789b953
--- 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 <fbs.h>
 
 #include <thumbnailmanager.h>
-
 #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 " );        
+    }
+}
+
+