imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp
branchRCL_3
changeset 58 9e8b0cc88842
parent 50 60bb012f1157
equal deleted inserted replaced
50:60bb012f1157 58:9e8b0cc88842
   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", &params.iFileName );
   873         "CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() -- create thumbnail generation task for %S", &params.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, &params.iMimeType, params.iFlags,
   949         ->Processor(), * Server(), aFile, NULL, &params.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 );
  1058         if ( missingSizes->Count() == 0)
  1032         if ( missingSizes->Count() == 0)
  1059             {
  1033             {
  1060             // all thumbs already exist
  1034             // all thumbs already exist
  1061             CleanupStack::PopAndDestroy( missingSizes );
  1035             CleanupStack::PopAndDestroy( missingSizes );
  1062             delete missingSizes;
  1036             delete missingSizes;
  1063             missingSizes = NULL;
       
  1064             
       
  1065             if ( aBuffer)
  1037             if ( aBuffer)
  1066                {
  1038                {
  1067                delete aBuffer;
  1039                delete aBuffer;
  1068                aBuffer = NULL; 
  1040                aBuffer = NULL; 
  1069                }
  1041                }
  1086         }
  1058         }
  1087     
  1059     
  1088     CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server()
  1060     CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server()
  1089         ->Processor(), * Server(), NULL, aBuffer, &params.iMimeType, params.iFlags,
  1061         ->Processor(), * Server(), NULL, aBuffer, &params.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", &params.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", &params.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
  1585         TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - message null");       
  1533         TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - message null");       
  1586         return EFalse;
  1534         return EFalse;
  1587         }
  1535         }
  1588     }
  1536     }
  1589 
  1537 
  1590 
       
  1591 // End of file
  1538 // End of file