imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailgeneratetask.cpp
changeset 14 2edacbf5d3f9
parent 1 235a7fc86938
child 15 7197e789b953
equal deleted inserted replaced
1:235a7fc86938 14:2edacbf5d3f9
    18 
    18 
    19 #include <e32base.h>
    19 #include <e32base.h>
    20 #include <fbs.h>
    20 #include <fbs.h>
    21 
    21 
    22 #include <thumbnailmanager.h>
    22 #include <thumbnailmanager.h>
    23 
       
    24 #include "thumbnailgeneratetask.h"
    23 #include "thumbnailgeneratetask.h"
    25 #include "thumbnailscaletask.h"
    24 #include "thumbnailscaletask.h"
    26 #include "thumbnailprovider.h"
    25 #include "thumbnailprovider.h"
    27 #include "thumbnailserver.h"
    26 #include "thumbnailserver.h"
    28 #include "thumbnailtaskprocessor.h"
    27 #include "thumbnailtaskprocessor.h"
    40 CThumbnailGenerateTask::CThumbnailGenerateTask( CThumbnailTaskProcessor&
    39 CThumbnailGenerateTask::CThumbnailGenerateTask( CThumbnailTaskProcessor&
    41     aProcessor, CThumbnailServer& aServer, RFile64* aFile, TDesC8* aBuffer,
    40     aProcessor, CThumbnailServer& aServer, RFile64* aFile, TDesC8* aBuffer,
    42     const TDataType* aMimeType, CThumbnailManager::TThumbnailFlags aFlags,
    41     const TDataType* aMimeType, CThumbnailManager::TThumbnailFlags aFlags,
    43     const TSize& aSize, TDisplayMode aDisplayMode, TInt aPriority,
    42     const TSize& aSize, TDisplayMode aDisplayMode, TInt aPriority,
    44     RArray < TThumbnailPersistentSize >* aMissingSizes, const TDesC& aTargetUri,
    43     RArray < TThumbnailPersistentSize >* aMissingSizes, const TDesC& aTargetUri,
    45     TThumbnailSize aThumbnailSize, const TThumbnailId aThumbnailId, 
    44     TThumbnailSize aThumbnailSize, const TInt64 aModified, 
    46     const CThumbnailManager::TThumbnailQualityPreference aQualityPreference ): 
    45     const CThumbnailManager::TThumbnailQualityPreference aQualityPreference ): 
    47     CThumbnailTask( aProcessor, aPriority ), iServer( aServer ), 
    46     CThumbnailTask( aProcessor, aPriority ), iServer( aServer ), 
    48     iFlags( aFlags ), iSize( aSize ), iDisplayMode( aDisplayMode ),
    47     iFlags( aFlags ), iSize( aSize ), iDisplayMode( aDisplayMode ),
    49     iMissingSizes( aMissingSizes ), iTargetUri( aTargetUri ),
    48     iMissingSizes( aMissingSizes ), iTargetUri( aTargetUri ),
    50     iThumbnailSize( aThumbnailSize ), iThumbnailId(aThumbnailId),
    49     iThumbnailSize( aThumbnailSize ), iModified(aModified),
    51     iQualityPreference( aQualityPreference )
    50     iQualityPreference( aQualityPreference )
    52     {
    51     {
    53     TN_DEBUG2( "CThumbnailGenerateTask(0x%08x)::CThumbnailGenerateTask()", this);
    52     TN_DEBUG2( "CThumbnailGenerateTask(0x%08x)::CThumbnailGenerateTask()", this);
    54     
    53     
    55     if ( !aBuffer && aFile)
    54     if ( !aBuffer && aFile)
   156       
   155       
   157     if(effectiveTargetSize == TSize())
   156     if(effectiveTargetSize == TSize())
   158         {
   157         {
   159         iProvider->SetTargetSize( croppedTargetSize );
   158         iProvider->SetTargetSize( croppedTargetSize );
   160         }
   159         }
   161 		
   160 	
       
   161     TInt providerErr;
       
   162     
   162     if ( !iBuffer )
   163     if ( !iBuffer )
   163         {
   164         {
   164         iProvider->GetThumbnailL( iServer.Fs(), iFile, iMimeType, iFlags,
   165         TRAP(providerErr, iProvider->GetThumbnailL( iServer.Fs(), iFile, iMimeType, iFlags,
   165             iDisplayMode, iQualityPreference );
   166             iDisplayMode, iQualityPreference ) );
   166         }
   167         }
   167     else
   168     else
   168         {
   169         {
   169         iProvider->GetThumbnailL( iServer.Fs(), iBuffer, iMimeType, iFlags,
   170         TRAP( providerErr, iProvider->GetThumbnailL( iServer.Fs(), iBuffer, iMimeType, iFlags,
   170             iDisplayMode, iQualityPreference );
   171             iDisplayMode, iQualityPreference ));
   171         }
   172         }
       
   173     
       
   174     DoBlacklisting( providerErr, TSize(0,0) );
       
   175     
       
   176     User::LeaveIfError( providerErr );
   172     }
   177     }
   173 
   178 
   174 
   179 
   175 // ---------------------------------------------------------------------------
   180 // ---------------------------------------------------------------------------
   176 // CThumbnailGenerateTask::RunL()
   181 // CThumbnailGenerateTask::RunL()
   275 
   280 
   276     if ( aError )
   281     if ( aError )
   277         {
   282         {
   278         delete aBitmap;
   283         delete aBitmap;
   279         aBitmap = NULL;
   284         aBitmap = NULL;
   280         // Create a temporary bitmap of size 1 for storing blacklisted thumbnail
   285 
   281         // Because no actual bitmap data is generated, there is no reason to 
   286         DoBlacklisting( aError, aOriginalSize );
   282         // add bitmap to server bitmap pool. Completion of client request with
   287             
   283         // error code just results in applications showing their default bitmap. 
       
   284         if( iFilename != KNullDesC || iTargetUri != KNullDesC )
       
   285             {
       
   286             if ( aError == KErrNotSupported ||
       
   287                     aError == KErrCorrupt ||
       
   288                     aError == KErrCompletion)
       
   289                 {
       
   290                 TRAPD( err, CreateBlackListedL( aOriginalSize ) );
       
   291                 if (err != KErrNone)
       
   292                     {
       
   293                     TN_DEBUG2( "CThumbnailGenerateTask::ThumbnailProviderReady() - blacklisting failed with code %d", err );
       
   294                     }
       
   295                 }
       
   296             }
       
   297         Complete( aError );
   288         Complete( aError );
   298         }
   289         }
   299     else
   290     else
   300         {
   291         {
   301         // CreateScaleTasksL will take ownership of bitmap
   292         // CreateScaleTasksL will take ownership of bitmap
   322 void CThumbnailGenerateTask::CreateScaleTasksL( CFbsBitmap* aBitmap )
   313 void CThumbnailGenerateTask::CreateScaleTasksL( CFbsBitmap* aBitmap )
   323     {
   314     {
   324     __ASSERT_DEBUG(( aBitmap ), ThumbnailPanic( EThumbnailNullPointer ));
   315     __ASSERT_DEBUG(( aBitmap ), ThumbnailPanic( EThumbnailNullPointer ));
   325 
   316 
   326     CleanupStack::PushL( aBitmap );
   317     CleanupStack::PushL( aBitmap );
   327     iServer.AddBitmapToPoolL( iRequestId.iSession, aBitmap );
   318     iServer.AddBitmapToPoolL( iRequestId.iSession, aBitmap, iRequestId );
   328 
   319 
   329     // Keep pointer so we can delete bitmap from pool
   320     // Keep pointer so we can delete bitmap from pool
   330     iBitmap = aBitmap;
   321     iBitmap = aBitmap;
   331     CleanupStack::Pop( aBitmap );
   322     CleanupStack::Pop( aBitmap );
   332 
   323 
   361                     }
   352                     }
   362                 }
   353                 }
   363             
   354             
   364             CThumbnailScaleTask* scaleTask = CThumbnailScaleTask::NewL( iProcessor, iServer, iFilename,
   355             CThumbnailScaleTask* scaleTask = CThumbnailScaleTask::NewL( iProcessor, iServer, iFilename,
   365                 iBitmap, iOriginalSize, (*iMissingSizes)[ i ].iSize, (*iMissingSizes)[ i ].iCrop, iDisplayMode,
   356                 iBitmap, iOriginalSize, (*iMissingSizes)[ i ].iSize, (*iMissingSizes)[ i ].iCrop, iDisplayMode,
   366                 KMaxPriority, iTargetUri, (*iMissingSizes)[ i ].iType, iThumbnailId, iScaledBitmapToPool, iEXIF );
   357                 KMaxPriority, iTargetUri, (*iMissingSizes)[ i ].iType, iModified, iScaledBitmapToPool, iEXIF );
   367             CleanupStack::PushL( scaleTask );
   358             CleanupStack::PushL( scaleTask );
   368             
   359             
   369             TInt err1 = KErrNone;
   360             TInt err1 = KErrNone;
   370             TInt err2 = KErrNone;
   361             TInt err2 = KErrNone;
   371             if(iFilename != KNullDesC)
   362             if(iFilename != KNullDesC)
   418             }
   409             }
   419         
   410         
   420         complTask = CThumbnailScaleTask::NewL( iProcessor, iServer, iFilename,
   411         complTask = CThumbnailScaleTask::NewL( iProcessor, iServer, iFilename,
   421             iBitmap, iOriginalSize, iSize, iFlags& CThumbnailManager
   412             iBitmap, iOriginalSize, iSize, iFlags& CThumbnailManager
   422             ::ECropToAspectRatio, iDisplayMode, KMaxPriority, iTargetUri,
   413             ::ECropToAspectRatio, iDisplayMode, KMaxPriority, iTargetUri,
   423             iThumbnailSize, iThumbnailId, iScaledBitmapToPool, iEXIF );
   414             iThumbnailSize, iModified, iScaledBitmapToPool, iEXIF );
   424         CleanupStack::PushL( complTask );
   415         CleanupStack::PushL( complTask );
   425         
   416         
   426         TInt err1 = KErrNone;
   417         TInt err1 = KErrNone;
   427         TInt err2 = KErrNone;
   418         TInt err2 = KErrNone;
   428         if(iFilename != KNullDesC)
   419         if(iFilename != KNullDesC)
   474 // Stores a blacklisted thumbnail
   465 // Stores a blacklisted thumbnail
   475 // ---------------------------------------------------------------------------
   466 // ---------------------------------------------------------------------------
   476 //
   467 //
   477 void CThumbnailGenerateTask::CreateBlackListedL( const TSize& aOriginalSize )
   468 void CThumbnailGenerateTask::CreateBlackListedL( const TSize& aOriginalSize )
   478     {
   469     {
       
   470     TN_DEBUG1( "CThumbnailGenerateTask::CreateBlackListedL()");
   479     CFbsBitmap* tempBitmap = 0;
   471     CFbsBitmap* tempBitmap = 0;
   480     tempBitmap = new (ELeave) CFbsBitmap();
   472     tempBitmap = new (ELeave) CFbsBitmap();
   481     CleanupStack::PushL( tempBitmap );
   473     CleanupStack::PushL( tempBitmap );
   482     TSize tempSize( 1, 1 );
   474     TSize tempSize( 1, 1 );
   483     User::LeaveIfError( tempBitmap->Create( tempSize, iDisplayMode ) );
   475     User::LeaveIfError( tempBitmap->Create( tempSize, iDisplayMode ) );
   484     
   476     
   485     // Instead of creating a blacklisted entry of requested size (iThumbnailSize) in thumbnail db,
   477     // Instead of creating a blacklisted entry of requested size (iThumbnailSize) in thumbnail db,
   486     // consider blacklisting all sizes (hence the changes are needed in thumbnail fetching logic too).
   478     // consider blacklisting all sizes (hence the changes are needed in thumbnail fetching logic too).
   487     // However, decoding of source to thumnail could succeed in other sizes, which makes blacklisting
   479     // However, decoding of source to thumnail could succeed in other sizes, which makes blacklisting
   488     // of requested size only meaningful. 
   480     // of requested size only meaningful. 
       
   481     
   489     if(iFilename != KNullDesC)
   482     if(iFilename != KNullDesC)
   490         {
   483         {
   491         iServer.StoreForPathL( iFilename )->StoreThumbnailL( 
   484         iServer.StoreForPathL( iFilename )->StoreThumbnailL( 
   492             iFilename, tempBitmap, aOriginalSize, EFalse, iThumbnailSize, iThumbnailId, EFalse, ETrue );
   485             iFilename, tempBitmap, aOriginalSize, EFalse, iThumbnailSize, iModified, EFalse, ETrue );
   493         }
   486         }
   494     else if(iTargetUri != KNullDesC)
   487     else if(iTargetUri != KNullDesC)
   495         {
   488         {
   496         iServer.StoreForPathL( iTargetUri )->StoreThumbnailL( 
   489         iServer.StoreForPathL( iTargetUri )->StoreThumbnailL( 
   497             iTargetUri, tempBitmap, aOriginalSize, EFalse, iThumbnailSize, iThumbnailId, EFalse, ETrue );
   490             iTargetUri, tempBitmap, aOriginalSize, EFalse, iThumbnailSize, iModified, EFalse, ETrue );
   498         }
   491         }
   499 
   492 
   500     CleanupStack::PopAndDestroy( tempBitmap );
   493     CleanupStack::PopAndDestroy( tempBitmap );
   501     }
   494     }
       
   495 
       
   496 // ---------------------------------------------------------------------------
       
   497 // Checks is blacklisting needed
       
   498 // ---------------------------------------------------------------------------
       
   499 //
       
   500 void CThumbnailGenerateTask::DoBlacklisting( const TInt aError, const TSize& aOriginalSize )
       
   501     {
       
   502     TN_DEBUG1( "CThumbnailGenerateTask::DoBlacklisting()");
       
   503     // Create a temporary bitmap of size 1 for storing blacklisted thumbnail
       
   504     // Because no actual bitmap data is generated, there is no reason to 
       
   505     // add bitmap to server bitmap pool. Completion of client request with
       
   506     // error code just results in applications showing their default bitmap. 
       
   507     if( aError != KErrNone && (iFilename != KNullDesC || iTargetUri != KNullDesC ))
       
   508         {
       
   509         if (aError == KErrNotFound ||
       
   510             aError == KErrNotSupported ||
       
   511             aError == KErrCorrupt ||
       
   512             aError == KErrCompletion ||
       
   513             aError == KErrUnderflow ||
       
   514             aError == KErrNotReady)
       
   515             {
       
   516         
       
   517         if(iMissingSizes)
       
   518             {
       
   519             TN_DEBUG2( "CThumbnailGenerateTask::DoBlacklisting() - blacklist missing sizes count = %d", iMissingSizes->Count() );
       
   520 
       
   521             for ( TInt i( 0 ); i < iMissingSizes->Count(); i++ )
       
   522                 {
       
   523                 iThumbnailSize = (*iMissingSizes)[ i ].iType;
       
   524                 TRAPD( err, CreateBlackListedL( aOriginalSize ) );
       
   525                 if (err != KErrNone)
       
   526                    {
       
   527                    TN_DEBUG3( "CThumbnailGenerateTask::DoBlacklisting() - blacklisting missing size %d failed with code %d", iThumbnailSize, err );
       
   528                    }
       
   529                 }
       
   530             return;
       
   531             }
       
   532         else
       
   533             {
       
   534             TN_DEBUG1( "CThumbnailGenerateTask::DoBlacklisting() - blacklist single size" );
       
   535             TRAPD( err, CreateBlackListedL( aOriginalSize ) );
       
   536             if (err != KErrNone)
       
   537                 {
       
   538                 TN_DEBUG2( "CThumbnailGenerateTask::DoBlacklisting() - blacklisting failed with code %d", err );
       
   539                 }
       
   540             return;
       
   541             }
       
   542         }
       
   543     TN_DEBUG1( "CThumbnailGenerateTask::DoBlacklisting() - not blacklisted " );        
       
   544     }
       
   545 }
       
   546 
       
   547