harvester/server/src/harvesterao.cpp
branchRCL_3
changeset 15 3cebc1a84278
parent 14 646a02f170b9
child 17 50de4d668bb6
equal deleted inserted replaced
14:646a02f170b9 15:3cebc1a84278
   123 
   123 
   124 // ---------------------------------------------------------------------------
   124 // ---------------------------------------------------------------------------
   125 // CHarvesterAO
   125 // CHarvesterAO
   126 // ---------------------------------------------------------------------------
   126 // ---------------------------------------------------------------------------
   127 //
   127 //
   128 CHarvesterAO::CHarvesterAO() : CActive( KHarvesterCustomImportantPriority )
   128 CHarvesterAO::CHarvesterAO() : CActive( KHarvesterPriorityHarvestingPlugin )
   129     {
   129     {
   130     WRITELOG( "CHarvesterAO::CHarvesterAO() - begin" );
   130     WRITELOG( "CHarvesterAO::CHarvesterAO() - begin" );
   131     
   131     
   132     iServerPaused = ETrue;
   132     iServerPaused = ETrue;
   133     iNextRequest = ERequestIdle;
   133     iNextRequest = ERequestIdle;
   134     
   134     
   135     iContextEngineInitialized = EFalse;
   135     iContextEngineInitialized = EFalse;
   136     iMdeSessionInitialized = EFalse;
   136     iMdeSessionInitialized = EFalse;
       
   137     
       
   138     iRamFull = EFalse;
       
   139     iDiskFull = EFalse;
       
   140     iManualPauseEnabled = EFalse;
       
   141     iFastHarvestNeeded = EFalse;
       
   142     iHarvestingPlaceholders = EFalse;
   137     }
   143     }
   138      
   144      
   139 // ---------------------------------------------------------------------------
   145 // ---------------------------------------------------------------------------
   140 // ~CHarvesterAO
   146 // ~CHarvesterAO
   141 // ---------------------------------------------------------------------------
   147 // ---------------------------------------------------------------------------
   162     DeleteMonitorPlugins();        
   168     DeleteMonitorPlugins();        
   163     
   169     
   164     StopComposers();
   170     StopComposers();
   165     DeleteComposers();
   171     DeleteComposers();
   166 
   172 
       
   173     delete iDiskFullNotifier;
   167 	delete iBackupSubscriber;
   174 	delete iBackupSubscriber;
   168     
   175     
   169     if (iBlacklist)
   176     if (iBlacklist)
   170 		{
   177 		{
   171 		iBlacklist->CloseDatabase();
   178 		iBlacklist->CloseDatabase();
   184             	}
   191             	}
   185             iHarvestFileMessages.Remove( i );
   192             iHarvestFileMessages.Remove( i );
   186             }
   193             }
   187         }
   194         }
   188     iHarvestFileMessages.Close();
   195     iHarvestFileMessages.Close();
   189     
       
   190     iMonitorPluginArray.ResetAndDestroy();
       
   191     iMonitorPluginArray.Close();
       
   192   	
   196   	
   193     iPHArray.ResetAndDestroy();
   197     iPHArray.ResetAndDestroy();
   194     iPHArray.Close();
   198     iPHArray.Close();
   195 	
   199 	
   196    	iReadyPHArray.ResetAndDestroy();
   200    	iReadyPHArray.ResetAndDestroy();
   229 
   233 
   230 	User::LeaveIfError( iFs.Connect() );
   234 	User::LeaveIfError( iFs.Connect() );
   231 
   235 
   232     // Setting up MdE Session
   236     // Setting up MdE Session
   233 	iMdESession = CMdESession::NewL( *this );
   237 	iMdESession = CMdESession::NewL( *this );
   234 	
       
   235     RProcess process;
       
   236  	process.SetPriority( EPriorityBackground );
       
   237  	process.Close();
       
   238  	
   238  	
   239     // Setting up context Engine (initialization is ready when ContextInitializationStatus -callback is called)
   239     // Setting up context Engine (initialization is ready when ContextInitializationStatus -callback is called)
   240     iCtxEngine = CContextEngine::GetInstanceL( this ); // Create the context engine
   240     iCtxEngine = CContextEngine::GetInstanceL( this ); // Create the context engine
   241 
   241 
   242     iBackupSubscriber = CBackupSubscriber::NewL( *this );
   242     iBackupSubscriber = CBackupSubscriber::NewL( *this );
   328 void CHarvesterAO::DeleteMonitorPlugins()
   328 void CHarvesterAO::DeleteMonitorPlugins()
   329     {
   329     {
   330     WRITELOG( "CHarvesterAO::DeleteMonitorPlugins()" );
   330     WRITELOG( "CHarvesterAO::DeleteMonitorPlugins()" );
   331     
   331     
   332     iMonitorPluginArray.ResetAndDestroy();
   332     iMonitorPluginArray.ResetAndDestroy();
       
   333     iMonitorPluginArray.Close();
       
   334     WRITELOG( "CHarvesterAO::DeleteMonitorPlugins() - end" );
   333     }
   335     }
   334 
   336 
   335 // ---------------------------------------------------------------------------
   337 // ---------------------------------------------------------------------------
   336 // StartMonitoring
   338 // StartMonitoring
   337 // ---------------------------------------------------------------------------
   339 // ---------------------------------------------------------------------------
   403 // HandleUnmount
   405 // HandleUnmount
   404 // ---------------------------------------------------------------------------
   406 // ---------------------------------------------------------------------------
   405 //
   407 //
   406 void CHarvesterAO::HandleUnmount( TUint32 aMediaId )
   408 void CHarvesterAO::HandleUnmount( TUint32 aMediaId )
   407 	{
   409 	{
   408 	WRITELOG1( "CHarvesterAO::HandleUnmount(%d)", aMediaId );
   410     WRITELOG1( "CHarvesterAO::HandleUnmount(%d)", aMediaId );    
       
   411     
       
   412     if( !iServerPaused )
       
   413         {
       
   414         // Stop harvesting for unmount
       
   415         PauseMonitoring();
       
   416         PauseHarvester();
       
   417         }
   409 	
   418 	
   410     TUint32 mediaId( 0 );
   419     TUint32 mediaId( 0 );
   411     TUint removed( 0 );
   420     TUint removed( 0 );
   412     CHarvesterData* hd = NULL;
   421     CHarvesterData* hd = NULL;
   413 
   422 
   419 	TInt arrayCount( iReadyPHArray.Count() );
   428 	TInt arrayCount( iReadyPHArray.Count() );
   420 	if( arrayCount > 0 )
   429 	if( arrayCount > 0 )
   421         {
   430         {
   422         for( TInt i=arrayCount-1; i>= 0; i--)
   431         for( TInt i=arrayCount-1; i>= 0; i--)
   423             {
   432             {
   424             hd = iPHArray[i];
   433             hd = iReadyPHArray[i];
   425             err = iMediaIdUtil->GetMediaId( hd->Uri(), mediaId );
   434             err = iMediaIdUtil->GetMediaId( hd->Uri(), mediaId );
   426             
   435             
   427             if( err == KErrNone && mediaId == aMediaId )
   436             if( err == KErrNone && mediaId == aMediaId )
   428                 {
   437                 {
   429                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iReadyPHArray %d", i);
   438                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iReadyPHArray %d", i);
   431                 hd = NULL;
   440                 hd = NULL;
   432                 iReadyPHArray.Remove( i );
   441                 iReadyPHArray.Remove( i );
   433                 removed++;
   442                 removed++;
   434                 arrayCount--;
   443                 arrayCount--;
   435                 }
   444                 }
       
   445             }
       
   446         if( iReadyPHArray.Count() == 0 )
       
   447             {
       
   448             iReadyPHArray.Compress();
   436             }
   449             }
   437         WRITELOG1( "CHarvesterAO::HandleUnmount() DecreaseItemCountL iReadyPHArray %d", removed);
   450         WRITELOG1( "CHarvesterAO::HandleUnmount() DecreaseItemCountL iReadyPHArray %d", removed);
   438         TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypePlaceholder, removed) );
   451         TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypePlaceholder, removed) );
   439         }
   452         }
   440    
   453    
   459                 iPHArray.Remove( i );
   472                 iPHArray.Remove( i );
   460                 removed++;
   473                 removed++;
   461                 arrayCount--;
   474                 arrayCount--;
   462                 }
   475                 }
   463             }
   476             }
       
   477         if( iPHArray.Count() == 0 )
       
   478             {
       
   479             iPHArray.Compress();
       
   480             }
   464         WRITELOG1( "CHarvesterAO::HandleUnmount() DecreaseItemCountL iPHArray %d", removed);
   481         WRITELOG1( "CHarvesterAO::HandleUnmount() DecreaseItemCountL iPHArray %d", removed);
   465         TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypePlaceholder, removed) );
   482         TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypePlaceholder, removed) );
   466         }
   483         }
   467    
   484    
   468    removed = 0;
   485    removed = 0;
   486                 iContainerPHArray.Remove( i );
   503                 iContainerPHArray.Remove( i );
   487                 removed++;
   504                 removed++;
   488                 arrayCount--;
   505                 arrayCount--;
   489                 }
   506                 }
   490             }
   507             }
       
   508         if( iContainerPHArray.Count() == 0 )
       
   509             {
       
   510             iContainerPHArray.Compress();
       
   511             }
   491         WRITELOG1( "CHarvesterAO::HandleUnmount() DecreaseItemCountL iContainerPHArray %d", removed);
   512         WRITELOG1( "CHarvesterAO::HandleUnmount() DecreaseItemCountL iContainerPHArray %d", removed);
   492         TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypePlaceholder, removed) );
   513         TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypePlaceholder, removed) );
   493         }
   514         }
   494 
   515 
   495    removed = 0;
   516    removed = 0;
   511 	
   532 	
   512 	RPointerArray<CHarvesterPluginInfo>& hpiArray = iHarvesterPluginFactory->GetPluginInfos();
   533 	RPointerArray<CHarvesterPluginInfo>& hpiArray = iHarvesterPluginFactory->GetPluginInfos();
   513 	const TInt hpiArrayCount( hpiArray.Count() );
   534 	const TInt hpiArrayCount( hpiArray.Count() );
   514 	if( hpiArrayCount > 0 )
   535 	if( hpiArrayCount > 0 )
   515 		{
   536 		{
   516 		RArray<TItemId> placeholders;
       
   517 		
       
   518 		TUint32 mediaId( 0 );
   537 		TUint32 mediaId( 0 );
   519 		TInt err( KErrNone );
   538 		TInt err( KErrNone );
   520 		
   539 		
   521 		for( TInt i = hpiArrayCount; --i >= 0; )
   540 		for( TInt i = hpiArrayCount; --i >= 0; )
   522 			{
   541 			{
   526 				CHarvesterData* hd = hpi->iQueue[j];
   545 				CHarvesterData* hd = hpi->iQueue[j];
   527 				CMdEObject& mdeobj = hd->MdeObject();
   546 				CMdEObject& mdeobj = hd->MdeObject();
   528 				
   547 				
   529 				err = iMediaIdUtil->GetMediaId( mdeobj.Uri(), mediaId );
   548 				err = iMediaIdUtil->GetMediaId( mdeobj.Uri(), mediaId );
   530 	
   549 	
   531 				if( mdeobj.Placeholder() && ( aMediaId == mediaId || err != KErrNone ))
   550 				if( aMediaId == mediaId || err != KErrNone )
   532 					{
   551 					{
       
   552                     hpi->iQueue.Remove(j);
   533 					removed++;
   553 					removed++;
   534 					                    
   554 
   535 					TItemId id = mdeobj.Id();
       
   536 					placeholders.Append( id );
       
   537 					TRAP_IGNORE( iMdESession->CancelObjectL( mdeobj ) );
   555 					TRAP_IGNORE( iMdESession->CancelObjectL( mdeobj ) );
   538 					
   556 					
   539 					delete hd;
   557 					delete hd;
   540 					hd = NULL;
   558 					hd = NULL;
   541 					hpi->iQueue.Remove(j);
       
   542 					
       
   543 					if( hpi->iQueue.Count() == 0 )
       
   544 						{
       
   545 						hpi->iQueue.Compress();
       
   546 						}
       
   547 					}
   559 					}
   548 				}
   560 				}
       
   561 			
       
   562             if( hpi->iQueue.Count() == 0 )
       
   563                 {
       
   564                 hpi->iQueue.Compress();
       
   565                 }
   549 			}
   566 			}
   550 		
   567 		
   551 		if( removed )
   568 		if( removed )
   552 		    {
   569 		    {
   553             WRITELOG1( "CHarvesterAO::HandleUnmount() remove from plugins = %d", removed);
   570             WRITELOG1( "CHarvesterAO::HandleUnmount() remove from plugins = %d", removed);
   554             TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypePlaceholder, removed ) );
   571             TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypePlaceholder, removed ) );
   555             TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, removed ) );
   572             TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, removed ) );
   556 		    }
   573 		    }
   557 		
       
   558 		RArray<TItemId> results;
       
   559 		TRAP_IGNORE( iMdESession->RemoveObjectsL( placeholders, results, NULL ) );
       
   560 		results.Close();
       
   561 		placeholders.Close();
       
   562 		}
   574 		}
       
   575 	
       
   576 	// resume harvesting from last state
       
   577     if( !iRamFull && !iDiskFull )
       
   578         {
       
   579         // resume monitoring
       
   580         ResumeMonitoring();
       
   581         TRAP_IGNORE( ResumeHarvesterL() );    
       
   582         }
   563 	}
   583 	}
   564 
   584 
   565 // ---------------------------------------------------------------------------
   585 // ---------------------------------------------------------------------------
   566 // StartComposersL
   586 // StartComposersL
   567 // ---------------------------------------------------------------------------
   587 // ---------------------------------------------------------------------------
   620 void CHarvesterAO::DeleteComposers()
   640 void CHarvesterAO::DeleteComposers()
   621     {
   641     {
   622     WRITELOG( "CHarvesterAO::DeleteComposers()" );
   642     WRITELOG( "CHarvesterAO::DeleteComposers()" );
   623     
   643     
   624     iComposerPluginArray.ResetAndDestroy();
   644     iComposerPluginArray.ResetAndDestroy();
       
   645     iComposerPluginArray.Close();
   625 
   646 
   626     WRITELOG( "CHarvesterAO::DeleteComposers() - end" );
   647     WRITELOG( "CHarvesterAO::DeleteComposers() - end" );
   627     }
   648     }
   628 
   649 
   629 // ---------------------------------------------------------------------------
   650 // ---------------------------------------------------------------------------
   657     
   678     
   658     CHarvesterData* hd = iQueue->GetNextItem();
   679     CHarvesterData* hd = iQueue->GetNextItem();
   659     
   680     
   660     if ( hd->ObjectType() == EPlaceholder )
   681     if ( hd->ObjectType() == EPlaceholder )
   661     	{
   682     	{
       
   683         iHarvestingPlaceholders = ETrue;
       
   684         if( !iFastHarvestNeeded )
       
   685             {
       
   686             SetPriority( KHarvesterCustomImportantPriority );
       
   687             }
   662     	while( hd != NULL &&
   688     	while( hd != NULL &&
   663 				iPHArray.Count() < KPlaceholderQueueSize &&
   689 				iPHArray.Count() < KPlaceholderQueueSize &&
   664 				hd->ObjectType() == EPlaceholder )
   690 				hd->ObjectType() == EPlaceholder )
   665     		{
   691     		{
   666         	iPHArray.Append( hd );
   692         	iPHArray.Append( hd );
       
   693         	if( hd->Origin() == MdeConstants::Object::ECamera || 
       
   694         	    hd->ObjectType() == EFastHarvest  )
       
   695         	    {
       
   696         	    if( !iFastHarvestNeeded )
       
   697         	        {
       
   698                     iFastHarvestNeeded = ETrue;
       
   699                     // Fast harvest event must be handled even if MMC handling would be ongoing
       
   700                     SetPriority( KHarvesterPriorityMonitorPlugin );
       
   701         	        }
       
   702         	    break;
       
   703         	    }
       
   704         	else if( iFastHarvestNeeded )
       
   705         	    {
       
   706         	    iFastHarvestNeeded = EFalse;
       
   707         	    SetPriority( KHarvesterCustomImportantPriority );
       
   708         	    }
   667         	hd = iQueue->GetNextItem();
   709         	hd = iQueue->GetNextItem();
   668     		}
   710     		}
       
   711     	
       
   712     	if( iFastHarvestNeeded && iPHArray.Count() > 0 )
       
   713     	    {
       
   714             TRAPD( err, HandlePlaceholdersL( ETrue ) );
       
   715 
       
   716             // make sure that when HandlePlaceholdersL leaves, iPHArray is cleared
       
   717             if ( err != KErrNone )
       
   718                 {
       
   719                 iPHArray.ResetAndDestroy();
       
   720                 User::Leave( err );
       
   721                 }
       
   722             
       
   723             TInt count( iReadyPHArray.Count() );
       
   724             for( TInt i = 0; i < count; i++ )
       
   725                 {
       
   726                 CheckFileExtensionAndHarvestL( iReadyPHArray[i] );
       
   727                 iReadyPHArray.Remove( i );
       
   728                 // correct the index so harvesting order remains ok
       
   729                 i--;
       
   730                 count--;
       
   731                 }
       
   732             return;
       
   733     	    }
   669     	
   734     	
   670 		if( hd )
   735 		if( hd )
   671     		{
   736     		{
   672 	    	if( hd->ObjectType() == EPlaceholder )
   737 	    	if( hd->ObjectType() == EPlaceholder )
   673 	    		{
   738 	    		{
   691 	    		}
   756 	    		}
   692     		}
   757     		}
   693     	}
   758     	}
   694     else
   759     else
   695     	{
   760     	{
       
   761         if( iHarvestingPlaceholders && !iFastHarvestNeeded )
       
   762             {
       
   763             SetPriority( KHarvesterPriorityHarvestingPlugin );
       
   764             }
       
   765         iHarvestingPlaceholders = EFalse;
   696         CheckFileExtensionAndHarvestL( hd );
   766         CheckFileExtensionAndHarvestL( hd );
   697     	}
   767     	}
   698     }
   768     }
   699 
   769 
   700 // ---------------------------------------------------------------------------
   770 // ---------------------------------------------------------------------------
  1214         if ( errorTrap != KErrNone )
  1284         if ( errorTrap != KErrNone )
  1215                 {
  1285                 {
  1216                 WRITELOG( "CHarvesterAO::HandleSessionOpened() - ObjectHandler creation failed" );
  1286                 WRITELOG( "CHarvesterAO::HandleSessionOpened() - ObjectHandler creation failed" );
  1217                 }
  1287                 }
  1218         
  1288         
  1219         TRAP( errorTrap, PreallocateNamespaceL( aSession.GetDefaultNamespaceDefL() ) );
       
  1220         if ( errorTrap != KErrNone )
       
  1221             {
       
  1222             WRITELOG( "CHarvesterAO::HandleSessionOpened() - error loading default schema" );
       
  1223             }
       
  1224         
       
  1225         // Setting up monitor plugins
  1289         // Setting up monitor plugins
  1226         TRAP( errorTrap, LoadMonitorPluginsL() );
  1290         TRAP( errorTrap, LoadMonitorPluginsL() );
  1227         if ( errorTrap != KErrNone )
  1291         if ( errorTrap != KErrNone )
  1228             {
  1292             {
  1229             WRITELOG( "CHarvesterAO::HandleSessionOpened() - error loading monitor plugins" );
  1293             WRITELOG( "CHarvesterAO::HandleSessionOpened() - error loading monitor plugins" );
  1230             }
  1294             }
  1231             
  1295 
       
  1296         // To check if the default namespace structure is in order
       
  1297         TRAP( errorTrap, PreallocateNamespaceL( aSession.GetDefaultNamespaceDefL() ) );
       
  1298         if ( errorTrap != KErrNone )
       
  1299             {
       
  1300             WRITELOG( "CHarvesterAO::HandleSessionOpened() - error loading default schema" );
       
  1301             }
       
  1302         
  1232         TRAP( errorTrap, StartComposersL() );
  1303         TRAP( errorTrap, StartComposersL() );
  1233         if ( errorTrap != KErrNone )
  1304         if ( errorTrap != KErrNone )
  1234             {
  1305             {
  1235             WRITELOG( "CHarvesterAO::HandleSessionOpened() - couldn't start composer plugins" );
  1306             WRITELOG( "CHarvesterAO::HandleSessionOpened() - couldn't start composer plugins" );
  1236             }
  1307             }
  1248             iCtxEngine->SetMdeSession( iMdESession );
  1319             iCtxEngine->SetMdeSession( iMdESession );
  1249             }
  1320             }
  1250 
  1321 
  1251             // Starting monitor plugins
  1322             // Starting monitor plugins
  1252         StartMonitoring();
  1323         StartMonitoring();
       
  1324 
       
  1325         TRAP( errorTrap, iDiskFullNotifier = CMdSHarvesterDiskspaceObserverAO::NewL( *this, KDiskFullThreshold, KMdsSqlDbDefaultName ) );
       
  1326         if ( errorTrap != KErrNone )
       
  1327             {
       
  1328             WRITELOG( "CHarvesterAO::HandleSessionOpened() - couldn't start diskspace observer" );
       
  1329             }
  1253         
  1330         
  1254         TRAP( errorTrap, iOnDemandAO = COnDemandAO::NewL( *iMdESession, *iQueue, 
  1331         TRAP( errorTrap, iOnDemandAO = COnDemandAO::NewL( *iMdESession, *iQueue, 
  1255         		*iHarvesterPluginFactory, &iReadyPHArray ) );
  1332         		*iHarvesterPluginFactory, &iReadyPHArray ) );
  1256         if ( errorTrap == KErrNone )
  1333         if ( errorTrap == KErrNone )
  1257         	{
  1334         	{
  1372 //
  1449 //
  1373 TInt CHarvesterAO::PauseHarvester()
  1450 TInt CHarvesterAO::PauseHarvester()
  1374     {
  1451     {
  1375     WRITELOG( "CHarvesterAO::PauseHarvester()" );
  1452     WRITELOG( "CHarvesterAO::PauseHarvester()" );
  1376 
  1453 
       
  1454     Cancel();
       
  1455     
       
  1456     iHarvesterPluginFactory->PauseHarvester( ETrue );
  1377     iServerPaused = ETrue;
  1457     iServerPaused = ETrue;
       
  1458     
       
  1459     if( !iRamFull && !iDiskFull )
       
  1460         {
       
  1461         iManualPauseEnabled = ETrue;
       
  1462         }
  1378     
  1463     
  1379     // Everything is paused
  1464     // Everything is paused
  1380     WRITELOG( "CHarvesterAO::PauseHarvester() - Moving paused state paused" );
  1465     WRITELOG( "CHarvesterAO::PauseHarvester() - Moving paused state paused" );
  1381     
  1466     
  1382     return KErrNone;
  1467     return KErrNone;
  1388 //
  1473 //
  1389 void CHarvesterAO::ResumeHarvesterL()
  1474 void CHarvesterAO::ResumeHarvesterL()
  1390     {
  1475     {
  1391     WRITELOG( "CHarvesterAO::ResumeHarvesterL()" );
  1476     WRITELOG( "CHarvesterAO::ResumeHarvesterL()" );
  1392     
  1477     
       
  1478     iHarvesterPluginFactory->PauseHarvester( EFalse );
  1393     iServerPaused = EFalse;
  1479     iServerPaused = EFalse;
       
  1480     iManualPauseEnabled = EFalse;
  1394     
  1481     
  1395     SetNextRequest( ERequestHarvest );
  1482     SetNextRequest( ERequestHarvest );
  1396     }
  1483     }
  1397 
  1484 
  1398 // ---------------------------------------------------------------------------
  1485 // ---------------------------------------------------------------------------
  1428             // harvest new items first...
  1515             // harvest new items first...
  1429             if ( iQueue->ItemsInQueue() > 0 )
  1516             if ( iQueue->ItemsInQueue() > 0 )
  1430                 {
  1517                 {
  1431                 ReadItemFromQueueL();
  1518                 ReadItemFromQueueL();
  1432 				SetNextRequest( ERequestHarvest );
  1519 				SetNextRequest( ERequestHarvest );
       
  1520 				break;
  1433                 }
  1521                 }
  1434 
  1522 
  1435             // no more items to harvest
  1523             // no more items to handle from main queue
  1436             else
  1524             else
  1437                 {
  1525                 {
  1438                 // if container files to harvest, handle those
  1526                 // All registered fast harvested items or placeholders handled at this point     
       
  1527                 // if container files to harvest, handle those next
  1439                 if( iContainerPHArray.Count() > 0 )
  1528                 if( iContainerPHArray.Count() > 0 )
  1440                 	{
  1529                 	{
       
  1530                     iFastHarvestNeeded = EFalse;
       
  1531                     iHarvestingPlaceholders = EFalse;
       
  1532                     SetPriority( KHarvesterPriorityHarvestingPlugin );
  1441                 	SetNextRequest( ERequestContainerPlaceholder );
  1533                 	SetNextRequest( ERequestContainerPlaceholder );
  1442                 	break;
  1534                 	break;
  1443                 	}
  1535                 	}
       
  1536                 else if( iHarvestingPlaceholders || iFastHarvestNeeded )
       
  1537                     {
       
  1538                     // reset to default priority       
       
  1539                     iFastHarvestNeeded = EFalse;
       
  1540                     iHarvestingPlaceholders = EFalse;
       
  1541                     SetPriority( KHarvesterPriorityHarvestingPlugin );
       
  1542                     SetNextRequest( ERequestHarvest );
       
  1543                     break;
       
  1544                     }
  1444                 
  1545                 
  1445                 const TInt arrayCount( iReadyPHArray.Count() );
  1546                 const TInt arrayCount( iReadyPHArray.Count() );
  1446 				if( arrayCount > 0 )
  1547 				if( arrayCount > 0 )
  1447             		{
  1548             		{
  1448 #ifdef _DEBUG
  1549 #ifdef _DEBUG
  1492         	TRAPD( err, HandlePlaceholdersL( EFalse ) );
  1593         	TRAPD( err, HandlePlaceholdersL( EFalse ) );
  1493 
  1594 
  1494 	    	// make sure that when HandlePlaceholdersL leaves, iPHArray is cleared
  1595 	    	// make sure that when HandlePlaceholdersL leaves, iPHArray is cleared
  1495 	    	if ( err != KErrNone )
  1596 	    	if ( err != KErrNone )
  1496 	    		{
  1597 	    		{
       
  1598 	    	    iContainerPHArray.ResetAndDestroy();
  1497 	    		iPHArray.ResetAndDestroy();
  1599 	    		iPHArray.ResetAndDestroy();
  1498 	    		User::Leave( err );
  1600 	    		User::Leave( err );
  1499 	    		}
  1601 	    		}
  1500 	    	SetNextRequest( ERequestHarvest );
  1602 	    	SetNextRequest( ERequestHarvest );
  1501         	}
  1603         	}
  1645 void CHarvesterAO::BackupRestoreReady()
  1747 void CHarvesterAO::BackupRestoreReady()
  1646     {
  1748     {
  1647     // restart blacklist database connection
  1749     // restart blacklist database connection
  1648     WRITELOG( "CHarvesterAO::BackupRestoreReady" );
  1750     WRITELOG( "CHarvesterAO::BackupRestoreReady" );
  1649     iBlacklist->OpenDatabase();
  1751     iBlacklist->OpenDatabase();
       
  1752     }
       
  1753 
       
  1754 // ---------------------------------------------------------------------------
       
  1755 // From MMdSHarvesterDiskSpaceObserver.
       
  1756 // Called when change is disk space status occures
       
  1757 // ---------------------------------------------------------------------------
       
  1758 //
       
  1759 void CHarvesterAO::HandleDiskSpaceNotificationL( TDiskSpaceDirection aDiskSpaceDirection )
       
  1760     {
       
  1761     WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL()");
       
  1762     if( MMdSHarvesterDiskSpaceObserver::EMore == aDiskSpaceDirection )
       
  1763         {
       
  1764         WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL() - disk full");
       
  1765         iDiskFull = EFalse;
       
  1766         }
       
  1767     else
       
  1768         {
       
  1769         WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL() - disk space available");
       
  1770         iDiskFull = ETrue;
       
  1771         if( iServerPaused )
       
  1772             {
       
  1773             return;
       
  1774             }
       
  1775         }
       
  1776     
       
  1777     if( iDiskFull )
       
  1778         {
       
  1779         // cache monitored events
       
  1780         PauseMonitoring();   
       
  1781         PauseHarvester();    
       
  1782         }
       
  1783     else if( !iRamFull && !iManualPauseEnabled && iServerPaused )
       
  1784         {
       
  1785         // resume monitoring
       
  1786         ResumeMonitoring();
       
  1787         TRAP_IGNORE( ResumeHarvesterL() );    
       
  1788         }
  1650     }
  1789     }
  1651 
  1790 
  1652 // ---------------------------------------------------------------------------
  1791 // ---------------------------------------------------------------------------
  1653 // HarvestFile
  1792 // HarvestFile
  1654 // ---------------------------------------------------------------------------
  1793 // ---------------------------------------------------------------------------
  2350 	CleanupStack::PopAndDestroy( &scanItems );
  2489 	CleanupStack::PopAndDestroy( &scanItems );
  2351 	}
  2490 	}
  2352 
  2491 
  2353 TBool CHarvesterAO::IsDescInArray(const TPtrC& aSearch, const RPointerArray<HBufC>& aArray)
  2492 TBool CHarvesterAO::IsDescInArray(const TPtrC& aSearch, const RPointerArray<HBufC>& aArray)
  2354 	{
  2493 	{
  2355 	const TInt count = aArray.Count();
  2494 	for( TInt i = aArray.Count() - 1; i >=0; i-- )
  2356 	
       
  2357 	for( TInt i = 0; i < count; i++ )
       
  2358 		{
  2495 		{
  2359 		const TDesC& ignorePath = aArray[i]->Des();
  2496 		const TDesC& ignorePath = aArray[i]->Des();
  2360 		
  2497 		
  2361 		TInt result = MdsUtils::Compare( aSearch, ignorePath );
  2498 		TInt result = MdsUtils::Compare( aSearch, ignorePath );
  2362 		
  2499 		
  2582 	return EFalse;
  2719 	return EFalse;
  2583 	}
  2720 	}
  2584 
  2721 
  2585 void CHarvesterAO::PreallocateNamespaceL( CMdENamespaceDef& aNamespaceDef )
  2722 void CHarvesterAO::PreallocateNamespaceL( CMdENamespaceDef& aNamespaceDef )
  2586 	{
  2723 	{
  2587 	const TInt objectDefCount = aNamespaceDef.ObjectDefCount();
  2724 	for( TInt i = aNamespaceDef.ObjectDefCount() - 1; i >=0; i-- )
  2588 
       
  2589 	for( TInt i = 0; i < objectDefCount; i++ )
       
  2590 		{
  2725 		{
  2591 		CMdEObjectDef& objectDef = aNamespaceDef.ObjectDefL( i );
  2726 		CMdEObjectDef& objectDef = aNamespaceDef.ObjectDefL( i );
  2592 
  2727 
  2593 		const TInt propertyDefCount = objectDef.PropertyDefCount();
  2728 		for( TInt j = objectDef.PropertyDefCount() - 1; j >=0; j-- )
  2594 
       
  2595 		for( TInt j = 0; j < propertyDefCount; j++ )
       
  2596 			{
  2729 			{
  2597 			CMdEPropertyDef& propertyDef = objectDef.PropertyDefL( j );
  2730 		    // No need for a local copy of the returned pointer
       
  2731 			objectDef.PropertyDefL( j );
  2598 			}
  2732 			}
  2599 		}
  2733 		}
  2600 	}
  2734 	}
  2601 
  2735 
  2602 void CHarvesterAO::StartThumbAGDaemon()
  2736 void CHarvesterAO::StartThumbAGDaemon()
  2637         }    
  2771         }    
  2638     }
  2772     }
  2639 
  2773 
  2640 void CHarvesterAO::MemoryLow()
  2774 void CHarvesterAO::MemoryLow()
  2641 	{
  2775 	{
  2642 	WRITELOG("CHarvesterAO::MemoryLow()");
  2776     WRITELOG("CHarvesterAO::MemoryLow()");
       
  2777     iRamFull = ETrue;
       
  2778     
       
  2779     if( iServerPaused )
       
  2780         {
       
  2781         return;
       
  2782         }
       
  2783 
  2643 	// cache monitored events
  2784 	// cache monitored events
  2644 	PauseMonitoring();
  2785 	PauseMonitoring();
  2645 	
       
  2646 	PauseHarvester();
  2786 	PauseHarvester();
       
  2787 	
       
  2788 	iPHArray.Compress();
       
  2789 	iReadyPHArray.Compress();
       
  2790 	iContainerPHArray.Compress();
  2647 	}
  2791 	}
  2648 
  2792 
  2649 void CHarvesterAO::MemoryGood()
  2793 void CHarvesterAO::MemoryGood()
  2650 	{
  2794 	{
  2651 	WRITELOG("CHarvesterAO::MemoryGood()");
  2795     WRITELOG("CHarvesterAO::MemoryGood()");    
  2652 	// resume monitoring
  2796     iRamFull = EFalse;
  2653 	ResumeMonitoring();
  2797     
  2654 	
  2798     if( !iDiskFull && !iManualPauseEnabled && iServerPaused )
  2655 	TRAP_IGNORE( ResumeHarvesterL() );
  2799         {
       
  2800         // resume monitoring
       
  2801         ResumeMonitoring();
       
  2802     
       
  2803         TRAP_IGNORE( ResumeHarvesterL() );    
       
  2804         }
  2656 	}
  2805 	}
  2657 
  2806 
  2658 TBool CHarvesterAO::CheckForCameraItem( CHarvesterData* aHd, TDes& aObjectDef )
  2807 TBool CHarvesterAO::CheckForCameraItem( CHarvesterData* aHd, TDes& aObjectDef )
  2659     {
  2808     {
  2660     if( aHd->Origin() == MdeConstants::Object::ECamera )
  2809     if( aHd->Origin() == MdeConstants::Object::ECamera )