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() |
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 |