imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailstore.cpp
changeset 1 235a7fc86938
parent 0 2014ca87e772
child 5 82749d516180
child 14 2edacbf5d3f9
equal deleted inserted replaced
0:2014ca87e772 1:235a7fc86938
   140 // ---------------------------------------------------------------------------
   140 // ---------------------------------------------------------------------------
   141 //
   141 //
   142 CThumbnailStore::~CThumbnailStore()
   142 CThumbnailStore::~CThumbnailStore()
   143     {
   143     {
   144     TN_DEBUG1( "CThumbnailStore::~CThumbnailStore()" );
   144     TN_DEBUG1( "CThumbnailStore::~CThumbnailStore()" );
       
   145     
       
   146     delete iDiskFullNotifier;
       
   147     iDiskFullNotifier = NULL; 
   145 
   148 
   146     if(!iServer->IsFormatting())
   149     if(!iServer->IsFormatting())
   147         {
   150         {
   148  	    FlushCacheTable( ETrue );
   151  	    FlushCacheTable( ETrue );
   149         }
   152         }
   163 // CThumbnailStore::CThumbnailStore()
   166 // CThumbnailStore::CThumbnailStore()
   164 // C++ default constructor can NOT contain any code, that might leave.
   167 // C++ default constructor can NOT contain any code, that might leave.
   165 // ---------------------------------------------------------------------------
   168 // ---------------------------------------------------------------------------
   166 //
   169 //
   167 CThumbnailStore::CThumbnailStore( RFs& aFs, TInt aDrive, TDesC& aImei,  CThumbnailServer* aServer ): 
   170 CThumbnailStore::CThumbnailStore( RFs& aFs, TInt aDrive, TDesC& aImei,  CThumbnailServer* aServer ): 
   168     iFs( aFs ), iDrive( aDrive ), iBatchItemCount(0), iImei(aImei), iServer(aServer)
   171     iFs( aFs ), iDrive( aDrive ), iBatchItemCount(0), iImei(aImei), iServer(aServer), iDiskFull(EFalse)
   169     {
   172     {
   170     // no implementation required
   173     // no implementation required
   171     }
   174     }
   172 
   175 
   173 
   176 
   188     TPtr pathPtr = databasePath->Des();
   191     TPtr pathPtr = databasePath->Des();
   189     TChar driveChar = 0;
   192     TChar driveChar = 0;
   190     User::LeaveIfError( RFs::DriveToChar( iDrive, driveChar ));
   193     User::LeaveIfError( RFs::DriveToChar( iDrive, driveChar ));
   191     pathPtr.Append( driveChar );
   194     pathPtr.Append( driveChar );
   192     pathPtr.Append( KThumbnailDatabaseName );
   195     pathPtr.Append( KThumbnailDatabaseName );
       
   196     
       
   197     iDiskFullNotifier = CThumbnailStoreDiskSpaceNotifierAO::NewL( *this, 
       
   198                                             KDiskFullThreshold,
       
   199                                             pathPtr );
   193 
   200 
   194     TVolumeInfo volumeinfo;
   201     TVolumeInfo volumeinfo;
   195     iFs.Volume(volumeinfo, iDrive);
   202     iFs.Volume(volumeinfo, iDrive);
   196     TUint id = volumeinfo.iUniqueID;
   203     TUint id = volumeinfo.iUniqueID;
   197     TBuf<50> mediaid;
   204     TBuf<50> mediaid;
   226         // db found, check version and rowids
   233         // db found, check version and rowids
   227         error = CheckVersionL();
   234         error = CheckVersionL();
   228         if(error == KErrNone)
   235         if(error == KErrNone)
   229             {
   236             {
   230             error = CheckRowIDsL();
   237             error = CheckRowIDsL();
   231             }
   238             }  
   232         
       
   233         }
   239         }
   234     
   240     
   235     // if wrong version, corrupted database or other error opening db
   241     // if wrong version, corrupted database or other error opening db
   236     if ( error == KErrNotSupported || (err != KErrNone && err != KErrNotFound) )
   242     if ( error == KErrNotSupported || (err != KErrNone && err != KErrNotFound) )
   237         {
   243         {
   457     TSize thumbSize = aThumbnail->SizeInPixels();
   463     TSize thumbSize = aThumbnail->SizeInPixels();
   458     for ( TInt i = iPersistentSizes.Count(); --i >= 0; )
   464     for ( TInt i = iPersistentSizes.Count(); --i >= 0; )
   459         {
   465         {
   460         TThumbnailPersistentSize & persistentSize = iPersistentSizes[i];
   466         TThumbnailPersistentSize & persistentSize = iPersistentSizes[i];
   461         
   467         
   462         // don't store duplicates or custom sizes
   468         // don't store duplicates or custom/unknown sizes
   463         if ( !exists && (aThumbnailSize != ECustomThumbnailSize && 
   469         if ( !exists && (aThumbnailSize != ECustomThumbnailSize && 
       
   470                          aThumbnailSize != EUnknownThumbnailSize &&
   464                          thumbSize.iWidth > 0 && thumbSize.iHeight > 0 ))
   471                          thumbSize.iWidth > 0 && thumbSize.iHeight > 0 ))
   465             {
   472             {
   466             TInt flags = 0;
   473             TInt flags = 0;
   467             if ( persistentSize.iCrop )
   474             if ( persistentSize.iCrop )
   468                 {
   475                 {
  2037       {
  2044       {
  2038       return KErrNone;  
  2045       return KErrNone;  
  2039       }
  2046       }
  2040     else
  2047     else
  2041       {
  2048       {
       
  2049       TN_DEBUG1( "CThumbnailStore::CheckVersionL() - wrong DB version" );
  2042       return KErrNotSupported;  
  2050       return KErrNotSupported;  
  2043       }
  2051       }
  2044     }
  2052     }
  2045 
  2053 
  2046 
  2054 
  2250     stmt.Close();
  2258     stmt.Close();
  2251     CleanupStack::PopAndDestroy( &stmt );
  2259     CleanupStack::PopAndDestroy( &stmt );
  2252             
  2260             
  2253     if( inforows != datarows)
  2261     if( inforows != datarows)
  2254         {
  2262         {
       
  2263         TN_DEBUG1( "CThumbnailStore::CheckRowIDsL() - tables out of sync" );
  2255         return KErrNotSupported;
  2264         return KErrNotSupported;
  2256         }  
  2265         }  
  2257     else
  2266     else
  2258         {
  2267         {
  2259         return KErrNone;
  2268         return KErrNone;
  2365     TN_DEBUG2( "CThumbnailStore::RemoveBlacklistedFlag() - main table, err=%d", err );
  2374     TN_DEBUG2( "CThumbnailStore::RemoveBlacklistedFlag() - main table, err=%d", err );
  2366     
  2375     
  2367     CleanupStack::PopAndDestroy( &stmt );
  2376     CleanupStack::PopAndDestroy( &stmt );
  2368     }
  2377     }
  2369 
  2378 
       
  2379 void CThumbnailStore::HandleDiskSpaceNotificationL( TBool aDiskFull )
       
  2380     {
       
  2381     TN_DEBUG2( "CThumbnailStore::HandleDiskSpaceNotificationL() aDiskFull = %d", aDiskFull );
       
  2382     iDiskFull = aDiskFull;
       
  2383     }
       
  2384 
       
  2385 
       
  2386 void CThumbnailStore::HandleDiskSpaceError(TInt aError )
       
  2387     {
       
  2388     if (aError != KErrNone)
       
  2389         {
       
  2390         TN_DEBUG2( "CThumbnailStore::HandleDiskSpaceError() aError = %d", aError );
       
  2391         }
       
  2392     }
       
  2393 
       
  2394 TBool CThumbnailStore::IsDiskFull()
       
  2395     {
       
  2396     return iDiskFull;
       
  2397     }
       
  2398 
       
  2399 CThumbnailStoreDiskSpaceNotifierAO* CThumbnailStoreDiskSpaceNotifierAO::NewL(
       
  2400         MThumbnailStoreDiskSpaceNotifierObserver& aObserver, TInt64 aThreshold, const TDesC& aFilename)
       
  2401     {
       
  2402     CThumbnailStoreDiskSpaceNotifierAO* self = 
       
  2403         CThumbnailStoreDiskSpaceNotifierAO::NewLC( aObserver, aThreshold, aFilename);
       
  2404     CleanupStack::Pop( self );
       
  2405     return self;
       
  2406     }
       
  2407 
       
  2408 CThumbnailStoreDiskSpaceNotifierAO* CThumbnailStoreDiskSpaceNotifierAO::NewLC(
       
  2409         MThumbnailStoreDiskSpaceNotifierObserver& aObserver, TInt64 aThreshold, const TDesC& aFilename)
       
  2410     {
       
  2411     TDriveNumber driveNumber = GetDriveNumberL( aFilename );
       
  2412     
       
  2413     CThumbnailStoreDiskSpaceNotifierAO* self = 
       
  2414         new ( ELeave ) CThumbnailStoreDiskSpaceNotifierAO( aObserver, aThreshold, driveNumber );
       
  2415     CleanupStack::PushL( self );
       
  2416     self->ConstructL();
       
  2417     return self;
       
  2418     }
       
  2419 
       
  2420 TDriveNumber CThumbnailStoreDiskSpaceNotifierAO::GetDriveNumberL( const TDesC& aFilename )
       
  2421     {
       
  2422     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::GetDriveNumberL()");
       
  2423     TLex driveParser( aFilename );
       
  2424     
       
  2425     TChar driveChar = driveParser.Get();
       
  2426 
       
  2427     if( 0 == driveChar || TChar( ':' ) != driveParser.Peek() )
       
  2428         {
       
  2429         TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::GetDriveNumberL() KErrArgument");
       
  2430         User::Leave( KErrArgument );
       
  2431         }
       
  2432         
       
  2433     TInt driveNumber;
       
  2434     
       
  2435     RFs::CharToDrive( driveChar, driveNumber );
       
  2436     
       
  2437     return (TDriveNumber)driveNumber;
       
  2438     }
       
  2439 
       
  2440 
       
  2441 CThumbnailStoreDiskSpaceNotifierAO::~CThumbnailStoreDiskSpaceNotifierAO()
       
  2442     {
       
  2443     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::~CThumbnailStoreDiskSpaceNotifierAO()");
       
  2444     Cancel();
       
  2445 
       
  2446     iFileServerSession.Close();
       
  2447     }
       
  2448 
       
  2449 void CThumbnailStoreDiskSpaceNotifierAO::RunL()
       
  2450     {   
       
  2451     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::RunL()");
       
  2452     TVolumeInfo volumeInfo;
       
  2453 
       
  2454     if ( iState == CThumbnailStoreDiskSpaceNotifierAO::ENormal )
       
  2455         {
       
  2456         TInt status = iStatus.Int();
       
  2457         
       
  2458         switch( status )
       
  2459             {
       
  2460             case KErrNone:
       
  2461                 iFileServerSession.Volume( volumeInfo, iDrive );
       
  2462                 
       
  2463                 // Check if free space is less than threshold level
       
  2464                 if( volumeInfo.iFree < iThreshold )
       
  2465                     {
       
  2466                     iDiskFull = ETrue;
       
  2467                     iObserver.HandleDiskSpaceNotificationL( iDiskFull );
       
  2468                     iState = EIterate;
       
  2469                     iIterationCount = 0;
       
  2470                     SetActive();
       
  2471                     TRequestStatus* status = &iStatus;
       
  2472                     User::RequestComplete( status, KErrNone );
       
  2473                     return;
       
  2474                     }
       
  2475                 else
       
  2476                     {
       
  2477                     iDiskFull = EFalse;
       
  2478                     iObserver.HandleDiskSpaceNotificationL( iDiskFull );
       
  2479                     }
       
  2480                 StartNotifier();
       
  2481                 break;
       
  2482 
       
  2483             case KErrArgument:
       
  2484                 TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::GetDriveNumberL() KErrArgument");
       
  2485                 User::Leave( status );
       
  2486                 break;
       
  2487             default:
       
  2488                 break;
       
  2489             }
       
  2490         }
       
  2491     else if ( iState == CThumbnailStoreDiskSpaceNotifierAO::EIterate )
       
  2492         {
       
  2493         const TInt KMaxIterations = 10;
       
  2494         
       
  2495         iFileServerSession.Volume( volumeInfo, iDrive );
       
  2496         if ( volumeInfo.iFree < iThreshold )
       
  2497             {
       
  2498             iObserver.HandleDiskSpaceNotificationL( iDiskFull );
       
  2499             ++iIterationCount;
       
  2500             if ( iIterationCount < KMaxIterations )
       
  2501                 {
       
  2502                 SetActive();
       
  2503                 TRequestStatus* status = &iStatus;
       
  2504                 User::RequestComplete( status, KErrNone );
       
  2505                 return;
       
  2506                 }
       
  2507             else
       
  2508                 {
       
  2509                 iFileServerSession.Volume( volumeInfo, iDrive );
       
  2510                 if ( volumeInfo.iFree >= iThreshold )
       
  2511                     {
       
  2512                     iDiskFull = EFalse;
       
  2513                     }
       
  2514                 }
       
  2515             }
       
  2516         else
       
  2517             {
       
  2518             iDiskFull = EFalse;
       
  2519             }
       
  2520         iState = ENormal;
       
  2521         iIterationCount = 0;
       
  2522         StartNotifier();            
       
  2523         }
       
  2524     else
       
  2525         {
       
  2526         User::Leave( KErrGeneral );
       
  2527         }
       
  2528     }
       
  2529 
       
  2530 TInt CThumbnailStoreDiskSpaceNotifierAO::RunError(TInt aError)
       
  2531     {
       
  2532     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::RunError()");
       
  2533     iObserver.HandleDiskSpaceError( aError );
       
  2534     
       
  2535     return KErrNone;
       
  2536     }
       
  2537 
       
  2538 void CThumbnailStoreDiskSpaceNotifierAO::DoCancel()
       
  2539     {
       
  2540     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::DoCancel()");
       
  2541     if( IsActive() )
       
  2542         {   
       
  2543         iFileServerSession.NotifyDiskSpaceCancel();
       
  2544         }
       
  2545     }
       
  2546 
       
  2547 CThumbnailStoreDiskSpaceNotifierAO::CThumbnailStoreDiskSpaceNotifierAO(
       
  2548     MThumbnailStoreDiskSpaceNotifierObserver& aObserver, TInt64 aThreshold, const TDriveNumber aDrive)
       
  2549     : CActive( CActive::EPriorityStandard ), 
       
  2550     iObserver( aObserver ), iThreshold( aThreshold ), iDrive( aDrive ), iState( CThumbnailStoreDiskSpaceNotifierAO::ENormal ), iDiskFull( EFalse )
       
  2551     {
       
  2552     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::CThumbnailStoreDiskSpaceNotifierAO()");
       
  2553     CActiveScheduler::Add( this );
       
  2554     }
       
  2555 
       
  2556 void CThumbnailStoreDiskSpaceNotifierAO::ConstructL()
       
  2557     {   
       
  2558     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::ConstructL()");
       
  2559     TInt KMessageSlotCount = 2; // slots for NotifyDiskSpace and NotifyDiskSpaceCancel
       
  2560 
       
  2561     User::LeaveIfError( iFileServerSession.Connect( KMessageSlotCount ) );
       
  2562     
       
  2563     TVolumeInfo volumeInfo;
       
  2564     iFileServerSession.Volume( volumeInfo, iDrive );    
       
  2565     if ( volumeInfo.iFree < iThreshold )
       
  2566         {
       
  2567         iDiskFull = ETrue;
       
  2568         }
       
  2569 
       
  2570     iObserver.HandleDiskSpaceNotificationL( iDiskFull );
       
  2571     
       
  2572     StartNotifier();
       
  2573     }
       
  2574 
       
  2575 void CThumbnailStoreDiskSpaceNotifierAO::StartNotifier()
       
  2576     {   
       
  2577     TN_DEBUG2( "CThumbnailStoreDiskSpaceNotifierAO::StartNotifier() iDrive == %d", iDrive);
       
  2578     iFileServerSession.NotifyDiskSpace( iThreshold, iDrive, iStatus );
       
  2579     
       
  2580     SetActive();
       
  2581     }
       
  2582 
       
  2583 TBool CThumbnailStoreDiskSpaceNotifierAO::DiskFull() const
       
  2584     {
       
  2585     return iDiskFull;
       
  2586     }
       
  2587 
  2370 // End of file
  2588 // End of file