imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailstore.cpp
changeset 54 48dd0f169f0d
parent 42 2e2a89493e2b
equal deleted inserted replaced
42:2e2a89493e2b 54:48dd0f169f0d
     1 /*
       
     2 * Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Store for thumbnails.
       
    15  *
       
    16 */
       
    17 
       
    18 
       
    19 #include <s32mem.h>
       
    20 #include <e32cmn.h>
       
    21 #include <fbs.h>
       
    22 #include <imageconversion.h>
       
    23 #include <e32base.h>
       
    24 #include <ExifRead.h>
       
    25 #include <bautils.h>  
       
    26 #include <IclExtJpegApi.h>
       
    27 
       
    28 #include "thumbnailstore.h"
       
    29 #include "thumbnailsql.h"
       
    30 #include "thumbnaillog.h"
       
    31 #include "thumbnailmanageruids.hrh"
       
    32 #include "thumbnailcenrep.h"
       
    33 #include "thumbnailpanic.h"
       
    34 #include "thumbnailmanagerconstants.h"
       
    35 #include "thumbnailserver.h"
       
    36 #include "OstTraceDefinitions.h"
       
    37 #ifdef OST_TRACE_COMPILER_IN_USE
       
    38 #include "thumbnailstoreTraces.h"
       
    39 #endif
       
    40 
       
    41 
       
    42 
       
    43 _LIT8( KThumbnailSqlConfig, "page_size=32768; cache_size=64;" );
       
    44 
       
    45 const TInt KStreamBufferSize = 1024 * 8;
       
    46 const TInt KMajor = 3;
       
    47 const TInt KMinor = 2;
       
    48 
       
    49 const TInt KStoreUnrecoverableErr = KErrCorrupt;
       
    50 
       
    51 // Database path without drive letter
       
    52 //Symbian^4 v5
       
    53 _LIT( KThumbnailDatabaseName, ":[102830AB]thumbnail_v5.db" );
       
    54 
       
    55 
       
    56 // Allow access to database only for the server process
       
    57 const TSecurityPolicy KThumbnailDatabaseSecurityPolicy( TSecureId(
       
    58     THUMBNAIL_MANAGER_SERVER_UID ));
       
    59 
       
    60 
       
    61 // ---------------------------------------------------------------------------
       
    62 // RThumbnailTransaction::RThumbnailTransaction::TThumbnailPersistentSize
       
    63 // ---------------------------------------------------------------------------
       
    64 //
       
    65 RThumbnailTransaction::RThumbnailTransaction( RSqlDatabase& aDatabase ):
       
    66     iDatabase( aDatabase ), iState( EClosed )
       
    67     {
       
    68     // No implementation required
       
    69     }
       
    70 
       
    71 // ---------------------------------------------------------------------------
       
    72 // RThumbnailTransaction::BeginL()
       
    73 // ---------------------------------------------------------------------------
       
    74 //
       
    75 void RThumbnailTransaction::BeginL()
       
    76     {    
       
    77     if (iDatabase.InTransaction())
       
    78         {
       
    79         TN_DEBUG1( "RThumbnailTransaction::BeginL() - error: old transaction open!" );
       
    80         OstTrace0( TRACE_NORMAL, RTHUMBNAILTRANSACTION_BEGINL, "RThumbnailTransaction::BeginL - error: old transaction open!" );
       
    81         __ASSERT_DEBUG(( !iDatabase.InTransaction() ), ThumbnailPanic( EThumbnailSQLTransaction ));
       
    82         
       
    83         // old transaction already open, don't open another
       
    84         iState = EOldOpen;
       
    85         
       
    86         return;
       
    87         }
       
    88     
       
    89     const TInt err = iDatabase.Exec( KThumbnailBeginTransaction );
       
    90     if ( err >= 0 )
       
    91         {
       
    92         iState = EOpen;
       
    93         }
       
    94     else
       
    95         {
       
    96         iState = EError;
       
    97 #ifdef _DEBUG
       
    98     TPtrC errorMsg = iDatabase.LastErrorMessage();
       
    99     TN_DEBUG3( "RThumbnailTransaction::BeginL() lastError %S, ret = %d" , &errorMsg, err);
       
   100     OstTraceExt2( TRACE_NORMAL, DUP1_RTHUMBNAILTRANSACTION_BEGINL, "RThumbnailTransaction::BeginL - lastError;errorMsg=%S;err=%d", errorMsg, err );
       
   101 #endif
       
   102         User::Leave( err );
       
   103         }
       
   104     }
       
   105 
       
   106 // ---------------------------------------------------------------------------
       
   107 // RThumbnailTransaction::Close()
       
   108 // ---------------------------------------------------------------------------
       
   109 //
       
   110 void RThumbnailTransaction::Close()
       
   111     {
       
   112     if ( iState != EClosed && iState != EOldOpen )
       
   113         {
       
   114         Rollback();
       
   115         }
       
   116     }
       
   117 
       
   118 // ---------------------------------------------------------------------------
       
   119 // RThumbnailTransaction::CommitL()
       
   120 // ---------------------------------------------------------------------------
       
   121 //
       
   122 void RThumbnailTransaction::CommitL()
       
   123     {
       
   124     if ( iState != EOldOpen )
       
   125         {
       
   126         TInt ret = iDatabase.Exec( KThumbnailCommitTransaction );
       
   127     
       
   128 #ifdef _DEBUG
       
   129     TPtrC errorMsg = iDatabase.LastErrorMessage();
       
   130     TN_DEBUG3( "RThumbnailTransaction::CommitL() lastError %S, ret = %d" , &errorMsg, ret);
       
   131     OstTraceExt2( TRACE_NORMAL, DUP2_RTHUMBNAILTRANSACTION_BEGINL, "RThumbnailTransaction::BeginL - lastError;errorMsg=%S;ret=%d", errorMsg, ret );
       
   132 #endif  
       
   133     User::LeaveIfError( ret );
       
   134         }
       
   135     
       
   136     iState = EClosed;
       
   137     }
       
   138 
       
   139 // ---------------------------------------------------------------------------
       
   140 // RThumbnailTransaction::Rollback()
       
   141 // ---------------------------------------------------------------------------
       
   142 //
       
   143 TInt RThumbnailTransaction::Rollback()
       
   144     {
       
   145     if ( iState != EOldOpen )
       
   146         {
       
   147         // in some cases there could have been automatic rollback
       
   148         if (iDatabase.InTransaction())
       
   149             {
       
   150             const TInt err = iDatabase.Exec( KThumbnailRollbackTransaction );
       
   151             if ( err >= 0 )
       
   152                 {
       
   153                 iState = EClosed;
       
   154                 }
       
   155             
       
   156             return err;
       
   157             }
       
   158         else
       
   159             {
       
   160             TN_DEBUG1( "RThumbnailTransaction::Rollback() - automatic rollback already done!" );
       
   161             OstTrace0( TRACE_NORMAL, RTHUMBNAILTRANSACTION_ROLLBACK, "RThumbnailTransaction::Rollback - automatic rollback already done!" );
       
   162             }
       
   163         }
       
   164     
       
   165     iState = EClosed;
       
   166     
       
   167     return KErrNone;
       
   168     }
       
   169 
       
   170 
       
   171 // ======== MEMBER FUNCTIONS ========
       
   172 
       
   173 // ---------------------------------------------------------------------------
       
   174 // CThumbnailStore::NewL()
       
   175 // Two-phased constructor.
       
   176 // ---------------------------------------------------------------------------
       
   177 //
       
   178 CThumbnailStore* CThumbnailStore::NewL( RFs& aFs, TInt aDrive, TDesC& aImei, CThumbnailServer* aServer, const TBool aReadOnly )
       
   179     {
       
   180     CThumbnailStore* self = new( ELeave )CThumbnailStore( aFs, aDrive, aImei, aServer, aReadOnly );
       
   181     CleanupStack::PushL( self );
       
   182     self->ConstructL();
       
   183     CleanupStack::Pop( self );
       
   184     return self;
       
   185     }
       
   186 
       
   187 
       
   188 // ---------------------------------------------------------------------------
       
   189 // CThumbnailStore::~CThumbnailStore()
       
   190 // Destructor.
       
   191 // ---------------------------------------------------------------------------
       
   192 //
       
   193 CThumbnailStore::~CThumbnailStore()
       
   194     {
       
   195     TN_DEBUG2( "CThumbnailStore::~CThumbnailStore() drive: %d", iDrive );
       
   196     OstTrace1( TRACE_NORMAL, CTHUMBNAILSTORE_CTHUMBNAILSTORE, "CThumbnailStore::~CThumbnailStore;iDrive=%d", iDrive );
       
   197     
       
   198     if(iActivityManager)
       
   199         {
       
   200         delete iActivityManager;
       
   201         iActivityManager = NULL;
       
   202         }
       
   203     
       
   204     if(iDiskFullNotifier)
       
   205         {
       
   206         delete iDiskFullNotifier;
       
   207         iDiskFullNotifier = NULL;
       
   208         }
       
   209 
       
   210     if( iAutoFlushTimer )
       
   211         {
       
   212         iAutoFlushTimer->Cancel();
       
   213         delete iAutoFlushTimer;
       
   214         iAutoFlushTimer = NULL;
       
   215         }
       
   216     
       
   217     if( iMaintenanceTimer )
       
   218         {
       
   219         iMaintenanceTimer->Cancel();
       
   220         delete iMaintenanceTimer;
       
   221         iMaintenanceTimer = NULL;
       
   222         }
       
   223     
       
   224     CloseStatements();   
       
   225     iDatabase.Close();
       
   226     
       
   227     TN_DEBUG1( "CThumbnailStore::~CThumbnailStore() - database closed" );
       
   228     OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_CTHUMBNAILSTORE, "CThumbnailStore::~CThumbnailStore - database closed" );
       
   229     }
       
   230 
       
   231 // ---------------------------------------------------------------------------
       
   232 // CThumbnailStore::CThumbnailStore()
       
   233 // C++ default constructor can NOT contain any code, that might leave.
       
   234 // ---------------------------------------------------------------------------
       
   235 //
       
   236 CThumbnailStore::CThumbnailStore( RFs& aFs, TInt aDrive, TDesC& aImei, CThumbnailServer* aServer, const TBool aReadOnly ): 
       
   237     iFs( aFs ), iDrive( aDrive ), iDriveChar( 0 ), iBatchItemCount(0), iImei(aImei), iServer(aServer), iDiskFullNotifier(NULL), 
       
   238     iDiskFull(EFalse), iActivityManager(NULL), iUnrecoverable(ETrue), iBatchFlushItemCount(KMInBatchItems), iReadOnly(aReadOnly)
       
   239     {
       
   240     // no implementation required
       
   241     }
       
   242 
       
   243 // ---------------------------------------------------------------------------
       
   244 // CThumbnailStore::ConstructL()
       
   245 // Symbian 2nd phase constructor can leave.
       
   246 // ---------------------------------------------------------------------------
       
   247 //
       
   248 void CThumbnailStore::ConstructL()
       
   249     {
       
   250     TN_DEBUG1( "CThumbnailStore::ConstructL()" );
       
   251     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_CONSTRUCTL, "CThumbnailStore::ConstructL" );
       
   252 
       
   253 #ifdef _DEBUG
       
   254     iThumbCounter = 0;
       
   255 #endif
       
   256     if(!iReadOnly)
       
   257         {
       
   258         HBufC* databasePath = HBufC::NewLC( KMaxFileName );
       
   259         TPtr pathPtr = databasePath->Des();
       
   260         User::LeaveIfError( RFs::DriveToChar( iDrive, iDriveChar ));
       
   261         pathPtr.Append( iDriveChar );
       
   262         pathPtr.Append( KThumbnailDatabaseName );
       
   263         
       
   264         //start disk space monitor
       
   265         iDiskFullNotifier = CThumbnailStoreDiskSpaceNotifierAO::NewL( *this, 
       
   266                                                 KDiskFullThreshold,
       
   267                                                 pathPtr );
       
   268 
       
   269         CleanupStack::PopAndDestroy( databasePath );
       
   270     
       
   271         TN_DEBUG2( "CThumbnailStore::ConstructL() drive: %d", iDrive );
       
   272         OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_CONSTRUCTL, "CThumbnailStore::ConstructL;iDrive=%d", iDrive );
       
   273     
       
   274         OpenDatabaseL();
       
   275     
       
   276         // to monitor device activity
       
   277         iActivityManager = CTMActivityManager::NewL( this, KStoreMaintenanceIdle);
       
   278         iActivityManager->Start();
       
   279     
       
   280         iDeleteThumbs = ETrue;
       
   281         iCheckFilesExist = ETrue;
       
   282         }
       
   283     else
       
   284         {
       
   285 	    TN_DEBUG1( "CThumbnailStore::ConstructL() - read only, dymmy mode..." );
       
   286         OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_CONSTRUCTL, "CThumbnailStore::ConstructL - read only, dymmy mode..." );
       
   287         iDeleteThumbs = EFalse;
       
   288         iCheckFilesExist = EFalse;
       
   289         iLastCheckedRowID = -1;
       
   290         }
       
   291     }
       
   292 
       
   293 // ---------------------------------------------------------------------------
       
   294 // OpenDatabaseL database file
       
   295 // ---------------------------------------------------------------------------
       
   296 TInt CThumbnailStore::OpenDatabaseFileL()
       
   297     {
       
   298     TN_DEBUG1( "CThumbnailStore::OpenDatabaseFile()" );
       
   299     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_OPENDATABASEFILEL, "CThumbnailStore::OpenDatabaseFileL" );
       
   300     
       
   301     HBufC* databasePath = HBufC::NewLC( KMaxFileName );
       
   302     TPtr pathPtr = databasePath->Des();
       
   303     TChar driveChar = 0;
       
   304     User::LeaveIfError( RFs::DriveToChar( iDrive, driveChar ));
       
   305     pathPtr.Append( driveChar );
       
   306     pathPtr.Append( KThumbnailDatabaseName );
       
   307     
       
   308     TInt ret = iDatabase.Open( pathPtr );
       
   309     CleanupStack::PopAndDestroy( databasePath );
       
   310     return ret;
       
   311     }
       
   312 
       
   313 // ---------------------------------------------------------------------------
       
   314 // OpenDatabaseL database
       
   315 // ---------------------------------------------------------------------------
       
   316 TInt CThumbnailStore::OpenDatabaseL( TBool aNewDatabase )
       
   317     {
       
   318     TN_DEBUG2( "CThumbnailStore::OpenDatabaseL() drive: %d", iDrive );
       
   319     OstTrace1( TRACE_NORMAL, CTHUMBNAILSTORE_OPENDATABASEL, "CThumbnailStore::OpenDatabaseL;iDrive=%d", iDrive );
       
   320         
       
   321     CloseStatements();
       
   322     iDatabase.Close();
       
   323     iUnrecoverable = ETrue;
       
   324     
       
   325     TInt checkError = KErrNone;
       
   326     TInt blistError = KErrNone;
       
   327     TInt blistError2 = KErrNone;
       
   328     TInt imeiError = KErrNone;
       
   329     TInt err = KErrNone;
       
   330     
       
   331     if (aNewDatabase)
       
   332         {
       
   333         // delete existing and create new
       
   334         CleanupClosePushL(iDatabase);
       
   335         RecreateDatabaseL(ETrue);
       
   336         CleanupStack::Pop(&iDatabase);
       
   337         }
       
   338     else
       
   339         {
       
   340         // just open old
       
   341         err = OpenDatabaseFileL();
       
   342         
       
   343         TN_DEBUG2( "CThumbnailStore::OpenDatabaseL() -- err = %d", err);
       
   344         OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_OPENDATABASEL, "CThumbnailStore::OpenDatabaseL;err=%d", err );
       
   345                
       
   346         if ( err == KErrNone)
       
   347             {
       
   348             // db found, check version and rowids
       
   349             checkError = CheckVersion();
       
   350             if(checkError == KErrNone)
       
   351                 {
       
   352                 checkError = CheckRowIDs();
       
   353                 }
       
   354             }
       
   355 
       
   356         // if db file not found, wrong version, corrupted database or other error opening db
       
   357         if ( err != KErrNone || checkError == KErrNotSupported )
       
   358             {
       
   359             CleanupClosePushL(iDatabase);
       
   360             RecreateDatabaseL(ETrue);
       
   361             CleanupStack::Pop(&iDatabase);
       
   362             
       
   363             aNewDatabase = ETrue;
       
   364             }          
       
   365         }    
       
   366    
       
   367     // opened existing database file
       
   368     if(!aNewDatabase)
       
   369         {       
       
   370         // add temp tables
       
   371         CreateTempTablesL();
       
   372     
       
   373         //check ownership
       
   374         imeiError = CheckImei();
       
   375        
       
   376         if(imeiError != KErrNone)
       
   377             {
       
   378             //take ownership
       
   379             TRAP(imeiError, UpdateImeiL() );
       
   380             
       
   381             //Touch blacklisted items
       
   382             TRAP(blistError, PrepareBlacklistedItemsForRetryL() );
       
   383             }
       
   384        
       
   385         //check if MMC is known
       
   386         if(CheckMediaIDL() != KErrNone)
       
   387             {
       
   388             //Touch blacklisted items
       
   389             TRAP(blistError2, PrepareBlacklistedItemsForRetryL() );
       
   390             }
       
   391         
       
   392         if(imeiError != KErrNone || blistError != KErrNone || blistError2 != KErrNone )
       
   393             {
       
   394             CleanupClosePushL(iDatabase);
       
   395             RecreateDatabaseL(ETrue);
       
   396             CleanupStack::Pop(&iDatabase);
       
   397             }
       
   398         }
       
   399    
       
   400     PrepareStatementsL();
       
   401     
       
   402     // database now usable
       
   403     iUnrecoverable = EFalse;
       
   404     
       
   405     return KErrNone;
       
   406     }
       
   407 
       
   408 // ---------------------------------------------------------------------------
       
   409 // PrepareDbL database tables
       
   410 // ---------------------------------------------------------------------------
       
   411 //
       
   412 void CThumbnailStore::PrepareDbL()
       
   413     {
       
   414     TN_DEBUG1( "CThumbnailStore::PrepareDbL()" );
       
   415     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_PREPAREDBL, "CThumbnailStore::PrepareDbL" );
       
   416     
       
   417     // add persistent tables
       
   418     CreateTablesL();
       
   419       
       
   420     AddVersionAndImeiL();
       
   421     
       
   422     // add temp tables
       
   423     CreateTempTablesL();
       
   424     }
       
   425 
       
   426 // ---------------------------------------------------------------------------
       
   427 // Create database tables
       
   428 // ---------------------------------------------------------------------------
       
   429 //
       
   430 void CThumbnailStore::CreateTablesL()
       
   431     {
       
   432     TN_DEBUG1( "CThumbnailStore::CreateTablesL()" );
       
   433     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_CREATETABLESL, "CThumbnailStore::CreateTablesL" );
       
   434     
       
   435     TInt err = KErrNone;
       
   436     err = iDatabase.Exec( KThumbnailCreateInfoTable );
       
   437     TN_DEBUG2( "CThumbnailStore::CreateTablesL() KThumbnailCreateInfoTable err=%d", err );
       
   438     OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_CREATETABLESL, "CThumbnailStore::CreateTablesL - KThumbnailCreateInfoTable;err=%d", err );
       
   439     User::LeaveIfError( err );
       
   440     
       
   441     err = iDatabase.Exec( KThumbnailCreateInfoDataTable );
       
   442     TN_DEBUG2( "CThumbnailStore::CreateTablesL() KThumbnailCreateInfoDataTable err=%d", err );
       
   443     OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_CREATETABLESL, "CThumbnailStore::CreateTablesL - KThumbnailCreateInfoDataTable;err=%d", err );
       
   444     User::LeaveIfError( err );
       
   445     
       
   446     err = iDatabase.Exec(KThumbnailDeletedTable);
       
   447     TN_DEBUG2( "CThumbnailStore::CreateTablesL() KThumbnailDeletedTable err=%d", err );
       
   448     OstTrace1( TRACE_NORMAL, DUP3_CTHUMBNAILSTORE_CREATETABLESL, "CThumbnailStore::CreateTablesL - KThumbnailDeletedTable;err=%d", err );
       
   449     User::LeaveIfError( err );
       
   450     
       
   451     err = iDatabase.Exec( KThumbnailCreateInfoTableIndex1 );
       
   452     TN_DEBUG2( "CThumbnailStore::CreateTablesL() KThumbnailCreateInfoTableIndex1 err=%d", err );
       
   453     User::LeaveIfError( err );
       
   454     
       
   455     err = iDatabase.Exec(KThumbnailVersionTable);
       
   456     TN_DEBUG2( "CThumbnailStore::CreateTablesL() KThumbnailVersionTable err=%d", err );
       
   457     OstTrace1( TRACE_NORMAL, DUP4_CTHUMBNAILSTORE_CREATETABLESL, "CThumbnailStore::CreateTablesL;err=%d", err );
       
   458     User::LeaveIfError( err );
       
   459     }
       
   460 
       
   461 // ---------------------------------------------------------------------------
       
   462 // Create temp tables
       
   463 // ---------------------------------------------------------------------------
       
   464 //
       
   465 void CThumbnailStore::CreateTempTablesL()
       
   466     {
       
   467     TN_DEBUG1( "CThumbnailStore::CreateTempTablesL()" );
       
   468     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_CREATETEMPTABLESL, "CThumbnailStore::CreateTempTablesL" );
       
   469 
       
   470     TInt err = iDatabase.Exec( KThumbnailCreateTempInfoTable );
       
   471 
       
   472 #ifdef _DEBUG
       
   473     if(err < 0)
       
   474         {
       
   475         TPtrC errorMsg = iDatabase.LastErrorMessage();
       
   476         TN_DEBUG2( "CThumbnailStore::PrepareDbL() KThumbnailCreateTempInfoTable %S" , &errorMsg);
       
   477         OstTraceExt1( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_CREATETEMPTABLESL, "CThumbnailStore::CreateTempTablesL - KThumbnailCreateTempInfoTable;errorMsg=%S", errorMsg );
       
   478         }
       
   479 #endif
       
   480     
       
   481     User::LeaveIfError( err );
       
   482 
       
   483     err = iDatabase.Exec( KThumbnailCreateTempInfoDataTable );
       
   484 
       
   485 #ifdef _DEBUG
       
   486     if(err < 0)
       
   487         {
       
   488         TPtrC errorMsg = iDatabase.LastErrorMessage();
       
   489         TN_DEBUG2( "CThumbnailStore::PrepareDbL() KThumbnailCreateTempInfoDataTable %S" , &errorMsg);
       
   490         OstTraceExt1( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_CREATETEMPTABLESL, "CThumbnailStore::CreateTempTablesL - KThumbnailCreateTempInfoDataTable;errorMsg=%S", errorMsg );
       
   491         }
       
   492 #endif
       
   493     
       
   494     User::LeaveIfError( err );
       
   495     }
       
   496 
       
   497 void CThumbnailStore::RecreateDatabaseL(const TBool aDelete)
       
   498     {
       
   499     TN_DEBUG2( "CThumbnailStore::RecreateDatabaseL() drive: %d", iDrive );
       
   500     OstTrace1( TRACE_NORMAL, CTHUMBNAILSTORE_RECREATEDATABASEL, "CThumbnailStore::RecreateDatabaseL;iDrive=%d", iDrive );
       
   501     
       
   502     TVolumeInfo volumeinfo;
       
   503     User::LeaveIfError( iFs.Volume(volumeinfo, iDrive) );
       
   504     TUint id = volumeinfo.iUniqueID;
       
   505     TBuf<50> mediaid;
       
   506     mediaid.Num(id);
       
   507    
       
   508     CloseStatements();
       
   509     iDatabase.Close();
       
   510     iUnrecoverable = ETrue;
       
   511     
       
   512     TN_DEBUG1( "CThumbnailStore::RecreateDatabaseL() database closed" );
       
   513     OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_RECREATEDATABASEL, "CThumbnailStore::RecreateDatabaseL - database closed" );
       
   514     
       
   515     HBufC* databasePath = HBufC::NewLC( KMaxFileName );
       
   516     TPtr pathPtr = databasePath->Des();
       
   517     User::LeaveIfError( RFs::DriveToChar( iDrive, iDriveChar ));
       
   518     pathPtr.Append( iDriveChar );
       
   519     pathPtr.Append( KThumbnailDatabaseName );
       
   520     
       
   521     TInt err(KErrNone);
       
   522     
       
   523     // delete old if necessary
       
   524     if(aDelete)
       
   525         {
       
   526         TN_DEBUG1( "CThumbnailStore::RecreateDatabaseL() delete database" );
       
   527         OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_RECREATEDATABASEL, "CThumbnailStore::RecreateDatabaseL - delete database" );
       
   528         TInt del = iDatabase.Delete(pathPtr);     
       
   529         TN_DEBUG2( "CThumbnailStore::RecreateDatabaseL() deleted database, err: %d", del );       
       
   530         OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSTORE_RECREATEDATABASEL, "CThumbnailStore::RecreateDatabaseL" );
       
   531         }
       
   532         
       
   533     const TDesC8& config = KThumbnailSqlConfig;
       
   534 
       
   535     RSqlSecurityPolicy securityPolicy;
       
   536     CleanupClosePushL( securityPolicy );
       
   537     securityPolicy.CreateL( KThumbnailDatabaseSecurityPolicy );
       
   538 
       
   539     // create new
       
   540     TN_DEBUG1( "CThumbnailStore::RecreateDatabaseL() create new" );
       
   541     OstTrace0( TRACE_FATAL, DUP3_CTHUMBNAILSTORE_RECREATEDATABASEL, "CThumbnailStore::RecreateDatabaseL - create new" );
       
   542     TRAP(err, iDatabase.CreateL( pathPtr, securityPolicy, &config ));    
       
   543     TN_DEBUG2( "CThumbnailStore::RecreateDatabaseL() -- database created, err = %d", err );
       
   544     OstTrace1( TRACE_FATAL, DUP5_CTHUMBNAILSTORE_RECREATEDATABASEL, "CThumbnailStore::RecreateDatabaseL;err=%d", err );
       
   545     User::LeaveIfError(err);
       
   546     
       
   547     CleanupStack::PopAndDestroy( &securityPolicy );
       
   548     
       
   549     // add tables
       
   550     TRAPD(prepareErr, PrepareDbL() );
       
   551     
       
   552     TN_DEBUG2( "CThumbnailStore::RecreateDatabaseL() -- prepare tables, err = %d", prepareErr );
       
   553     OstTrace1( TRACE_FATAL, DUP6_CTHUMBNAILSTORE_RECREATEDATABASEL, "CThumbnailStore::RecreateDatabaseL - prepare tables;prepareErr=%d", prepareErr );
       
   554     
       
   555     TInt mediaidErr(KErrNone);
       
   556     
       
   557     // write media id file if doesn't exist
       
   558     if(!BaflUtils::FileExists( iFs, mediaid ))
       
   559         {
       
   560         RFile64 file;
       
   561         mediaidErr = file.Create(iFs, mediaid, EFileShareReadersOrWriters );
       
   562         file.Close();
       
   563         
       
   564         TN_DEBUG2( "CThumbnailStore::RecreateDatabaseL() -- mediaID file created, err = %d", mediaidErr );
       
   565         OstTrace1( TRACE_FATAL, DUP7_CTHUMBNAILSTORE_RECREATEDATABASEL, "CThumbnailStore::RecreateDatabaseL;mediaidErr=%d", mediaidErr );
       
   566         }
       
   567     
       
   568     // delete db if not fully complete
       
   569     if (prepareErr < 0 || mediaidErr < 0)
       
   570         {
       
   571         CloseStatements();
       
   572         iDatabase.Close();
       
   573         TN_DEBUG1( "CThumbnailStore::RecreateDatabaseL() delete database" );
       
   574         OstTrace0( TRACE_FATAL, DUP8_CTHUMBNAILSTORE_RECREATEDATABASEL, "CThumbnailStore::RecreateDatabaseL - delete database" );
       
   575         TInt del = iDatabase.Delete(pathPtr);     
       
   576         TN_DEBUG2( "CThumbnailStore::RecreateDatabaseL() deleted database, err: %d", del );
       
   577         OstTrace1( TRACE_FATAL, DUP9_CTHUMBNAILSTORE_RECREATEDATABASEL, "CThumbnailStore::RecreateDatabaseL - delete database;del=%d", del );
       
   578         }
       
   579     
       
   580     User::LeaveIfError( prepareErr );
       
   581     User::LeaveIfError( mediaidErr );
       
   582     
       
   583     CleanupStack::PopAndDestroy( databasePath );
       
   584     }
       
   585 
       
   586 TInt CThumbnailStore::CheckRowIDs()
       
   587     {
       
   588     TN_DEBUG1( "CThumbnailStore::CheckRowIDs()");
       
   589     OstTrace0( TRACE_FATAL, CTHUMBNAILSTORE_CHECKROWIDS, "CThumbnailStore::CheckRowIDs" );
       
   590     
       
   591     RSqlStatement stmt;
       
   592     TInt column = 0;   
       
   593     TInt rowStatus = 0;
       
   594     TInt64 inforows = -1;
       
   595     TInt64 datarows = -1;
       
   596     
       
   597     TInt ret = stmt.Prepare( iDatabase, KGetInfoRowID );
       
   598     if(ret < 0)
       
   599         {
       
   600         stmt.Close();
       
   601         TN_DEBUG1( "CThumbnailStore::CheckRowIDs() KGetInfoRowID failed %d");
       
   602         OstTrace1( TRACE_FATAL, DUP1_CTHUMBNAILSTORE_CHECKROWIDS, "CThumbnailStore::CheckRowIDs KGetInfoRowID failed;ret=%d", ret );
       
   603         return KErrNotSupported;
       
   604         }
       
   605     rowStatus = stmt.Next();
       
   606                 
       
   607     if ( rowStatus == KSqlAtRow)    
       
   608         {        
       
   609         inforows = stmt.ColumnInt64( column );  
       
   610         }
       
   611                 
       
   612     stmt.Close();
       
   613     
       
   614     if(rowStatus < 0)
       
   615         {
       
   616 #ifdef _DEBUG
       
   617         TPtrC errorMsg2 = iDatabase.LastErrorMessage();
       
   618         TN_DEBUG2( "RThumbnailTransaction::ResetThumbnailIDs() lastError %S, ret = %d" , &errorMsg2);
       
   619         OstTraceExt1( TRACE_FATAL, DUP2_CTHUMBNAILSTORE_CHECKROWIDS, "CThumbnailStore::CheckRowIDs - lastError;errorMsg2=%S", errorMsg2 );
       
   620 #endif
       
   621         return KErrNotSupported;
       
   622         }
       
   623               
       
   624     ret = stmt.Prepare( iDatabase, KGetDataRowID );
       
   625     if(ret < 0)
       
   626         {
       
   627         stmt.Close();
       
   628         TN_DEBUG1( "CThumbnailStore::CheckRowIDs() KGetDataRowID failed");
       
   629         OstTrace0( TRACE_FATAL, DUP3_CTHUMBNAILSTORE_CHECKROWIDS, "CThumbnailStore::CheckRowIDs - KGetDataRowID failed" );
       
   630         return KErrNotSupported;
       
   631         }
       
   632     rowStatus = stmt.Next();
       
   633                        
       
   634     if ( rowStatus == KSqlAtRow)    
       
   635         {        
       
   636         datarows = stmt.ColumnInt64( column );  
       
   637         }
       
   638             
       
   639     stmt.Close();
       
   640     
       
   641     if( rowStatus < 0)
       
   642         {
       
   643 #ifdef _DEBUG
       
   644         TPtrC errorMsg2 = iDatabase.LastErrorMessage();
       
   645         TN_DEBUG2( "RThumbnailTransaction::ResetThumbnailIDs() lastError %S, ret = %d" , &errorMsg2);
       
   646         OstTraceExt1( TRACE_FATAL, DUP4_CTHUMBNAILSTORE_CHECKROWIDS, "CThumbnailStore::CheckRowIDs - lastError;errorMsg2=%S", errorMsg2 );
       
   647 #endif
       
   648         return KErrNotSupported;
       
   649         }
       
   650     
       
   651     TN_DEBUG2( "CThumbnailStore::CheckRowIDsL() - inforows %Ld", inforows );
       
   652     OstTraceExt1( TRACE_FATAL, DUP5_CTHUMBNAILSTORE_CHECKROWIDS, "CThumbnailStore::CheckRowIDs;inforows=%g", inforows );
       
   653     TN_DEBUG2( "CThumbnailStore::CheckRowIDsL() - datarows %Ld", datarows );
       
   654     OstTraceExt1( TRACE_FATAL, DUP6_CTHUMBNAILSTORE_CHECKROWIDS, "CThumbnailStore::CheckRowIDs;datarows=%Ld", datarows );
       
   655             
       
   656     if( inforows != datarows )
       
   657         {
       
   658         TN_DEBUG1( "CThumbnailStore::CheckRowIDsL() - tables out of sync" );
       
   659         return KErrNotSupported;
       
   660         }  
       
   661     else
       
   662         {
       
   663         return KErrNone;
       
   664         }
       
   665     }
       
   666 
       
   667 // -----------------------------------------------------------------------------
       
   668 // CheckVersion()
       
   669 // -----------------------------------------------------------------------------
       
   670 //
       
   671 TInt CThumbnailStore::CheckVersion()
       
   672     {
       
   673     TN_DEBUG1( "CThumbnailStore::CheckVersion()" );
       
   674     OstTrace0( TRACE_FATAL, CTHUMBNAILSTORE_CHECKVERSION, "CThumbnailStore::CheckVersion" );
       
   675     RSqlStatement stmt;
       
   676          
       
   677     TInt rowStatus = 0;
       
   678     TInt column = 0;
       
   679     TInt minor = 0;
       
   680     TInt major = 0;
       
   681 
       
   682     TInt ret = stmt.Prepare( iDatabase, KThumbnailSelectFromVersion );
       
   683     if(ret < 0 )
       
   684        {  
       
   685        stmt.Close();
       
   686        TN_DEBUG1( "CThumbnailStore::CheckVersion() unknown version" );
       
   687        OstTrace0( TRACE_FATAL, DUP1_CTHUMBNAILSTORE_CHECKVERSION, "CThumbnailStore::CheckVersion - unknown version" );
       
   688        return KErrNotSupported;
       
   689        }
       
   690               
       
   691     rowStatus = stmt.Next();
       
   692     
       
   693     if ( rowStatus == KSqlAtRow)    
       
   694        {        
       
   695        major = stmt.ColumnInt( column++);
       
   696        minor = stmt.ColumnInt( column++);
       
   697        }
       
   698     
       
   699     stmt.Close();
       
   700     
       
   701     if( rowStatus < 0 )
       
   702         {
       
   703 #ifdef _DEBUG
       
   704          TPtrC errorMsg = iDatabase.LastErrorMessage();
       
   705         TN_DEBUG2( "RThumbnailTransaction::CheckVersion() lastError %S, ret = %d" , &errorMsg);
       
   706         OstTrace0( TRACE_FATAL, DUP2_CTHUMBNAILSTORE_CHECKVERSION, "CThumbnailStore::CheckVersion" );
       
   707 #endif
       
   708         return ret;
       
   709         }
       
   710     
       
   711     if(major == KMajor && minor == KMinor )
       
   712       {
       
   713       return KErrNone;  
       
   714       }
       
   715     else
       
   716       {
       
   717       TN_DEBUG1( "CThumbnailStore::CheckVersion() - wrong DB version" );
       
   718       OstTrace0( TRACE_FATAL, DUP3_CTHUMBNAILSTORE_CHECKVERSION, "CThumbnailStore::CheckVersion" );
       
   719       return KErrNotSupported;  
       
   720       }
       
   721     }
       
   722 
       
   723 // -----------------------------------------------------------------------------
       
   724 // CheckImei()
       
   725 // -----------------------------------------------------------------------------
       
   726 //
       
   727 TInt CThumbnailStore::CheckImei()
       
   728     {
       
   729     TN_DEBUG1( "CThumbnailStore::CheckImei()" );
       
   730     OstTrace0( TRACE_FATAL, CTHUMBNAILSTORE_CHECKIMEI, "CThumbnailStore::CheckImei" );
       
   731     RSqlStatement stmt;
       
   732          
       
   733     TInt rowStatus = 0;
       
   734     TInt column = 0;
       
   735     TBuf<KImeiBufferSize> imei;
       
   736       
       
   737     TInt ret = stmt.Prepare( iDatabase, KThumbnailSelectFromVersion );
       
   738     if(ret < 0 )
       
   739        {  
       
   740         stmt.Close();
       
   741        TN_DEBUG1( "CThumbnailStore::CheckImei() failed" );
       
   742        OstTrace0( TRACE_FATAL, DUP1_CTHUMBNAILSTORE_CHECKIMEI, "CThumbnailStore::CheckImei - failed" );
       
   743        return KErrNotSupported;
       
   744        }
       
   745               
       
   746     rowStatus = stmt.Next();
       
   747     
       
   748     if ( rowStatus == KSqlAtRow)    
       
   749        {        
       
   750        column = 2; // imei column
       
   751        stmt.ColumnText( column, imei);  
       
   752        }
       
   753     
       
   754     stmt.Close(); 
       
   755     
       
   756     if( rowStatus < 0 )
       
   757         {
       
   758 #ifdef _DEBUG
       
   759          TPtrC errorMsg = iDatabase.LastErrorMessage();
       
   760         TN_DEBUG2( "RThumbnailTransaction::CheckImei() lastError %S, ret = %d" , &errorMsg);
       
   761         OstTraceExt1( TRACE_FATAL, DUP2_CTHUMBNAILSTORE_CHECKIMEI, "CThumbnailStore::CheckImei - lastError;errorMsg=%S", errorMsg );
       
   762 #endif
       
   763         return ret;
       
   764         }
       
   765     
       
   766     if( imei == iImei )
       
   767       {
       
   768       return KErrNone;  
       
   769       }
       
   770     else
       
   771       {
       
   772       TN_DEBUG1( "CThumbnailStore::CheckImei() mismatch" );
       
   773       OstTrace0( TRACE_FATAL, DUP3_CTHUMBNAILSTORE_CHECKIMEI, "CThumbnailStore::CheckImei - mismatch" );
       
   774       return KErrNotSupported;  
       
   775       }
       
   776     }
       
   777 
       
   778 // -----------------------------------------------------------------------------
       
   779 // CheckMediaID()
       
   780 // -----------------------------------------------------------------------------
       
   781 //
       
   782 TInt CThumbnailStore::CheckMediaIDL()
       
   783     {
       
   784     TN_DEBUG1( "CThumbnailStore::CheckMediaIDL()" );
       
   785     OstTrace0( TRACE_FATAL, CTHUMBNAILSTORE_CHECKMEDIAIDL, "CThumbnailStore::CheckMediaIDL" );
       
   786     
       
   787     TVolumeInfo volumeinfo;
       
   788     User::LeaveIfError( iFs.Volume(volumeinfo, iDrive) );
       
   789     TUint id = volumeinfo.iUniqueID;
       
   790     TBuf<50> mediaid;
       
   791     mediaid.Num(id);
       
   792     
       
   793     if(!BaflUtils::FileExists( iFs, mediaid ))
       
   794        {
       
   795        RFile64 file;
       
   796        TInt err = file.Create(iFs, mediaid, EFileShareReadersOrWriters );
       
   797        file.Close();
       
   798        TN_DEBUG2( "CThumbnailStore::CheckMediaIDL() -- mediaID file created, err = %d", err );
       
   799        OstTrace1( TRACE_FATAL, DUP1_CTHUMBNAILSTORE_CHECKMEDIAIDL, "CThumbnailStore::CheckMediaIDL - mediaID file created;err=%d", err );
       
   800        
       
   801        return KErrNotSupported;
       
   802        } 
       
   803 
       
   804     return KErrNone;  
       
   805     }
       
   806      
       
   807 // ----------------------------------------------------------------------------
       
   808 // AddVersionAndImeiL()
       
   809 // -----------------------------------------------------------------------------
       
   810 //
       
   811 void CThumbnailStore::AddVersionAndImeiL()
       
   812     {
       
   813     TN_DEBUG1( "CThumbnailStore::AddVersionAndImei()" );
       
   814     OstTrace0( TRACE_FATAL, CTHUMBNAILSTORE_ADDVERSIONANDIMEIL, "CThumbnailStore::AddVersionAndImeiL" );
       
   815     RSqlStatement stmt;
       
   816     CleanupClosePushL( stmt );
       
   817             
       
   818     TInt paramIndex = 0;
       
   819             
       
   820     User::LeaveIfError( stmt.Prepare( iDatabase, KThumbnailInsertToVersion ));
       
   821     paramIndex = stmt.ParameterIndex( KThumbnailSqlParamImei );
       
   822     User::LeaveIfError( paramIndex );
       
   823     User::LeaveIfError( stmt.BindText( paramIndex, iImei ));  
       
   824     
       
   825     paramIndex = stmt.ParameterIndex( KThumbnailSqlParamMinor );
       
   826     User::LeaveIfError( paramIndex );
       
   827     User::LeaveIfError( stmt.BindInt( paramIndex, KMinor )); 
       
   828     
       
   829     paramIndex = stmt.ParameterIndex( KThumbnailSqlParamMajor );
       
   830     User::LeaveIfError( paramIndex );
       
   831     User::LeaveIfError( stmt.BindInt( paramIndex, KMajor )); 
       
   832     
       
   833     User::LeaveIfError( stmt.Exec());
       
   834     CleanupStack::PopAndDestroy( &stmt );  
       
   835     }
       
   836 
       
   837 // -----------------------------------------------------------------------------
       
   838 // UpdateImeiL()
       
   839 // -----------------------------------------------------------------------------
       
   840 //
       
   841 void CThumbnailStore::UpdateImeiL()
       
   842     {
       
   843     TN_DEBUG1( "CThumbnailStore::UpdateImeiL()" );
       
   844     OstTrace0( TRACE_FATAL, CTHUMBNAILSTORE_UPDATEIMEIL, "CThumbnailStore::UpdateImeiL" );
       
   845     RSqlStatement stmt;
       
   846     CleanupClosePushL( stmt );
       
   847             
       
   848     User::LeaveIfError( stmt.Prepare( iDatabase, KThumbnailUpdateIMEI ) );
       
   849     
       
   850     TInt paramIndex = stmt.ParameterIndex( KThumbnailSqlParamImei );
       
   851     User::LeaveIfError( paramIndex );
       
   852     User::LeaveIfError( stmt.BindText( paramIndex, iImei ));
       
   853     
       
   854     TInt err = stmt.Exec();
       
   855     
       
   856     if(err < 0)
       
   857         {
       
   858 #ifdef _DEBUG
       
   859         TPtrC errorMsg = iDatabase.LastErrorMessage();
       
   860         TN_DEBUG2( "RThumbnailTransaction::UpdateImeiL() lastError %S" , &errorMsg);
       
   861         OstTraceExt1( TRACE_FATAL, DUP1_CTHUMBNAILSTORE_UPDATEIMEIL, "CThumbnailStore::UpdateImeiL - lastError;errorMsg=%S", errorMsg );
       
   862 #endif
       
   863         User::Leave(err);
       
   864         }
       
   865     
       
   866     CleanupStack::PopAndDestroy( &stmt );
       
   867     }
       
   868 
       
   869 // ---------------------------------------------------------------------------
       
   870 // CThumbnailStore::PrepareStatementsL()
       
   871 // ---------------------------------------------------------------------------
       
   872 //
       
   873 void CThumbnailStore::PrepareStatementsL()
       
   874     {
       
   875     TN_DEBUG1("CThumbnailStore::PrepareStatementsL()");
       
   876     OstTrace0( TRACE_FATAL, CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL" );
       
   877     
       
   878     TInt err = KErrNone;  
       
   879 #ifdef _DEBUG
       
   880     TFileName msg;
       
   881 #endif
       
   882     
       
   883     err = iStmt_KThumbnailSelectInfoByPath.Prepare( iDatabase, KThumbnailSelectInfoByPath );
       
   884 #ifdef _DEBUG
       
   885     msg.Append( iDatabase.LastErrorMessage() );
       
   886     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSelectInfoByPath %S" , &msg );
       
   887     OstTraceExt1( TRACE_FATAL, DUP1_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSelectInfoByPath;msg=%S", msg );
       
   888     msg.Zero();
       
   889 #endif
       
   890     User::LeaveIfError( err );
       
   891     
       
   892     err = iStmt_KThumbnailSelectTempInfoByPath.Prepare( iDatabase, KThumbnailSelectTempInfoByPath );
       
   893 #ifdef _DEBUG
       
   894     msg.Append( iDatabase.LastErrorMessage() );
       
   895     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSelectTempInfoByPath %S" , &msg );
       
   896     OstTraceExt1( TRACE_FATAL, DUP2_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSelectTempInfoByPath;msg=%S", msg );
       
   897     msg.Zero();
       
   898 #endif
       
   899     User::LeaveIfError( err );
       
   900 
       
   901     err = iStmt_KThumbnailInsertTempThumbnailInfo.Prepare( iDatabase, KThumbnailInsertTempThumbnailInfo );
       
   902 #ifdef _DEBUG
       
   903     msg.Append( iDatabase.LastErrorMessage() );
       
   904     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailInsertTempThumbnailInfo %S" , &msg );
       
   905     OstTraceExt1( TRACE_FATAL, DUP3_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailInsertTempThumbnailInfo ;msg=%S", msg );
       
   906     msg.Zero();
       
   907 #endif
       
   908     User::LeaveIfError( err );
       
   909     
       
   910     err = iStmt_KThumbnailInsertTempThumbnailInfoData.Prepare( iDatabase, KThumbnailInsertTempThumbnailInfoData );
       
   911 #ifdef _DEBUG
       
   912     msg.Append( iDatabase.LastErrorMessage() );
       
   913     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailInsertTempThumbnailInfoData %S" , &msg );
       
   914     OstTraceExt1( TRACE_FATAL, DUP4_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailInsertTempThumbnailInfoData;msg=%S", msg );
       
   915     msg.Zero();
       
   916 #endif
       
   917     User::LeaveIfError( err );
       
   918     
       
   919     err = iStmt_KThumbnailSelectModifiedByPath.Prepare( iDatabase, KThumbnailSelectModifiedByPath );
       
   920 #ifdef _DEBUG
       
   921     msg.Append( iDatabase.LastErrorMessage() );
       
   922     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSelectModifiedByPath %S" , &msg );
       
   923     OstTraceExt1( TRACE_FATAL, DUP5_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL;msg=%S", msg );
       
   924     msg.Zero();
       
   925 #endif
       
   926     User::LeaveIfError( err );
       
   927     
       
   928     err = iStmt_KThumbnailSelectTempModifiedByPath.Prepare( iDatabase, KThumbnailSelectTempModifiedByPath );
       
   929 #ifdef _DEBUG
       
   930     msg.Append( iDatabase.LastErrorMessage() );
       
   931     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSelectTempModifiedByPath %S" , &msg );
       
   932     OstTraceExt1( TRACE_FATAL, DUP6_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSelectTempModifiedByPath;msg=%S", msg );
       
   933     msg.Zero();
       
   934 #endif
       
   935     User::LeaveIfError( err );
       
   936     
       
   937     err = iStmt_KThumbnailFindDuplicate.Prepare( iDatabase, KThumbnailFindDuplicate );
       
   938 #ifdef _DEBUG
       
   939     msg.Append( iDatabase.LastErrorMessage() );
       
   940     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailFindDuplicate %S" , &msg );
       
   941     OstTraceExt1( TRACE_FATAL, DUP7_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailFindDuplicate;msg=%S", msg );
       
   942     msg.Zero();
       
   943 #endif
       
   944     User::LeaveIfError( err );
       
   945     
       
   946     err = iStmt_KThumbnailTempFindDuplicate.Prepare( iDatabase, KThumbnailTempFindDuplicate );
       
   947 #ifdef _DEBUG
       
   948     msg.Append( iDatabase.LastErrorMessage() );
       
   949     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailTempFindDuplicate %S" , &msg );
       
   950     OstTraceExt1( TRACE_FATAL, DUP8_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailTempFindDuplicate;msg=%S", msg );
       
   951     msg.Zero();
       
   952 #endif
       
   953     User::LeaveIfError( err );
       
   954     
       
   955     err = iStmt_KThumbnailSqlFindDeleted.Prepare( iDatabase, KThumbnailSqlFindDeleted );
       
   956 #ifdef _DEBUG
       
   957     msg.Append( iDatabase.LastErrorMessage() );
       
   958     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSqlFindDeleted %S" , &msg );
       
   959     OstTraceExt1( TRACE_FATAL, DUP9_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSqlFindDeleted;msg=%S", msg );
       
   960     msg.Zero();
       
   961 #endif
       
   962     User::LeaveIfError( err );
       
   963     
       
   964     err = iStmt_KThumbnailSelectSizeByPath.Prepare( iDatabase, KThumbnailSelectSizeByPath );
       
   965 #ifdef _DEBUG
       
   966     msg.Append( iDatabase.LastErrorMessage() );
       
   967     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSelectSizeByPath %S" , &msg );
       
   968     OstTraceExt1( TRACE_FATAL, DUP10_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSelectSizeByPath;msg=%S", msg );
       
   969     msg.Zero();
       
   970 #endif
       
   971     User::LeaveIfError( err );
       
   972     
       
   973     err = iStmt_KThumbnailSelectTempSizeByPath.Prepare( iDatabase, KThumbnailSelectTempSizeByPath );
       
   974 #ifdef _DEBUG
       
   975     msg.Append( iDatabase.LastErrorMessage() );
       
   976     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSelectTempSizeByPath %S" , &msg );
       
   977     OstTraceExt1( TRACE_FATAL, DUP11_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSelectTempSizeByPath;msg=%S", msg );
       
   978     msg.Zero();
       
   979 #endif
       
   980     User::LeaveIfError( err );
       
   981     
       
   982     err = iStmt_KThumbnailSqlSelectRowIDInfoByPath.Prepare( iDatabase, KThumbnailSqlSelectRowIDInfoByPath );
       
   983 #ifdef _DEBUG
       
   984     msg.Append( iDatabase.LastErrorMessage() );
       
   985     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSqlSelectRowIDInfoByPath %S" , &msg );
       
   986     OstTraceExt1( TRACE_FATAL, DUP12_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSqlSelectRowIDInfoByPath;msg=%S", msg );
       
   987     msg.Zero();
       
   988 #endif
       
   989     User::LeaveIfError( err );
       
   990     
       
   991     err = iStmt_KThumbnailSqlDeleteInfoByPath.Prepare( iDatabase, KThumbnailSqlDeleteInfoByPath );
       
   992 #ifdef _DEBUG
       
   993     msg.Append( iDatabase.LastErrorMessage() );
       
   994     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSqlDeleteInfoByPath %S" , &msg );
       
   995     OstTraceExt1( TRACE_FATAL, DUP13_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSqlDeleteInfoByPath;msg=%S", msg );
       
   996     msg.Zero();
       
   997 #endif
       
   998     User::LeaveIfError( err );
       
   999 
       
  1000     err = iStmt_KThumbnailSqlDeleteInfoDataByPath.Prepare( iDatabase, KThumbnailSqlDeleteInfoDataByPath );
       
  1001 #ifdef _DEBUG
       
  1002     msg.Append( iDatabase.LastErrorMessage() );
       
  1003     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSqlDeleteInfoDataByPath %S" , &msg );
       
  1004     OstTraceExt1( TRACE_FATAL, DUP14_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSqlDeleteInfoDataByPath;msg=%S", msg );
       
  1005     msg.Zero();
       
  1006 #endif
       
  1007     User::LeaveIfError( err );
       
  1008 
       
  1009     err = iStmt_KTempThumbnailSqlSelectRowIDInfoByPath.Prepare( iDatabase, KTempThumbnailSqlSelectRowIDInfoByPath );
       
  1010 #ifdef _DEBUG
       
  1011     msg.Append( iDatabase.LastErrorMessage() );
       
  1012     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KTempThumbnailSqlSelectRowIDInfoByPath %S" , &msg );
       
  1013     OstTraceExt1( TRACE_FATAL, DUP15_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KTempThumbnailSqlSelectRowIDInfoByPath;msg=%S", msg );
       
  1014     msg.Zero();
       
  1015 #endif
       
  1016     User::LeaveIfError( err );
       
  1017 
       
  1018     err = iStmt_KTempThumbnailSqlDeleteInfoByPath.Prepare( iDatabase, KTempThumbnailSqlDeleteInfoByPath );
       
  1019 #ifdef _DEBUG
       
  1020     msg.Append( iDatabase.LastErrorMessage() );
       
  1021     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KTempThumbnailSqlDeleteInfoByPath %S" , &msg );
       
  1022     OstTraceExt1( TRACE_FATAL, DUP16_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KTempThumbnailSqlDeleteInfoByPath;msg=%S", msg );
       
  1023     msg.Zero();
       
  1024 #endif
       
  1025     User::LeaveIfError( err );
       
  1026 
       
  1027     err = iStmt_KTempThumbnailSqlDeleteInfoDataByPath.Prepare( iDatabase, KTempThumbnailSqlDeleteInfoDataByPath );
       
  1028 #ifdef _DEBUG
       
  1029     msg.Append( iDatabase.LastErrorMessage() );
       
  1030     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KTempThumbnailSqlDeleteInfoDataByPath %S" , &msg );
       
  1031     OstTraceExt1( TRACE_FATAL, DUP17_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KTempThumbnailSqlDeleteInfoDataByPath;msg=%S", msg );
       
  1032     msg.Zero();
       
  1033 #endif
       
  1034     User::LeaveIfError( err );
       
  1035 
       
  1036     err = iStmt_KThumbnailSqlInsertDeleted.Prepare( iDatabase, KThumbnailSqlInsertDeleted );
       
  1037 #ifdef _DEBUG
       
  1038     msg.Append( iDatabase.LastErrorMessage() );
       
  1039     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSqlInsertDeleted %S" , &msg );
       
  1040     OstTraceExt1( TRACE_FATAL, DUP18_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSqlInsertDeleted;msg=%S", msg );
       
  1041     msg.Zero();
       
  1042 #endif
       
  1043     User::LeaveIfError( err );
       
  1044     
       
  1045     err = iStmt_KThumbnailSqlSelectMarked.Prepare( iDatabase, KThumbnailSqlSelectMarked );
       
  1046 #ifdef _DEBUG
       
  1047     msg.Append( iDatabase.LastErrorMessage() );
       
  1048     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSqlSelectMarked %S" , &msg );
       
  1049     OstTraceExt1( TRACE_NORMAL, DUP19_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSqlSelectMarked;msg=%S", msg );
       
  1050     msg.Zero();
       
  1051 #endif
       
  1052     User::LeaveIfError( err );
       
  1053 
       
  1054     err = iStmt_KThumbnailSqlDeleteInfoByRowID.Prepare( iDatabase, KThumbnailSqlDeleteInfoByRowID );
       
  1055 #ifdef _DEBUG
       
  1056     msg.Append( iDatabase.LastErrorMessage() );
       
  1057     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSqlDeleteInfoByRowID %S" , &msg );
       
  1058     OstTraceExt1( TRACE_NORMAL, DUP20_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSqlDeleteInfoByRowID;msg=%S", msg );
       
  1059     msg.Zero();
       
  1060 #endif
       
  1061     User::LeaveIfError( err );
       
  1062 
       
  1063     err = iStmt_KThumbnailSqlDeleteInfoDataByRowID.Prepare( iDatabase, KThumbnailSqlDeleteInfoDataByRowID );
       
  1064 #ifdef _DEBUG
       
  1065     msg.Append( iDatabase.LastErrorMessage() );
       
  1066     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSqlDeleteInfoDataByRowID %S" , &msg );
       
  1067     OstTraceExt1( TRACE_NORMAL, DUP21_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSqlDeleteInfoDataByRowID;msg=%S", msg );
       
  1068     msg.Zero();
       
  1069 #endif
       
  1070     User::LeaveIfError( err );
       
  1071     
       
  1072     err = iStmt_KThumbnailSelectAllPaths.Prepare( iDatabase, KThumbnailSelectAllPaths );
       
  1073 #ifdef _DEBUG
       
  1074     msg.Append( iDatabase.LastErrorMessage() );
       
  1075     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailSelectAllPaths %S" , &msg );
       
  1076     OstTraceExt1( TRACE_NORMAL, DUP22_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailSelectAllPaths;msg=%S", msg );
       
  1077     msg.Zero();
       
  1078 #endif
       
  1079     User::LeaveIfError( err );
       
  1080     
       
  1081     err = iStmt_KThumbnailRename.Prepare( iDatabase, KThumbnailRename );
       
  1082 #ifdef _DEBUG
       
  1083     msg.Append( iDatabase.LastErrorMessage() );
       
  1084     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailRename %S" , &msg );
       
  1085     OstTraceExt1( TRACE_NORMAL, DUP23_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailRename;msg=%S", msg );
       
  1086     msg.Zero();
       
  1087 #endif
       
  1088     User::LeaveIfError( err );
       
  1089     
       
  1090     err = iStmt_KThumbnailTempRename.Prepare( iDatabase, KThumbnailTempRename );
       
  1091 #ifdef _DEBUG
       
  1092     msg.Append( iDatabase.LastErrorMessage() );
       
  1093     TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailTempRename %S" , &msg );
       
  1094     OstTraceExt1( TRACE_NORMAL, DUP24_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - KThumbnailTempRename;msg=%S", msg );
       
  1095     msg.Zero();
       
  1096 #endif
       
  1097     User::LeaveIfError( err );
       
  1098     
       
  1099     TN_DEBUG1("CThumbnailStore::PrepareStatementsL() end");
       
  1100     OstTrace0( TRACE_NORMAL, DUP25_CTHUMBNAILSTORE_PREPARESTATEMENTSL, "CThumbnailStore::PrepareStatementsL - end" );
       
  1101     }
       
  1102 
       
  1103 // ---------------------------------------------------------------------------
       
  1104 // CThumbnailStore::ResetStatement()
       
  1105 // ---------------------------------------------------------------------------
       
  1106 //
       
  1107 void CThumbnailStore::ResetStatement( TAny* aStmt )
       
  1108     {
       
  1109     // called by CleanupStack::PopAndDestroy()
       
  1110     // just reset so that there's no need to prepare again
       
  1111     ((RSqlStatement*)aStmt)->Reset();
       
  1112     }
       
  1113 
       
  1114 // ---------------------------------------------------------------------------
       
  1115 // CThumbnailStore::CloseStatements()
       
  1116 // ---------------------------------------------------------------------------
       
  1117 //
       
  1118 void CThumbnailStore::CloseStatements()
       
  1119     {
       
  1120     TN_DEBUG1("CThumbnailStore::CloseStatements()");
       
  1121     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_CLOSESTATEMENTS, "CThumbnailStore::CloseStatements" );
       
  1122     
       
  1123     iStmt_KThumbnailSelectInfoByPath.Close();
       
  1124     iStmt_KThumbnailSelectTempInfoByPath.Close();   
       
  1125     iStmt_KThumbnailInsertTempThumbnailInfo.Close();
       
  1126     iStmt_KThumbnailInsertTempThumbnailInfoData.Close();  
       
  1127     iStmt_KThumbnailSelectModifiedByPath.Close();
       
  1128     iStmt_KThumbnailSelectTempModifiedByPath.Close();
       
  1129     iStmt_KThumbnailFindDuplicate.Close();
       
  1130     iStmt_KThumbnailTempFindDuplicate.Close();
       
  1131     iStmt_KThumbnailSqlFindDeleted.Close();
       
  1132     iStmt_KThumbnailSelectSizeByPath.Close();
       
  1133     iStmt_KThumbnailSelectTempSizeByPath.Close();
       
  1134     iStmt_KThumbnailSqlSelectRowIDInfoByPath.Close();
       
  1135     iStmt_KThumbnailSqlDeleteInfoByPath.Close();
       
  1136     iStmt_KThumbnailSqlDeleteInfoDataByPath.Close();
       
  1137     iStmt_KTempThumbnailSqlSelectRowIDInfoByPath.Close();
       
  1138     iStmt_KTempThumbnailSqlDeleteInfoByPath.Close();
       
  1139     iStmt_KTempThumbnailSqlDeleteInfoDataByPath.Close();
       
  1140     iStmt_KThumbnailSqlInsertDeleted.Close();
       
  1141     iStmt_KThumbnailSqlSelectMarked.Close();
       
  1142     iStmt_KThumbnailSqlDeleteInfoByRowID.Close();
       
  1143     iStmt_KThumbnailSqlDeleteInfoDataByRowID.Close();
       
  1144     iStmt_KThumbnailSelectAllPaths.Close();
       
  1145     iStmt_KThumbnailRename.Close();
       
  1146     iStmt_KThumbnailTempRename.Close();
       
  1147     
       
  1148     TN_DEBUG1("CThumbnailStore::CloseStatements() end");
       
  1149     OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_CLOSESTATEMENTS, "CThumbnailStore::CloseStatements - end" );
       
  1150     }
       
  1151 
       
  1152 // ---------------------------------------------------------------------------
       
  1153 // CThumbnailStore::StoreThumbnailL()
       
  1154 // Stores thumbnail image.
       
  1155 // ---------------------------------------------------------------------------
       
  1156 //
       
  1157 void CThumbnailStore::StoreThumbnailL( const TDesC& aPath, const TDes8& aData,
       
  1158     const TSize& aSize, const TSize& aOriginalSize, const TThumbnailFormat& aFormat, TInt aFlags, 
       
  1159 	const TThumbnailSize& aThumbnailSize, const TInt64 aModified, const TBool aThumbFromPath )
       
  1160     {
       
  1161     TN_DEBUG1( "CThumbnailStore::StoreThumbnailL( private ) in" );
       
  1162     
       
  1163     if(iReadOnly)
       
  1164         {
       
  1165         TN_DEBUG1( "CThumbnailStore::StoreThumbnailL() read only, skip..." );
       
  1166         return;
       
  1167         }
       
  1168 
       
  1169 #ifdef _DEBUG
       
  1170     TTime aStart, aStop;
       
  1171     aStart.UniversalTime();
       
  1172 #endif
       
  1173 
       
  1174     //Encapsulate insert to Transaction
       
  1175     RThumbnailTransaction transaction( iDatabase );
       
  1176     CleanupClosePushL( transaction );
       
  1177     transaction.BeginL();
       
  1178     
       
  1179     // Insert into TempThumbnailInfo
       
  1180     RSqlStatement* stmt = NULL;
       
  1181     stmt = &iStmt_KThumbnailInsertTempThumbnailInfo;
       
  1182     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  1183     
       
  1184     TInt paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  1185     User::LeaveIfError( paramIndex );
       
  1186     User::LeaveIfError( stmt->BindText( paramIndex, aPath ));
       
  1187 
       
  1188     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamWidth );
       
  1189     User::LeaveIfError( paramIndex );
       
  1190     User::LeaveIfError( stmt->BindInt( paramIndex, aSize.iWidth ));
       
  1191 
       
  1192     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamHeight );
       
  1193     User::LeaveIfError( paramIndex );
       
  1194     User::LeaveIfError( stmt->BindInt( paramIndex, aSize.iHeight ));
       
  1195 
       
  1196     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamOriginalWidth );
       
  1197     User::LeaveIfError( paramIndex );
       
  1198     User::LeaveIfError( stmt->BindInt( paramIndex, aOriginalSize.iWidth ));
       
  1199 
       
  1200     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamOriginalHeight );
       
  1201     User::LeaveIfError( paramIndex );
       
  1202     User::LeaveIfError( stmt->BindInt( paramIndex, aOriginalSize.iHeight ));
       
  1203 
       
  1204     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamFormat );
       
  1205     User::LeaveIfError( paramIndex );
       
  1206     User::LeaveIfError( stmt->BindInt( paramIndex, aFormat ));
       
  1207 
       
  1208     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamFlags );
       
  1209     User::LeaveIfError( paramIndex );
       
  1210     User::LeaveIfError( stmt->BindInt( paramIndex, aFlags ));
       
  1211 
       
  1212     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamSize );
       
  1213     User::LeaveIfError( paramIndex );
       
  1214     User::LeaveIfError( stmt->BindInt( paramIndex, aThumbnailSize ));
       
  1215     
       
  1216     // orientation temporarily to 0
       
  1217     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamOrientation );
       
  1218     User::LeaveIfError( paramIndex );
       
  1219     User::LeaveIfError( stmt->BindInt( paramIndex, 0 ));
       
  1220     
       
  1221     // thumb from associated path
       
  1222     TInt fromPath = aThumbFromPath;
       
  1223     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamThumbFromPath );
       
  1224     User::LeaveIfError( paramIndex );
       
  1225     User::LeaveIfError( stmt->BindInt( paramIndex, fromPath ));
       
  1226     
       
  1227     // try getting modification time from file
       
  1228     TTime timeStamp;
       
  1229     
       
  1230     TN_DEBUG2( "CThumbnailStore::StoreThumbnailL( private ) timeStamp aModified %Ld", aModified );
       
  1231     OstTraceExt1( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - timeStamp aModified;aModified=%Ld", aModified );
       
  1232         
       
  1233     if( aModified )
       
  1234         {
       
  1235         timeStamp = aModified;
       
  1236         }
       
  1237     else
       
  1238         {
       
  1239         TInt timeErr = KErrNone;
       
  1240     
       
  1241         if (aPath.Length())
       
  1242             {
       
  1243             // need to add drive letter
       
  1244             TFileName path;
       
  1245             path.Append(iDriveChar);
       
  1246             path.Append(KDrv);
       
  1247             path.Append(aPath);
       
  1248         
       
  1249             timeErr = iFs.Modified(path, timeStamp);
       
  1250             
       
  1251             if (timeErr != KErrNone)
       
  1252                 {
       
  1253                 TN_DEBUG2( "CThumbnailStore::StoreThumbnailL( private ) error getting timeStamp: %d", timeErr );
       
  1254                 OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - error getting timeStamp;timeErr=%d", timeErr );
       
  1255                 }
       
  1256             else
       
  1257                 {
       
  1258                 TN_DEBUG2( "CThumbnailStore::StoreThumbnailL( private ) timeStamp       iFs %Ld", timeStamp.Int64() );
       
  1259                 OstTraceExt1( TRACE_NORMAL, DUP3_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - timeStamp;timeStamp.Int64()=%Ld", timeStamp.Int64() );
       
  1260                 }
       
  1261             }
       
  1262         
       
  1263         if (!aPath.Length() || timeErr != KErrNone)
       
  1264             {
       
  1265             // otherwise current time
       
  1266             timeStamp.UniversalTime();
       
  1267             TN_DEBUG2( "CThumbnailStore::StoreThumbnailL( private ) timeStamp   current %Ld", timeStamp.Int64() );
       
  1268             OstTraceExt1( TRACE_NORMAL, DUP4_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - timeStamp   current;timeStamp.Int64()=%Ld", timeStamp.Int64() );
       
  1269             }
       
  1270         }
       
  1271         
       
  1272    TN_DEBUG2( "CThumbnailStore::StoreThumbnailL( private ) timeStamp       set %Ld", timeStamp.Int64());
       
  1273    OstTraceExt1( TRACE_NORMAL, DUP5_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - timeStamp       set;timeStamp.Int64()=%Ld", timeStamp.Int64() );
       
  1274    
       
  1275     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamModified );
       
  1276     User::LeaveIfError( paramIndex );
       
  1277     User::LeaveIfError( stmt->BindInt64( paramIndex, timeStamp.Int64() ));
       
  1278     
       
  1279     User::LeaveIfError( stmt->Exec());
       
  1280     CleanupStack::PopAndDestroy( stmt );
       
  1281     
       
  1282     // Insert into TempThumbnailInfoData
       
  1283     RSqlStatement* stmtData = NULL;
       
  1284     stmtData = &iStmt_KThumbnailInsertTempThumbnailInfoData;
       
  1285     CleanupStack::PushL(TCleanupItem(ResetStatement, stmtData));
       
  1286     
       
  1287     paramIndex = stmtData->ParameterIndex( KThumbnailSqlParamData );
       
  1288     User::LeaveIfError( paramIndex );
       
  1289     User::LeaveIfError( stmtData->BindBinary( paramIndex, aData ));
       
  1290 
       
  1291     User::LeaveIfError( stmtData->Exec());
       
  1292     CleanupStack::PopAndDestroy( stmtData );
       
  1293 	
       
  1294     // Commit transaction
       
  1295     transaction.CommitL();
       
  1296     CleanupStack::PopAndDestroy( &transaction );
       
  1297 
       
  1298     iBatchItemCount++;
       
  1299     
       
  1300     FlushCacheTable();
       
  1301 
       
  1302 #ifdef _DEBUG
       
  1303     iThumbCounter++;
       
  1304     TN_DEBUG2( "CThumbnailStore::THUMBSTORE-COUNTER----------, Thumbs = %d", iThumbCounter );
       
  1305     OstTrace1( TRACE_NORMAL, DUP6_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::THUMBSTORE-COUNTER----------, Thumbs =;iThumbCounter=%d", iThumbCounter );
       
  1306     
       
  1307     aStop.UniversalTime();
       
  1308     TInt tookTime = aStop.MicroSecondsFrom(aStart).Int64()/1000;
       
  1309     TN_DEBUG2( "CThumbnailStore::StoreThumbnailL( private ) insert to table %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000);
       
  1310     OstTrace1( TRACE_NORMAL, DUP7_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - insert to table;tookTime=%d", tookTime );
       
  1311 #endif 
       
  1312     TN_DEBUG1( "CThumbnailStore::StoreThumbnailL( private ) out" );
       
  1313     OstTrace0( TRACE_NORMAL, DUP8_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - out" );
       
  1314     }
       
  1315 
       
  1316 
       
  1317 // ---------------------------------------------------------------------------
       
  1318 // CThumbnailStore::StoreThumbnailL()
       
  1319 // Stores thumbnail image.
       
  1320 // ---------------------------------------------------------------------------
       
  1321 //
       
  1322 void CThumbnailStore::StoreThumbnailL( const TDesC& aPath, CFbsBitmap*
       
  1323     aThumbnail, const TSize& aOriginalSize, TBool /*aCropped*/, const TThumbnailSize aThumbnailSize, 
       
  1324     const TInt64 aModified, TBool aThumbFromPath, TBool aBlackListed )
       
  1325     {
       
  1326     TSize thumbSize = aThumbnail->SizeInPixels();
       
  1327     TN_DEBUG4( "CThumbnailStore::StoreThumbnailL( public ) aThumbnailSize = %d, aThumbnailSize(%d,%d) IN", aThumbnailSize, thumbSize.iWidth, thumbSize.iHeight );
       
  1328     OstTraceExt3( TRACE_NORMAL, DUP9_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - IN;aThumbnailSize=%u;thumbSize.iWidth=%d;thumbSize.iHeight=%d", aThumbnailSize, thumbSize.iWidth, thumbSize.iHeight );    
       
  1329     if(iReadOnly)
       
  1330         {
       
  1331         TN_DEBUG1( "CThumbnailStore::StoreThumbnailL() read only, skip..." );
       
  1332         return;
       
  1333         }
       
  1334 
       
  1335     __ASSERT_DEBUG(( aThumbnail ), ThumbnailPanic( EThumbnailNullPointer ));
       
  1336     
       
  1337     User::LeaveIfError( CheckDbState() );
       
  1338     
       
  1339     // don't store custom/unknown sizes or zero sizes
       
  1340     if(aThumbnailSize == ECustomThumbnailSize || aThumbnailSize == EUnknownThumbnailSize 
       
  1341             || thumbSize.iWidth <= 0 || thumbSize.iHeight <= 0 )
       
  1342         {
       
  1343         TN_DEBUG1( "CThumbnailStore::StoreThumbnailL( public ) not stored");
       
  1344         OstTrace0( TRACE_NORMAL, DUP10_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - not stored" );
       
  1345         return;
       
  1346         }
       
  1347     
       
  1348     HBufC* path = aPath.AllocLC();
       
  1349     TPtr ptr(path->Des());
       
  1350     StripDriveLetterL( ptr );
       
  1351 
       
  1352     // check for duplicates
       
  1353     TBool exists = FindDuplicateL(*path, aThumbnailSize);
       
  1354     
       
  1355     for ( TInt i = iPersistentSizes.Count(); --i >= 0; )
       
  1356         {
       
  1357         TThumbnailPersistentSize & persistentSize = iPersistentSizes[i];
       
  1358         
       
  1359         // don't store duplicates or zero sizes
       
  1360         if ( !exists )
       
  1361             {
       
  1362             TInt flags = 0;
       
  1363             if ( persistentSize.iCrop )
       
  1364                 {
       
  1365                 flags |= KThumbnailDbFlagCropped;
       
  1366                 }
       
  1367             
       
  1368             if( aBlackListed )
       
  1369                 {
       
  1370                 flags |= KThumbnailDbFlagBlacklisted;
       
  1371                 }
       
  1372             
       
  1373             if( (aThumbnailSize == EImageFullScreenThumbnailSize || 
       
  1374                  aThumbnailSize == EVideoFullScreenThumbnailSize ||
       
  1375                  aThumbnailSize == EAudioFullScreenThumbnailSize ||
       
  1376                  aThumbnailSize == EContactFullScreenThumbnailSize) && !aBlackListed )
       
  1377                 {
       
  1378                 TN_DEBUG1( "CThumbnailStore::StoreThumbnailL( public ) - encode jpg" );
       
  1379                 OstTrace0( TRACE_NORMAL, DUP11_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - encode jpg" );
       
  1380             
       
  1381                 HBufC8* data = NULL;
       
  1382                 CleanupStack::PushL( data );
       
  1383                 
       
  1384                 CImageEncoder* encoder = NULL;
       
  1385 				
       
  1386 				CImageEncoder::TOptions options = ( CImageEncoder::TOptions )( CImageEncoder::EOptionAlwaysThread );
       
  1387 				
       
  1388                 TRAPD( decErr, encoder = CExtJpegEncoder::DataNewL( CExtJpegEncoder::EHwImplementation, data, options ) );
       
  1389                 if ( decErr != KErrNone )
       
  1390                     {
       
  1391                     TN_DEBUG2( "CThumbnailStore::StoreThumbnailL( public ) - HW CExtJpegEncoder failed %d", decErr);
       
  1392                     OstTrace1( TRACE_NORMAL, DUP12_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - HW CExtJpegEncoder failed;decErr=%d", decErr );
       
  1393                 
       
  1394                     TRAPD( decErr, encoder = CExtJpegEncoder::DataNewL( CExtJpegEncoder::ESwImplementation, data, options ) );
       
  1395                     if ( decErr != KErrNone )
       
  1396                         {
       
  1397                         TN_DEBUG2( "CThumbnailStore::StoreThumbnailL( public ) - SW CExtJpegEncoder failed %d", decErr);
       
  1398                         OstTrace1( TRACE_NORMAL, DUP13_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - SW CExtJpegEncoder failed;decErr=%d", decErr );
       
  1399                     
       
  1400                         TRAPD( decErr, encoder = CImageEncoder::DataNewL( data,  KJpegMime(), options ) );
       
  1401                         if ( decErr != KErrNone )
       
  1402                             {
       
  1403                             TN_DEBUG2( "CThumbnailStore::StoreThumbnailL( public ) - CImageEncoder failed %d", decErr);
       
  1404                             OstTrace1( TRACE_NORMAL, DUP14_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - CImageEncoder failed;decErr=%d", decErr );
       
  1405                             
       
  1406                             User::Leave(decErr);
       
  1407                             }
       
  1408                         else
       
  1409                             {
       
  1410                             TN_DEBUG1( "CThumbnailStore::StoreThumbnailL( public ) - CImageEncoder created" );
       
  1411                             OstTrace0( TRACE_NORMAL, DUP15_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - CImageEncoder created" );
       
  1412                             }
       
  1413                         }
       
  1414                     else
       
  1415                         {
       
  1416                         TN_DEBUG1( "CThumbnailStore::StoreThumbnailL( public ) - SW CExtJpegEncoder created" );
       
  1417                         OstTrace0( TRACE_NORMAL, DUP16_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - SW CExtJpegEncoder created" );
       
  1418                         }
       
  1419                     }
       
  1420                 else
       
  1421                     {
       
  1422                     TN_DEBUG1( "CThumbnailStore::StoreThumbnailL( public ) - HW CExtJpegEncoder created" );
       
  1423                     OstTrace0( TRACE_NORMAL, DUP17_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - HW CExtJpegEncoder created" );
       
  1424                     }             
       
  1425                 
       
  1426                 CleanupStack::Pop( data );
       
  1427                 CleanupStack::PushL( encoder );
       
  1428              
       
  1429                 CFrameImageData* frameImageData = CFrameImageData::NewL();
       
  1430                 CleanupStack::PushL( frameImageData );
       
  1431                 
       
  1432                 TJpegImageData* imageData = new (ELeave) TJpegImageData();
       
  1433                 CleanupStack::PushL( imageData );
       
  1434                 
       
  1435                 // Set some format specific data
       
  1436                 imageData->iSampleScheme = TJpegImageData::EColor444;
       
  1437                 imageData->iQualityFactor = 80;
       
  1438                 
       
  1439                 // imageData - ownership passed to frameImageData after AppendImageData
       
  1440                 User::LeaveIfError(frameImageData->AppendImageData(imageData));
       
  1441                 CleanupStack::Pop( imageData );
       
  1442                 
       
  1443 #ifdef _DEBUG
       
  1444         TN_DEBUG4( "CThumbnailStore::StoreThumbnailL( public ) - size: %d x %d, displaymode: %d ", 
       
  1445                 aThumbnail->SizeInPixels().iWidth, 
       
  1446                 aThumbnail->SizeInPixels().iHeight, 
       
  1447                 aThumbnail->DisplayMode());
       
  1448 #endif
       
  1449                 
       
  1450                 TRequestStatus request;
       
  1451                 encoder->Convert( &request, *aThumbnail, frameImageData);
       
  1452                 User::WaitForRequest( request);
       
  1453                 
       
  1454                 CleanupStack::PopAndDestroy( frameImageData );
       
  1455                 CleanupStack::PopAndDestroy( encoder );
       
  1456                 
       
  1457                 if(request == KErrNone)
       
  1458                     {           
       
  1459                     TN_DEBUG1( "CThumbnailStore::StoreThumbnailL( public ) - encoding ok" );    
       
  1460                     OstTrace0( TRACE_NORMAL, DUP18_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - encoding ok" );
       
  1461                 
       
  1462                     CleanupStack::PushL( data );
       
  1463                     TPtr8 ptr = data->Des(); 
       
  1464                     StoreThumbnailL( *path, ptr, aThumbnail->SizeInPixels(), 
       
  1465                                      aOriginalSize, EThumbnailFormatJpeg, flags, 
       
  1466                                      aThumbnailSize, aModified, aThumbFromPath  );
       
  1467                     CleanupStack::Pop( data );
       
  1468                     }
       
  1469                 else
       
  1470                     {
       
  1471                     TN_DEBUG2( "CThumbnailStore::StoreThumbnailL( public ) - encoding failed: %d", request.Int() );
       
  1472                     OstTrace1( TRACE_NORMAL, DUP19_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - encoding failed;request.Int()=%d", request.Int() );
       
  1473                     }
       
  1474                 
       
  1475                 delete data;
       
  1476                 data = NULL;
       
  1477                 }
       
  1478             else
       
  1479                 {
       
  1480                 CBufFlat* buf = CBufFlat::NewL( KStreamBufferSize );
       
  1481                 CleanupStack::PushL( buf );
       
  1482                 RBufWriteStream stream;
       
  1483                 stream.Open( *buf );
       
  1484                 aThumbnail->ExternalizeL( stream );
       
  1485             
       
  1486                 StoreThumbnailL( *path, buf->Ptr( 0 ), aThumbnail->SizeInPixels(),
       
  1487                                  aOriginalSize, EThumbnailFormatFbsBitmap, flags, 
       
  1488                                  aThumbnailSize, aModified, aThumbFromPath);
       
  1489   
       
  1490                 CleanupStack::PopAndDestroy( buf );
       
  1491                 }
       
  1492             
       
  1493             break;
       
  1494             }
       
  1495         }
       
  1496     
       
  1497     CleanupStack::PopAndDestroy( path );
       
  1498     
       
  1499     TN_DEBUG1( "CThumbnailStore::StoreThumbnailL( public ) out" );
       
  1500     OstTrace0( TRACE_NORMAL, DUP20_CTHUMBNAILSTORE_STORETHUMBNAILL, "CThumbnailStore::StoreThumbnailL - out" );
       
  1501     }
       
  1502 
       
  1503 // ---------------------------------------------------------------------------
       
  1504 // Finds possible existing duplicate thumbnail.
       
  1505 // ---------------------------------------------------------------------------
       
  1506 //
       
  1507 TBool CThumbnailStore::FindDuplicateL( const TDesC& aPath, const TThumbnailSize& aThumbnailSize )
       
  1508     {
       
  1509     TN_DEBUG1( "CThumbnailStore::FindDuplicateL()" );
       
  1510     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_FINDDUPLICATEL, "CThumbnailStore::FindDuplicateL" );
       
  1511 	if(iReadOnly)
       
  1512 		{
       
  1513 		TN_DEBUG1( "CThumbnailStore::FindDuplicateL() read only, skip..." );
       
  1514 		return EFalse;
       
  1515 		}
       
  1516     
       
  1517     User::LeaveIfError( CheckDbState() );
       
  1518     
       
  1519     TInt rowStatus = 0;
       
  1520     TInt paramIndex = 0;
       
  1521     TInt found = EFalse;
       
  1522     
       
  1523     RSqlStatement* stmt = NULL;
       
  1524     stmt = &iStmt_KThumbnailTempFindDuplicate;
       
  1525     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));  
       
  1526     
       
  1527     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  1528     User::LeaveIfError( paramIndex );
       
  1529     User::LeaveIfError( stmt->BindText( paramIndex, aPath ));
       
  1530     
       
  1531     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamSize );
       
  1532     User::LeaveIfError( paramIndex );
       
  1533     User::LeaveIfError( stmt->BindInt( paramIndex, aThumbnailSize ));
       
  1534     
       
  1535     rowStatus = stmt->Next();
       
  1536     
       
  1537     //if not found from temp table, look from real table
       
  1538     if(rowStatus != KSqlAtRow)
       
  1539         {
       
  1540         CleanupStack::PopAndDestroy( stmt );
       
  1541         stmt = &iStmt_KThumbnailFindDuplicate;
       
  1542         CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  1543            
       
  1544         paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  1545         User::LeaveIfError( paramIndex );
       
  1546         User::LeaveIfError( stmt->BindText( paramIndex, aPath ));
       
  1547             
       
  1548         paramIndex = stmt->ParameterIndex( KThumbnailSqlParamSize );
       
  1549         User::LeaveIfError( paramIndex );
       
  1550         User::LeaveIfError( stmt->BindInt( paramIndex, aThumbnailSize ));
       
  1551         
       
  1552         rowStatus = stmt->Next();
       
  1553         
       
  1554         if(rowStatus == KSqlAtRow)
       
  1555             {
       
  1556             TN_DEBUG1( "CThumbnailStore::FindDuplicateL() - duplicate in main table" );
       
  1557             OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_FINDDUPLICATEL, "CThumbnailStore::FindDuplicateL - duplicate in main table" );
       
  1558             
       
  1559             found = ETrue;
       
  1560             }
       
  1561         else
       
  1562             {
       
  1563             TN_DEBUG1( "CThumbnailStore::FindDuplicateL() - no duplicate" );
       
  1564             OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_FINDDUPLICATEL, "CThumbnailStore::FindDuplicateL - no duplicate" );
       
  1565             }
       
  1566         }
       
  1567     else
       
  1568         {
       
  1569         TN_DEBUG1( "CThumbnailStore::FindDuplicateL() - duplicate in temp table" );
       
  1570         OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSTORE_FINDDUPLICATEL, "CThumbnailStore::FindDuplicateL - duplicate in temp table" );
       
  1571         
       
  1572         found = ETrue;
       
  1573         }
       
  1574     
       
  1575     CleanupStack::PopAndDestroy( stmt );
       
  1576     
       
  1577     // check if duplicate in Deleted
       
  1578     if (found)
       
  1579         {
       
  1580         stmt = &iStmt_KThumbnailSqlFindDeleted;
       
  1581         CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));   
       
  1582             
       
  1583         paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  1584         User::LeaveIfError( paramIndex );
       
  1585         User::LeaveIfError( stmt->BindText( paramIndex, aPath ));
       
  1586         
       
  1587         rowStatus = stmt->Next();
       
  1588         
       
  1589         CleanupStack::PopAndDestroy( stmt );
       
  1590         
       
  1591         if(rowStatus == KSqlAtRow)
       
  1592             {
       
  1593             TN_DEBUG1( "CThumbnailStore::FindDuplicateL() - duplicate marked deleted" );
       
  1594             OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSTORE_FINDDUPLICATEL, "CThumbnailStore::FindDuplicateL - duplicate marked deleted" );
       
  1595             
       
  1596             DeleteThumbnailsL(aPath, ETrue);
       
  1597             
       
  1598             TN_DEBUG1( "CThumbnailStore::FindDuplicateL() - duplicate force-deleted" );
       
  1599             OstTrace0( TRACE_NORMAL, DUP5_CTHUMBNAILSTORE_FINDDUPLICATEL, "CThumbnailStore::FindDuplicateL - duplicate force-deleted" );
       
  1600             
       
  1601             found = EFalse;
       
  1602             }
       
  1603         }
       
  1604     
       
  1605     return found;
       
  1606     }
       
  1607 
       
  1608 // ---------------------------------------------------------------------------
       
  1609 // Get missing sizes by Path
       
  1610 // ---------------------------------------------------------------------------
       
  1611 //     
       
  1612 void CThumbnailStore::GetMissingSizesL( const TDesC& aPath, TInt aSourceType, RArray <
       
  1613     TThumbnailPersistentSize > & aMissingSizes, TBool aCheckGridSizeOnly )
       
  1614     {
       
  1615     TN_DEBUG2( "CThumbnailStore::GetMissingSizesL() aSourceType == %d", aSourceType );
       
  1616     OstTrace1( TRACE_NORMAL, CTHUMBNAILSTORE_GETMISSINGSIZESL, "CThumbnailStore::GetMissingSizesL;aSourceType=%d", aSourceType );
       
  1617     if(iReadOnly)
       
  1618         {
       
  1619         TN_DEBUG1( "CThumbnailStore::GetMissingSizesL() read only, skip..." );
       
  1620 		return;
       
  1621         }
       
  1622     
       
  1623     User::LeaveIfError( CheckDbState() );
       
  1624     
       
  1625     HBufC* path = aPath.AllocLC();
       
  1626     TPtr ptr(path->Des());
       
  1627     StripDriveLetterL( ptr );
       
  1628     
       
  1629     // define sizes to be checked
       
  1630     const TInt count = iPersistentSizes.Count();
       
  1631     
       
  1632     for ( TInt i = 0 ; i < count; i++ )
       
  1633         {
       
  1634         if ( iPersistentSizes[ i ].iSourceType == aSourceType && iPersistentSizes[ i ].iAutoCreate)
       
  1635             {
       
  1636             //if generating only grid size for image or video, other sizes are not missing
       
  1637             if( aCheckGridSizeOnly )
       
  1638                 {
       
  1639 				if( (iPersistentSizes[i].iSourceType == TThumbnailPersistentSize::EImage || iPersistentSizes[i].iSourceType == TThumbnailPersistentSize::EVideo )&&
       
  1640                      iPersistentSizes[i].iSizeType != TThumbnailPersistentSize::EGrid )
       
  1641                     {
       
  1642                     TN_DEBUG4( "CThumbnailStore::GetMissingSizesL() skip, aCheckGridSizeOnly = %d and  iPersistentSizes[%d].iSizeType == %d", 
       
  1643                             aCheckGridSizeOnly, i, iPersistentSizes[i].iSizeType );
       
  1644                     OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_GETMISSINGSIZESL, "CThumbnailStore::GetMissingSizesL;aCheckGridSizeOnly=%u", aCheckGridSizeOnly );
       
  1645                     }
       
  1646 				else
       
  1647 				    {
       
  1648                     aMissingSizes.AppendL( iPersistentSizes[ i ] );
       
  1649 				    }
       
  1650                 }
       
  1651             else
       
  1652                 {
       
  1653                 aMissingSizes.AppendL( iPersistentSizes[ i ] );
       
  1654                 }
       
  1655             }
       
  1656         }
       
  1657     
       
  1658     TInt missingSizeCount = aMissingSizes.Count();
       
  1659         
       
  1660     TN_DEBUG2( "CThumbnailStore::GetMissingSizesL() missingSizeCount == %d", missingSizeCount );
       
  1661     OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_GETMISSINGSIZESL, "CThumbnailStore::GetMissingSizesL;missingSizeCount=%d", missingSizeCount );
       
  1662     
       
  1663     // check temp table first
       
  1664     RSqlStatement* stmt = NULL;
       
  1665     stmt = &iStmt_KThumbnailSelectTempSizeByPath;
       
  1666     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  1667 
       
  1668     TInt paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  1669     User::LeaveIfError( paramIndex );
       
  1670     User::LeaveIfError( stmt->BindText( paramIndex, *path ));
       
  1671        
       
  1672     TInt rowStatus = stmt->Next();
       
  1673 
       
  1674     TInt round = 1;
       
  1675     TInt size = 0;
       
  1676     
       
  1677     while (round <= 2)
       
  1678         {
       
  1679         while ( rowStatus == KSqlAtRow && missingSizeCount > 0 )
       
  1680             {
       
  1681             size = stmt->ColumnInt( 0 );
       
  1682 			
       
  1683             missingSizeCount = aMissingSizes.Count();
       
  1684             for ( TInt i = 0; i < missingSizeCount; i++ )
       
  1685                 {
       
  1686                 if ( aMissingSizes[ i ].iType == size )
       
  1687                     {
       
  1688                     TN_DEBUG1( "CThumbnailStore::GetMissingSizesL() -- thumbnail found" );
       
  1689                     OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSTORE_GETMISSINGSIZESL, "CThumbnailStore::GetMissingSizesL - thumbnail found" );
       
  1690                     aMissingSizes.Remove( i );
       
  1691                     missingSizeCount--;
       
  1692                     break;
       
  1693                     }
       
  1694                 }
       
  1695                 
       
  1696             rowStatus = stmt->Next();
       
  1697             }
       
  1698 
       
  1699         CleanupStack::PopAndDestroy( stmt );
       
  1700         
       
  1701         // all found
       
  1702         if (missingSizeCount == 0)
       
  1703             {
       
  1704             CleanupStack::PopAndDestroy( path );
       
  1705             return;
       
  1706             }
       
  1707         else if (round == 1)
       
  1708             {
       
  1709             // change to real table
       
  1710             stmt = &iStmt_KThumbnailSelectSizeByPath;
       
  1711             CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  1712             
       
  1713             paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  1714             User::LeaveIfError( paramIndex );
       
  1715             User::LeaveIfError( stmt->BindText( paramIndex, *path ));
       
  1716             rowStatus = stmt->Next();    
       
  1717             }
       
  1718         
       
  1719         round++;
       
  1720         }
       
  1721     
       
  1722     CleanupStack::PopAndDestroy( path );
       
  1723     }
       
  1724 
       
  1725 // ---------------------------------------------------------------------------
       
  1726 // CThumbnailStore::FetchThumbnailL()
       
  1727 // Fetches thumbnail image.
       
  1728 // ---------------------------------------------------------------------------
       
  1729 //
       
  1730 void CThumbnailStore::FetchThumbnailL( const TDesC& aPath, CFbsBitmap* &
       
  1731     aThumbnail, TDesC8* & aData, const TThumbnailSize aThumbnailSize, TSize &aThumbnailRealSize )
       
  1732     {
       
  1733     TN_DEBUG3( "CThumbnailStore::FetchThumbnailL(%S) aThumbnailSize==%d", &aPath, aThumbnailSize );
       
  1734     OstTraceExt2( TRACE_NORMAL, CTHUMBNAILSTORE_FETCHTHUMBNAILL, "CThumbnailStore::FetchThumbnailL;aPath=%S;aThumbnailSize=%u", aPath, aThumbnailSize );
       
  1735     if(iReadOnly)
       
  1736         {
       
  1737         TN_DEBUG1( "CThumbnailStore::FetchThumbnailL() read only, skip..." );
       
  1738         User::Leave( KErrNotFound );
       
  1739         }
       
  1740     
       
  1741     User::LeaveIfError( CheckDbState() );
       
  1742     
       
  1743     HBufC* path = aPath.AllocLC();
       
  1744     TPtr ptr(path->Des());
       
  1745     StripDriveLetterL( ptr );
       
  1746     
       
  1747     TInt paramIndex = 0;
       
  1748     TInt found = KErrNotFound;
       
  1749     TInt rowStatus = 0;
       
  1750     TInt column = 0;
       
  1751     
       
  1752     TN_DEBUG1( "CThumbnailStore::FetchThumbnailL() -- TEMP TABLE lookup" );
       
  1753     OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_FETCHTHUMBNAILL, "CThumbnailStore::FetchThumbnailL - TEMP TABLE lookup" );
       
  1754 
       
  1755     RSqlStatement* stmt = NULL;
       
  1756     stmt = &iStmt_KThumbnailSelectTempInfoByPath;
       
  1757     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  1758     
       
  1759     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  1760     User::LeaveIfError( paramIndex );
       
  1761     User::LeaveIfError( stmt->BindText( paramIndex, *path ));
       
  1762     
       
  1763     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamSize );
       
  1764     User::LeaveIfError( paramIndex );
       
  1765     User::LeaveIfError( stmt->BindInt( paramIndex, aThumbnailSize ));
       
  1766     
       
  1767     rowStatus = stmt->Next();
       
  1768 
       
  1769     //if not found from temp table, look from real table
       
  1770     if(rowStatus != KSqlAtRow)
       
  1771        {
       
  1772        TN_DEBUG1( "CThumbnailStore::FetchThumbnailL() -- MAIN TABLE lookup" );
       
  1773        OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_FETCHTHUMBNAILL, "CThumbnailStore::FetchThumbnailL - MAIN TABLE lookup" );
       
  1774       
       
  1775        CleanupStack::PopAndDestroy( stmt );
       
  1776        stmt = &iStmt_KThumbnailSelectInfoByPath;
       
  1777        CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  1778     
       
  1779         paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  1780         User::LeaveIfError( paramIndex );
       
  1781         User::LeaveIfError( stmt->BindText( paramIndex, *path ));
       
  1782         
       
  1783         paramIndex = stmt->ParameterIndex( KThumbnailSqlParamSize );
       
  1784         User::LeaveIfError( paramIndex );
       
  1785         User::LeaveIfError( stmt->BindInt( paramIndex, aThumbnailSize ));
       
  1786     
       
  1787         rowStatus = stmt->Next();
       
  1788        }
       
  1789 
       
  1790     if(rowStatus == KSqlAtRow)
       
  1791        {
       
  1792         TN_DEBUG1( "CThumbnailStore::FetchThumbnailL() -- thumbnail found" );
       
  1793         OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSTORE_FETCHTHUMBNAILL, "CThumbnailStore::FetchThumbnailL - thumbnail found" );
       
  1794         
       
  1795         // Check whether blacklisted thumbnail entry modified. 
       
  1796         // If thumbnail is marked as blacklisted and timestamp has 
       
  1797         // changed, delete thumbnails from tables and leave with 
       
  1798         // KErrNotFound to get thumbnail regenerated.
       
  1799         column = 4;
       
  1800         TInt flags = stmt->ColumnInt( column );
       
  1801         if( flags & KThumbnailDbFlagDeleted )
       
  1802             {
       
  1803             CleanupStack::PopAndDestroy( stmt );
       
  1804             
       
  1805             // delete existing blacklisted thumbs
       
  1806             DeleteThumbnailsL(*path, ETrue);
       
  1807             
       
  1808             CleanupStack::PopAndDestroy( path );
       
  1809         
       
  1810             User::Leave( KErrNotFound );
       
  1811             }
       
  1812         else if( flags & KThumbnailDbFlagBlacklisted )
       
  1813             {
       
  1814             CleanupStack::PopAndDestroy( stmt );
       
  1815             CleanupStack::PopAndDestroy( path );
       
  1816         
       
  1817             User::Leave( KErrCompletion );
       
  1818             }
       
  1819         else if( !(flags & KThumbnailDbFlagBlacklisted) )
       
  1820             {
       
  1821             found = KErrNone;
       
  1822             column = 0;
       
  1823             TInt format = stmt->ColumnInt( column++ );  
       
  1824             if(format == 1 /*TThumbnailFormat::EThumbnailFormatJpeg */ )
       
  1825                 {
       
  1826                 TPtrC8 ptr = stmt->ColumnBinaryL( column++ );
       
  1827                 HBufC8* data = ptr.AllocL() ;
       
  1828                 aThumbnail = NULL;
       
  1829                 aData = data;               
       
  1830                 } 
       
  1831             else 
       
  1832                 {
       
  1833                 TPtrC8 ptr = stmt->ColumnBinaryL( column++ );
       
  1834                 RDesReadStream stream( ptr );
       
  1835                 aThumbnail = new( ELeave )CFbsBitmap();
       
  1836                 CleanupStack::PushL( aThumbnail );
       
  1837                 aThumbnail->InternalizeL( stream );
       
  1838                 CleanupStack::Pop( aThumbnail );
       
  1839                 aData = NULL;
       
  1840                 }
       
  1841             
       
  1842             //fetch real size of TN
       
  1843             column = 2;
       
  1844             aThumbnailRealSize.iWidth = stmt->ColumnInt( column++ );
       
  1845             aThumbnailRealSize.iHeight = stmt->ColumnInt( column );
       
  1846             }
       
  1847         }
       
  1848     else
       
  1849         {
       
  1850         TN_DEBUG1( "CThumbnailStore::FetchThumbnailL() -- thumbnail NOT found" );
       
  1851         OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSTORE_FETCHTHUMBNAILL, "CThumbnailStore::FetchThumbnailL - thumbnail NOT found" );
       
  1852         }
       
  1853         
       
  1854     CleanupStack::PopAndDestroy( stmt );
       
  1855     CleanupStack::PopAndDestroy( path );
       
  1856     
       
  1857     User::LeaveIfError( found );
       
  1858     }
       
  1859 
       
  1860 // -----------------------------------------------------------------------------
       
  1861 // Delete thumbnails for given object file by Path
       
  1862 // -----------------------------------------------------------------------------
       
  1863 //
       
  1864 void CThumbnailStore::DeleteThumbnailsL( const TDesC& aPath, TBool aForce, 
       
  1865                                          TBool aTransaction )
       
  1866     {
       
  1867     TN_DEBUG2( "CThumbnailStore::DeleteThumbnailsL(%S)", &aPath );
       
  1868     OstTraceExt1( TRACE_NORMAL, CTHUMBNAILSTORE_DELETETHUMBNAILSL, "CThumbnailStore::DeleteThumbnailsL;aPath=%S", aPath );
       
  1869 
       
  1870     if(iReadOnly)
       
  1871         {
       
  1872         TN_DEBUG1( "CThumbnailStore::DeleteThumbnailsL() read only, skip..." );
       
  1873         return;
       
  1874         }
       
  1875     
       
  1876 #ifdef _DEBUG
       
  1877     TTime aStart, aStop;
       
  1878     aStart.UniversalTime();
       
  1879 #endif
       
  1880     
       
  1881     User::LeaveIfError( CheckDbState() );
       
  1882     
       
  1883     TInt paramIndex = 0;
       
  1884     TInt paramIndex1 = 0;
       
  1885     TInt paramIndex2 = 0;
       
  1886     TInt rowStatus = 0;
       
  1887     TInt column = 0;
       
  1888     TInt64 rowid = 0;
       
  1889     TInt count = 0;
       
  1890 
       
  1891     HBufC* path = aPath.AllocLC();
       
  1892     TPtr ptr(path->Des());
       
  1893     StripDriveLetterL( ptr );
       
  1894     
       
  1895     RThumbnailTransaction transaction( iDatabase );
       
  1896     if (aTransaction)
       
  1897         {
       
  1898         CleanupClosePushL( transaction );    
       
  1899         transaction.BeginL();
       
  1900         }
       
  1901         
       
  1902     TN_DEBUG1( "CThumbnailStore::DeleteThumbnailsByPathL() -- TEMP TABLE lookup" );
       
  1903     OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_DELETETHUMBNAILSL, "CThumbnailStore::DeleteThumbnailsL - TEMP TABLE lookup" );
       
  1904     
       
  1905     RSqlStatement* stmt = NULL;
       
  1906     RSqlStatement* stmt_info = NULL;
       
  1907     RSqlStatement* stmt_infodata = NULL;
       
  1908     
       
  1909     stmt = &iStmt_KTempThumbnailSqlSelectRowIDInfoByPath;
       
  1910     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  1911     stmt_info = &iStmt_KTempThumbnailSqlDeleteInfoByPath;
       
  1912     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt_info));    
       
  1913     stmt_infodata = &iStmt_KTempThumbnailSqlDeleteInfoDataByPath;
       
  1914     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt_infodata));
       
  1915     
       
  1916     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  1917     User::LeaveIfError( paramIndex );
       
  1918     User::LeaveIfError( stmt->BindText( paramIndex, *path ));
       
  1919     
       
  1920     rowStatus = stmt->Next();
       
  1921     
       
  1922     while(rowStatus == KSqlAtRow)
       
  1923         {  
       
  1924         rowid = stmt->ColumnInt64( column ); 
       
  1925         paramIndex1 = stmt_info->ParameterIndex( KThumbnailSqlParamRowID );
       
  1926         User::LeaveIfError( paramIndex1 );
       
  1927         User::LeaveIfError( stmt_info->BindInt64( paramIndex1, rowid ));
       
  1928        
       
  1929         TInt err = stmt_info->Exec();
       
  1930         stmt_info->Reset();
       
  1931         User::LeaveIfError( err );
       
  1932              
       
  1933         paramIndex2 = stmt_infodata->ParameterIndex( KThumbnailSqlParamRowID );
       
  1934         User::LeaveIfError( paramIndex2 );
       
  1935         User::LeaveIfError( stmt_infodata->BindInt64( paramIndex2, rowid ));
       
  1936              
       
  1937         err = stmt_infodata->Exec();
       
  1938         stmt_infodata->Reset();
       
  1939         User::LeaveIfError( err );
       
  1940         
       
  1941         TN_DEBUG1( "CThumbnailStore::DeleteThumbnailsByPathL() -- TEMP TABLE lookup - thumbnail deleted" );
       
  1942         OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_DELETETHUMBNAILSL, "CThumbnailStore::DeleteThumbnailsL - TEMP TABLE lookup - thumbnail deleted" );
       
  1943        
       
  1944         // fetch another row (temp table rowIDs are updated immediately)
       
  1945         stmt->Reset();
       
  1946        
       
  1947         paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  1948         User::LeaveIfError( paramIndex );
       
  1949         User::LeaveIfError( stmt->BindText( paramIndex, *path ));
       
  1950        
       
  1951         rowStatus = stmt->Next();   
       
  1952         }
       
  1953     
       
  1954     CleanupStack::PopAndDestroy( stmt_infodata );
       
  1955     CleanupStack::PopAndDestroy( stmt_info );
       
  1956     CleanupStack::PopAndDestroy( stmt );
       
  1957         
       
  1958     // if forcing instant delete
       
  1959     if (aForce)
       
  1960         {
       
  1961         //look from real table 
       
  1962         TN_DEBUG1( "CThumbnailStore::DeleteThumbnailByPathL() -- MAIN TABLE lookup" );
       
  1963         OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSTORE_DELETETHUMBNAILSL, "CThumbnailStore::DeleteThumbnailsL - MAIN TABLE lookup" );
       
  1964         
       
  1965         stmt = &iStmt_KThumbnailSqlSelectRowIDInfoByPath;
       
  1966         CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  1967         stmt_info = &iStmt_KThumbnailSqlDeleteInfoByPath;
       
  1968         CleanupStack::PushL(TCleanupItem(ResetStatement, stmt_info));    
       
  1969         stmt_infodata = &iStmt_KThumbnailSqlDeleteInfoDataByPath;
       
  1970         CleanupStack::PushL(TCleanupItem(ResetStatement, stmt_infodata));
       
  1971 
       
  1972         paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  1973         User::LeaveIfError( paramIndex );
       
  1974         User::LeaveIfError( stmt->BindText( paramIndex, *path ));
       
  1975              
       
  1976         rowStatus = stmt->Next();   
       
  1977            
       
  1978         while(rowStatus == KSqlAtRow)
       
  1979             { 
       
  1980             rowid = stmt->ColumnInt64( column ); 
       
  1981             paramIndex1 = stmt_info->ParameterIndex( KThumbnailSqlParamRowID );
       
  1982             User::LeaveIfError( paramIndex1 );
       
  1983             User::LeaveIfError( stmt_info->BindInt64( paramIndex1, rowid ));
       
  1984                
       
  1985             TInt err = stmt_info->Exec();
       
  1986             stmt_info->Reset();
       
  1987             User::LeaveIfError( err );
       
  1988                     
       
  1989             paramIndex2 = stmt_infodata->ParameterIndex( KThumbnailSqlParamRowID );  
       
  1990             User::LeaveIfError( paramIndex2 );
       
  1991             User::LeaveIfError( stmt_infodata->BindInt64( paramIndex2, rowid ));
       
  1992                     
       
  1993             err = stmt_infodata->Exec();
       
  1994             stmt_infodata->Reset();
       
  1995             User::LeaveIfError( err );
       
  1996            
       
  1997             TN_DEBUG1( "CThumbnailStore::DeleteThumbnailByPathL() -- MAIN TABLE lookup - thumbnail deleted" );
       
  1998             OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSTORE_DELETETHUMBNAILSL, "CThumbnailStore::DeleteThumbnailsL - MAIN TABLE lookup - thumbnail deleted" );
       
  1999             
       
  2000             rowStatus = stmt->Next();
       
  2001             }
       
  2002         
       
  2003         CleanupStack::PopAndDestroy( stmt_infodata );
       
  2004         CleanupStack::PopAndDestroy( stmt_info );
       
  2005         CleanupStack::PopAndDestroy( stmt );
       
  2006         
       
  2007 		//remove delete mark
       
  2008         User::LeaveIfError( iDatabase.Exec( KThumbnailSqlDeleteFromDeleted ) );
       
  2009         } 
       
  2010     else
       
  2011         {
       
  2012         TN_DEBUG1( "CThumbnailStore::DeleteThumbnailByPathL() -- MAIN TABLE lookup" );        
       
  2013         OstTrace0( TRACE_NORMAL, DUP5_CTHUMBNAILSTORE_DELETETHUMBNAILSL, "CThumbnailStore::DeleteThumbnailsL - MAIN TABLE lookup" );
       
  2014     
       
  2015         stmt = &iStmt_KThumbnailSqlSelectRowIDInfoByPath;
       
  2016         CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  2017 
       
  2018         paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  2019         User::LeaveIfError( paramIndex );
       
  2020         User::LeaveIfError( stmt->BindText( paramIndex, *path ));
       
  2021              
       
  2022         rowStatus = stmt->Next();   
       
  2023            
       
  2024         CleanupStack::PopAndDestroy( stmt );
       
  2025         
       
  2026         // there were matching rows in main table
       
  2027         if (rowStatus == KSqlAtRow)
       
  2028             {        
       
  2029             TN_DEBUG1( "CThumbnailStore::DeleteThumbnailByPathL() -- add to Deleted" );
       
  2030             OstTrace0( TRACE_NORMAL, DUP6_CTHUMBNAILSTORE_DELETETHUMBNAILSL, "CThumbnailStore::DeleteThumbnailsL - add to Deleted" );
       
  2031         
       
  2032             // only add path to deleted table
       
  2033             stmt = &iStmt_KThumbnailSqlInsertDeleted;
       
  2034             CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  2035             
       
  2036             paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  2037             User::LeaveIfError( paramIndex );
       
  2038             User::LeaveIfError( stmt->BindText( paramIndex, *path ));
       
  2039             
       
  2040             count = stmt->Exec();
       
  2041             
       
  2042             CleanupStack::PopAndDestroy( stmt );
       
  2043             }
       
  2044         else
       
  2045             {
       
  2046             TN_DEBUG1( "CThumbnailStore::DeleteThumbnailByPathL() -- no thumbs in MAIN" );
       
  2047             OstTrace0( TRACE_NORMAL, DUP7_CTHUMBNAILSTORE_DELETETHUMBNAILSL, "CThumbnailStore::DeleteThumbnailsL - no thumbs in MAIN" );
       
  2048             }
       
  2049         }    
       
  2050     
       
  2051     if (aTransaction)
       
  2052         {
       
  2053         transaction.CommitL();
       
  2054         CleanupStack::PopAndDestroy( &transaction );
       
  2055         }
       
  2056     
       
  2057 #ifdef _DEBUG
       
  2058     aStop.UniversalTime();
       
  2059     TInt tookTime = (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000;
       
  2060     TN_DEBUG2( "CThumbnailStore::DeleteThumbnailByPathL() took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000);
       
  2061     OstTrace1( TRACE_NORMAL, DUP8_CTHUMBNAILSTORE_DELETETHUMBNAILSL, "CThumbnailStore::DeleteThumbnailsL - took;tookTime=%d", tookTime );
       
  2062 #endif
       
  2063     
       
  2064     // start maintenance if rows in main table were marked
       
  2065     if (!aForce && count > 0)
       
  2066         {
       
  2067         TN_DEBUG2( "CThumbnailStore::DeleteThumbnailByPathL() -- MAIN TABLE lookup - %d rows marked deleted", count);
       
  2068         OstTrace1( TRACE_NORMAL, DUP9_CTHUMBNAILSTORE_DELETETHUMBNAILSL, "CThumbnailStore::DeleteThumbnailsL -- MAIN TABLE lookup - rows marked deleted;count=%d", count );
       
  2069         
       
  2070         iDeleteThumbs = ETrue;
       
  2071         iActivityManager->Start();
       
  2072         }
       
  2073     
       
  2074     CleanupStack::PopAndDestroy( path );
       
  2075     }
       
  2076 
       
  2077 // -----------------------------------------------------------------------------
       
  2078 // Rename thumbnails
       
  2079 // -----------------------------------------------------------------------------
       
  2080 //
       
  2081 void CThumbnailStore::RenameThumbnailsL( const TDesC& aCurrentPath, const TDesC& aNewPath )
       
  2082     {
       
  2083     TN_DEBUG2( "CThumbnailStore::RenameThumbnailsL(%S)", &aCurrentPath );
       
  2084     OstTraceExt1( TRACE_NORMAL, CTHUMBNAILSTORE_RENAMETHUMBNAILSL, "CThumbnailStore::RenameThumbnailsL;aCurrentPath=%S", aCurrentPath );
       
  2085     if(iReadOnly)
       
  2086         {
       
  2087         TN_DEBUG1( "CThumbnailStore::RenameThumbnailsL() read only, skip..." );
       
  2088         return;
       
  2089         }
       
  2090     
       
  2091 #ifdef _DEBUG
       
  2092     TTime aStart, aStop;
       
  2093     aStart.UniversalTime();
       
  2094 #endif
       
  2095     
       
  2096     User::LeaveIfError( CheckDbState() );
       
  2097     
       
  2098     TInt paramIndex = 0;
       
  2099 
       
  2100     HBufC* path = aCurrentPath.AllocLC();
       
  2101     TPtr ptr(path->Des());
       
  2102     StripDriveLetterL( ptr );
       
  2103     
       
  2104     HBufC* newPath = aNewPath.AllocLC();
       
  2105     TPtr ptr2(newPath->Des());
       
  2106     StripDriveLetterL( ptr2 );
       
  2107     
       
  2108     RThumbnailTransaction transaction( iDatabase );
       
  2109     CleanupClosePushL( transaction );    
       
  2110     transaction.BeginL();
       
  2111         
       
  2112     TN_DEBUG1( "CThumbnailStore::RenameThumbnailsL() -- TEMP TABLE" );
       
  2113     OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_RENAMETHUMBNAILSL, "CThumbnailStore::RenameThumbnailsL - TEMP TABLE" );
       
  2114     
       
  2115     RSqlStatement* stmt = NULL;
       
  2116     stmt = &iStmt_KThumbnailTempRename;
       
  2117     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  2118     
       
  2119     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  2120     User::LeaveIfError( paramIndex );
       
  2121     User::LeaveIfError( stmt->BindText( paramIndex, *path ));
       
  2122     
       
  2123     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamNewPath );
       
  2124     User::LeaveIfError( paramIndex );
       
  2125     User::LeaveIfError( stmt->BindText( paramIndex, *newPath ));
       
  2126     
       
  2127     User::LeaveIfError( stmt->Exec() );
       
  2128     
       
  2129     TN_DEBUG1( "CThumbnailStore::RenameThumbnailsL() -- MAIN TABLE" );
       
  2130     OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_RENAMETHUMBNAILSL, "CThumbnailStore::RenameThumbnailsL - MAIN TABLE" );
       
  2131     
       
  2132     CleanupStack::PopAndDestroy( stmt );
       
  2133     stmt = &iStmt_KThumbnailRename;
       
  2134     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  2135     
       
  2136     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  2137     User::LeaveIfError( paramIndex );
       
  2138     User::LeaveIfError( stmt->BindText( paramIndex, *path ));
       
  2139     
       
  2140     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamNewPath );
       
  2141     User::LeaveIfError( paramIndex );
       
  2142     User::LeaveIfError( stmt->BindText( paramIndex, *newPath ));
       
  2143     
       
  2144     User::LeaveIfError( stmt->Exec() );
       
  2145     
       
  2146     CleanupStack::PopAndDestroy( stmt );
       
  2147     
       
  2148     // if thumb was for some reason already marked deleted, clean from deleted
       
  2149     User::LeaveIfError( iDatabase.Exec( KThumbnailSqlDeleteFromDeleted ) );
       
  2150     
       
  2151     transaction.CommitL();
       
  2152     CleanupStack::PopAndDestroy( &transaction );
       
  2153     
       
  2154     CleanupStack::PopAndDestroy( newPath );
       
  2155     CleanupStack::PopAndDestroy( path );
       
  2156     
       
  2157 #ifdef _DEBUG
       
  2158     aStop.UniversalTime();
       
  2159     TInt tookTime = (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000;
       
  2160     TN_DEBUG2( "CThumbnailStore::RenameThumbnailsL() took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000);
       
  2161     OstTrace1( TRACE_NORMAL, DUP3_CTHUMBNAILSTORE_RENAMETHUMBNAILSL, "CThumbnailStore::RenameThumbnailsL;tookTime=%d", tookTime );
       
  2162 #endif      
       
  2163     }
       
  2164 
       
  2165 // ---------------------------------------------------------------------------
       
  2166 // CThumbnailStore::PersistentSizes()
       
  2167 // ---------------------------------------------------------------------------
       
  2168 //
       
  2169 void CThumbnailStore::SetPersistentSizes(const RArray < TThumbnailPersistentSize > &aSizes)
       
  2170     {
       
  2171     iPersistentSizes = aSizes;
       
  2172     }
       
  2173 
       
  2174 // ---------------------------------------------------------------------------
       
  2175 // CThumbnailStore::FlushCacheTable()
       
  2176 // ---------------------------------------------------------------------------
       
  2177 //
       
  2178 void CThumbnailStore::FlushCacheTable( TBool aForce )
       
  2179     {
       
  2180     TN_DEBUG1("CThumbnailStore::FlushCacheTable() in");
       
  2181     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable - in" );
       
  2182     
       
  2183     StopAutoFlush();
       
  2184     
       
  2185     if(iReadOnly)
       
  2186         {
       
  2187         TN_DEBUG1( "CThumbnailStore::FlushCacheTable() read only, skip..." );
       
  2188         return;
       
  2189         }
       
  2190     
       
  2191     if(iBatchItemCount <= 0 || CheckDbState() != KErrNone)
       
  2192         {
       
  2193         // cache empty or db unusable
       
  2194         TN_DEBUG1( "CThumbnailStore::FlushCacheTable() error ");
       
  2195         OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable - error" );
       
  2196         return;
       
  2197         }
       
  2198     
       
  2199     // longer flush allowed if MTP sync on
       
  2200     TInt MPXHarvesting(0);
       
  2201     TInt ret = RProperty::Get(KTAGDPSNotification, KMPXHarvesting, MPXHarvesting);
       
  2202     if(ret != KErrNone)
       
  2203        {
       
  2204        TN_DEBUG2( "CThumbnailStore::FlushCacheTable() error checking MTP sync: %d", ret);
       
  2205        OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable - error checking MTP sync;ret=%d", ret );
       
  2206        }
       
  2207     
       
  2208     //set init max flush delay
       
  2209     TReal32 aMaxFlushDelay(KMaxFlushDelay);
       
  2210     TReal32 aPreviousFlushDelay(iPreviousFlushDelay);
       
  2211     TReal32 aBatchFlushItemCount(iBatchFlushItemCount);
       
  2212     
       
  2213     if(MPXHarvesting)
       
  2214         {
       
  2215         //MTP or MPX harvesting active, allow longer flush -> bigger batch size
       
  2216         TN_DEBUG1("CThumbnailStore::FlushCacheTable() MTP sync, longer flush..");
       
  2217         OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable - MTP sync, longer flush.." );
       
  2218         aMaxFlushDelay = KMaxMTPFlushDelay;
       
  2219         }
       
  2220     
       
  2221     //1st item in batch    
       
  2222     if( iBatchItemCount == 1)
       
  2223         {
       
  2224         TN_DEBUG2("CThumbnailStore::FlushCacheTable() calculate new batch size iPreviousFlushDelay = %d", iPreviousFlushDelay);
       
  2225         OstTrace1( TRACE_NORMAL, DUP4_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable;iPreviousFlushDelay=%d", iPreviousFlushDelay );
       
  2226         //adjust batch size dynamically between min and max based on previous flush speed
       
  2227         if( iPreviousFlushDelay > 0 )
       
  2228             {
       
  2229             TReal32 aNewBatchFlushItemCount = aMaxFlushDelay / aPreviousFlushDelay * aBatchFlushItemCount;
       
  2230             iBatchFlushItemCount = (TInt)aNewBatchFlushItemCount;
       
  2231 
       
  2232             TN_DEBUG2("CThumbnailStore::FlushCacheTable() aMaxFlushDelay %e", aMaxFlushDelay);      
       
  2233             OstTrace1( TRACE_NORMAL, DUP5_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable;aMaxFlushDelay=%d", aMaxFlushDelay );
       
  2234             TN_DEBUG2("CThumbnailStore::FlushCacheTable() aPreviousFlushDelay %e", aPreviousFlushDelay);      
       
  2235 			OstTrace1( TRACE_NORMAL, DUP6_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable;aPreviousFlushDelay=%d", aPreviousFlushDelay );
       
  2236 			TN_DEBUG2("CThumbnailStore::FlushCacheTable() aBatchFlushItemCount %e", aBatchFlushItemCount);      
       
  2237             OstTrace1( TRACE_NORMAL, DUP7_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable;aBatchFlushItemCount=%d", aBatchFlushItemCount );
       
  2238             TN_DEBUG2("CThumbnailStore::FlushCacheTable() aNewBatchFlushItemCount %e", aNewBatchFlushItemCount);
       
  2239             OstTrace1( TRACE_NORMAL, DUP8_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable;aNewBatchFlushItemCount=%d", aNewBatchFlushItemCount );
       
  2240             TN_DEBUG2("CThumbnailStore::FlushCacheTable() iBatchFlushItemCount %d", iBatchFlushItemCount);
       
  2241             OstTrace1( TRACE_NORMAL, DUP9_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable;iBatchFlushItemCount=%d", iBatchFlushItemCount );
       
  2242             
       
  2243             if( iBatchFlushItemCount < KMInBatchItems )
       
  2244                 {
       
  2245                 iBatchFlushItemCount = KMInBatchItems;
       
  2246                 }
       
  2247             else if( iBatchFlushItemCount > KMaxBatchItems )
       
  2248                 {
       
  2249                 iBatchFlushItemCount = KMaxBatchItems;
       
  2250                 }
       
  2251             }
       
  2252         else
       
  2253             {
       
  2254             //cannot calculate, init values set to min
       
  2255             iBatchFlushItemCount = KMInBatchItems;
       
  2256             }
       
  2257         }
       
  2258     
       
  2259     TN_DEBUG3("CThumbnailStore::FlushCacheTable() iBatchFlushItemCount = %d, iBatchItemCount = %d", iBatchFlushItemCount, iBatchItemCount);
       
  2260     OstTrace0( TRACE_NORMAL, DUP10_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable" );
       
  2261     
       
  2262     if( iBatchItemCount < iBatchFlushItemCount && !aForce)
       
  2263        {
       
  2264        //some items in cache
       
  2265        StartAutoFlush();
       
  2266        return;
       
  2267        }    
       
  2268     
       
  2269     iStartFlush.UniversalTime();
       
  2270     
       
  2271     // Move data from temp table to main....
       
  2272     TInt err_begin = iDatabase.Exec( KThumbnailBeginTransaction );
       
  2273     TN_DEBUG2("CThumbnailStore::FlushCacheTable() KThumbnailBeginTransaction %d", err_begin);
       
  2274     OstTrace1( TRACE_NORMAL, DUP11_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable - KThumbnailBeginTransaction;err_begin=%d", err_begin );
       
  2275     
       
  2276     TInt err_tempinfo = iDatabase.Exec( KThumbnailMoveFromTempInfoToMainTable );
       
  2277     TN_DEBUG2("CThumbnailStore::FlushCacheTable() KThumbnailMoveFromTempInfoToMainTable %d", err_tempinfo);
       
  2278     OstTrace1( TRACE_NORMAL, DUP12_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable - KThumbnailMoveFromTempInfoToMainTable;err_tempinfo=%d", err_tempinfo );
       
  2279     
       
  2280 #ifdef _DEBUG
       
  2281     if(err_tempinfo < 0)
       
  2282         {
       
  2283         TPtrC errorMsg = iDatabase.LastErrorMessage();
       
  2284         TN_DEBUG2( "CThumbnailStore::FlushCacheTable() lastError %S", &errorMsg);
       
  2285         OstTraceExt1( TRACE_NORMAL, DUP13_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable - lastError;errorMsg=%S", errorMsg );
       
  2286         }
       
  2287 #endif
       
  2288     
       
  2289     TInt err_tempdata = iDatabase.Exec( KThumbnailMoveFromTempDataToMainTable );
       
  2290     
       
  2291 #ifdef _DEBUG
       
  2292     if(err_tempdata < 0)
       
  2293         {
       
  2294         TPtrC errorMsg2 = iDatabase.LastErrorMessage();
       
  2295         TN_DEBUG2( "CThumbnailStore::FlushCacheTable() KThumbnailMoveFromTempDataToMainTable %S", &errorMsg2);
       
  2296         OstTraceExt1( TRACE_NORMAL, DUP14_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable - KThumbnailMoveFromTempDataToMainTable;errorMsg2=%S", errorMsg2 );
       
  2297         }
       
  2298 #endif
       
  2299     
       
  2300     TInt err_delinfo = iDatabase.Exec( KThumbnailDeleteFromTempInfoTable );
       
  2301     TN_DEBUG2("CThumbnailStore::FlushCacheTable() KThumbnailDeleteFromTempInfoTable %d", err_delinfo);
       
  2302     OstTrace1( TRACE_NORMAL, DUP15_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable - KThumbnailDeleteFromTempInfoTable;err_delinfo=%d", err_delinfo );
       
  2303     
       
  2304     TInt err_deldata = iDatabase.Exec( KThumbnailDeleteFromTempDataTable );
       
  2305     TN_DEBUG2("CThumbnailStore::FlushCacheTable() KThumbnailDeleteFromTempDataTable %d", err_deldata);
       
  2306     OstTrace1( TRACE_NORMAL, DUP16_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable;err_deldata=%d", err_deldata );
       
  2307    
       
  2308     if( err_tempinfo < 0 || err_tempdata < 0  || err_delinfo < 0  || err_deldata < 0 )
       
  2309         {
       
  2310         TInt err = iDatabase.Exec( KThumbnailRollbackTransaction );
       
  2311         TN_DEBUG2("CThumbnailStore::FlushCacheTable() KThumbnailRollbackTransaction %d", err);
       
  2312         OstTrace1( TRACE_NORMAL, DUP17_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable - KThumbnailRollbackTransaction;err=%d", err );
       
  2313         }
       
  2314     else
       
  2315         {
       
  2316         TInt err_commit = iDatabase.Exec( KThumbnailCommitTransaction );
       
  2317         TN_DEBUG2("CThumbnailStore::FlushCacheTable() KThumbnailCommitTransaction %d", err_commit);
       
  2318         OstTrace0( TRACE_NORMAL, DUP18_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable" );
       
  2319         }
       
  2320     
       
  2321     // db got corrupted
       
  2322     if(err_tempinfo == KSqlErrCorrupt || err_tempinfo == KErrCorrupt ||
       
  2323        err_tempdata == KSqlErrCorrupt || err_tempdata == KErrCorrupt)
       
  2324         {
       
  2325         TN_DEBUG1("CThumbnailStore::FlushCacheTable() db corrupted");
       
  2326         OstTrace0( TRACE_NORMAL, DUP19_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable - db corrupted" );
       
  2327     
       
  2328         // open new
       
  2329         TRAP_IGNORE(OpenDatabaseL(ETrue));
       
  2330         }
       
  2331    
       
  2332     iStopFlush.UniversalTime();
       
  2333     iPreviousFlushDelay = (TInt)iStopFlush.MicroSecondsFrom(iStartFlush).Int64()/1000;
       
  2334     
       
  2335     TN_DEBUG2( "CThumbnailStore::FlushCacheTable() took %d ms", iPreviousFlushDelay);
       
  2336     OstTrace1( TRACE_NORMAL, DUP20_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable - took ms ;iPreviousFlushDelay=%d", iPreviousFlushDelay );
       
  2337         
       
  2338     //cache flushed
       
  2339     iBatchItemCount = 0;
       
  2340 
       
  2341     TN_DEBUG1("CThumbnailStore::FlushCacheTable() out");
       
  2342     OstTrace0( TRACE_NORMAL, DUP21_CTHUMBNAILSTORE_FLUSHCACHETABLE, "CThumbnailStore::FlushCacheTable - out" );
       
  2343     }
       
  2344 
       
  2345 // -----------------------------------------------------------------------------
       
  2346 // StartAutoFlush()
       
  2347 // -----------------------------------------------------------------------------
       
  2348 //
       
  2349 void CThumbnailStore::StartAutoFlush()
       
  2350     {
       
  2351     TN_DEBUG1( "CThumbnailStore::StartAutoFlush()" );
       
  2352     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_STARTAUTOFLUSH, "CThumbnailStore::StartAutoFlush" );
       
  2353     if(iReadOnly)
       
  2354         {
       
  2355         TN_DEBUG1( "CThumbnailStore::StartAutoFlush() read only, skip..." );
       
  2356         return;
       
  2357         }
       
  2358     
       
  2359     TInt err = KErrNone;
       
  2360     
       
  2361     if( iAutoFlushTimer )
       
  2362         {
       
  2363         iAutoFlushTimer->Cancel();
       
  2364         }
       
  2365     else
       
  2366         {
       
  2367         TRAP(err, iAutoFlushTimer = CPeriodic::NewL(CActive::EPriorityIdle) );
       
  2368         }
       
  2369     
       
  2370     if (err != KErrNone)
       
  2371         {
       
  2372         TN_DEBUG2( "CThumbnailStore::StartAutoFlush() - Error creating timer (%d)", err );
       
  2373         OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_STARTAUTOFLUSH, "CThumbnailStore::StartAutoFlush - - Error creating timer;err=%d", err );
       
  2374         }
       
  2375     else
       
  2376         {
       
  2377         iAutoFlushTimer->Start( KAutoFlushTimeout * 1000000, KAutoFlushTimeout * 1000000, 
       
  2378                                 TCallBack(AutoFlushTimerCallBack, this));
       
  2379         }
       
  2380     }
       
  2381 
       
  2382 // -----------------------------------------------------------------------------
       
  2383 // StopAutoFlush()
       
  2384 // -----------------------------------------------------------------------------
       
  2385 //
       
  2386 void CThumbnailStore::StopAutoFlush()
       
  2387     {
       
  2388     TN_DEBUG1( "CThumbnailStore::StopAutoFlush()" );
       
  2389     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_STOPAUTOFLUSH, "CThumbnailStore::StopAutoFlush" );
       
  2390     if( iAutoFlushTimer )
       
  2391         {
       
  2392         iAutoFlushTimer->Cancel();
       
  2393         }
       
  2394     }
       
  2395 
       
  2396 // -----------------------------------------------------------------------------
       
  2397 // StartMaintenance()
       
  2398 // -----------------------------------------------------------------------------
       
  2399 //
       
  2400 void CThumbnailStore::StartMaintenance()
       
  2401     {
       
  2402     TN_DEBUG1( "CThumbnailStore::StartMaintenance()");
       
  2403     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_STARTMAINTENANCE, "CThumbnailStore::StartMaintenance" );
       
  2404     TInt err = KErrNone;
       
  2405     
       
  2406     if( iMaintenanceTimer && iMaintenanceTimer->IsActive() )
       
  2407         {
       
  2408         return;
       
  2409         }
       
  2410     else if (!iMaintenanceTimer)
       
  2411         {
       
  2412         TRAP(err, iMaintenanceTimer = CPeriodic::NewL(CActive::EPriorityIdle) );
       
  2413         }
       
  2414     
       
  2415     if (err != KErrNone && !iMaintenanceTimer)
       
  2416         {
       
  2417         TN_DEBUG2( "CThumbnailStore::StartMaintenanceTimer() - Error creating timer (%d)", err );
       
  2418         OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_STARTMAINTENANCE, "CThumbnailStore::StartMaintenance - Error creating timer ;err=%d", err );
       
  2419         }
       
  2420     else
       
  2421         {
       
  2422         iMaintenanceTimer->Start( KStoreMaintenancePeriodic, KStoreMaintenancePeriodic, 
       
  2423                                   TCallBack(MaintenanceTimerCallBack, this));
       
  2424         }
       
  2425     }
       
  2426 
       
  2427 // ---------------------------------------------------------------------------
       
  2428 // CThumbnailStore::AutoFlushTimerCallBack()
       
  2429 // ---------------------------------------------------------------------------
       
  2430 //
       
  2431 TInt CThumbnailStore::AutoFlushTimerCallBack(TAny* aAny)
       
  2432     {
       
  2433     TN_DEBUG1( "CThumbnailStore::AutoFlushTimerCallBack()");
       
  2434     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_AUTOFLUSHTIMERCALLBACK, "CThumbnailStore::AutoFlushTimerCallBack" );
       
  2435     CThumbnailStore* self = static_cast<CThumbnailStore*>( aAny );
       
  2436     
       
  2437     self->FlushCacheTable(ETrue);
       
  2438 
       
  2439     return KErrNone; // Return value ignored by CPeriodic
       
  2440     }
       
  2441 
       
  2442 // ---------------------------------------------------------------------------
       
  2443 // CThumbnailStore::MaintenanceTimerCallBack()
       
  2444 // ---------------------------------------------------------------------------
       
  2445 //
       
  2446 TInt CThumbnailStore::MaintenanceTimerCallBack(TAny* aAny)
       
  2447     {
       
  2448     CThumbnailStore* self = static_cast<CThumbnailStore*>( aAny );
       
  2449  
       
  2450     self->iMaintenanceTimer->Cancel();
       
  2451     
       
  2452     TInt MPXHarvesting(0);
       
  2453     TInt DaemonProcessing(0);
       
  2454     TInt ret = RProperty::Get(KTAGDPSNotification, KMPXHarvesting, MPXHarvesting);
       
  2455     if(ret != KErrNone || MPXHarvesting)
       
  2456         {
       
  2457         TN_DEBUG3( "CThumbnailStore::MaintenanceTimerCallBack() KMPXHarvesting err == %d, MPXHarvesting == %d", ret, MPXHarvesting);
       
  2458         OstTraceExt2( TRACE_NORMAL, CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack;ret=%d;MPXHarvesting=%d", ret, MPXHarvesting );
       
  2459         self->iIdle = EFalse;
       
  2460         }
       
  2461     TN_DEBUG2( "CThumbnailStore::MaintenanceTimerCallBack() KMPXHarvesting == %d", MPXHarvesting);
       
  2462     OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack;MPXHarvesting=%d", MPXHarvesting );
       
  2463 
       
  2464     ret = RProperty::Get(KTAGDPSNotification, KDaemonProcessing, DaemonProcessing);
       
  2465     if(ret != KErrNone || DaemonProcessing)
       
  2466         {
       
  2467         TN_DEBUG3( "CThumbnailStore::MaintenanceTimerCallBack() KDaemonProcessing err == %d, DaemonProcessing == %d", ret, DaemonProcessing);
       
  2468         OstTraceExt2( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack;ret=%d;DaemonProcessing=%d", ret, DaemonProcessing );
       
  2469         self->iIdle = EFalse;
       
  2470         }
       
  2471     TN_DEBUG2( "CThumbnailStore::MaintenanceTimerCallBack() DaemonProcessing == %d", DaemonProcessing);
       
  2472     OstTrace1( TRACE_NORMAL, DUP3_CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack;DaemonProcessing=%d", DaemonProcessing );
       
  2473     
       
  2474     if (self->iIdle)
       
  2475         {
       
  2476         TN_DEBUG2( "CThumbnailStore::MaintenanceTimerCallBack() - maintenance, store %d", self->iDrive);
       
  2477         OstTrace1( TRACE_NORMAL, DUP4_CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack - maintenance, store;self->iDrive=%d", self->iDrive );
       
  2478     
       
  2479         // thumbmnail deletion
       
  2480         if (self->iDeleteThumbs)
       
  2481             {
       
  2482             TN_DEBUG1( "CThumbnailStore::MaintenanceTimerCallBack() - cleanup");
       
  2483             OstTrace0( TRACE_NORMAL, DUP5_CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack - cleanup" );
       
  2484         
       
  2485             TInt deleteCount = 0;
       
  2486             
       
  2487             // delete marked rows from database
       
  2488             TRAPD( err, deleteCount = self->DeleteMarkedL() );
       
  2489             if (err != KErrNone)
       
  2490                 {
       
  2491                 TN_DEBUG2( "CThumbnailStore::MaintenanceTimerCallBack() - cleanup failed, err %d", err);
       
  2492                 OstTrace1( TRACE_NORMAL, DUP6_CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack - cleanup failed;err=%d", err );
       
  2493                 return err;
       
  2494                 }
       
  2495             
       
  2496             // no more marked rows
       
  2497             if (deleteCount < KStoreMaintenanceDeleteLimit || deleteCount == 0)
       
  2498                 {
       
  2499                 TN_DEBUG2( "CThumbnailStore::MaintenanceTimerCallBack() - cleanup finished, store %d", self->iDrive);
       
  2500                 OstTrace1( TRACE_NORMAL, DUP7_CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack - cleanup finished, store;self->iDrive=%d", self->iDrive );
       
  2501                 self->iDeleteThumbs = EFalse;
       
  2502                 }     
       
  2503             }
       
  2504         
       
  2505         // file existence check
       
  2506         else if (self->iCheckFilesExist)
       
  2507             {
       
  2508             TN_DEBUG1( "CThumbnailStore::MaintenanceTimerCallBack() - file existence check");
       
  2509             OstTrace0( TRACE_NORMAL, DUP8_CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack - file existence check" );
       
  2510         
       
  2511             TBool finished = EFalse;
       
  2512         
       
  2513             TRAPD( err, finished = self->FileExistenceCheckL() );
       
  2514             if (err != KErrNone)
       
  2515                 {
       
  2516                 TN_DEBUG2( "CThumbnailStore::MaintenanceTimerCallBack() - file existence check failed, err %d", err);
       
  2517                 OstTrace1( TRACE_NORMAL, DUP9_CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack - file existence check failed;err=%d", err );
       
  2518                 return err;
       
  2519                 }
       
  2520         
       
  2521             // all files checked.
       
  2522             if (finished)
       
  2523                 {
       
  2524                 TN_DEBUG2( "CThumbnailStore::MaintenanceTimerCallBack() - file existence check finished, store %d", self->iDrive);
       
  2525                 OstTrace1( TRACE_NORMAL, DUP10_CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack - file existence check finished, store;self->iDrive=%d", self->iDrive );
       
  2526                 self->iCheckFilesExist = EFalse;
       
  2527                 }
       
  2528             }
       
  2529         
       
  2530         // next round
       
  2531         if (self->iIdle && ( self->iDeleteThumbs || self->iCheckFilesExist) )
       
  2532             {
       
  2533             TN_DEBUG1( "CThumbnailStore::MaintenanceTimerCallBack() - continue maintenance");
       
  2534             OstTrace0( TRACE_NORMAL, DUP11_CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack - continue maintenance" );
       
  2535             self->StartMaintenance();
       
  2536             }  
       
  2537         else if (!self->iDeleteThumbs && !self->iCheckFilesExist)
       
  2538             {
       
  2539             TN_DEBUG1( "CThumbnailStore::MaintenanceTimerCallBack() - no more maintenance");
       
  2540             OstTrace0( TRACE_NORMAL, DUP12_CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack - no more maintenance" );
       
  2541         
       
  2542             // no need to monitor activity anymore
       
  2543             self->iActivityManager->Cancel();
       
  2544             }
       
  2545         }
       
  2546     else
       
  2547         {
       
  2548         TN_DEBUG1( "CThumbnailStore::MaintenanceTimerCallBack() - device not idle");
       
  2549         OstTrace0( TRACE_NORMAL, DUP13_CTHUMBNAILSTORE_MAINTENANCETIMERCALLBACK, "CThumbnailStore::MaintenanceTimerCallBack - device not idle" );
       
  2550         }
       
  2551 
       
  2552     return KErrNone; // Return value ignored by CPeriodic
       
  2553     }
       
  2554 
       
  2555 TBool CThumbnailStore::CheckModifiedByPathL( const TDesC& aPath, const TInt64 aModified, TBool& modifiedChanged )
       
  2556     {
       
  2557     TN_DEBUG2( "CThumbnailStore::CheckModifiedByPathL() %S", &aPath);
       
  2558     OstTraceExt1( TRACE_NORMAL, CTHUMBNAILSTORE_CHECKMODIFIEDBYPATHL, "CThumbnailStore::CheckModifiedByPathL;aPath=%S", aPath );
       
  2559     
       
  2560     if(iReadOnly)
       
  2561     	{
       
  2562     	TN_DEBUG1( "CThumbnailStore::CheckModifiedByPathL() read only, skip..." );
       
  2563 		modifiedChanged = EFalse;
       
  2564     	return ETrue;
       
  2565     	}
       
  2566 	
       
  2567     User::LeaveIfError( CheckDbState() );
       
  2568     
       
  2569     HBufC* path = aPath.AllocLC();
       
  2570     TPtr ptr(path->Des());
       
  2571     StripDriveLetterL( ptr );
       
  2572 	
       
  2573     TBool ret(EFalse);
       
  2574 
       
  2575     modifiedChanged = EFalse;
       
  2576 
       
  2577     TInt column = 0;
       
  2578    
       
  2579     RSqlStatement* stmt = NULL;
       
  2580     stmt = &iStmt_KThumbnailSelectTempModifiedByPath;
       
  2581     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  2582    
       
  2583     TInt paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  2584     User::LeaveIfError( paramIndex );
       
  2585     User::LeaveIfError( stmt->BindText( paramIndex, *path ));
       
  2586     
       
  2587     TInt rowStatus = stmt->Next();
       
  2588    
       
  2589     TBool checkMain = EFalse;
       
  2590    
       
  2591     TN_DEBUG1( "CThumbnailStore::CheckModifiedL() -- temp" );
       
  2592     OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_CHECKMODIFIEDBYPATHL, "CThumbnailStore::CheckModifiedByPathL -- temp" );
       
  2593    
       
  2594     while(rowStatus == KSqlAtRow || !checkMain)
       
  2595         {
       
  2596         if(rowStatus == KSqlAtRow)
       
  2597             {
       
  2598             ret = ETrue;
       
  2599             TInt64 oldModified = stmt->ColumnInt64( column );
       
  2600            
       
  2601             TN_DEBUG2( "CThumbnailStore::CheckModifiedL() -- timestamp old %Ld", oldModified);
       
  2602             OstTraceExt1( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_CHECKMODIFIEDBYPATHL, "CThumbnailStore::CheckModifiedByPathL -- timestamp old;oldModified=%Ld", oldModified );
       
  2603             TN_DEBUG2( "CThumbnailStore::CheckModifiedL() -- timestamp mds %Ld", aModified);
       
  2604             OstTraceExt1( TRACE_NORMAL, DUP3_CTHUMBNAILSTORE_CHECKMODIFIEDBYPATHL, "CThumbnailStore::CheckModifiedByPathL -- timestamp mds;aModified=%Ld", aModified );
       
  2605           
       
  2606             if (oldModified < aModified)
       
  2607                 {
       
  2608                 TN_DEBUG1( "CThumbnailStore::CheckModifiedL() -- timestamp is newer than original" );
       
  2609                 OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSTORE_CHECKMODIFIEDBYPATHL, "CThumbnailStore::CheckModifiedByPathL -- timestamp is newer than original" );
       
  2610                 modifiedChanged = ETrue;
       
  2611                 break;
       
  2612                 }
       
  2613             else if (oldModified > aModified)
       
  2614                 {
       
  2615                 TN_DEBUG1( "CThumbnailStore::CheckModifiedL() -- timestamp is older than original" );
       
  2616                 OstTrace0( TRACE_NORMAL, DUP5_CTHUMBNAILSTORE_CHECKMODIFIEDBYPATHL, "CThumbnailStore::CheckModifiedByPathL -- timestamp is older than original" );
       
  2617                 }
       
  2618             else if (oldModified == aModified)
       
  2619                 {
       
  2620                 TN_DEBUG1( "CThumbnailStore::CheckModifiedL() -- timestamp is the same as original" );
       
  2621                 OstTrace0( TRACE_NORMAL, DUP6_CTHUMBNAILSTORE_CHECKMODIFIEDBYPATHL, "CThumbnailStore::CheckModifiedByPathL -- timestamp is the same as original" );
       
  2622                 }
       
  2623             
       
  2624             rowStatus = stmt->Next();
       
  2625             }
       
  2626        
       
  2627         //switch to main table if modified not found from temp
       
  2628         if(rowStatus != KSqlAtRow && !checkMain && !modifiedChanged)
       
  2629             {
       
  2630             TN_DEBUG1( "CThumbnailStore::CheckModifiedL() -- main" );
       
  2631             OstTrace0( TRACE_NORMAL, DUP7_CTHUMBNAILSTORE_CHECKMODIFIEDBYPATHL, "CThumbnailStore::CheckModifiedByPathL -- main" );
       
  2632             //come here only once
       
  2633             checkMain = ETrue;
       
  2634            
       
  2635             CleanupStack::PopAndDestroy( stmt );
       
  2636             stmt = &iStmt_KThumbnailSelectModifiedByPath;
       
  2637             CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  2638            
       
  2639             paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath );
       
  2640             User::LeaveIfError( paramIndex );
       
  2641             User::LeaveIfError( stmt->BindText( paramIndex, *path ));
       
  2642             
       
  2643             rowStatus = stmt->Next();
       
  2644             }
       
  2645         }
       
  2646     
       
  2647     CleanupStack::PopAndDestroy( stmt );   
       
  2648     CleanupStack::PopAndDestroy( path );
       
  2649    
       
  2650     return ret;
       
  2651 }
       
  2652 	
       
  2653 
       
  2654 // -----------------------------------------------------------------------------
       
  2655 // IsReadOnly()
       
  2656 // -----------------------------------------------------------------------------
       
  2657 //
       
  2658 TBool CThumbnailStore::IsReadOnly()
       
  2659     {
       
  2660     return iReadOnly;
       
  2661     }
       
  2662 
       
  2663 // -----------------------------------------------------------------------------
       
  2664 // PrepareBlacklistedItemsForRetryL()
       
  2665 // -----------------------------------------------------------------------------
       
  2666 //
       
  2667 void CThumbnailStore::PrepareBlacklistedItemsForRetryL()
       
  2668     {
       
  2669     TN_DEBUG1( "CThumbnailStore::PrepareBlacklistedItemsForRetry()" );
       
  2670     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_PREPAREBLACKLISTEDITEMSFORRETRYL, "CThumbnailStore::PrepareBlacklistedItemsForRetryL" );
       
  2671     
       
  2672     RSqlStatement stmt;
       
  2673     CleanupClosePushL( stmt );
       
  2674 
       
  2675     User::LeaveIfError( stmt.Prepare( iDatabase, KThumbnailTouchBlacklistedRows ));
       
  2676     
       
  2677     TInt paramIndex = stmt.ParameterIndex( KThumbnailSqlParamFlag );
       
  2678     User::LeaveIfError( paramIndex );
       
  2679     User::LeaveIfError( stmt.BindInt( paramIndex, KThumbnailDbFlagBlacklisted ));
       
  2680     TInt err = stmt.Exec();
       
  2681    
       
  2682     TN_DEBUG2( "CThumbnailStore::PrepareBlacklistedItemsForRetryL() - main table, err=%d", err );
       
  2683     OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_PREPAREBLACKLISTEDITEMSFORRETRYL, "CThumbnailStore::PrepareBlacklistedItemsForRetryL - main table;err=%d", err );
       
  2684     
       
  2685     CleanupStack::PopAndDestroy( &stmt );
       
  2686     }
       
  2687 
       
  2688 // -----------------------------------------------------------------------------
       
  2689 // DeleteMarkedL()
       
  2690 // -----------------------------------------------------------------------------
       
  2691 //
       
  2692 TInt CThumbnailStore::DeleteMarkedL()
       
  2693     {
       
  2694     TN_DEBUG1( "CThumbnailStore::DeleteMarkedL()" );
       
  2695     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_DELETEMARKEDL, "CThumbnailStore::DeleteMarkedL" );
       
  2696     if(iReadOnly)
       
  2697         {
       
  2698         TN_DEBUG1( "CThumbnailStore::DeleteMarkedL() read only, skip..." );
       
  2699         return KErrAccessDenied;
       
  2700         }
       
  2701    
       
  2702 #ifdef _DEBUG
       
  2703     TTime aStart, aStop;
       
  2704     aStart.UniversalTime();
       
  2705 #endif
       
  2706     
       
  2707     User::LeaveIfError( CheckDbState() );
       
  2708     
       
  2709     TInt paramIndex = 0;
       
  2710     TInt paramIndex1 = 0;
       
  2711     TInt paramIndex2 = 0;
       
  2712     TInt rowStatus = 0;
       
  2713     TInt column = 0;
       
  2714     TInt64 rowid = 0;
       
  2715     TInt deleteCount = 0;
       
  2716       
       
  2717     RThumbnailTransaction transaction( iDatabase );
       
  2718     CleanupClosePushL( transaction );
       
  2719     transaction.BeginL();
       
  2720     
       
  2721     RSqlStatement* stmt = NULL;
       
  2722     RSqlStatement* stmt_info = NULL;
       
  2723     RSqlStatement* stmt_infodata = NULL;
       
  2724     
       
  2725     stmt = &iStmt_KThumbnailSqlSelectMarked;
       
  2726     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  2727     stmt_info = &iStmt_KThumbnailSqlDeleteInfoByRowID;
       
  2728     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt_info));    
       
  2729     stmt_infodata = &iStmt_KThumbnailSqlDeleteInfoDataByRowID;
       
  2730     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt_infodata));
       
  2731     
       
  2732     // select marked rows
       
  2733     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamLimit );
       
  2734     User::LeaveIfError( paramIndex );
       
  2735     User::LeaveIfError( stmt->BindInt( paramIndex, KStoreMaintenanceDeleteLimit ));
       
  2736              
       
  2737     rowStatus = stmt->Next();  
       
  2738            
       
  2739     while(rowStatus == KSqlAtRow)
       
  2740        { 
       
  2741        rowid = stmt->ColumnInt64( column ); 
       
  2742        paramIndex1 = stmt_info->ParameterIndex( KThumbnailSqlParamRowID );
       
  2743        User::LeaveIfError( paramIndex1 );
       
  2744        User::LeaveIfError( stmt_info->BindInt64( paramIndex1, rowid ));
       
  2745               
       
  2746        TInt err = stmt_info->Exec();
       
  2747        stmt_info->Reset();
       
  2748        User::LeaveIfError( err );
       
  2749                     
       
  2750        paramIndex2 = stmt_infodata->ParameterIndex( KThumbnailSqlParamRowID );  
       
  2751        User::LeaveIfError( paramIndex2 );
       
  2752        User::LeaveIfError( stmt_infodata->BindInt64( paramIndex2, rowid ));
       
  2753                     
       
  2754        err = stmt_infodata->Exec();
       
  2755        stmt_infodata->Reset();
       
  2756        User::LeaveIfError( err );
       
  2757        deleteCount++;
       
  2758        
       
  2759        TN_DEBUG1( "CThumbnailStore::DeleteMarkedL() - thumbnail deleted" );
       
  2760        OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_DELETEMARKEDL, "CThumbnailStore::DeleteMarkedL - thumbnail deleted" );
       
  2761        
       
  2762        rowStatus = stmt->Next();
       
  2763        }
       
  2764         
       
  2765     CleanupStack::PopAndDestroy( stmt_infodata );
       
  2766     CleanupStack::PopAndDestroy( stmt_info );
       
  2767     CleanupStack::PopAndDestroy( stmt );    
       
  2768     
       
  2769     // remove successfully deleted paths from Deleted table
       
  2770     if (deleteCount > 0)
       
  2771         {
       
  2772         User::LeaveIfError( iDatabase.Exec( KThumbnailSqlDeleteFromDeleted ) ); 
       
  2773         }
       
  2774     
       
  2775     transaction.CommitL();
       
  2776     CleanupStack::PopAndDestroy( &transaction );
       
  2777     
       
  2778 #ifdef _DEBUG
       
  2779     aStop.UniversalTime();
       
  2780     TInt tookTime = (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000;
       
  2781     TN_DEBUG2( "CThumbnailStore::DeleteMarkedL() took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000);
       
  2782     OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_DELETEMARKEDL, "CThumbnailStore::DeleteMarkedL - took ms;tookTime=%d", tookTime );
       
  2783 #endif
       
  2784     
       
  2785     return deleteCount;
       
  2786     }
       
  2787 
       
  2788 // -----------------------------------------------------------------------------
       
  2789 // FileExistenceCheckL()
       
  2790 // -----------------------------------------------------------------------------
       
  2791 //
       
  2792 TInt CThumbnailStore::FileExistenceCheckL()
       
  2793     {
       
  2794     TN_DEBUG1( "CThumbnailStore::FileExistenceCheckL()" );
       
  2795     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_FILEEXISTENCECHECKL, "CThumbnailStore::FileExistenceCheckL" );
       
  2796     if(iReadOnly)
       
  2797 		{
       
  2798 		TN_DEBUG1( "CThumbnailStore::FileExistenceCheckL() read only, skip..." );
       
  2799 		return ETrue;
       
  2800 		}
       
  2801     
       
  2802 #ifdef _DEBUG
       
  2803     TTime aStart, aStop;
       
  2804     aStart.UniversalTime();
       
  2805 #endif
       
  2806     
       
  2807     User::LeaveIfError( CheckDbState() );
       
  2808     
       
  2809     TInt paramIndex = 0;
       
  2810     TInt rowStatus = 0; 
       
  2811     TInt column = 0;
       
  2812     TInt64 rowid = 0;
       
  2813     TFileName path;
       
  2814     TFileName prevPath;
       
  2815     TFileName full;
       
  2816     TInt count = 0;
       
  2817     
       
  2818     TBool finished = EFalse;
       
  2819     
       
  2820     RThumbnailTransaction transaction( iDatabase );
       
  2821     CleanupClosePushL( transaction );    
       
  2822     transaction.BeginL();
       
  2823     
       
  2824     // get rows    
       
  2825     RSqlStatement* stmt = NULL;
       
  2826     stmt = &iStmt_KThumbnailSelectAllPaths;
       
  2827     CleanupStack::PushL(TCleanupItem(ResetStatement, stmt));
       
  2828     
       
  2829     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamRowID );
       
  2830     User::LeaveIfError( paramIndex );
       
  2831     User::LeaveIfError( stmt->BindInt64( paramIndex, iLastCheckedRowID ));
       
  2832     
       
  2833     paramIndex = stmt->ParameterIndex( KThumbnailSqlParamLimit );
       
  2834     User::LeaveIfError( paramIndex );
       
  2835     User::LeaveIfError( stmt->BindInt( paramIndex, KStoreMaintenanceExistLimit ));
       
  2836              
       
  2837     rowStatus = stmt->Next();     
       
  2838            
       
  2839     while(rowStatus == KSqlAtRow)
       
  2840         {
       
  2841         column = 0;
       
  2842         path.Zero();
       
  2843         
       
  2844         rowid = stmt->ColumnInt64( column++ );
       
  2845         stmt->ColumnText( column, path );
       
  2846     
       
  2847         full.Zero();
       
  2848         full.Append(iDriveChar);
       
  2849         full.Append(KDrv);
       
  2850         full.Append(path);
       
  2851         
       
  2852         // if path matches previous one, skip
       
  2853         if (path.CompareF(prevPath) != 0)
       
  2854             {
       
  2855             // file doesn't exist anymore, mark thumbs deleted
       
  2856             if(!BaflUtils::FileExists( iFs, full ))
       
  2857                 {
       
  2858                 TN_DEBUG2( "CThumbnailStore::FileExistenceCheckL(%S) - not found", &full );
       
  2859                 DeleteThumbnailsL(path, EFalse, EFalse);                    
       
  2860                 }
       
  2861             
       
  2862             prevPath.Zero();
       
  2863             prevPath.Append(path);
       
  2864             }
       
  2865         
       
  2866         iLastCheckedRowID = rowid;
       
  2867         count++;
       
  2868        
       
  2869         // get next
       
  2870         rowStatus = stmt->Next();
       
  2871         }
       
  2872     
       
  2873     if (count < KStoreMaintenanceExistLimit)
       
  2874         {
       
  2875         // all rows checked
       
  2876         finished = ETrue;
       
  2877         }
       
  2878         
       
  2879     CleanupStack::PopAndDestroy( stmt );    
       
  2880     
       
  2881     transaction.CommitL();
       
  2882     CleanupStack::PopAndDestroy( &transaction );
       
  2883     
       
  2884 #ifdef _DEBUG
       
  2885     aStop.UniversalTime();
       
  2886     TInt tookTime = (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000;
       
  2887     TN_DEBUG2( "CThumbnailStore::FileExistenceCheckL() took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000);
       
  2888     OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_FILEEXISTENCECHECKL, "CThumbnailStore::FileExistenceCheckL - took ms;tookTime=%d", tookTime );
       
  2889 #endif
       
  2890     
       
  2891     return finished;
       
  2892     }
       
  2893 
       
  2894 // -----------------------------------------------------------------------------
       
  2895 // StripDriveLetter
       
  2896 // -----------------------------------------------------------------------------
       
  2897 //
       
  2898 void CThumbnailStore::StripDriveLetterL( TDes& aPath )
       
  2899     {
       
  2900     TInt pos = aPath.Find(KDrv);
       
  2901     TInt pos2 = aPath.Find(KBackSlash);
       
  2902     
       
  2903     // if URI contains drive letter
       
  2904     if ( pos == 1 )
       
  2905         {
       
  2906         // normal URI
       
  2907         if ( pos2 == 2 )
       
  2908             {
       
  2909             aPath.Delete(0,pos+1);
       
  2910             }
       
  2911         // virtual URI
       
  2912         else
       
  2913             {
       
  2914             aPath.Replace(0,2,KBackSlash);
       
  2915             }
       
  2916         }
       
  2917     }
       
  2918 
       
  2919 // -----------------------------------------------------------------------------
       
  2920 // CheckDbState
       
  2921 // -----------------------------------------------------------------------------
       
  2922 //
       
  2923 TInt CThumbnailStore::CheckDbState()
       
  2924     {
       
  2925     if (iUnrecoverable && !iReadOnly)
       
  2926         {
       
  2927         TN_DEBUG1( "CThumbnailStore::CheckDbState() - database in unrecoverable state" );
       
  2928         OstTrace0( TRACE_NORMAL, CTHUMBNAILSTORE_CHECKDBSTATE, "CThumbnailStore::CheckDbState" );
       
  2929         __ASSERT_DEBUG( !iUnrecoverable, ThumbnailPanic( EThumbnailDatabaseUnrecoverable ));
       
  2930         
       
  2931         return KStoreUnrecoverableErr;
       
  2932         }
       
  2933     else
       
  2934         {
       
  2935         return KErrNone;
       
  2936         }
       
  2937     }
       
  2938 
       
  2939 void CThumbnailStore::HandleDiskSpaceNotificationL( TBool aDiskFull )
       
  2940     {
       
  2941     TN_DEBUG2( "CThumbnailStore::HandleDiskSpaceNotificationL() aDiskFull = %d", aDiskFull );
       
  2942     OstTrace1( TRACE_NORMAL, CTHUMBNAILSTORE_HANDLEDISKSPACENOTIFICATIONL, "CThumbnailStore::HandleDiskSpaceNotificationL;aDiskFull=%u", aDiskFull );
       
  2943     iDiskFull = aDiskFull;
       
  2944     }
       
  2945 
       
  2946 #ifdef _DEBUG
       
  2947 void CThumbnailStore::HandleDiskSpaceError(TInt aError )
       
  2948 #else
       
  2949 void CThumbnailStore::HandleDiskSpaceError(TInt /*aError*/ )
       
  2950 #endif
       
  2951     {
       
  2952     TN_DEBUG2( "CThumbnailStore::HandleDiskSpaceError() aError = %d", aError );
       
  2953 #ifdef _DEBUG
       
  2954     OstTrace1( TRACE_NORMAL, CTHUMBNAILSTORE_HANDLEDISKSPACEERROR, "CThumbnailStore::HandleDiskSpaceError;aError=%d", aError );
       
  2955 #endif
       
  2956     }
       
  2957 
       
  2958 TBool CThumbnailStore::IsDiskFull()
       
  2959     {
       
  2960     if(iReadOnly)
       
  2961         {
       
  2962         TN_DEBUG1( "CThumbnailStore::IsDiskFull() read only, skip..." );
       
  2963         return EFalse;
       
  2964         }
       
  2965     return iDiskFull;
       
  2966     }
       
  2967 
       
  2968 // -----------------------------------------------------------------------------
       
  2969 // ActivityDetected()
       
  2970 // -----------------------------------------------------------------------------
       
  2971 //
       
  2972 void CThumbnailStore::ActivityChanged(const TBool aActive)
       
  2973     {
       
  2974     TN_DEBUG2( "CThumbnailStore::ActivityChanged() aActive == %d", aActive);
       
  2975     OstTrace1( TRACE_NORMAL, CTHUMBNAILSTORE_ACTIVITYCHANGED, "CThumbnailStore::ActivityChanged;aActive=%u", aActive );
       
  2976     if( iReadOnly )
       
  2977         {
       
  2978         TN_DEBUG1( "CThumbnailStore::ActivityChanged() read only, skip..." );
       
  2979         return;
       
  2980         }
       
  2981     
       
  2982     if( aActive )
       
  2983         {
       
  2984         iIdle = EFalse;
       
  2985         }
       
  2986     else
       
  2987         {
       
  2988         TInt MPXHarvesting(0);
       
  2989         TInt DaemonProcessing(0);
       
  2990         
       
  2991         TInt ret = RProperty::Get(KTAGDPSNotification, KMPXHarvesting, MPXHarvesting);
       
  2992         if(ret != KErrNone || MPXHarvesting)
       
  2993             {
       
  2994             TN_DEBUG3( "CThumbnailStore::ActivityChanged() KMPXHarvesting err == %d, MPXHarvesting == %d", ret, MPXHarvesting);
       
  2995             OstTraceExt2( TRACE_NORMAL, DUP1_CTHUMBNAILSTORE_ACTIVITYCHANGED, "CThumbnailStore::ActivityChanged;ret=%d;MPXHarvesting=%d", ret, MPXHarvesting );
       
  2996             iIdle = EFalse;
       
  2997             return;
       
  2998             }
       
  2999         
       
  3000         ret = RProperty::Get(KTAGDPSNotification, KDaemonProcessing, DaemonProcessing);
       
  3001         if(ret != KErrNone || DaemonProcessing)
       
  3002             {
       
  3003             TN_DEBUG3( "CThumbnailStore::ActivityChanged() KDaemonProcessing err == %d DaemonProcessing == %d", ret, DaemonProcessing );
       
  3004             OstTraceExt2( TRACE_NORMAL, DUP2_CTHUMBNAILSTORE_ACTIVITYCHANGED, "CThumbnailStore::ActivityChanged - KDaemonProcessing;ret=%d;DaemonProcessing=%d", ret, DaemonProcessing );
       
  3005             iIdle = EFalse;
       
  3006             return;
       
  3007             }
       
  3008         
       
  3009         TN_DEBUG1( "CThumbnailStore::ActivityChanged() - starting maintenance");
       
  3010         OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSTORE_ACTIVITYCHANGED, "CThumbnailStore::ActivityChanged - starting maintenance" );
       
  3011         iIdle = ETrue;
       
  3012         StartMaintenance();
       
  3013         }
       
  3014     }
       
  3015 
       
  3016 
       
  3017 // -----------------------------------------------------------------------------
       
  3018 // CThumbnailStoreDiskSpaceNotifierAO class
       
  3019 // -----------------------------------------------------------------------------
       
  3020 //
       
  3021 CThumbnailStoreDiskSpaceNotifierAO* CThumbnailStoreDiskSpaceNotifierAO::NewL(
       
  3022         MThumbnailStoreDiskSpaceNotifierObserver& aObserver, TInt64 aThreshold, const TDesC& aFilename)
       
  3023     {
       
  3024     CThumbnailStoreDiskSpaceNotifierAO* self = 
       
  3025         CThumbnailStoreDiskSpaceNotifierAO::NewLC( aObserver, aThreshold, aFilename);
       
  3026     CleanupStack::Pop( self );
       
  3027     return self;
       
  3028     }
       
  3029 
       
  3030 CThumbnailStoreDiskSpaceNotifierAO* CThumbnailStoreDiskSpaceNotifierAO::NewLC(
       
  3031         MThumbnailStoreDiskSpaceNotifierObserver& aObserver, TInt64 aThreshold, const TDesC& aFilename)
       
  3032     {
       
  3033     TDriveNumber driveNumber = GetDriveNumberL( aFilename );
       
  3034     
       
  3035     CThumbnailStoreDiskSpaceNotifierAO* self = 
       
  3036         new ( ELeave ) CThumbnailStoreDiskSpaceNotifierAO( aObserver, aThreshold, driveNumber );
       
  3037     CleanupStack::PushL( self );
       
  3038     self->ConstructL();
       
  3039     return self;
       
  3040     }
       
  3041 
       
  3042 TDriveNumber CThumbnailStoreDiskSpaceNotifierAO::GetDriveNumberL( const TDesC& aFilename )
       
  3043     {
       
  3044     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::GetDriveNumberL()");
       
  3045     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTOREDISKSPACENOTIFIERAO_GETDRIVENUMBERL, "CThumbnailStoreDiskSpaceNotifierAO::GetDriveNumberL" );
       
  3046     TLex driveParser( aFilename );
       
  3047     
       
  3048     TChar driveChar = driveParser.Get();
       
  3049 
       
  3050     if( 0 == driveChar || TChar( ':' ) != driveParser.Peek() )
       
  3051         {
       
  3052         TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::GetDriveNumberL() KErrArgument");
       
  3053         OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTOREDISKSPACENOTIFIERAO_GETDRIVENUMBERL, "CThumbnailStoreDiskSpaceNotifierAO::GetDriveNumberL - KErrArgument" );
       
  3054         User::Leave( KErrArgument );
       
  3055         }
       
  3056         
       
  3057     TInt driveNumber;
       
  3058     
       
  3059     RFs::CharToDrive( driveChar, driveNumber );
       
  3060     
       
  3061     return (TDriveNumber)driveNumber;
       
  3062     }
       
  3063 
       
  3064 CThumbnailStoreDiskSpaceNotifierAO::~CThumbnailStoreDiskSpaceNotifierAO()
       
  3065     {
       
  3066     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::~CThumbnailStoreDiskSpaceNotifierAO()");
       
  3067     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTOREDISKSPACENOTIFIERAO_CTHUMBNAILSTOREDISKSPACENOTIFIERAO, "CThumbnailStoreDiskSpaceNotifierAO::~CThumbnailStoreDiskSpaceNotifierAO" );
       
  3068     Cancel();
       
  3069 
       
  3070     iFileServerSession.Close();
       
  3071     }
       
  3072 
       
  3073 void CThumbnailStoreDiskSpaceNotifierAO::RunL()
       
  3074     {   
       
  3075     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::RunL()");
       
  3076     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTOREDISKSPACENOTIFIERAO_RUNL, "CThumbnailStoreDiskSpaceNotifierAO::RunL" );
       
  3077     TVolumeInfo volumeInfo;
       
  3078 
       
  3079     if ( iState == CThumbnailStoreDiskSpaceNotifierAO::ENormal )
       
  3080         {
       
  3081         TInt status = iStatus.Int();
       
  3082         
       
  3083         TInt ret(KErrNone);
       
  3084         
       
  3085         switch( status )
       
  3086             {
       
  3087             case KErrNone:
       
  3088                 ret = iFileServerSession.Volume( volumeInfo, iDrive );
       
  3089                 
       
  3090                 if(!ret)
       
  3091                     {                  
       
  3092                     // Check if free space is less than threshold level
       
  3093                     if( volumeInfo.iFree < iThreshold )
       
  3094                         {
       
  3095                         TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::RunL() FULL");
       
  3096                         OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTOREDISKSPACENOTIFIERAO_RUNL, "CThumbnailStoreDiskSpaceNotifierAO::RunL - FULL" );
       
  3097                         iDiskFull = ETrue;
       
  3098                         iObserver.HandleDiskSpaceNotificationL( iDiskFull );
       
  3099                         iState = EIterate;
       
  3100                         iIterationCount = 0;
       
  3101                         SetActive();
       
  3102                         TRequestStatus* status = &iStatus;
       
  3103                         User::RequestComplete( status, KErrNone );
       
  3104                         return;
       
  3105                         }
       
  3106                     else
       
  3107                         {
       
  3108                         TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::RunL() NOT FULL");
       
  3109                         OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSTOREDISKSPACENOTIFIERAO_RUNL, "CThumbnailStoreDiskSpaceNotifierAO::RunL - NOT FULL" );
       
  3110                         iDiskFull = EFalse;
       
  3111                         iObserver.HandleDiskSpaceNotificationL( iDiskFull );
       
  3112                         }
       
  3113                     }
       
  3114                 else
       
  3115                     {
       
  3116                     TN_DEBUG2( "CThumbnailStoreDiskSpaceNotifierAO::RunL() error %d NOT FULL", ret);
       
  3117                     OstTrace1( TRACE_NORMAL, DUP3_CTHUMBNAILSTOREDISKSPACENOTIFIERAO_RUNL, "CThumbnailStoreDiskSpaceNotifierAO::RunL - NOT FULL;ret=%d", ret );
       
  3118                     iDiskFull = EFalse;
       
  3119                     iObserver.HandleDiskSpaceNotificationL( iDiskFull );
       
  3120                     User::Leave( ret );
       
  3121                     }
       
  3122                 
       
  3123                 StartNotifier();
       
  3124                 break;
       
  3125 
       
  3126             case KErrArgument:
       
  3127                 TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::RunL() KErrArgument");
       
  3128                 OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSTOREDISKSPACENOTIFIERAO_RUNL, "CThumbnailStoreDiskSpaceNotifierAO::RunL - KErrArgument" );
       
  3129                 User::Leave( status );
       
  3130                 break;
       
  3131             default:
       
  3132                 break;
       
  3133             }
       
  3134         }
       
  3135     else if ( iState == CThumbnailStoreDiskSpaceNotifierAO::EIterate )
       
  3136         {
       
  3137         const TInt KMaxIterations = 10;
       
  3138         
       
  3139         User::LeaveIfError( iFileServerSession.Volume( volumeInfo, iDrive ) );
       
  3140         if ( volumeInfo.iFree < iThreshold )
       
  3141             {
       
  3142             iObserver.HandleDiskSpaceNotificationL( iDiskFull );
       
  3143             ++iIterationCount;
       
  3144             if ( iIterationCount < KMaxIterations )
       
  3145                 {
       
  3146                 SetActive();
       
  3147                 TRequestStatus* status = &iStatus;
       
  3148                 User::RequestComplete( status, KErrNone );
       
  3149                 return;
       
  3150                 }
       
  3151             else
       
  3152                 {
       
  3153                 User::LeaveIfError( iFileServerSession.Volume( volumeInfo, iDrive ) );
       
  3154                 if ( volumeInfo.iFree >= iThreshold )
       
  3155                     {
       
  3156                     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::RunL() NOT FULL");
       
  3157                     OstTrace0( TRACE_NORMAL, DUP5_CTHUMBNAILSTOREDISKSPACENOTIFIERAO_RUNL, "CThumbnailStoreDiskSpaceNotifierAO::RunL - NOT FULL" );
       
  3158                     iDiskFull = EFalse;
       
  3159                     }
       
  3160                 }
       
  3161             }
       
  3162         else
       
  3163             {
       
  3164             TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::RunL() NOT FULL");
       
  3165             OstTrace0( TRACE_NORMAL, DUP6_CTHUMBNAILSTOREDISKSPACENOTIFIERAO_RUNL, "CThumbnailStoreDiskSpaceNotifierAO::RunL - NOT FULL" );
       
  3166             iDiskFull = EFalse;
       
  3167             }
       
  3168         iState = ENormal;
       
  3169         iIterationCount = 0;
       
  3170         StartNotifier();            
       
  3171         }
       
  3172     else
       
  3173         {
       
  3174         TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::RunL() KErrGeneral");
       
  3175         OstTrace0( TRACE_NORMAL, DUP7_CTHUMBNAILSTOREDISKSPACENOTIFIERAO_RUNL, "CThumbnailStoreDiskSpaceNotifierAO::RunL - KErrGeneral" );
       
  3176         User::Leave( KErrGeneral );
       
  3177         }
       
  3178     }
       
  3179 
       
  3180 TInt CThumbnailStoreDiskSpaceNotifierAO::RunError(TInt aError)
       
  3181     {
       
  3182     TN_DEBUG2( "CThumbnailStoreDiskSpaceNotifierAO::RunError() %d", aError);
       
  3183     OstTrace1( TRACE_NORMAL, CTHUMBNAILSTOREDISKSPACENOTIFIERAO_RUNERROR, "CThumbnailStoreDiskSpaceNotifierAO::RunError;aError=%d", aError );
       
  3184     
       
  3185     iObserver.HandleDiskSpaceError( aError );
       
  3186     
       
  3187     return KErrNone;
       
  3188     }
       
  3189 
       
  3190 void CThumbnailStoreDiskSpaceNotifierAO::DoCancel()
       
  3191     {
       
  3192     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::DoCancel()");
       
  3193     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTOREDISKSPACENOTIFIERAO_DOCANCEL, "CThumbnailStoreDiskSpaceNotifierAO::DoCancel" );
       
  3194     
       
  3195     if( IsActive() )
       
  3196         {   
       
  3197         iFileServerSession.NotifyDiskSpaceCancel();
       
  3198         }
       
  3199     }
       
  3200 
       
  3201 CThumbnailStoreDiskSpaceNotifierAO::CThumbnailStoreDiskSpaceNotifierAO(
       
  3202     MThumbnailStoreDiskSpaceNotifierObserver& aObserver, TInt64 aThreshold, const TDriveNumber aDrive)
       
  3203     : CActive( CActive::EPriorityStandard ), 
       
  3204     iObserver( aObserver ), iThreshold( aThreshold ), iDrive( aDrive ), iState( CThumbnailStoreDiskSpaceNotifierAO::ENormal ), iDiskFull( EFalse )
       
  3205     {
       
  3206     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::CThumbnailStoreDiskSpaceNotifierAO()");
       
  3207     OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTOREDISKSPACENOTIFIERAO_CTHUMBNAILSTOREDISKSPACENOTIFIERAO, "CThumbnailStoreDiskSpaceNotifierAO::CThumbnailStoreDiskSpaceNotifierAO" );
       
  3208     CActiveScheduler::Add( this );
       
  3209     }
       
  3210 
       
  3211 void CThumbnailStoreDiskSpaceNotifierAO::ConstructL()
       
  3212     {   
       
  3213     TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::ConstructL()");
       
  3214     OstTrace0( TRACE_NORMAL, CTHUMBNAILSTOREDISKSPACENOTIFIERAO_CONSTRUCTL, "CThumbnailStoreDiskSpaceNotifierAO::ConstructL" );
       
  3215     TInt KMessageSlotCount = 2; // slots for NotifyDiskSpace and NotifyDiskSpaceCancel
       
  3216 
       
  3217     User::LeaveIfError( iFileServerSession.Connect( KMessageSlotCount ) );
       
  3218     
       
  3219     TVolumeInfo volumeInfo;
       
  3220     TInt ret = iFileServerSession.Volume( volumeInfo, iDrive );
       
  3221     
       
  3222     if( !ret )
       
  3223         {
       
  3224         if ( volumeInfo.iFree < iThreshold )
       
  3225             {
       
  3226             TN_DEBUG1( "CThumbnailStoreDiskSpaceNotifierAO::ConstructL() FULL");
       
  3227             OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSTOREDISKSPACENOTIFIERAO_CONSTRUCTL, "CThumbnailStoreDiskSpaceNotifierAO::ConstructL - FULL" );
       
  3228             iDiskFull = ETrue;
       
  3229             }
       
  3230         }
       
  3231     else
       
  3232         {
       
  3233         TN_DEBUG2( "CThumbnailStoreDiskSpaceNotifierAO::ConstructL() error %d NOT FULL", ret);
       
  3234         OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILSTOREDISKSPACENOTIFIERAO_CONSTRUCTL, "CThumbnailStoreDiskSpaceNotifierAO::ConstructL - NOT FULL;ret=%d", ret );
       
  3235         iDiskFull = EFalse;
       
  3236         User::Leave( ret );
       
  3237         }
       
  3238 
       
  3239     iObserver.HandleDiskSpaceNotificationL( iDiskFull );
       
  3240     
       
  3241     StartNotifier();
       
  3242     }
       
  3243 
       
  3244 void CThumbnailStoreDiskSpaceNotifierAO::StartNotifier()
       
  3245     {   
       
  3246     TN_DEBUG2( "CThumbnailStoreDiskSpaceNotifierAO::StartNotifier() iDrive == %d", iDrive);
       
  3247     OstTrace1( TRACE_NORMAL, CTHUMBNAILSTOREDISKSPACENOTIFIERAO_STARTNOTIFIER, "CThumbnailStoreDiskSpaceNotifierAO::StartNotifier;iDrive=%d", iDrive );
       
  3248     iFileServerSession.NotifyDiskSpace( iThreshold, iDrive, iStatus );
       
  3249     
       
  3250     SetActive();
       
  3251     }
       
  3252 
       
  3253 TBool CThumbnailStoreDiskSpaceNotifierAO::DiskFull() const
       
  3254     {
       
  3255     return iDiskFull;
       
  3256     }
       
  3257 
       
  3258 // End of file