476 params.iThumbnailSize == EListThumbnailSize ) |
476 params.iThumbnailSize == EListThumbnailSize ) |
477 { |
477 { |
478 TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType; |
478 TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType; |
479 sourceType = Server()->SourceTypeFromMimeType( params.iMimeType ); |
479 sourceType = Server()->SourceTypeFromMimeType( params.iMimeType ); |
480 ModifyThumbnailSize(sourceType); |
480 ModifyThumbnailSize(sourceType); |
481 } |
|
482 |
|
483 // delete existing |
|
484 if(params.iImport && params.iOverwrite) |
|
485 { |
|
486 Server()->DeleteThumbnailsL( params.iTargetUri); |
|
487 } |
481 } |
488 |
482 |
489 // CreateThumbnails |
483 // CreateThumbnails |
490 if (params.iControlFlags == EThumbnailGeneratePersistentSizesOnly) |
484 if (params.iControlFlags == EThumbnailGeneratePersistentSizesOnly) |
491 { |
485 { |
641 else |
635 else |
642 { |
636 { |
643 TN_DEBUG2( |
637 TN_DEBUG2( |
644 "CThumbnailServerSession::RequestThumbByPathAsyncL() - thumbnail not found, err = %d", err ); |
638 "CThumbnailServerSession::RequestThumbByPathAsyncL() - thumbnail not found, err = %d", err ); |
645 |
639 |
646 // don't try to create from virtual URI |
|
647 if ( params.iVirtualUri ) |
|
648 { |
|
649 User::Leave(err); |
|
650 } |
|
651 |
|
652 // disk space check only for stored sizes |
|
653 if ( params.iThumbnailSize != ECustomThumbnailSize && |
|
654 Server()->StoreForPathL(params.iFileName)->IsDiskFull() ) |
|
655 { |
|
656 User::Leave( KErrDiskFull ); |
|
657 } |
|
658 |
|
659 if ( (err == KErrNotFound || err == KErrAccessDenied) && |
640 if ( (err == KErrNotFound || err == KErrAccessDenied) && |
660 !(params.iFlags& CThumbnailManager::EDoNotCreate) ) |
641 !(params.iFlags& CThumbnailManager::EDoNotCreate) ) |
661 { |
642 { |
662 // Special error code so that the client side can open the file |
643 // Special error code so that the client side can open the file |
663 // and retry the request using file handle |
644 // and retry the request using file handle |
664 err = KThumbnailErrThumbnailNotFound; |
645 err = KThumbnailErrThumbnailNotFound; |
|
646 } |
|
647 else |
|
648 { |
|
649 User::Leave(err); |
|
650 } |
|
651 |
|
652 // disk space check only for stored sizes |
|
653 if ( params.iThumbnailSize != ECustomThumbnailSize && |
|
654 Server()->StoreForPathL(params.iFileName)->IsDiskFull() ) |
|
655 { |
|
656 User::Leave( KErrDiskFull ); |
665 } |
657 } |
666 |
658 |
667 User::Leave(err); |
659 User::Leave(err); |
668 } |
660 } |
669 } |
661 } |
808 { |
800 { |
809 const TInt count = missingSizes->Count(); |
801 const TInt count = missingSizes->Count(); |
810 |
802 |
811 TSize bitmapSize = bitmap->SizeInPixels(); |
803 TSize bitmapSize = bitmap->SizeInPixels(); |
812 |
804 |
813 // scale small thumbs first, because fullscreen encoding takes longer |
805 for ( TInt i( 0 ); i < count; i++ ) |
814 for ( TInt i( count-1 ); i >= 0; i-- ) |
|
815 { |
806 { |
816 if( bitmapSize.iWidth < bitmapSize.iHeight ) |
807 if( bitmapSize.iWidth < bitmapSize.iHeight ) |
817 { |
808 { |
818 TThumbnailSize size = (*missingSizes)[ i ].iType; |
809 TThumbnailSize size = (*missingSizes)[ i ].iType; |
819 |
810 |
820 if ( size == EFullScreenThumbnailSize || |
811 if ( size == EFullScreenThumbnailSize || |
821 size == EVideoFullScreenThumbnailSize || |
812 size == EVideoFullScreenThumbnailSize || |
822 size == EAudioFullScreenThumbnailSize || |
813 size == EAudioFullScreenThumbnailSize || |
823 size == EImageFullScreenThumbnailSize || |
814 size == EImageFullScreenThumbnailSize ) |
824 size == EContactFullScreenThumbnailSize ) |
|
825 { |
815 { |
826 TInt height = (*missingSizes)[i].iSize.iHeight; |
816 TInt height = (*missingSizes)[i].iSize.iHeight; |
827 (*missingSizes)[i].iSize.iHeight = (*missingSizes)[i].iSize.iWidth; |
817 (*missingSizes)[i].iSize.iHeight = (*missingSizes)[i].iSize.iWidth; |
828 (*missingSizes)[i].iSize.iWidth = height; |
818 (*missingSizes)[i].iSize.iWidth = height; |
829 |
819 |
833 |
823 |
834 CThumbnailScaleTask* scaleTask = CThumbnailScaleTask::NewL( Server()->Processor(), |
824 CThumbnailScaleTask* scaleTask = CThumbnailScaleTask::NewL( Server()->Processor(), |
835 *Server(), params.iTargetUri, bitmap, bitmapSize, |
825 *Server(), params.iTargetUri, bitmap, bitmapSize, |
836 (*missingSizes)[i].iSize, (*missingSizes)[i].iCrop, params.iDisplayMode, |
826 (*missingSizes)[i].iSize, (*missingSizes)[i].iCrop, params.iDisplayMode, |
837 KMaxPriority, KNullDesC, (*missingSizes)[i].iType, params.iModified, EFalse, EFalse, |
827 KMaxPriority, KNullDesC, (*missingSizes)[i].iType, params.iModified, EFalse, EFalse, |
838 reqId, params.iVirtualUri); |
828 reqId); |
839 |
|
840 CleanupStack::PushL( scaleTask ); |
829 CleanupStack::PushL( scaleTask ); |
841 scaleTask->SetDoStore( ETrue ); |
830 scaleTask->SetDoStore( ETrue ); |
842 Server()->Processor().AddTaskL( scaleTask ); |
831 Server()->Processor().AddTaskL( scaleTask ); |
843 CleanupStack::Pop( scaleTask ); |
832 CleanupStack::Pop( scaleTask ); |
844 |
833 |
882 |
871 |
883 TN_DEBUG2( |
872 TN_DEBUG2( |
884 "CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() -- create thumbnail generation task for %S", ¶ms.iFileName ); |
873 "CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() -- create thumbnail generation task for %S", ¶ms.iFileName ); |
885 |
874 |
886 // disk space check only for stored sizes |
875 // disk space check only for stored sizes |
887 if ( params.iImport && |
876 if ( params.iThumbnailSize != ECustomThumbnailSize && |
888 Server()->StoreForPathL(params.iTargetUri)->IsDiskFull() ) |
|
889 { |
|
890 User::Leave( KErrDiskFull ); |
|
891 } |
|
892 else if ( params.iThumbnailSize != ECustomThumbnailSize && |
|
893 Server()->StoreForPathL(params.iFileName)->IsDiskFull() ) |
877 Server()->StoreForPathL(params.iFileName)->IsDiskFull() ) |
894 { |
878 { |
895 User::Leave( KErrDiskFull ); |
879 User::Leave( KErrDiskFull ); |
896 } |
880 } |
897 |
881 |
905 missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >; |
889 missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >; |
906 CleanupClosePushL( *missingSizes ); |
890 CleanupClosePushL( *missingSizes ); |
907 |
891 |
908 TBool gridSizeOnly(EFalse); |
892 TBool gridSizeOnly(EFalse); |
909 |
893 |
910 if ( params.iQualityPreference == CThumbnailManager::EOptimizeForQualityWithPreview ) |
894 if ( params.iQualityPreference == CThumbnailManager |
|
895 ::EOptimizeForQualityWithPreview ) |
911 { |
896 { |
912 gridSizeOnly = ETrue; |
897 gridSizeOnly = ETrue; |
913 } |
898 } |
914 |
899 |
915 // import vs. normal |
900 Server()->GetMissingSizesL( params.iFileName, sourceType, *missingSizes, gridSizeOnly); |
916 if(params.iImport) |
|
917 { |
|
918 Server()->GetMissingSizesL( params.iTargetUri, sourceType, *missingSizes, gridSizeOnly); |
|
919 } |
|
920 else |
|
921 { |
|
922 Server()->GetMissingSizesL( params.iFileName, sourceType, *missingSizes, gridSizeOnly); |
|
923 } |
|
924 |
901 |
925 if ( missingSizes->Count() == 0) |
902 if ( missingSizes->Count() == 0) |
926 { |
903 { |
927 // all thumbs already exist |
904 // all thumbs already exist |
928 CleanupStack::PopAndDestroy( missingSizes ); |
905 CleanupStack::PopAndDestroy( missingSizes ); |
929 delete missingSizes; |
906 delete missingSizes; |
930 missingSizes = NULL; |
|
931 |
|
932 if( aFile ) |
907 if( aFile ) |
933 { |
908 { |
934 aFile->Close(); |
909 aFile->Close(); |
935 } |
910 } |
936 return; |
911 return; |
971 } |
946 } |
972 CleanupClosePushL( *aFile ); |
947 CleanupClosePushL( *aFile ); |
973 CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server() |
948 CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server() |
974 ->Processor(), * Server(), aFile, NULL, ¶ms.iMimeType, params.iFlags, |
949 ->Processor(), * Server(), aFile, NULL, ¶ms.iMimeType, params.iFlags, |
975 params.iSize, params.iDisplayMode, priority, missingSizes, params.iTargetUri, |
950 params.iSize, params.iDisplayMode, priority, missingSizes, params.iTargetUri, |
976 params.iThumbnailSize, params.iModified, params.iQualityPreference, |
951 params.iThumbnailSize, params.iModified, params.iQualityPreference ); |
977 params.iVirtualUri); |
|
978 |
952 |
979 // do not store bitmaps to server pool when generating only |
953 // do not store bitmaps to server pool when generating only |
980 if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) |
954 if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) |
981 { |
955 { |
982 task->ScaledBitmapToPool( EFalse ); |
956 task->ScaledBitmapToPool( EFalse ); |
1086 } |
1058 } |
1087 |
1059 |
1088 CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server() |
1060 CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server() |
1089 ->Processor(), * Server(), NULL, aBuffer, ¶ms.iMimeType, params.iFlags, |
1061 ->Processor(), * Server(), NULL, aBuffer, ¶ms.iMimeType, params.iFlags, |
1090 params.iSize, params.iDisplayMode, priority, missingSizes, params.iTargetUri, |
1062 params.iSize, params.iDisplayMode, priority, missingSizes, params.iTargetUri, |
1091 params.iThumbnailSize, params.iModified, params.iQualityPreference, |
1063 params.iThumbnailSize, params.iModified, params.iQualityPreference ); |
1092 params.iVirtualUri); |
|
1093 |
1064 |
1094 // do not store bitmaps to server pool when generating only |
1065 // do not store bitmaps to server pool when generating only |
1095 if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) |
1066 if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) |
1096 { |
1067 { |
1097 task->ScaledBitmapToPool( EFalse ); |
1068 task->ScaledBitmapToPool( EFalse ); |
1381 else if(params.iThumbnailSize == EListThumbnailSize) |
1352 else if(params.iThumbnailSize == EListThumbnailSize) |
1382 { |
1353 { |
1383 params.iThumbnailSize = EAudioListThumbnailSize; |
1354 params.iThumbnailSize = EAudioListThumbnailSize; |
1384 } |
1355 } |
1385 } |
1356 } |
1386 else if(aSourceType == TThumbnailPersistentSize::EContact) |
|
1387 { |
|
1388 if(params.iThumbnailSize == EFullScreenThumbnailSize) |
|
1389 { |
|
1390 params.iThumbnailSize = EContactFullScreenThumbnailSize; |
|
1391 } |
|
1392 else if(params.iThumbnailSize == EGridThumbnailSize) |
|
1393 { |
|
1394 params.iThumbnailSize = EContactGridThumbnailSize; |
|
1395 } |
|
1396 else if(params.iThumbnailSize == EListThumbnailSize) |
|
1397 { |
|
1398 params.iThumbnailSize = EContactListThumbnailSize; |
|
1399 } |
|
1400 } |
|
1401 } |
1357 } |
1402 |
1358 |
1403 //------------------------------------------------------------------------ |
1359 //------------------------------------------------------------------------ |
1404 // CThumbnailServerSession::ModifyThumbnailSize |
1360 // CThumbnailServerSession::ModifyThumbnailSize |
1405 // --------------------------------------------------------------------------- |
1361 // --------------------------------------------------------------------------- |
1409 TThumbnailRequestParams& params = iRequestParams(); |
1365 TThumbnailRequestParams& params = iRequestParams(); |
1410 TInt res = 0; |
1366 TInt res = 0; |
1411 |
1367 |
1412 // mime type |
1368 // mime type |
1413 if ( params.iMimeType.Des8() == KNullDesC8 && !Server()->SupportedMimeType(params.iMimeType) ) |
1369 if ( params.iMimeType.Des8() == KNullDesC8 && !Server()->SupportedMimeType(params.iMimeType) ) |
1414 { |
1370 { |
1415 // try parsing from file extension |
1371 // try parsing from file extension |
1416 if (params.iImport) |
1372 res = Server()->MimeTypeFromFileExt( params.iFileName, params.iMimeType ); |
1417 { |
1373 if ( res == KErrNotFound ) |
1418 res = Server()->MimeTypeFromFileExt( params.iTargetUri, params.iMimeType ); |
1374 { |
1419 } |
1375 if( aFile ) |
1420 else |
1376 { |
1421 { |
1377 // parsed type not in the list, resolve from file |
1422 res = Server()->MimeTypeFromFileExt( params.iFileName, params.iMimeType ); |
1378 params.iMimeType = Server()->ResolveMimeTypeL(*aFile); |
1423 } |
1379 } |
1424 |
1380 else |
1425 if ( res == KErrNotFound ) |
1381 { |
1426 { |
1382 Server()->Fs().ShareProtected(); |
1427 if( aFile ) |
1383 RFile64 file; |
1428 { |
1384 CleanupClosePushL( file ); |
1429 // parsed type not in the list, resolve from file |
1385 |
1430 params.iMimeType = Server()->ResolveMimeTypeL(*aFile); |
1386 User::LeaveIfError( file.Open( Server()->Fs(), params.iFileName, EFileShareReadersOrWriters )); |
1431 } |
1387 TN_DEBUG2( "CThumbnailServerSession::ResolveMimeType - file handle opened for %S", ¶ms.iFileName ); |
1432 else |
1388 |
1433 { |
1389 params.iMimeType = Server()->ResolveMimeTypeL(file); |
1434 Server()->Fs().ShareProtected(); |
1390 |
1435 RFile64 file; |
1391 file.Close(); |
1436 CleanupClosePushL( file ); |
1392 TN_DEBUG1("CThumbnailServerSession::ResolveMimeType - file handle closed"); |
1437 |
1393 |
1438 User::LeaveIfError( file.Open( Server()->Fs(), params.iFileName, EFileShareReadersOrWriters )); |
1394 CleanupStack::Pop( &file ); |
1439 TN_DEBUG2( "CThumbnailServerSession::ResolveMimeType - file handle opened for %S", ¶ms.iFileName ); |
1395 } |
1440 |
1396 } |
1441 params.iMimeType = Server()->ResolveMimeTypeL(file); |
1397 } |
1442 |
|
1443 file.Close(); |
|
1444 TN_DEBUG1("CThumbnailServerSession::ResolveMimeType - file handle closed"); |
|
1445 |
|
1446 CleanupStack::Pop( &file ); |
|
1447 } |
|
1448 } |
|
1449 } |
|
1450 } |
1398 } |
1451 |
1399 |
1452 |
1400 |
1453 // --------------------------------------------------------------------------- |
1401 // --------------------------------------------------------------------------- |
1454 // RThumbnailMessage::FilterSqlErr |
1402 // RThumbnailMessage::FilterSqlErr |