mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp
branchRCL_3
changeset 23 4740b34b83ce
parent 19 51035f0751c2
child 28 f56ec6ce2732
equal deleted inserted replaced
19:51035f0751c2 23:4740b34b83ce
    15 *
    15 *
    16 */
    16 */
    17 
    17 
    18 
    18 
    19 #include <e32base.h>
    19 #include <e32base.h>
    20 #ifdef RD_MULTIPLE_DRIVE
       
    21 #include <pathinfo.h>
    20 #include <pathinfo.h>
    22 #include <driveinfo.h>
    21 #include <driveinfo.h>
    23 #endif //RD_MULTIPLE_DRIVE
       
    24 
    22 
    25 #ifdef __RAMDISK_PERF_ENABLE
    23 #ifdef __RAMDISK_PERF_ENABLE
    26 #include <centralrepository.h>
    24 #include <centralrepository.h>
    27 #include <bautils.h>  
    25 #include <bautils.h>  
    28 #include <mpxharvestercrkeys.h>
    26 #include <mpxharvestercrkeys.h>
   127     {
   125     {
   128 #ifdef __RAMDISK_PERF_ENABLE
   126 #ifdef __RAMDISK_PERF_ENABLE
   129     TInt count(iDatabases.Count());
   127     TInt count(iDatabases.Count());
   130     for (TInt i = 0; i < count; ++i)
   128     for (TInt i = 0; i < count; ++i)
   131         {
   129         {
   132         RemoveDummyFile(i);
   130         RemoveDummyFile(iDatabases[i]->GetDbDrive());
   133         }
   131         }
   134 #endif // __RAMDISK_PERF_ENABLE
   132 #endif // __RAMDISK_PERF_ENABLE
   135     iDatabases.ResetAndDestroy();
   133     iDatabases.ResetAndDestroy();
   136     iDatabases.Close();
   134     iDatabases.Close();
   137     iDBSession.Close();
   135     iDBSession.Close();
   147 
   145 
   148     TInt rtn (KErrNone);
   146     TInt rtn (KErrNone);
   149 
   147 
   150     // Open drives we are interested in.
   148     // Open drives we are interested in.
   151     //
   149     //
   152 #ifdef RD_MULTIPLE_DRIVE
       
   153     TDriveList driveList;
   150     TDriveList driveList;
   154     TInt driveCount(0);
   151     TInt driveCount(0);
   155     User::LeaveIfError( DriveInfo::GetUserVisibleDrives(
   152     User::LeaveIfError( DriveInfo::GetUserVisibleDrives(
   156            iFs, driveList, driveCount ) );
   153            iFs, driveList, driveCount ) );
   157 
   154 
   158     TInt check(KErrNone);
       
   159     for( TInt driveNum = EDriveA; driveNum <= EDriveZ; driveNum++ )
   155     for( TInt driveNum = EDriveA; driveNum <= EDriveZ; driveNum++ )
   160         {
   156         {
   161         if (driveList[driveNum] && !IsRemoteDrive(static_cast<TDriveNumber>(driveNum)))
   157         if (driveList[driveNum] && IsLocalDrive(static_cast<TDriveNumber>(driveNum)))
   162             {
   158             {
   163             TFileName drivePath;
   159             MPX_DEBUG2("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: opening database in drive %d", driveNum);
   164             User::LeaveIfError(
   160             TInt index = FindDatabaseIndex ( (TDriveNumber) driveNum );
   165                 PathInfo::GetRootPath( drivePath, driveNum ) );
   161             if ( index == KErrNotFound )
   166             MPX_DEBUG2("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: opening database in %S drive",
       
   167                 &drivePath);
       
   168             TRAP( check, GetDatabaseL(static_cast<TDriveNumber>(driveNum)) );
       
   169             if( check == KErrNotFound )
       
   170                 {
   162                 {
   171                 MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: re-creating database");
   163                 MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: re-creating database");
   172                 CMPXHarvesterDB* dB = CMPXHarvesterDB::NewL(
   164                 CMPXHarvesterDB* dB = CMPXHarvesterDB::NewL(
   173                     static_cast<TDriveNumber>(driveNum), iFs );
   165                     static_cast<TDriveNumber>(driveNum), iFs );
   174                 CleanupStack::PushL( dB );
   166                 CleanupStack::PushL( dB );
   182                     {
   174                     {
   183                     MPX_DEBUG2("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: opening failed, error=%d, removing database", openError);
   175                     MPX_DEBUG2("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: opening failed, error=%d, removing database", openError);
   184                     CleanupStack::PopAndDestroy( dB );
   176                     CleanupStack::PopAndDestroy( dB );
   185                     }
   177                     }
   186                 }
   178                 }
   187             else if( check == KErrNone )
   179             else
   188                 {
   180                 {
   189                 TRAPD(openError, GetDatabaseL(static_cast<TDriveNumber>(driveNum)).OpenL() );
   181                 CMPXHarvesterDB* dB = iDatabases[index];
       
   182                 TRAPD(openError, rtn |= dB->OpenL() );   //lint !e665
   190                 if(openError != KErrNone)
   183                 if(openError != KErrNone)
   191                     {
   184                     {
   192                     MPX_DEBUG2("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: opening failed, error=%d, removing database", openError);
   185                     MPX_DEBUG2("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: opening failed, error=%d, removing database", openError);
   193                     TRAP_IGNORE( RemoveDatabaseL(static_cast<TDriveNumber>(driveNum)));
   186                     iDatabases.Remove ( index );
       
   187                     delete dB;
   194                     }
   188                     }
   195                 }
   189                 }
   196             }
   190             }
   197         }
   191         }
   198 #else
       
   199     TInt check(KErrNone);
       
   200     TRAP( check, GetDatabaseL(EDriveC) );
       
   201     if( check == KErrNotFound )
       
   202         {
       
   203         CMPXHarvesterDB* dB = CMPXHarvesterDB::NewL( EDriveC, iFs );
       
   204         CleanupStack::PushL( dB );
       
   205         iDatabases.AppendL( dB );
       
   206         CleanupStack::Pop( dB );
       
   207         TRAP_IGNORE( rtn = dB->OpenL() ); //lint !e665
       
   208         }
       
   209     else if( check == KErrNone )
       
   210         {
       
   211         TRAPD(openError, GetDatabaseL(EDriveC).OpenL() );
       
   212         if(openError != KErrNone)
       
   213             {
       
   214             TRAP_IGNORE( RemoveDatabaseL(EDriveC));
       
   215             }
       
   216         }
       
   217     TRAP( check, GetDatabaseL(EDriveE) );  //lint !e961
       
   218     if( check == KErrNotFound )
       
   219         {
       
   220         CMPXHarvesterDB* dB = CMPXHarvesterDB::NewL( EDriveE, iFs );
       
   221         CleanupStack::PushL( dB );
       
   222         TRAPD(openError, rtn |= dB->OpenL() );  //lint !e665
       
   223         if(openError == KErrNone)
       
   224             {
       
   225              iDatabases.AppendL( dB );
       
   226              CleanupStack::Pop( dB );
       
   227             }
       
   228         else
       
   229             {
       
   230             CleanupStack::PopAndDestroy( dB );
       
   231             }
       
   232         }
       
   233     else if( check == KErrNone )
       
   234         {
       
   235         TRAPD(openError,GetDatabaseL(EDriveE).OpenL() );
       
   236         if(openError != KErrNone)
       
   237             {
       
   238             TRAP_IGNORE( RemoveDatabaseL(EDriveE));
       
   239             }
       
   240         }
       
   241 #endif // RD_MULTIPLE_DRIVE
       
   242 
       
   243     MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenAllDatabasesL --->");  //lint !e961
   192     MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenAllDatabasesL --->");  //lint !e961
   244     return rtn;
   193     return rtn;
   245     }
   194     }
   246 
   195 
   247 // ---------------------------------------------------------------------------
   196 // ---------------------------------------------------------------------------
   248 // CMPXHarvesterDatabaseManager::OpenDatabaseL
   197 // CMPXHarvesterDatabaseManager::OpenDatabaseL
   249 // ---------------------------------------------------------------------------
   198 // ---------------------------------------------------------------------------
   250 //
   199 //
   251 void CMPXHarvesterDatabaseManager::OpenDatabaseL( TDriveNumber aDrive )
   200 void CMPXHarvesterDatabaseManager::OpenDatabaseL( TDriveNumber aDrive )
   252     {
   201     {
   253     MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenDatabaseL <---");
   202     MPX_DEBUG2("CMPXHarvesterDatabaseManager::OpenDatabaseL %d <---", aDrive);
   254 
   203 
   255     // Re-open a specific database
   204     if ( ! IsLocalDrive( aDrive ) )
   256     //
   205         {
   257     if (!IsRemoteDrive(aDrive))
   206         MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenDatabaseL drive not available -->");
   258         {
   207         return;
   259         TInt count( iDatabases.Count() );
   208         }
   260         for( TInt i=0; i<count; ++i )
   209 
   261             {
   210     CMPXHarvesterDB * db = NULL;
   262             CMPXHarvesterDB* db = (CMPXHarvesterDB*) iDatabases[i];
   211     TInt index = FindDatabaseIndex ( aDrive );
   263             if( db->GetDbDrive() == aDrive )
   212     if ( index == KErrNotFound )
   264                 {
   213         {
   265                 db->OpenL();
   214         db = CMPXHarvesterDB::NewL( aDrive, iFs );
   266                 break;
   215         CleanupStack::PushL( db );
   267                 }
   216         iDatabases.AppendL( db );
   268             }
   217         CleanupStack::Pop( db );
       
   218         }
       
   219     else
       
   220         {
       
   221         db = iDatabases[index];
       
   222         }
       
   223 
       
   224     // TRAPD(openError, rtn |= dB->OpenL() );  //lint !e665
       
   225     TRAPD( openError, db->OpenL() );
       
   226     if( openError != KErrNone )
       
   227         {
       
   228         MPX_DEBUG2("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: opening failed, error=%d", openError);
       
   229         iDatabases.Remove(index);
       
   230         delete db;
   269         }
   231         }
   270     MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenDatabaseL --->");
   232     MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenDatabaseL --->");
   271     }
   233     }
   272 
   234 
   273 // ---------------------------------------------------------------------------
   235 // ---------------------------------------------------------------------------
   274 // CMPXHarvesterDatabaseManager::CloseAllDatabase
   236 // CMPXHarvesterDatabaseManager::CloseAllDatabases
   275 // ---------------------------------------------------------------------------
   237 // ---------------------------------------------------------------------------
   276 //
   238 //
   277 void CMPXHarvesterDatabaseManager::CloseAllDatabase()
   239 void CMPXHarvesterDatabaseManager::CloseAllDatabases()
   278     {
   240     {
   279     // Close all databases for shutdown
   241     // Close all databases for shutdown
   280     iDatabases.ResetAndDestroy();
   242     iDatabases.ResetAndDestroy();
   281     }
   243     }
   282 
   244 
       
   245 
       
   246 // ---------------------------------------------------------------------------
       
   247 // CMPXHarvesterDatabaseManager::CloseMassStorageDatabases
       
   248 // ---------------------------------------------------------------------------
       
   249 //
       
   250 void CMPXHarvesterDatabaseManager::CloseMassStorageDatabases()
       
   251     {
       
   252     MPX_FUNC("CMPXHarvesterDatabaseManager::CloseMassStorageDatabases");
       
   253     for (TInt i = 0; i < iDatabases.Count();)
       
   254         {
       
   255         CMPXHarvesterDB * db =iDatabases [i];
       
   256         TDriveNumber drive = db->GetDbDrive();
       
   257         if ( drive != EDriveC )
       
   258             {
       
   259             MPX_DEBUG2("CMPXHarvesterDatabaseManager::CloseMassStorageDatabases closing DB on drive %d", drive);
       
   260         	  db->Close();
       
   261 #ifdef __RAMDISK_PERF_ENABLE                
       
   262             if( iRAMDiskPerfEnabled && db->IsUseRamDrive() )
       
   263                 {
       
   264                 MPX_DEBUG1("CMPXHarvesterDatabaseManager::CloseDatabase DB is on RAM");
       
   265                 db->SetRamDriveInfo( iRAMDrive, EFalse ); 
       
   266                 TInt err = DoCopyDBFromRam (drive);
       
   267                 if ( err )
       
   268                     {
       
   269                     MPX_DEBUG2("CMPXHarvesterDatabaseManager::CloseDatabase DB copy error=%d", err);                
       
   270                     RemoveDummyFile( drive );
       
   271                     }
       
   272                 }
       
   273 #endif
       
   274             delete db;
       
   275             iDatabases.Remove(i);
       
   276             }
       
   277         else
       
   278             {
       
   279             ++i;
       
   280             }
       
   281         }
       
   282     }
       
   283 
   283 // ---------------------------------------------------------------------------
   284 // ---------------------------------------------------------------------------
   284 // CMPXHarvesterDatabaseManager::CloseDatabase
   285 // CMPXHarvesterDatabaseManager::CloseDatabase
   285 // ---------------------------------------------------------------------------
   286 // ---------------------------------------------------------------------------
   286 //
   287 //
   287 void CMPXHarvesterDatabaseManager::CloseDatabase( TDriveNumber aDrive )
   288 void CMPXHarvesterDatabaseManager::CloseDatabase( TDriveNumber aDrive )
   288     {
   289     {
   289      if (!IsRemoteDrive(aDrive))
   290     MPX_DEBUG2("-->CMPXHarvesterDatabaseManager::CloseDatabase drive %d", aDrive );
   290         {
   291     TInt index = FindDatabaseIndex( aDrive );
   291         MPX_DEBUG2("CMPXHarvesterDatabaseManager::CloseDatabase drive %d <---", aDrive );
   292     if ( index != KErrNotFound )
   292         TInt count = iDatabases.Count();
   293         {
   293         for ( TInt i=0; i<count; ++i)
   294         CMPXHarvesterDB * db =iDatabases[index];
   294             {
   295         db->Close();
   295             CMPXHarvesterDB* db = (CMPXHarvesterDB*) iDatabases[i];
       
   296             if ( db->GetDbDrive() == aDrive)
       
   297                 {
       
   298                 db->Close();
       
   299 #ifdef __RAMDISK_PERF_ENABLE                
   296 #ifdef __RAMDISK_PERF_ENABLE                
   300                 if( iRAMDiskPerfEnabled && db->IsUseRamDrive() )
   297         if( iRAMDiskPerfEnabled && db->IsUseRamDrive() )
   301                     {
   298             {
   302                     MPX_DEBUG1("CMPXHarvesterDatabaseManager::CloseDatabase DB is on RAM");
   299             MPX_DEBUG1("CMPXHarvesterDatabaseManager::CloseDatabase DB is on RAM");
   303                     db->SetRamDriveInfo( iRAMDrive, EFalse ); 
   300             db->SetRamDriveInfo( iRAMDrive, EFalse ); 
   304                     TRAPD( err, DoCopyDBFromRamL(aDrive) );
   301             TInt err = DoCopyDBFromRam(aDrive);
   305                     if ( err )
   302             if ( err )
   306                         {
   303                 {
   307                         MPX_DEBUG2("CMPXHarvesterDatabaseManager::CloseDatabase DB copy error=%d", err);                
   304                 MPX_DEBUG2("CMPXHarvesterDatabaseManager::CloseDatabase DB copy error=%d", err);                
   308                         RemoveDummyFile(i);
   305                 RemoveDummyFile( aDrive );
   309                         }
   306                 }
   310                     }
   307             }
   311 #endif
   308 #endif
   312                 break;
   309         delete db;
   313                 }
   310         iDatabases.Remove(index);
   314             }
   311         }
   315         }
   312     MPX_DEBUG1("<--CMPXHarvesterDatabaseManager::CloseDatabase");
   316     MPX_DEBUG1("CMPXHarvesterDatabaseManager::CloseDatabase --->");
   313     }
   317     }
   314 
   318 
   315 // ---------------------------------------------------------------------------
   319 // ---------------------------------------------------------------------------
   316 // CMPXHarvesterDatabaseManager::DropDatabase
   320 // CMPXHarvesterDatabaseManager::GetDatabase
   317 // ---------------------------------------------------------------------------
   321 // ---------------------------------------------------------------------------
   318 //
   322 //
   319 void CMPXHarvesterDatabaseManager::DropDatabase( TDriveNumber aDrive )
   323 CMPXHarvesterDB& CMPXHarvesterDatabaseManager::GetDatabaseL( TDriveNumber aDrive )
   320     {
   324     {
   321     MPX_DEBUG2("CMPXHarvesterDatabaseManager::DropDatabase drive %d <---", aDrive );
   325     CMPXHarvesterDB* db( NULL );
   322     TInt index = FindDatabaseIndex( aDrive );
   326 
   323     if ( index != KErrNotFound )
   327     // Find the database
   324         {
       
   325         CMPXHarvesterDB * db =iDatabases[index];
       
   326 #ifdef __RAMDISK_PERF_ENABLE                
       
   327         if( iRAMDiskPerfEnabled && db->IsUseRamDrive() )
       
   328             {
       
   329             MPX_DEBUG1("CMPXHarvesterDatabaseManager::DropDatabase DB is on RAM");
       
   330             db->Close();
       
   331             // delete db on ram drive.
       
   332             TFileName src = GenerateHarvesterDbName( TDriveUnit(aDrive), ETrue );
       
   333             BaflUtils::DeleteFile(iFs, src);
       
   334             }
       
   335 #endif
       
   336         delete db;
       
   337         iDatabases.Remove(index);
       
   338         }
       
   339     MPX_DEBUG1("CMPXHarvesterDatabaseManager::DropDatabase --->");
       
   340     }
       
   341 // ---------------------------------------------------------------------------
       
   342 // CMPXHarvesterDatabaseManager::FindDatabaseIndex
       
   343 // ---------------------------------------------------------------------------
       
   344 //
       
   345 TInt CMPXHarvesterDatabaseManager::FindDatabaseIndex ( TDriveNumber aDrive )
       
   346     {
   328     TInt count = iDatabases.Count();
   347     TInt count = iDatabases.Count();
   329     for( TInt i=0; i<count; ++i )
   348     for( TInt i=0; i<count; ++i )
   330         {
   349         {
   331         CMPXHarvesterDB* tmp = (CMPXHarvesterDB*) iDatabases[i];
   350         CMPXHarvesterDB* db = (CMPXHarvesterDB*) iDatabases[i];
   332         if( tmp->GetDbDrive() == aDrive )
   351         if( db->GetDbDrive() == aDrive )
   333             {
   352             {
   334             db = tmp;
   353             MPX_DEBUG3("CMPXHarvesterDatabaseManager::FindDatabaseIndex drive=%d returns index %d ", aDrive, i);
   335             break;
   354             return i;
   336             }
   355             }
   337         }
   356         }
   338 
   357     MPX_DEBUG2("CMPXHarvesterDatabaseManager::FindDatabaseIndex drive=%d returns KErrNotFound", aDrive);
   339     // Not found, so we leave
   358     return KErrNotFound;
   340     if( db == NULL )
   359     }
   341         {
   360 
   342         User::Leave( KErrNotFound );
   361 // ---------------------------------------------------------------------------
   343         }
   362 // CMPXHarvesterDatabaseManager::DataaseIsOpen
   344     return *db;
   363 // ---------------------------------------------------------------------------
   345     }
   364 //
   346 
   365 TBool CMPXHarvesterDatabaseManager::DatabaseIsOpen( TDriveNumber aDrive )
   347 // ---------------------------------------------------------------------------
   366     {
   348 // CMPXHarvesterDatabaseManager::RemoveDatabase
   367     return FindDatabaseIndex( aDrive ) != KErrNotFound;
   349 // ---------------------------------------------------------------------------
   368     }
   350 //
   369 
   351 void CMPXHarvesterDatabaseManager::RemoveDatabaseL( TDriveNumber aDrive )
   370 // ---------------------------------------------------------------------------
   352     {
   371 // CMPXHarvesterDatabaseManager::GetDatabase
   353 
   372 // ---------------------------------------------------------------------------
   354     TBool bFound(EFalse);
   373 //
   355     // Find the database
   374 CMPXHarvesterDB& CMPXHarvesterDatabaseManager::GetDatabaseL( TDriveNumber aDrive )
   356     TInt count = iDatabases.Count();
   375     {
   357     for(TInt index=0; index<count; ++index )
   376     TInt index = FindDatabaseIndex( aDrive );
   358         {
   377     User::LeaveIfError (index); // Not found, so we leave
   359         if((iDatabases[index]!=NULL) && ( iDatabases[index]->GetDbDrive() == aDrive ))
   378     return *iDatabases[index];
   360             {
       
   361             bFound = ETrue;
       
   362             delete iDatabases[index];
       
   363             iDatabases.Remove(index);
       
   364             break;
       
   365             }
       
   366         }
       
   367 
       
   368     // Not found, so we leave
       
   369     if( !bFound )
       
   370         {
       
   371         User::Leave( KErrNotFound );
       
   372         }
       
   373     }
   379     }
   374 
   380 
   375 // ---------------------------------------------------------------------------
   381 // ---------------------------------------------------------------------------
   376 // CMPXHarvesterDatabaseManager::Count
   382 // CMPXHarvesterDatabaseManager::Count
   377 // ---------------------------------------------------------------------------
   383 // ---------------------------------------------------------------------------
   400 //
   406 //
   401 void CMPXHarvesterDatabaseManager::RecreateDatabases()
   407 void CMPXHarvesterDatabaseManager::RecreateDatabases()
   402     {
   408     {
   403     MPX_DEBUG1("CMPXHarvesterDatabaseManager::RecreateDatabases <--");
   409     MPX_DEBUG1("CMPXHarvesterDatabaseManager::RecreateDatabases <--");
   404     TInt count( iDatabases.Count() );
   410     TInt count( iDatabases.Count() );
   405     for( TInt i=0; i<count; ++i )
   411     for( TInt i=0; i<count; )
   406         {
   412         {
   407         // Close db, delete and recreate
   413         // Close db, delete and recreate
   408         //
   414         //
   409         MPX_DEBUG2("RecreateDatabasesL() -- %i", i);
   415         MPX_DEBUG2("RecreateDatabasesL() -- %i", i);
   410         CMPXHarvesterDB* cur = (CMPXHarvesterDB*)iDatabases[i];
   416         CMPXHarvesterDB* cur = iDatabases[i];
   411         cur->Close();
   417         cur->Close();
   412         cur->DeleteDatabase();
   418         cur->DeleteDatabase();
   413         // trap leave just in case 1 db had err
   419         // trap leave just in case 1 db had err
   414         //
   420         //
   415         TRAP_IGNORE( cur->OpenL() );
   421         TRAPD( openError, cur->OpenL() );
       
   422         if( openError != KErrNone )
       
   423             {
       
   424             MPX_DEBUG2("CMPXHarvesterDatabaseManager::RecreateDatabases: opening failed, error=%d", openError);
       
   425             iDatabases.Remove(i);
       
   426             delete cur;
       
   427             }
       
   428         else 
       
   429             {
       
   430             ++i;
       
   431             }
   416         }
   432         }
   417     }
   433     }
   418 
   434 
   419 
   435 
   420 // ---------------------------------------------------------------------------
   436 // ---------------------------------------------------------------------------
   428     if (iFs.Drive(driveInfo, aDrive) == KErrNone)
   444     if (iFs.Drive(driveInfo, aDrive) == KErrNone)
   429         {
   445         {
   430         isRemoteDrive = driveInfo.iDriveAtt & KDriveAttRemote;
   446         isRemoteDrive = driveInfo.iDriveAtt & KDriveAttRemote;
   431         }
   447         }
   432     return isRemoteDrive;
   448     return isRemoteDrive;
       
   449     }
       
   450 
       
   451 // ---------------------------------------------------------------------------
       
   452 // CMPXHarvesterDatabaseManager::IsLocalDrive
       
   453 // ---------------------------------------------------------------------------
       
   454 //
       
   455 TBool CMPXHarvesterDatabaseManager::IsLocalDrive( TDriveNumber aDrive )
       
   456     {
       
   457     TDriveInfo driveInfo;
       
   458     return (iFs.Drive ( driveInfo, aDrive) == KErrNone )
       
   459            && driveInfo.iType != EMediaNotPresent 
       
   460            && ! (driveInfo.iDriveAtt & KDriveAttRemote);
   433     }
   461     }
   434 
   462 
   435 // ---------------------------------------------------------------------------
   463 // ---------------------------------------------------------------------------
   436 // CMPXHarvesterDatabaseManager::BeginL
   464 // CMPXHarvesterDatabaseManager::BeginL
   437 // ---------------------------------------------------------------------------
   465 // ---------------------------------------------------------------------------
   549             TRAPD(err, DoCopyDBToRamL( drive ));
   577             TRAPD(err, DoCopyDBToRamL( drive ));
   550             if ( err != KErrNone )
   578             if ( err != KErrNone )
   551                 {
   579                 {
   552                 MPX_DEBUG2("CMPXHarvesterDatabaseManager::CopyDBsToRamL error=%d", err);
   580                 MPX_DEBUG2("CMPXHarvesterDatabaseManager::CopyDBsToRamL error=%d", err);
   553                 // delete dummy file
   581                 // delete dummy file
   554                 RemoveDummyFile(i);
   582                 RemoveDummyFile( (TDriveNumber)(TInt)drive );
   555                 
   583                 
   556                 // delete db in ram drive
   584                 // delete db in ram drive
   557                 TFileName ramDb = GenerateHarvesterDbName( drive, ETrue );
   585                 TFileName ramDb = GenerateHarvesterDbName( drive, ETrue );
   558                 TInt delErr = BaflUtils::DeleteFile(iFs, ramDb);
   586                 TInt delErr = BaflUtils::DeleteFile(iFs, ramDb);
   559                 MPX_DEBUG3("CMPXHarvesterDatabaseManager::CopyDBsToRamL db on ram drive deleted file=%S, err=%d", &ramDb, delErr);
   587                 MPX_DEBUG3("CMPXHarvesterDatabaseManager::CopyDBsToRamL db on ram drive deleted file=%S, err=%d", &ramDb, delErr);
   624             // Get the db state in order to restore it later.
   652             // Get the db state in order to restore it later.
   625             TDbState dbState = iDatabases[i]->GetDbState();
   653             TDbState dbState = iDatabases[i]->GetDbState();
   626             TRAP( err, iDatabases[i]->SetDbStateL(EDbClose) );
   654             TRAP( err, iDatabases[i]->SetDbStateL(EDbClose) );
   627             if ( err == KErrNone )
   655             if ( err == KErrNone )
   628                 {
   656                 {
   629                 TRAP( err, DoCopyDBFromRamL(drive) );
   657                 err = DoCopyDBFromRam(drive);
   630                 }
   658                 }
   631             else
   659             else
   632                 {
   660                 {
   633                 // Error closing db on RAM drive, try to delete it.
   661                 // Error closing db on RAM drive, try to delete it.
   634                 TFileName ramDB;
   662                 TFileName ramDB;
   638             
   666             
   639             if ( err )
   667             if ( err )
   640                 {
   668                 {
   641                 MPX_DEBUG2("CMPXHarvesterDatabaseManager::CopyDBsFromRamL copy error=%d", err);                
   669                 MPX_DEBUG2("CMPXHarvesterDatabaseManager::CopyDBsFromRamL copy error=%d", err);                
   642                 //anyting wrong, delete the temp file.
   670                 //anyting wrong, delete the temp file.
   643                 RemoveDummyFile(i);
   671                 RemoveDummyFile( (TDriveNumber)(TInt)drive );
   644                 }
   672                 }
   645 
   673 
   646             // Restore the db state.
   674             // Restore the db state.
   647             TRAPD( error, iDatabases[i]->SetDbStateL( dbState ) );
   675             TRAPD( error, iDatabases[i]->SetDbStateL( dbState ) );
   648             if ( error && !leaveError )
   676             if ( error && !leaveError )
   653         User::LeaveIfError( leaveError );
   681         User::LeaveIfError( leaveError );
   654         }
   682         }
   655     }
   683     }
   656 
   684 
   657 // ---------------------------------------------------------------------------
   685 // ---------------------------------------------------------------------------
   658 // CMPXHarvesterDatabaseManager::DoCopyDBFromRamL
   686 // CMPXHarvesterDatabaseManager::DoCopyDBFromRam
   659 // ---------------------------------------------------------------------------
   687 // ---------------------------------------------------------------------------
   660 //
   688 //
   661 void CMPXHarvesterDatabaseManager::DoCopyDBFromRamL(TDriveUnit aDriveUnit)
   689 TInt CMPXHarvesterDatabaseManager::DoCopyDBFromRam(TDriveUnit aDriveUnit)
   662     {
   690     {
   663     MPX_FUNC("CMPXHarvesterDatabaseManager::DoCopyDBFromRamL");
   691     MPX_FUNC("CMPXHarvesterDatabaseManager::DoCopyDBFromRam");
   664     TFileName dst;
   692     TFileName dst;
   665     TFileName src;
   693     TFileName src;
   666     TInt err = KErrNone;
   694     TInt err = KErrNone;
   667     
   695     
   668     dst = GenerateHarvesterDbName( aDriveUnit );
   696     dst = GenerateHarvesterDbName( aDriveUnit );
   669     src = GenerateHarvesterDbName( aDriveUnit, ETrue );
   697     src = GenerateHarvesterDbName( aDriveUnit, ETrue );
   670     MPX_DEBUG3("CMPXHarvesterDatabaseManager::DoCopyDBFromRamL from %S to %S", &src, &dst );
   698     MPX_DEBUG3("CMPXHarvesterDatabaseManager::DoCopyDBFromRam from %S to %S", &src, &dst );
   671 
   699 
   672     TFileName dummyDbFileName = GenerateDummyDbName( aDriveUnit ); 
   700     TFileName dummyDbFileName = GenerateDummyDbName( aDriveUnit ); 
   673 
   701 
   674     //Copy Db from RAM to replace dummy file
   702     //Copy Db from RAM to replace dummy file
   675     err = BaflUtils::CopyFile(iFs, src, dummyDbFileName);
   703     err = BaflUtils::CopyFile(iFs, src, dummyDbFileName);
   676     MPX_DEBUG2("CMPXHarvesterDatabaseManager::DoCopyDBFromRamL database copied from ram drive err=%d.", err);
   704     MPX_DEBUG2("CMPXHarvesterDatabaseManager::DoCopyDBFromRam database copied from ram drive err=%d.", err);
   677     
   705     
   678     // delete db on ram drive.
   706     // delete db on ram drive.
   679     TInt delErr = BaflUtils::DeleteFile(iFs, src);
   707     TInt delErr = BaflUtils::DeleteFile(iFs, src);
   680     MPX_DEBUG3("CMPXHarvesterDatabaseManager::DoCopyDBFromRamL db on ram drive deleted file=%S, err=%d", &src, delErr);
   708     MPX_DEBUG3("CMPXHarvesterDatabaseManager::DoCopyDBFromRam db on ram drive deleted file=%S, err=%d", &src, delErr);
   681 
   709 
   682     // Make sure we del db from ram drive before leaving.
   710     // Make sure we del db from ram drive before returning.
   683     User::LeaveIfError( err );
   711     if (err != KErrNone)
   684     
   712         {
   685     // Delete existing DB on drive
   713         return err;
   686     delErr = BaflUtils::DeleteFile(iFs, dst);
   714         }
   687     MPX_DEBUG2("CMPXHarvesterDatabaseManager::DoCopyDBFromRamL destination file deleted err=%d", delErr);
   715     
   688 
   716     err = iFs.Replace(dummyDbFileName, dst);
   689     // rename dummy file to real db name
   717     MPX_DEBUG2("CMPXHarvesterDatabaseManager::DoCopyDBFromRam dummy file replaced, err=%d.", err);
   690     User::LeaveIfError( BaflUtils::RenameFile(iFs, dummyDbFileName, dst) );
   718     return err;
   691     MPX_DEBUG1("CMPXHarvesterDatabaseManager::DoCopyDBFromRamL dummy file renamed.");
       
   692     }
   719     }
   693 
   720 
   694 // ---------------------------------------------------------------------------
   721 // ---------------------------------------------------------------------------
   695 // CMPXHarvesterDatabaseManager::GetRAMDiskPath
   722 // CMPXHarvesterDatabaseManager::GetRAMDiskPath
   696 // ---------------------------------------------------------------------------
   723 // ---------------------------------------------------------------------------
   870 
   897 
   871 // ---------------------------------------------------------------------------
   898 // ---------------------------------------------------------------------------
   872 // CMPXHarvesterDatabaseManager::RemoveDummyFile
   899 // CMPXHarvesterDatabaseManager::RemoveDummyFile
   873 // ---------------------------------------------------------------------------
   900 // ---------------------------------------------------------------------------
   874 //
   901 //
   875 void CMPXHarvesterDatabaseManager::RemoveDummyFile( TInt aIndex )
   902 void CMPXHarvesterDatabaseManager::RemoveDummyFile( TDriveNumber aDrive )
   876     {
   903     {
   877     MPX_FUNC("CMPXHarvesterDatabaseManager::RemoveDummyFile");
   904     MPX_FUNC("CMPXHarvesterDatabaseManager::RemoveDummyFile");
   878     
   905     
   879     TDriveUnit driveUnit(iDatabases[aIndex]->GetDbDrive());
   906     TFileName file = GenerateDummyDbName(TDriveUnit(aDrive));
   880     TFileName file = GenerateDummyDbName(driveUnit);
       
   881     
   907     
   882     if ( (file.Length() > 0) &&
   908     if ( (file.Length() > 0) &&
   883          (BaflUtils::FileExists(iFs, file)) )
   909          (BaflUtils::FileExists(iFs, file)) )
   884         {
   910         {
   885         BaflUtils::DeleteFile(iFs, file);
   911         BaflUtils::DeleteFile(iFs, file);