harvester/server/src/harvesterao.cpp
branchRCL_3
changeset 63 e538444823de
parent 53 29d87345eaeb
equal deleted inserted replaced
57:2872ae438bf7 63:e538444823de
    17 
    17 
    18 #include <e32svr.h>
    18 #include <e32svr.h>
    19 #include <caf/caf.h>
    19 #include <caf/caf.h>
    20 #include <driveinfo.h>
    20 #include <driveinfo.h>
    21 
    21 
       
    22 #include <rlocationobjectmanipulator.h>
    22 #include <placeholderdata.h>
    23 #include <placeholderdata.h>
    23 #include <harvesterclientdata.h>
    24 #include <harvesterclientdata.h>
    24 #include <pathinfo.h>
    25 #include <pathinfo.h>
    25 
    26 
    26 using namespace ContentAccess;
    27 using namespace ContentAccess;
    50 // constants
    51 // constants
    51 const TInt32 KFileMonitorPluginUid = 0x20007186;  // file monitor plugin implementation uid
    52 const TInt32 KFileMonitorPluginUid = 0x20007186;  // file monitor plugin implementation uid
    52 
    53 
    53 const TInt KPlaceholderQueueSize = 99;
    54 const TInt KPlaceholderQueueSize = 99;
    54 const TInt KContainerPlaceholderQueueSize = 10;
    55 const TInt KContainerPlaceholderQueueSize = 10;
    55 const TInt KReadyPlaceholderQueueSize = 10;
       
    56 const TInt KObjectDefStrSize = 20;
    56 const TInt KObjectDefStrSize = 20;
    57 
    57 
    58 _LIT( KTAGDaemonName, "ThumbAGDaemon" );
    58 _LIT( KTAGDaemonName, "ThumbAGDaemon" );
    59 _LIT( KTAGDaemonExe, "thumbagdaemon.exe" );
    59 _LIT( KTAGDaemonExe, "thumbagdaemon.exe" );
    60 
    60 
    61 _LIT(KVideo, "Video");
    61 _LIT(KVideo, "Video");
    62 _LIT(KInUse, "InUse");
    62 _LIT(KInUse, "InUse");
    63 
    63 
    64 _LIT(KUndefined, " ");
    64 _LIT(KUndefinedMime, " ");
    65 
    65 
    66 _LIT( KExtensionMp4,   "mp4" );
    66 _LIT( KExtensionMp4,   "mp4" );
    67 _LIT( KExtensionMpg4,  "mpg4" );
    67 _LIT( KExtensionMpg4,  "mpg4" );
    68 _LIT( KExtensionMpeg4, "mpeg4" );
    68 _LIT( KExtensionMpeg4, "mpeg4" );
    69 _LIT( KExtension3gp,   "3gp" );
    69 _LIT( KExtension3gp,   "3gp" );
    74 	{
    74 	{
    75 	}
    75 	}
    76 
    76 
    77 void CHarvesterAoPropertyDefs::ConstructL(CMdEObjectDef& aObjectDef)
    77 void CHarvesterAoPropertyDefs::ConstructL(CMdEObjectDef& aObjectDef)
    78 	{
    78 	{
    79     SetByObjectDefL( aObjectDef );
    79 	CMdENamespaceDef& nsDef = aObjectDef.NamespaceDef();
       
    80 
       
    81 	// Common property definitions
       
    82 	CMdEObjectDef& objectDef = nsDef.GetObjectDefL( MdeConstants::Object::KBaseObject );
       
    83 	iCreationDatePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KCreationDateProperty );
       
    84 	iLastModifiedDatePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KLastModifiedDateProperty );
       
    85 	iSizePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KSizeProperty );
       
    86 	iOriginPropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KOriginProperty );
       
    87 	iItemTypePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KItemTypeProperty );
       
    88 	iTitlePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KTitleProperty );
       
    89 	iDefaultFolderPropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KInDefaultFolder );
       
    90 	
       
    91 	CMdEObjectDef& mediaDef = nsDef.GetObjectDefL( MdeConstants::MediaObject::KMediaObject );
       
    92 	iPreinstalledPropertyDef = &mediaDef.GetPropertyDefL( MdeConstants::MediaObject::KPreinstalledProperty );
    80 	}
    93 	}
    81 
    94 
    82 CHarvesterAoPropertyDefs* CHarvesterAoPropertyDefs::NewL()
    95 CHarvesterAoPropertyDefs* CHarvesterAoPropertyDefs::NewL(CMdEObjectDef& aObjectDef)
    83     {
    96 	{
    84     CHarvesterAoPropertyDefs* self = 
    97 	CHarvesterAoPropertyDefs* self = 
    85         new (ELeave) CHarvesterAoPropertyDefs();
    98 		new (ELeave) CHarvesterAoPropertyDefs();
    86     return self;
    99 	CleanupStack::PushL( self );
    87     }
   100 	self->ConstructL( aObjectDef );
    88 
   101 	CleanupStack::Pop( self );
    89 void CHarvesterAoPropertyDefs::SetByObjectDefL(CMdEObjectDef& aObjectDef)
   102 	return self;
    90     {
   103 	}
    91     CMdENamespaceDef& nsDef = aObjectDef.NamespaceDef();
   104 
    92 
       
    93     // Common property definitions
       
    94     CMdEObjectDef& objectDef = nsDef.GetObjectDefL( MdeConstants::Object::KBaseObject );
       
    95     iCreationDatePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KCreationDateProperty );
       
    96     iLastModifiedDatePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KLastModifiedDateProperty );
       
    97     iSizePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KSizeProperty );
       
    98     iOriginPropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KOriginProperty );
       
    99     iItemTypePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KItemTypeProperty );
       
   100     iTitlePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KTitleProperty );
       
   101     iDefaultFolderPropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KInDefaultFolder );
       
   102     
       
   103     CMdEObjectDef& mediaDef = nsDef.GetObjectDefL( MdeConstants::MediaObject::KMediaObject );
       
   104     iPreinstalledPropertyDef = &mediaDef.GetPropertyDefL( MdeConstants::MediaObject::KPreinstalledProperty );
       
   105     }
       
   106 	
       
   107 // ---------------------------------------------------------------------------
   105 // ---------------------------------------------------------------------------
   108 // NewLC
   106 // NewLC
   109 // ---------------------------------------------------------------------------
   107 // ---------------------------------------------------------------------------
   110 //
   108 //
   111 CHarvesterAO* CHarvesterAO::NewLC()
   109 CHarvesterAO* CHarvesterAO::NewLC()
   153     iManualPauseEnabled = EFalse;
   151     iManualPauseEnabled = EFalse;
   154     iFastHarvestNeeded = EFalse;
   152     iFastHarvestNeeded = EFalse;
   155     iHarvestingPlaceholders = EFalse;
   153     iHarvestingPlaceholders = EFalse;
   156     
   154     
   157     iUnmountDetected = EFalse;
   155     iUnmountDetected = EFalse;
   158     iUnmountHandlingOngoing = EFalse;
       
   159     iPriorityInterruptDetected = EFalse;
   156     iPriorityInterruptDetected = EFalse;
   160     iLocManipulatorConnected = EFalse;
       
   161     }
   157     }
   162      
   158      
   163 // ---------------------------------------------------------------------------
   159 // ---------------------------------------------------------------------------
   164 // ~CHarvesterAO
   160 // ~CHarvesterAO
   165 // ---------------------------------------------------------------------------
   161 // ---------------------------------------------------------------------------
   170     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_CHARVESTERAO, "CHarvesterAO::~CHarvesterAO" );
   166     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_CHARVESTERAO, "CHarvesterAO::~CHarvesterAO" );
   171     
   167     
   172     Cancel();
   168     Cancel();
   173 
   169 
   174 	iFs.Close();
   170 	iFs.Close();
   175 	
       
   176 	iLocManipulator.Close();
       
   177 	
   171 	
   178 	if (iCtxEngine)
   172 	if (iCtxEngine)
   179 		{
   173 		{
   180 		iCtxEngine->ReleaseInstance();
   174 		iCtxEngine->ReleaseInstance();
   181 		}
   175 		}
   190     
   184     
   191     StopComposers();
   185     StopComposers();
   192     DeleteComposers();
   186     DeleteComposers();
   193 
   187 
   194     delete iDiskFullNotifier;
   188     delete iDiskFullNotifier;
   195     iDiskFullNotifier = NULL;
       
   196 	delete iBackupSubscriber;
   189 	delete iBackupSubscriber;
   197 	iBackupSubscriber = NULL;
       
   198     
   190     
   199     if (iBlacklist)
   191     if (iBlacklist)
   200 		{
   192 		{
   201 		iBlacklist->CloseDatabase();
   193 		iBlacklist->CloseDatabase();
   202 		delete iBlacklist;
   194 		delete iBlacklist;
   203 		iBlacklist = NULL;
       
   204 		}
   195 		}
   205 	delete iReHarvester;
   196 	delete iReHarvester;
   206 	iReHarvester = NULL;
       
   207 
   197 
   208     if ( iHarvestFileMessages.Count() > 0 )
   198     if ( iHarvestFileMessages.Count() > 0 )
   209         {
   199         {
   210         for ( TInt i = iHarvestFileMessages.Count()-1; i >= 0; --i )
   200         for ( TInt i = iHarvestFileMessages.Count()-1; i >= 0; --i )
   211             {
   201             {
   230     
   220     
   231     iTempReadyPHArray.ResetAndDestroy();
   221     iTempReadyPHArray.ResetAndDestroy();
   232     iTempReadyPHArray.Close();
   222     iTempReadyPHArray.Close();
   233     
   223     
   234 	delete iHarvesterOomAO;
   224 	delete iHarvesterOomAO;
   235 	iHarvesterOomAO = NULL;
       
   236     delete iRestoreWatcher;
   225     delete iRestoreWatcher;
   237     iRestoreWatcher = NULL;
       
   238 	delete iOnDemandAO;
   226 	delete iOnDemandAO;
   239 	iOnDemandAO = NULL;
       
   240 	delete iMdEHarvesterSession;
   227 	delete iMdEHarvesterSession;
   241 	iMdEHarvesterSession = NULL;
       
   242 	delete iMdESession;
   228 	delete iMdESession;
   243 	iMdESession = NULL;
       
   244 	delete iQueue;
   229 	delete iQueue;
   245 	iQueue = NULL;
       
   246 	delete iHarvesterPluginFactory;
   230 	delete iHarvesterPluginFactory;
   247 	iHarvesterPluginFactory = NULL;
       
   248 	delete iMdeObjectHandler;
   231 	delete iMdeObjectHandler;
   249 	iMdeObjectHandler = NULL;
       
   250 	delete iUnmountHandlerAO;
   232 	delete iUnmountHandlerAO;
   251 	iUnmountHandlerAO = NULL;
       
   252 	
   233 	
   253 	delete iPropDefs;
   234 	delete iPropDefs;
   254 	iPropDefs = NULL;
       
   255 	delete iCameraExtensionArray;
   235 	delete iCameraExtensionArray;
   256 	iCameraExtensionArray = NULL;
       
   257 	
   236 	
   258     delete iPhoneImagesPath;
   237     delete iPhoneImagesPath;
   259     iPhoneImagesPath = NULL;
       
   260     delete iMmcImagesPath;
   238     delete iMmcImagesPath;
   261     iMmcImagesPath = NULL;
       
   262     
   239     
   263     delete iPhoneVideosPath;
   240     delete iPhoneVideosPath;
   264     iPhoneVideosPath = NULL;
       
   265     delete iMmcVideosPath;
   241     delete iMmcVideosPath;
   266     iMmcVideosPath = NULL;
       
   267     
   242     
   268     delete iPhoneSoundsPath;
   243     delete iPhoneSoundsPath;
   269     iPhoneSoundsPath = NULL;
       
   270     delete iMmcSoundsPath;
   244     delete iMmcSoundsPath;
   271     iMmcSoundsPath = NULL;
       
   272 	
   245 	
   273 	RMediaIdUtil::ReleaseInstance();
   246 	RMediaIdUtil::ReleaseInstance();
   274     
   247     
   275     REComSession::FinalClose();
   248     REComSession::FinalClose();
   276     }
   249     }
   318     iHarvesterPluginFactory->SetBlacklist( *iBlacklist );
   291     iHarvesterPluginFactory->SetBlacklist( *iBlacklist );
   319     
   292     
   320     // Reset harvesting status for clients in case blacklisted file was handled
   293     // Reset harvesting status for clients in case blacklisted file was handled
   321     iHarvesterPluginFactory->SendHarvestingStatusEventL( EFalse );
   294     iHarvesterPluginFactory->SendHarvestingStatusEventL( EFalse );
   322     
   295     
   323     iPropDefs = CHarvesterAoPropertyDefs::NewL();
       
   324 	
       
   325     iCameraExtensionArray = new ( ELeave ) CDesCArraySeg( 6 );
   296     iCameraExtensionArray = new ( ELeave ) CDesCArraySeg( 6 );
   326     iCameraExtensionArray->InsertIsqL( KExtensionMp4 );
   297     iCameraExtensionArray->InsertIsqL( KExtensionMp4 );
   327     iCameraExtensionArray->InsertIsqL( KExtensionMpg4 );
   298     iCameraExtensionArray->InsertIsqL( KExtensionMpg4 );
   328     iCameraExtensionArray->InsertIsqL( KExtensionMpeg4 );
   299     iCameraExtensionArray->InsertIsqL( KExtensionMpeg4 );
   329     iCameraExtensionArray->InsertIsqL( KExtension3gp );
   300     iCameraExtensionArray->InsertIsqL( KExtension3gp );
   381     
   352     
   382     TCleanupItem cleanupItem( MdsUtils::CleanupEComArray, &infoArray );
   353     TCleanupItem cleanupItem( MdsUtils::CleanupEComArray, &infoArray );
   383     CleanupStack::PushL( cleanupItem );
   354     CleanupStack::PushL( cleanupItem );
   384     
   355     
   385     CMonitorPlugin::ListImplementationsL( infoArray );
   356     CMonitorPlugin::ListImplementationsL( infoArray );
   386     const TInt count( infoArray.Count() );
   357     TInt count( 0 );
       
   358     count = infoArray.Count();
   387     CMonitorPlugin* plugin = NULL;
   359     CMonitorPlugin* plugin = NULL;
   388     
   360     
   389     for ( TInt i = 0; i < count; i++ )
   361     for ( TInt i = 0; i < count; i++ )
   390         {
   362         {
   391         TUid uid = infoArray[i]->ImplementationUid();    // Create the plug-ins
   363         TUid uid = infoArray[i]->ImplementationUid();    // Create the plug-ins
   436 //
   408 //
   437 void CHarvesterAO::StartMonitoring()
   409 void CHarvesterAO::StartMonitoring()
   438     {
   410     {
   439     WRITELOG( "CHarvesterAO::StartMonitoring()" );
   411     WRITELOG( "CHarvesterAO::StartMonitoring()" );
   440     OstTrace0( TRACE_NORMAL, CHARVESTERAO_STARTMONITORING, "CHarvesterAO::StartMonitoring" );    
   412     OstTrace0( TRACE_NORMAL, CHARVESTERAO_STARTMONITORING, "CHarvesterAO::StartMonitoring" );    
       
   413     
   441     const TInt count( iMonitorPluginArray.Count() );  
   414     const TInt count( iMonitorPluginArray.Count() );  
   442     
   415     
   443     for ( TInt i = 0; i < count; i++ )
   416     for ( TInt i = 0; i < count; i++ )
   444         {
   417         {
   445         iMonitorPluginArray[i]->StartMonitoring( *iQueue, iMdESession, NULL, 
   418         iMonitorPluginArray[i]->StartMonitoring( *iQueue, iMdESession, NULL, 
   454 void CHarvesterAO::StopMonitoring()
   427 void CHarvesterAO::StopMonitoring()
   455     {
   428     {
   456     WRITELOG( "CHarvesterAO::StopMonitoring()" );
   429     WRITELOG( "CHarvesterAO::StopMonitoring()" );
   457     
   430     
   458     OstTrace0( TRACE_NORMAL, CHARVESTERAO_STOPMONITORING, "CHarvesterAO::StopMonitoring" );
   431     OstTrace0( TRACE_NORMAL, CHARVESTERAO_STOPMONITORING, "CHarvesterAO::StopMonitoring" );
   459     
   432 
   460     for( TInt i = iMonitorPluginArray.Count() - 1; i >=0; i-- )
   433     const TInt count( iMonitorPluginArray.Count() );
       
   434     
       
   435     for ( TInt i = 0; i < count; i++ )
   461         {
   436         {
   462         iMonitorPluginArray[i]->StopMonitoring();
   437         iMonitorPluginArray[i]->StopMonitoring();
   463         }
   438         }
   464     }
   439     }
   465 
   440 
   470 void CHarvesterAO::PauseMonitoring()
   445 void CHarvesterAO::PauseMonitoring()
   471     {
   446     {
   472     WRITELOG( "CHarvesterAO::PauseMonitoring()" );
   447     WRITELOG( "CHarvesterAO::PauseMonitoring()" );
   473     OstTrace0( TRACE_NORMAL, CHARVESTERAO_PAUSEMONITORING, "CHarvesterAO::PauseMonitoring" );
   448     OstTrace0( TRACE_NORMAL, CHARVESTERAO_PAUSEMONITORING, "CHarvesterAO::PauseMonitoring" );
   474     
   449     
   475     for( TInt i = iMonitorPluginArray.Count() - 1; i >=0; i-- )
   450     const TInt count( iMonitorPluginArray.Count() );
       
   451     
       
   452     for ( TInt i = 0; i<count; i++ )
   476         {
   453         {
   477         iMonitorPluginArray[i]->PauseMonitoring();
   454         iMonitorPluginArray[i]->PauseMonitoring();
   478         }
   455         }
   479     
       
   480     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_PAUSEMONITORING, "CHarvesterAO::PauseMonitoring - end" );    
   456     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_PAUSEMONITORING, "CHarvesterAO::PauseMonitoring - end" );    
   481     WRITELOG( "CHarvesterAO::PauseMonitoring() - end" );
   457     WRITELOG( "CHarvesterAO::PauseMonitoring() - end" );
   482     }
   458     }
   483 
   459 
   484 // ---------------------------------------------------------------------------
   460 // ---------------------------------------------------------------------------
   508 	{
   484 	{
   509     WRITELOG1( "CHarvesterAO::HandleUnmount(%d)", aMediaId );    
   485     WRITELOG1( "CHarvesterAO::HandleUnmount(%d)", aMediaId );    
   510 	OstTrace1( TRACE_NORMAL, CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount;aMediaId=%d", aMediaId );
   486 	OstTrace1( TRACE_NORMAL, CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount;aMediaId=%d", aMediaId );
   511     
   487     
   512     iUnmountDetected = ETrue;
   488     iUnmountDetected = ETrue;
   513     iUnmountHandlingOngoing = ETrue;
       
   514     
   489     
   515     if( !iServerPaused )
   490     if( !iServerPaused )
   516         {
   491         {
   517         // Stop harvesting for unmount
   492         // Stop harvesting for unmount
   518         PauseMonitoring();
   493         PauseMonitoring();
   733 		}
   708 		}
   734 	
   709 	
   735     iMediaIdUtil->RemoveMediaId( aMediaId );
   710     iMediaIdUtil->RemoveMediaId( aMediaId );
   736 	
   711 	
   737 	// resume harvesting from last state
   712 	// resume harvesting from last state
   738     iUnmountHandlingOngoing = EFalse;
   713     if( !iRamFull && !iDiskFull )
   739     // resume monitoring
   714         {
   740     ResumeMonitoring();
   715         // resume monitoring
   741     TRAP_IGNORE( ResumeHarvesterL() );    
   716         ResumeMonitoring();
       
   717         TRAP_IGNORE( ResumeHarvesterL() );    
       
   718         }
   742 	}
   719 	}
   743 
   720 
   744 // ---------------------------------------------------------------------------
   721 // ---------------------------------------------------------------------------
   745 // StartComposersL
   722 // StartComposersL
   746 // ---------------------------------------------------------------------------
   723 // ---------------------------------------------------------------------------
   847         iHarvestingPlaceholders = ETrue;
   824         iHarvestingPlaceholders = ETrue;
   848         if( !iFastHarvestNeeded )
   825         if( !iFastHarvestNeeded )
   849             {
   826             {
   850             SetPriority( KHarvesterCustomImportantPriority );
   827             SetPriority( KHarvesterCustomImportantPriority );
   851             }
   828             }
   852     	while( hd &&
   829     	while( hd != NULL &&
   853 			   iPHArray.Count() < KPlaceholderQueueSize &&
   830 				iPHArray.Count() < KPlaceholderQueueSize &&
   854 			   hd->ObjectType() == EPlaceholder )
   831 				hd->ObjectType() == EPlaceholder )
   855     		{
   832     		{
   856         	if(iPHArray.Append( hd ) != KErrNone)
   833         	iPHArray.Append( hd );
       
   834         	if( hd->Origin() == MdeConstants::Object::ECamera || 
       
   835         	    hd->ObjectType() == EFastHarvest  )
   857         	    {
   836         	    {
   858         	    HarvestCompleted( hd->ClientId(), hd->Uri(), KErrNoMemory );
   837         	    if( !iFastHarvestNeeded )
   859         	    iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
   838         	        {
   860                 delete hd;
   839                     iFastHarvestNeeded = ETrue;
   861                 hd = NULL;
   840                     // Fast harvest event must be handled even if MMC handling would be ongoing
       
   841                     SetPriority( KHarvesterPriorityMonitorPlugin );
       
   842         	        }
       
   843         	    break;
   862         	    }
   844         	    }
   863         	else
   845         	else if( iFastHarvestNeeded )
   864         	    {
   846         	    {
   865                 if( hd->Origin() == MdeConstants::Object::ECamera || 
   847         	    iFastHarvestNeeded = EFalse;
   866                     hd->ObjectType() == EFastHarvest  )
   848         	    SetPriority( KHarvesterCustomImportantPriority );
   867                     {
       
   868                     if( !iFastHarvestNeeded )
       
   869                         {
       
   870                         iFastHarvestNeeded = ETrue;
       
   871                         // Fast harvest event must be handled even if MMC handling would be ongoing
       
   872                         SetPriority( KHarvesterPriorityMonitorPlugin );
       
   873                         }
       
   874                     break;
       
   875                     }
       
   876                 else if( iFastHarvestNeeded )
       
   877                     {
       
   878                     iFastHarvestNeeded = EFalse;
       
   879                     SetPriority( KHarvesterCustomImportantPriority );
       
   880         	    	}
       
   881         	    }
   849         	    }
   882         	hd = iQueue->GetNextItem();
   850         	hd = iQueue->GetNextItem();
   883     		}
   851     		}
   884     	
   852     	
   885     	if( iFastHarvestNeeded && iPHArray.Count() > 0 )
   853     	if( iFastHarvestNeeded && iPHArray.Count() > 0 )
   886     	    {
   854     	    {
   887             TRAPD( err, HandlePlaceholdersL( ETrue ) );
   855             TRAPD( err, HandlePlaceholdersL( ETrue ) );
   888 
   856 
   889             // make sure that when HandlePlaceholdersL leaves unexpectedly, iPHArray is cleared
   857             // make sure that when HandlePlaceholdersL leaves, iPHArray is cleared
   890             if ( err != KErrNone )
   858             if ( err != KErrNone )
   891                 {
   859                 {
   892                 if( err != KErrDiskFull )
   860                 iPHArray.ResetAndDestroy();
   893                     {
   861                 iTempReadyPHArray.ResetAndDestroy();
   894                     iPHArray.ResetAndDestroy();
       
   895                     iTempReadyPHArray.ResetAndDestroy();
       
   896                     }
       
   897                 User::Leave( err );
   862                 User::Leave( err );
   898                 }
   863                 }
   899             
   864             
   900             TInt count( iReadyPHArray.Count() );
   865             TInt count( iReadyPHArray.Count() );
   901             for( TInt i = 0; i < count; i++ )
   866             for( TInt i = 0; i < count; i++ )
   915     	
   880     	
   916 		if( hd )
   881 		if( hd )
   917     		{
   882     		{
   918 	    	if( hd->ObjectType() == EPlaceholder )
   883 	    	if( hd->ObjectType() == EPlaceholder )
   919 	    		{
   884 	    		{
   920 	        	if( iPHArray.Append( hd ) != KErrNone )
   885 	        	iPHArray.Append( hd );
   921 	        	    {
       
   922 	        	    HarvestCompleted( hd->ClientId(), hd->Uri(), KErrNoMemory ); 
       
   923 	        	    iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
       
   924                     delete hd;
       
   925                     hd = NULL;
       
   926 	        	    }
       
   927 	    		}
   886 	    		}
   928 	    	else
   887 	    	else
   929 	    		{
   888 	    		{
   930                 if( iReadyPHArray.Append( hd ) != KErrNone)
   889 	    		CheckFileExtensionAndHarvestL( hd );
   931                     {
   890 	    		if( iUnmountDetected )
   932                     delete hd;
   891 	    		    {
   933                     hd = NULL;
   892 	    		    iQueue->Append( hd );
   934                     }
   893 	    		    return;
       
   894 	    		    }
   935 	    		}
   895 	    		}
   936     		}
   896     		}
   937 			
   897 			
   938     	if( iPHArray.Count() > 0 )
   898     	if( iPHArray.Count() > 0 )
   939     		{
   899     		{
   940 	    	TRAPD( err, HandlePlaceholdersL( ETrue ) );
   900 	    	TRAPD( err, HandlePlaceholdersL( ETrue ) );
   941 
   901 
   942 	    	// make sure that when HandlePlaceholdersL leaves unexpectedly, iPHArray is cleared
   902 	    	// make sure that when HandlePlaceholdersL leaves, iPHArray is cleared
   943 	    	if ( err != KErrNone )
   903 	    	if ( err != KErrNone )
   944 	    		{
   904 	    		{
   945 	    	    if( err != KErrDiskFull )
   905 	    		iPHArray.ResetAndDestroy();
   946 	    	        {
   906 	    		iTempReadyPHArray.ResetAndDestroy();
   947 	    	        iPHArray.ResetAndDestroy();
       
   948 	    	        iTempReadyPHArray.ResetAndDestroy();
       
   949 	    	        }
       
   950 	    		User::Leave( err );
   907 	    		User::Leave( err );
   951 	    		}
   908 	    		}
   952     		}
   909     		}
   953     	}
   910     	}
   954     else
   911     else
   957             {
   914             {
   958             SetPriority( KHarvesterPriorityHarvestingPlugin );
   915             SetPriority( KHarvesterPriorityHarvestingPlugin );
   959             }
   916             }
   960         iHarvestingPlaceholders = EFalse;
   917         iHarvestingPlaceholders = EFalse;
   961         CheckFileExtensionAndHarvestL( hd );
   918         CheckFileExtensionAndHarvestL( hd );
   962         if( iUnmountDetected && hd )
   919         if( iUnmountDetected )
   963             {
   920             {
   964             iQueue->Append( hd );
   921             iQueue->Append( hd );
   965             }
   922             }
   966     	}
   923     	}
   967     }
   924     }
   977 
   934 
   978 	RPointerArray<CMdEObject> mdeObjectArray;
   935 	RPointerArray<CMdEObject> mdeObjectArray;
   979 	CleanupClosePushL( mdeObjectArray );
   936 	CleanupClosePushL( mdeObjectArray );
   980 
   937 
   981 	TTimeIntervalSeconds timeOffsetSeconds = User::UTCOffset();
   938 	TTimeIntervalSeconds timeOffsetSeconds = User::UTCOffset();
   982 	
       
   983 	CMdENamespaceDef& defNS = iMdESession->GetDefaultNamespaceDefL();
       
   984 	
   939 	
   985 	TInt endindex( iPHArray.Count() );
   940 	TInt endindex( iPHArray.Count() );
   986 	for( TInt i = 0; i < endindex; i++ )
   941 	for( TInt i = 0; i < endindex; i++ )
   987 		{
   942 		{
   988 		CHarvesterData* hd = iPHArray[i];
   943 		CHarvesterData* hd = iPHArray[i];
   989 		
   944 		
   990 		if( aCheck && 
   945 		if( aCheck && iHarvesterPluginFactory->IsContainerFileL( hd->Uri() ) )
   991 		    hd->Origin() != MdeConstants::Object::ECamera &&
       
   992 		    iHarvesterPluginFactory->IsContainerFileL( hd->Uri() ) )
       
   993 			{
   946 			{
   994 			if( iContainerPHArray.Append( hd ) != KErrNone )
   947 			iContainerPHArray.Append( hd );
   995 			    {
       
   996 			    HarvestCompleted( hd->ClientId(), hd->Uri(), KErrNoMemory );
       
   997 			    iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
       
   998                 delete hd;
       
   999                 hd = NULL;
       
  1000 			    }
       
  1001 
       
  1002 			iPHArray.Remove( i );
   948 			iPHArray.Remove( i );
  1003 			i--;
   949             i--;
  1004 			endindex--;
   950             endindex--;
  1005 			continue;
   951 			continue;
  1006 			}
   952 			}
  1007 		
       
  1008 		TBuf<KObjectDefStrSize> objDefStr;
   953 		TBuf<KObjectDefStrSize> objDefStr;
  1009 		
   954 		
  1010 		if( !CheckForCameraItem( hd, objDefStr ) )
   955 		if( !CheckForCameraItem( hd, objDefStr ) )
  1011 		    {
   956 		    {
  1012 		    iHarvesterPluginFactory->GetObjectDefL( hd, objDefStr );
   957 		    iHarvesterPluginFactory->GetObjectDefL( *hd, objDefStr );
  1013 		    }
   958 		    }
  1014 		
   959 		
  1015 		// GetObjectDef can cause context switch, and if unmount happens when this execution is 
   960 		// GetObjectDef can cause context switch, and if unmount happens when this execution is 
  1016 		// interrupted, the ph arrays can be invalid. Thus, abort whole run, and start over to make sure 
   961 		// interrupted, the ph arrays can be invalid. Thus, abort whole run, and start over to make sure 
  1017 		// the arrays are valid.
   962 		// the arrays are valid.
  1018 		if( iUnmountDetected )
   963 		if( iUnmountDetected )
  1019 		    {
   964 		    {
  1020 		    WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - Unmount detected during execution!" );
   965 		    WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - Unmount detected during execution!" );
  1021 		    for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
   966 		    for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
  1022 		        {
   967 		        {
  1023 		        CHarvesterData* tempHd = iTempReadyPHArray[y];
   968 		        CHarvesterData* hd = iTempReadyPHArray[y];
  1024 				
   969 		        iPHArray.Insert( hd, 0 );
  1025 		        if(iPHArray.Insert( tempHd, 0 ) != KErrNone)
       
  1026 		            {
       
  1027 		            HarvestCompleted( tempHd->ClientId(), tempHd->Uri(), KErrNoMemory );
       
  1028 		            iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
       
  1029                     delete tempHd;
       
  1030                     tempHd = NULL;
       
  1031 		            }
       
  1032 		        }
   970 		        }
  1033 		    iTempReadyPHArray.Reset();
   971 		    iTempReadyPHArray.Reset();
  1034 		    CleanupStack::PopAndDestroy( &mdeObjectArray );
   972 		    CleanupStack::PopAndDestroy( &mdeObjectArray );
  1035 		    return;
   973 		    return;
  1036 		    }
   974 		    }
  1041 		    {
   979 		    {
  1042             WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - Priority interrupt during execution!" );
   980             WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - Priority interrupt during execution!" );
  1043             const TInt currentPHArrayCount( iPHArray.Count() );
   981             const TInt currentPHArrayCount( iPHArray.Count() );
  1044             for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
   982             for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
  1045                 {
   983                 {
  1046                 CHarvesterData* tempHd = iTempReadyPHArray[y];
   984                 CHarvesterData* hd = iTempReadyPHArray[y];
  1047                 if(iPHArray.Insert( tempHd, 0 ) != KErrNone)
   985                 if( currentPHArrayCount )
  1048                     {
   986                     {
  1049                     HarvestCompleted( tempHd->ClientId(), tempHd->Uri(), KErrNoMemory );
   987                     // Leave the first item in the array as it is the priority item
  1050                     iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
   988                     iPHArray.Insert( hd, 1 );
  1051                     delete tempHd;
   989                     }
  1052                     tempHd = NULL;
   990                 else
       
   991                     {
       
   992                     iPHArray.Insert( hd, 0 );
  1053                     }
   993                     }
  1054                 }
   994                 }
  1055             iTempReadyPHArray.Reset();
   995             iTempReadyPHArray.Reset();
  1056             CleanupStack::PopAndDestroy( &mdeObjectArray );
   996             CleanupStack::PopAndDestroy( &mdeObjectArray );
  1057             return;		
   997             return;		
  1058 		    }
   998 		    }
  1059 	    // Check if disk is full
       
  1060 	    // If disk is detected to be full, no items can be added to MDS db, thus abort the run, and start over 
       
  1061 		// when disk space is available to make sure the arrays are valid.
       
  1062 		else if( iDiskFull )
       
  1063 		    {
       
  1064             WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - No disk space available!" );
       
  1065             for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
       
  1066                 {
       
  1067                 CHarvesterData* tempHd = iTempReadyPHArray[y];
       
  1068             
       
  1069                 if(iPHArray.Insert( tempHd, 0 ) != KErrNone)
       
  1070                     {
       
  1071                     HarvestCompleted( tempHd->ClientId(), tempHd->Uri(), KErrNoMemory );
       
  1072                     iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
       
  1073                     delete tempHd;
       
  1074                     tempHd = NULL;
       
  1075                     }
       
  1076                 }
       
  1077             iTempReadyPHArray.Reset();
       
  1078             CleanupStack::PopAndDestroy( &mdeObjectArray );
       
  1079             User::Leave( KErrDiskFull );
       
  1080 		    }
       
  1081 		
   999 		
  1082 		if( objDefStr.Length() == 0 ||
  1000 		if( objDefStr.Length() == 0 ||
  1083 		    ( objDefStr == KInUse ) )
  1001 		    ( objDefStr == KInUse ) )
  1084 			{
  1002 			{
  1085 #ifdef _DEBUG
  1003 		    WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - no objectDef or in use, failing harvesting" );
  1086 		    if( objDefStr.Length() == 0 )
       
  1087 		        {
       
  1088 		        WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - no objectDef failing harvesting" );
       
  1089 		        }
       
  1090 		    else
       
  1091 		        {
       
  1092 		        WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - in use, failing harvesting" );
       
  1093 		        }
       
  1094 		    WRITELOG1( "CHarvesterAO::HandlePlaceholdersL() - harvesting failed, uri: %S", &(hd->Uri()) );
       
  1095 #endif
       
  1096 		    // If object has not been created in the device so that monitors would have
       
  1097 		    // picked up creation event, and the file is in use, subclose event will
       
  1098 		    // not trigger the file to be harvester when closed, thus it needs to be moved 
       
  1099 		    // to reharvesting queue
       
  1100 		    if( objDefStr == KInUse &&
       
  1101 		        !hd->TakeSnapshot() )
       
  1102 		        {
       
  1103 		        iPHArray.Remove( i );
       
  1104 		        i--;
       
  1105 		        endindex--;
       
  1106 		        iReHarvester->AddItem( hd );
       
  1107 		        continue;
       
  1108 		        }
       
  1109 			const TInt error( KErrUnknown );
  1004 			const TInt error( KErrUnknown );
  1110             // notify observer, notification is needed even if file is not supported
  1005             // notify observer, notification is needed even if file is not supported
  1111             HarvestCompleted( hd->ClientId(), hd->Uri(), error );
  1006             HarvestCompleted( hd->ClientId(), hd->Uri(), error );
  1112 			delete hd;
  1007 			delete hd;
  1113 			hd = NULL;
  1008 			hd = NULL;
  1116             endindex--;
  1011             endindex--;
  1117 			iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
  1012 			iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
  1118 			continue;
  1013 			continue;
  1119 			}
  1014 			}
  1120 
  1015 
       
  1016 		CMdENamespaceDef& defNS = iMdESession->GetDefaultNamespaceDefL();
  1121 		CMdEObjectDef& mdeObjectDef = defNS.GetObjectDefL( objDefStr );
  1017 		CMdEObjectDef& mdeObjectDef = defNS.GetObjectDefL( objDefStr );
  1122 
  1018 
  1123 		HBufC* hdUri = hd->Uri().AllocL();
  1019 		CMdEObject* mdeObject = iMdESession->NewObjectL( mdeObjectDef, hd->Uri() );
  1124 		CleanupStack::PushL( hdUri );
       
  1125 		CMdEObject* mdeObject = iMdESession->NewObjectL( mdeObjectDef, *hdUri );
       
  1126 		CleanupStack::PopAndDestroy( hdUri );
       
  1127 		CleanupStack::PushL( mdeObject );
  1020 		CleanupStack::PushL( mdeObject );
  1128 		
  1021 		
  1129 		CPlaceholderData* phData = NULL;
  1022 		CPlaceholderData* phData = NULL;
  1130 
  1023 
  1131 		if( hd->TakeSnapshot() )
  1024 		if( hd->TakeSnapshot() )
  1190 		mdeObject->SetMediaId( phData->MediaId() );
  1083 		mdeObject->SetMediaId( phData->MediaId() );
  1191 	    
  1084 	    
  1192 	    // set placeholder
  1085 	    // set placeholder
  1193 	    mdeObject->SetPlaceholder( ETrue );
  1086 	    mdeObject->SetPlaceholder( ETrue );
  1194 	    
  1087 	    
  1195 	    if( !iPropDefs->iCreationDatePropertyDef )
  1088 	    if( !iPropDefs )
  1196 	        {
  1089 	    	{
  1197             iPropDefs->SetByObjectDefL( defNS.GetObjectDefL( MdeConstants::Object::KBaseObject ) );
  1090 	    	iPropDefs = CHarvesterAoPropertyDefs::NewL( defNS.GetObjectDefL( MdeConstants::Object::KBaseObject ) );
  1198 	        }
  1091 	    	}
  1199 
  1092 
  1200 	    // set file size
  1093 	    // set file size
  1201     	mdeObject->AddUint32PropertyL( *iPropDefs->iSizePropertyDef, phData->FileSize() );
  1094     	mdeObject->AddUint32PropertyL( *iPropDefs->iSizePropertyDef, phData->FileSize() );
  1202 
  1095 
  1203 	    // set creation date
  1096 	    // set creation date
  1216             {
  1109             {
  1217             mdeObject->AddTextPropertyL( *iPropDefs->iItemTypePropertyDef, mimeType );
  1110             mdeObject->AddTextPropertyL( *iPropDefs->iItemTypePropertyDef, mimeType );
  1218             }
  1111             }
  1219         else
  1112         else
  1220             {
  1113             {
  1221             mdeObject->AddTextPropertyL( *iPropDefs->iItemTypePropertyDef, KUndefined );
  1114             mdeObject->AddTextPropertyL( *iPropDefs->iItemTypePropertyDef, KUndefinedMime );
  1222             }
  1115             }
  1223 		
  1116 		
  1224         if( hd->Origin() == MdeConstants::Object::ECamera )
  1117         if( hd->Origin() == MdeConstants::Object::ECamera )
  1225             {
  1118             {
  1226             TBool inDefaultFolder( ETrue );
  1119             TBool inDefaultFolder( ETrue );
  1238 	        {
  1131 	        {
  1239 	        mdeObject->AddTextPropertyL( *iPropDefs->iTitlePropertyDef, name );
  1132 	        mdeObject->AddTextPropertyL( *iPropDefs->iTitlePropertyDef, name );
  1240 	        }
  1133 	        }
  1241 	    else
  1134 	    else
  1242 	        {
  1135 	        {
  1243 	        mdeObject->AddTextPropertyL( *iPropDefs->iTitlePropertyDef, KUndefined );
  1136 	        mdeObject->AddTextPropertyL( *iPropDefs->iTitlePropertyDef, KNullDesC );
  1244 	        }
  1137 	        }
  1245 	    
  1138 	    
  1246     	CPlaceholderData* ph = NULL;
  1139     	CPlaceholderData* ph = NULL;
  1247     	if( hd->TakeSnapshot() )
  1140     	if( hd->TakeSnapshot() )
  1248     	    {
  1141     	    {
  1282 		
  1175 		
  1283 	    CleanupStack::PopAndDestroy( phData );
  1176 	    CleanupStack::PopAndDestroy( phData );
  1284 	    
  1177 	    
  1285 	    CleanupStack::Pop( mdeObject );
  1178 	    CleanupStack::Pop( mdeObject );
  1286 		
  1179 		
  1287 	    if(iTempReadyPHArray.Append( hd ) != KErrNone)
  1180 	    iTempReadyPHArray.Append( hd );
  1288 	        {
       
  1289 	        HarvestCompleted( hd->ClientId(), hd->Uri(), KErrNoMemory );
       
  1290             delete hd;
       
  1291             hd = NULL;
       
  1292 	        }
       
  1293 		iPHArray.Remove( i );
  1181 		iPHArray.Remove( i );
  1294         i--;
  1182         i--;
  1295         endindex--;
  1183         endindex--;
  1296 		}
  1184 		}
  1297 	
  1185 	
       
  1186 	const TInt tempArrayCount( iTempReadyPHArray.Count() );
       
  1187 	for( TInt i( 0 ); i < tempArrayCount; i++ )
       
  1188 	    {
       
  1189 	    CHarvesterData* hd = iTempReadyPHArray[i];
       
  1190 	    iReadyPHArray.Append( hd );
       
  1191 	    }
       
  1192 	iTempReadyPHArray.Reset();
       
  1193 	
  1298 	const TInt objectCount = mdeObjectArray.Count();  
  1194 	const TInt objectCount = mdeObjectArray.Count();  
  1299 	
  1195 	
  1300     if( objectCount > 0 )
  1196     if( objectCount > 0 )
  1301 		{
  1197 		{
  1302 		// add object to mde
  1198 		// add object to mde
  1303 		iMdEHarvesterSession->AutoLockL( mdeObjectArray );
  1199 		iMdEHarvesterSession->AutoLockL( mdeObjectArray );
  1304 		TInt addError( KErrNone );
  1200 		const TInt addError( iMdESession->AddObjectsL( mdeObjectArray ) );
  1305 		TRAPD( addFailure, addError = iMdESession->AddObjectsL( mdeObjectArray ) );
       
  1306 		if( addFailure == KErrDiskFull )
       
  1307 		    {
       
  1308             WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - No disk space available!" );
       
  1309             for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
       
  1310                 {
       
  1311                 CHarvesterData* tempHd = iTempReadyPHArray[y];
       
  1312         
       
  1313                 if(iPHArray.Insert( tempHd, 0 ) != KErrNone)
       
  1314                     {
       
  1315                     HarvestCompleted( tempHd->ClientId(), tempHd->Uri(), KErrNoMemory );
       
  1316                     iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
       
  1317                     delete tempHd;
       
  1318                     tempHd = NULL;
       
  1319                     }
       
  1320                 }
       
  1321             iTempReadyPHArray.Reset();
       
  1322             CleanupStack::PopAndDestroy( &mdeObjectArray );
       
  1323             User::Leave( KErrDiskFull );		
       
  1324 		    }
       
  1325 		else if( addFailure != KErrNone )
       
  1326 		    {
       
  1327 		    User::Leave( addFailure );      
       
  1328 		    }
       
  1329 		
       
  1330 		if( addError != KErrNone )
  1201 		if( addError != KErrNone )
  1331 		    {
  1202 		    {
  1332 		    // If some error occures, retry
  1203 		    // If some error occures, retry
  1333 		    iMdESession->AddObjectsL( mdeObjectArray );
  1204 		    iMdESession->AddObjectsL( mdeObjectArray );
  1334 		    }
  1205 		    }
  1335 
  1206 
  1336 	    const TInt tempArrayCount( iTempReadyPHArray.Count() );
       
  1337 	    for( TInt i( 0 ); i < tempArrayCount; i++ )
       
  1338 	        {
       
  1339 	        CHarvesterData* tempHd = iTempReadyPHArray[i];
       
  1340             if(iReadyPHArray.Append( tempHd ) != KErrNone)
       
  1341                  {
       
  1342                  HarvestCompleted( tempHd->ClientId(), tempHd->Uri(), KErrNoMemory );
       
  1343                  delete tempHd;
       
  1344                  tempHd = NULL;
       
  1345                  }
       
  1346 	        }
       
  1347 	    iTempReadyPHArray.Reset();
       
  1348 		
       
  1349 	    iHarvesterEventManager->IncreaseItemCount( EHEObserverTypePlaceholder, 
  1207 	    iHarvesterEventManager->IncreaseItemCount( EHEObserverTypePlaceholder, 
  1350 		        objectCount );
  1208 		        objectCount );
  1351 		iHarvesterEventManager->SendEventL( EHEObserverTypePlaceholder, EHEStateStarted, 
  1209 		iHarvesterEventManager->SendEventL( EHEObserverTypePlaceholder, EHEStateStarted, 
  1352 				iHarvesterEventManager->ItemCount( EHEObserverTypePlaceholder ) );
  1210 				iHarvesterEventManager->ItemCount( EHEObserverTypePlaceholder ) );
  1353 		
  1211 		
  1379     TBool isError = EFalse;
  1237     TBool isError = EFalse;
  1380     CMdEObject* mdeObject = &aHD->MdeObject();
  1238     CMdEObject* mdeObject = &aHD->MdeObject();
  1381     const TDesC& uri = aHD->Uri();
  1239     const TDesC& uri = aHD->Uri();
  1382     TBool objectExisted = ETrue;
  1240     TBool objectExisted = ETrue;
  1383     
  1241     
  1384     if( !mdeObject )
  1242     if( ! mdeObject )
  1385     	{
  1243     	{
  1386     	objectExisted = EFalse;
  1244     	objectExisted = EFalse;
  1387     	WRITELOG1( "CHarvesterAO::CheckFileExtensionAndHarvestL() - no mdeobject. URI: %S", &uri );
  1245     	WRITELOG1( "CHarvesterAO::CheckFileExtensionAndHarvestL() - no mdeobject. URI: %S", &uri );
  1388 	    TBuf<KObjectDefStrSize> objDefStr;
  1246 	    TBuf<KObjectDefStrSize> objDefStr;
  1389 		iHarvesterPluginFactory->GetObjectDefL( aHD, objDefStr );
  1247 		iHarvesterPluginFactory->GetObjectDefL( *aHD, objDefStr );
  1390 
  1248 
  1391         // GetObjectDef can cause context switch, and if unmount happens when this execution is 
  1249         // GetObjectDef can cause context switch, and if unmount happens when this execution is 
  1392         // interrupted, the ph data can be invalid. Thus, abort whole run, and start over to make sure 
  1250         // interrupted, the ph data can be invalid. Thus, abort whole run, and start over to make sure 
  1393         // the data is valid.
  1251         // the data is valid.
  1394         if( !aHD )
  1252         if( iUnmountDetected )
  1395             {
  1253             {
  1396             return;
  1254             return;
  1397             }
  1255             }
  1398 		
  1256 		
  1399 		if( objDefStr.Length() == 0 )
  1257 		if( objDefStr.Length() == 0 )
  1494 	
  1352 	
  1495     if( objectExisted && aHD->EventType() == EHarvesterAdd )
  1353     if( objectExisted && aHD->EventType() == EHarvesterAdd )
  1496     	{
  1354     	{
  1497     	iMdESession->RemoveObjectL( aHD->Uri() );
  1355     	iMdESession->RemoveObjectL( aHD->Uri() );
  1498     	}
  1356     	}
  1499     
       
  1500     // If context swich occures just right due to RemoveObjectL, check aHD for validity
       
  1501     if( !aHD )
       
  1502         {
       
  1503         return;
       
  1504         }
       
  1505 	
  1357 	
  1506 	TInt pluginErr = KErrNone;
  1358 	TInt pluginErr = KErrNone;
  1507     TRAPD( err, pluginErr = iHarvesterPluginFactory->HarvestL( aHD ));
  1359     TRAPD( err, pluginErr = iHarvesterPluginFactory->HarvestL( aHD ));
  1508     
       
  1509     if ( err != KErrNone )
  1360     if ( err != KErrNone )
  1510     	{
  1361     	{
  1511     	WRITELOG1( "CHarvesterAO::CheckFileExtensionAndHarvestL() - plugin error: %d", err );
  1362     	WRITELOG1( "CHarvesterAO::CheckFileExtensionAndHarvestL() - plugin error: %d", err );
  1512     	OstTrace1( TRACE_NORMAL, DUP6_CHARVESTERAO_CHECKFILEEXTENSIONANDHARVESTL, "CHarvesterAO::CheckFileExtensionAndHarvestL - plugin error: %d", err );
  1363     	OstTrace1( TRACE_NORMAL, DUP6_CHARVESTERAO_CHECKFILEEXTENSIONANDHARVESTL, "CHarvesterAO::CheckFileExtensionAndHarvestL - plugin error: %d", err );
  1513     	
  1364     	
  1533     	return;
  1384     	return;
  1534     	}
  1385     	}
  1535     
  1386     
  1536     WRITELOG1("CHarvesterAO::CheckFileExtensionAndHarvestL() - ends with error %d", pluginErr );
  1387     WRITELOG1("CHarvesterAO::CheckFileExtensionAndHarvestL() - ends with error %d", pluginErr );
  1537     OstTrace1( TRACE_NORMAL, DUP8_CHARVESTERAO_CHECKFILEEXTENSIONANDHARVESTL, "CHarvesterAO::CheckFileExtensionAndHarvestL) - ends with error %d", pluginErr );
  1388     OstTrace1( TRACE_NORMAL, DUP8_CHARVESTERAO_CHECKFILEEXTENSIONANDHARVESTL, "CHarvesterAO::CheckFileExtensionAndHarvestL) - ends with error %d", pluginErr );
       
  1389     
       
  1390     SetNextRequest( ERequestHarvest );
  1538     }
  1391     }
  1539 
  1392 
  1540 // ---------------------------------------------------------------------------
  1393 // ---------------------------------------------------------------------------
  1541 // HarvestingCompleted
  1394 // HarvestingCompleted
  1542 // ---------------------------------------------------------------------------
  1395 // ---------------------------------------------------------------------------
  1591 	        	if( locData )
  1444 	        	if( locData )
  1592 	        		{
  1445 	        		{
  1593 	        		WRITELOG( "CHarvesterAO::HarvestingCompleted() - Creating location object. " );
  1446 	        		WRITELOG( "CHarvesterAO::HarvestingCompleted() - Creating location object. " );
  1594 	        		OstTrace0( TRACE_NORMAL, DUP6_CHARVESTERAO_HARVESTINGCOMPLETED, "CHarvesterAO::HarvestingCompleted - Creating location object." );
  1447 	        		OstTrace0( TRACE_NORMAL, DUP6_CHARVESTERAO_HARVESTINGCOMPLETED, "CHarvesterAO::HarvestingCompleted - Creating location object." );
  1595 	        		
  1448 	        		
  1596 	        		TInt loError( KErrNone ); 
  1449 	        		RLocationObjectManipulator lo;
  1597 	        		if( !iLocManipulatorConnected )
  1450 	        		
  1598 	        		    {
  1451 	        		const TInt loError = lo.Connect();     		
  1599 	        		    loError = iLocManipulator.Connect();
       
  1600 	        		    if( loError == KErrNone )
       
  1601 	        		        {
       
  1602 	        		        iLocManipulatorConnected = ETrue;
       
  1603 	        		        }
       
  1604 	        		    }    		
       
  1605 	        		
  1452 	        		
  1606 	        		if (loError == KErrNone)
  1453 	        		if (loError == KErrNone)
  1607 	        			{
  1454 	        			{
  1608 	        			TInt err = iLocManipulator.CreateLocationObject( *locData, aHD->MdeObject().Id() );
  1455 	        			TInt err = lo.CreateLocationObject( *locData, aHD->MdeObject().Id() );
  1609 	        			if( err != KErrNone )
  1456 	        			if( err != KErrNone )
  1610 	        				{
  1457 	        				{
  1611 	        				WRITELOG( "CHarvesterAO::HarvestingCompleted() - Location object creation failed!!!" );
  1458 	        				WRITELOG( "CHarvesterAO::HarvestingCompleted() - Location object creation failed!!!" );
  1612 	        				OstTrace0( TRACE_NORMAL, DUP7_CHARVESTERAO_HARVESTINGCOMPLETED, "CHarvesterAO::HarvestingCompleted - Location object creation failed!!!" );
  1459 	        				OstTrace0( TRACE_NORMAL, DUP7_CHARVESTERAO_HARVESTINGCOMPLETED, "CHarvesterAO::HarvestingCompleted - Location object creation failed!!!" );
  1613 	        				iLocManipulator.Close();
  1460 	        				
  1614 	        				iLocManipulatorConnected = EFalse;
       
  1615 	        				}
  1461 	        				}
  1616 	        			}
  1462 	        			}
  1617 	        		else
  1463 	        		else
  1618 	        			{
  1464 	        			{
  1619 	        			WRITELOG( "CHarvesterAO::HarvestingCompleted() - LocationObjectManipulator connect failed!!!" );
  1465 	        			WRITELOG( "CHarvesterAO::HarvestingCompleted() - LocationObjectManipulator connect failed!!!" );
  1620 	        			OstTrace0( TRACE_NORMAL, DUP8_CHARVESTERAO_HARVESTINGCOMPLETED, "CHarvesterAO::HarvestingCompleted - LocationObjectManipulator connect failed!!" );	        			
  1466 	        			OstTrace0( TRACE_NORMAL, DUP8_CHARVESTERAO_HARVESTINGCOMPLETED, "CHarvesterAO::HarvestingCompleted - LocationObjectManipulator connect failed!!" );	        			
  1621 	        			}
  1467 	        			}
       
  1468 	        		
       
  1469 	        		lo.Close();
  1622 	        		}
  1470 	        		}
  1623 	        	
  1471 	        	
  1624 	        	TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 ) );
  1472 	        	TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 ) );
  1625 	        	
  1473 	        	
  1626 				delete aHD;
  1474 				delete aHD;
  1667         
  1515         
  1668         WRITELOG( "==============================ERROR done =========================" );
  1516         WRITELOG( "==============================ERROR done =========================" );
  1669         OstTrace0( TRACE_NORMAL, DUP12_CHARVESTERAO_HARVESTINGCOMPLETED, "==============================ERROR done =========================" );
  1517         OstTrace0( TRACE_NORMAL, DUP12_CHARVESTERAO_HARVESTINGCOMPLETED, "==============================ERROR done =========================" );
  1670         
  1518         
  1671         }
  1519         }
       
  1520            
       
  1521     SetNextRequest( ERequestHarvest );
  1672     }
  1522     }
  1673 
  1523 
  1674 // ---------------------------------------------------------------------------
  1524 // ---------------------------------------------------------------------------
  1675 // HandleSessionOpened
  1525 // HandleSessionOpened
  1676 // ---------------------------------------------------------------------------
  1526 // ---------------------------------------------------------------------------
  1813             TRAP_IGNORE( BootRomScanL() );
  1663             TRAP_IGNORE( BootRomScanL() );
  1814             }
  1664             }
  1815         TRAP_IGNORE( BootPartialRestoreScanL() );
  1665         TRAP_IGNORE( BootPartialRestoreScanL() );
  1816 #endif
  1666 #endif
  1817         
  1667         
  1818         // Store the internal mass memory media ID to DB, and update data if necessary
  1668         if( !iMassMemoryIdChecked )
  1819         TInt drive( -1 );
  1669             {
  1820         TInt internalMassStorageError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, drive ) );
  1670             TInt drive( -1 );
  1821         if( internalMassStorageError == KErrNone )
  1671             TInt massStorageError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, drive ) );
  1822             {
  1672             if( massStorageError == KErrNone )
  1823             TVolumeInfo internalMassStorageVolumeInfo;
       
  1824             internalMassStorageError = iFs.Volume( internalMassStorageVolumeInfo, drive );
       
  1825             if( internalMassStorageError == KErrNone )
       
  1826                 {
  1673                 {
  1827                 const TUint32 massStorageMediaId( internalMassStorageVolumeInfo.iUniqueID );
  1674                 TVolumeInfo massStorageVolumeInfo;
  1828                 if( massStorageMediaId != 0 )
  1675                 iFs.Volume( massStorageVolumeInfo, drive );
       
  1676                 const TUint32 massStorageMediaId( massStorageVolumeInfo.iUniqueID );
       
  1677                 massStorageError = DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, drive );
       
  1678                 if( massStorageError == KErrNone )
  1829                     {
  1679                     {
  1830                     TUint32 mmcMediaId( 0 );
  1680                     iFs.Volume( massStorageVolumeInfo, drive );
  1831                     TInt mmcDrive( -1 );
  1681                     // Update mass storage media id if the mass storage is not memory card
  1832                     TInt mmcError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, mmcDrive ) );
  1682                     if( massStorageVolumeInfo.iUniqueID != massStorageMediaId && massStorageMediaId != 0 )
  1833                     if( mmcError == KErrNone )
       
  1834                         {
       
  1835                         if( drive != mmcDrive )
       
  1836                             {
       
  1837                             TVolumeInfo mmcVolumeInfo;
       
  1838                             mmcError = iFs.Volume( mmcVolumeInfo, mmcDrive );
       
  1839                             if( mmcError == KErrNone )
       
  1840                                 {
       
  1841                                 mmcMediaId = mmcVolumeInfo.iUniqueID;
       
  1842                                 }                        
       
  1843                             }
       
  1844                         else
       
  1845                             {
       
  1846                             mmcMediaId = massStorageMediaId;
       
  1847                             }
       
  1848                         }
       
  1849                 
       
  1850                     // If removable storage is not found, assume internal mass storage was mounted
       
  1851                     if( mmcError )
       
  1852                         {
       
  1853                         iMdEHarvesterSession->CheckMassStorageMediaId( massStorageMediaId );                  
       
  1854                         }
       
  1855                     else if( massStorageMediaId != mmcMediaId )
       
  1856                         {
  1683                         {
  1857                         iMdEHarvesterSession->CheckMassStorageMediaId( massStorageMediaId );
  1684                         iMdEHarvesterSession->CheckMassStorageMediaId( massStorageMediaId );
  1858                         }          
  1685                         }
  1859                     }                    
  1686                     }
  1860                 }
  1687                 }
  1861             }
  1688             }
  1862         }
  1689         }
  1863     else
  1690     else
  1864         {
  1691         {
  1919     OstTrace0( TRACE_NORMAL, CHARVESTERAO_PAUSEHARVESTER, "CHarvesterAO::PauseHarvester" );
  1746     OstTrace0( TRACE_NORMAL, CHARVESTERAO_PAUSEHARVESTER, "CHarvesterAO::PauseHarvester" );
  1920     
  1747     
  1921     iHarvesterPluginFactory->PauseHarvester( ETrue );
  1748     iHarvesterPluginFactory->PauseHarvester( ETrue );
  1922     iServerPaused = ETrue;
  1749     iServerPaused = ETrue;
  1923     
  1750     
       
  1751     if( !iRamFull && !iDiskFull && !iUnmountDetected )
       
  1752         {
       
  1753         iManualPauseEnabled = ETrue;
       
  1754         }
       
  1755     
  1924     // Everything is paused
  1756     // Everything is paused
  1925     WRITELOG( "CHarvesterAO::PauseHarvester() - Moving paused state paused" );
  1757     WRITELOG( "CHarvesterAO::PauseHarvester() - Moving paused state paused" );
  1926     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_PAUSEHARVESTER, "CHarvesterAO::PauseHarvester - Moving paused state paused" );
  1758     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_PAUSEHARVESTER, "CHarvesterAO::PauseHarvester - Moving paused state paused" );
  1927         
  1759         
  1928     return KErrNone;
  1760     return KErrNone;
  1934 //
  1766 //
  1935 void CHarvesterAO::ResumeHarvesterL()
  1767 void CHarvesterAO::ResumeHarvesterL()
  1936     {
  1768     {
  1937     WRITELOG( "CHarvesterAO::ResumeHarvesterL()" );
  1769     WRITELOG( "CHarvesterAO::ResumeHarvesterL()" );
  1938     OstTrace0( TRACE_NORMAL, CHARVESTERAO_RESUMEHARVESTERL, "CHarvesterAO::ResumeHarvesterL" );
  1770     OstTrace0( TRACE_NORMAL, CHARVESTERAO_RESUMEHARVESTERL, "CHarvesterAO::ResumeHarvesterL" );
  1939 
       
  1940     if( iRamFull || iDiskFull || iUnmountHandlingOngoing || iManualPauseEnabled )
       
  1941         {
       
  1942         return;
       
  1943         }
       
  1944     
  1771     
  1945     iHarvesterPluginFactory->PauseHarvester( EFalse );
  1772     iHarvesterPluginFactory->PauseHarvester( EFalse );
  1946     iServerPaused = EFalse;
  1773     iServerPaused = EFalse;
  1947     
  1774     
  1948     if( iNextRequest == ERequestIdle )
  1775     if( !iManualPauseEnabled &&
       
  1776         iNextRequest == ERequestIdle )
  1949         {
  1777         {
  1950         SetNextRequest( ERequestHarvest );
  1778         SetNextRequest( ERequestHarvest );
  1951         }  
  1779         }
       
  1780     
       
  1781     iManualPauseEnabled = EFalse;
  1952     }
  1782     }
  1953 
  1783 
  1954 // ---------------------------------------------------------------------------
  1784 // ---------------------------------------------------------------------------
  1955 // RunL
  1785 // RunL
  1956 // ---------------------------------------------------------------------------
  1786 // ---------------------------------------------------------------------------
  1982             
  1812             
  1983             iReadyPHArray.Compress();
  1813             iReadyPHArray.Compress();
  1984             iContainerPHArray.Compress();
  1814             iContainerPHArray.Compress();
  1985             iPHArray.Compress();
  1815             iPHArray.Compress();
  1986             iTempReadyPHArray.Compress();
  1816             iTempReadyPHArray.Compress();
  1987             
       
  1988             if( iLocManipulatorConnected )
       
  1989                 {
       
  1990                 iLocManipulator.Close();
       
  1991                 iLocManipulatorConnected = EFalse;            
       
  1992                 }
       
  1993             }
  1817             }
  1994         break;
  1818         break;
  1995 
  1819 
  1996         // data added to harvester queue
  1820         // data added to harvester queue
  1997         case ERequestHarvest:
  1821         case ERequestHarvest:
  1998             {
  1822             {
  1999             WRITELOG( "CHarvesterAO::RunL - ERequestHarvest" );
  1823             WRITELOG( "CHarvesterAO::RunL - ERequestHarvest" );
  2000             OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - ERequestHarvest" );
  1824             OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - ERequestHarvest" );
  2001             
  1825             
  2002             // harvest new items first
  1826             // harvest new items first...
  2003             if ( iQueue->ItemsInQueue() > 0 )
  1827             if ( iQueue->ItemsInQueue() > 0 )
  2004                 {
  1828                 {
  2005                 WRITELOG( "CHarvesterAO::RunL - Items in queue - calling ReadItemFromQueueL()" );
  1829                 WRITELOG( "CHarvesterAO::RunL - Items in queue - calling ReadItemFromQueueL()" );
  2006                 ReadItemFromQueueL();
  1830                 ReadItemFromQueueL();
  2007 				SetNextRequest( ERequestHarvest );
  1831 				SetNextRequest( ERequestHarvest );
  2010 
  1834 
  2011             // no more items to handle from main queue
  1835             // no more items to handle from main queue
  2012             else
  1836             else
  2013                 {
  1837                 {
  2014                 WRITELOG( "CHarvesterAO::RunL - No items in main queue" );
  1838                 WRITELOG( "CHarvesterAO::RunL - No items in main queue" );
  2015                 // If interrupts occured, check the normal placeholder array for possible items to
       
  2016                 // be handled before moving on to container or ready placeholders
       
  2017                 if( iPHArray.Count() > 0 )
       
  2018                     {
       
  2019                     WRITELOG( "CHarvesterAO::RunL - Items found in placeholder array" );
       
  2020                     TRAPD( err, HandlePlaceholdersL( ETrue ) );
       
  2021 
       
  2022                     // make sure that when HandlePlaceholdersL leaves unexpectedly, iPHArray is cleared
       
  2023                     if ( err != KErrNone )
       
  2024                         {
       
  2025                         if( err != KErrDiskFull )
       
  2026                             {
       
  2027                             iPHArray.ResetAndDestroy();
       
  2028                             iTempReadyPHArray.ResetAndDestroy();
       
  2029                             }
       
  2030                         User::Leave( err );
       
  2031                         }
       
  2032                     SetNextRequest( ERequestHarvest );
       
  2033                     break;
       
  2034                     }
       
  2035                 // All registered fast harvested items or placeholders handled at this point     
  1839                 // All registered fast harvested items or placeholders handled at this point     
  2036                 // if container files to harvest, handle those next
  1840                 // if container files to harvest, handle those next
  2037                 else if( iContainerPHArray.Count() > 0 )
  1841                 if( iContainerPHArray.Count() > 0 )
  2038                 	{
  1842                 	{
  2039                     WRITELOG( "CHarvesterAO::RunL - Items in iContainterPHArray - requesting ERequestContainerPlaceholder handling" );
  1843                     WRITELOG( "CHarvesterAO::RunL - Items in iContainterPHArray - requesting ERequestContainerPlaceholder handling" );
  2040                     iFastHarvestNeeded = EFalse;
  1844                     iFastHarvestNeeded = EFalse;
  2041                     iHarvestingPlaceholders = EFalse;
  1845                     iHarvestingPlaceholders = EFalse;
  2042                     SetPriority( KHarvesterPriorityHarvestingPlugin );
  1846                     SetPriority( KHarvesterPriorityHarvestingPlugin );
  2063             		{
  1867             		{
  2064 #ifdef _DEBUG
  1868 #ifdef _DEBUG
  2065             		WRITELOG1("CHarvesterAO::RunL - items in ready pharray: %d", arrayCount );
  1869             		WRITELOG1("CHarvesterAO::RunL - items in ready pharray: %d", arrayCount );
  2066             		OstTrace1( TRACE_NORMAL, DUP3_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - items in ready pharray: %d", arrayCount );
  1870             		OstTrace1( TRACE_NORMAL, DUP3_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - items in ready pharray: %d", arrayCount );
  2067 #endif   		
  1871 #endif   		
  2068             		TInt endIndex( KReadyPlaceholderQueueSize );
  1872             		TInt endIndex( KPlaceholderQueueSize );
  2069             		if( arrayCount < KReadyPlaceholderQueueSize )
  1873             		if( arrayCount < KPlaceholderQueueSize )
  2070             		    {
  1874             		    {
  2071             		    endIndex = arrayCount;
  1875             		    endIndex = arrayCount;
  2072             		    }
  1876             		    }
  2073             		for( TInt i = 0; i < endIndex; i++ )
  1877             		for( TInt i = 0; i < endIndex; i++ )
  2074             			{
  1878             			{
  2106         	TInt count = iContainerPHArray.Count() > KContainerPlaceholderQueueSize ? KContainerPlaceholderQueueSize : iContainerPHArray.Count();
  1910         	TInt count = iContainerPHArray.Count() > KContainerPlaceholderQueueSize ? KContainerPlaceholderQueueSize : iContainerPHArray.Count();
  2107         	TInt i = 0;
  1911         	TInt i = 0;
  2108         	while( i < count )
  1912         	while( i < count )
  2109         		{
  1913         		{
  2110         		CHarvesterData* hd = iContainerPHArray[0];
  1914         		CHarvesterData* hd = iContainerPHArray[0];
  2111         		if( iPHArray.Append( hd ) != KErrNone )
  1915         		iPHArray.Append( hd );
  2112         		    {
       
  2113         		    delete hd;
       
  2114         		    hd = NULL;
       
  2115         		    }
       
  2116         		iContainerPHArray.Remove( 0 );
  1916         		iContainerPHArray.Remove( 0 );
  2117         		i++;
  1917         		i++;
  2118         		}
  1918         		}
  2119         	TRAPD( err, HandlePlaceholdersL( EFalse ) );
  1919         	TRAPD( err, HandlePlaceholdersL( EFalse ) );
  2120 
  1920 
  2121             // make sure that when HandlePlaceholdersL leaves unexpectedly, iPHArray is cleared
  1921 	    	// make sure that when HandlePlaceholdersL leaves, iPHArray is cleared
  2122             if ( err != KErrNone )
  1922 	    	if ( err != KErrNone )
  2123                 {
  1923 	    		{
  2124                 if( err != KErrDiskFull )
  1924 	    	    iContainerPHArray.ResetAndDestroy();
  2125                     {
  1925 	    		iPHArray.ResetAndDestroy();
  2126                     iContainerPHArray.ResetAndDestroy();
  1926 	    		iTempReadyPHArray.ResetAndDestroy();
  2127                     iPHArray.ResetAndDestroy();
  1927 	    		User::Leave( err );
  2128                     iTempReadyPHArray.ResetAndDestroy();
  1928 	    		}
  2129                     }
       
  2130                 User::Leave( err );
       
  2131                 }
       
  2132 	    	SetNextRequest( ERequestHarvest );
  1929 	    	SetNextRequest( ERequestHarvest );
  2133         	}
  1930         	}
  2134         break;
  1931         break;
  2135         
  1932         
  2136         // pause request
  1933         // pause request
  2137         case ERequestPause:
  1934         case ERequestPause:
  2138             {
  1935             {
  2139             WRITELOG( "CHarvesterAO::RunL - ERequestPause" );
  1936             WRITELOG( "CHarvesterAO::RunL - ERequestPause" );
  2140             OstTrace0( TRACE_NORMAL, DUP6_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - ERequestPause" );
  1937             OstTrace0( TRACE_NORMAL, DUP6_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - ERequestPause" );
  2141             User::LeaveIfError( PauseHarvester() );
  1938             User::LeaveIfError( PauseHarvester() );
  2142             iManualPauseEnabled = ETrue;
       
  2143             iHarvesterEventManager->SendEventL( EHEObserverTypeOverall, EHEStatePaused );
  1939             iHarvesterEventManager->SendEventL( EHEObserverTypeOverall, EHEStatePaused );
  2144             if( iHarvesterStatusObserver )
  1940             if( iHarvesterStatusObserver )
  2145             	{
  1941             	{
  2146             	iHarvesterStatusObserver->PauseReady( KErrNone );
  1942             	iHarvesterStatusObserver->PauseReady( KErrNone );
  2147             	}
  1943             	}
  2151         // resume request
  1947         // resume request
  2152         case ERequestResume:
  1948         case ERequestResume:
  2153             {
  1949             {
  2154             WRITELOG( "CHarvesterAO::RunL - ERequestResume" );
  1950             WRITELOG( "CHarvesterAO::RunL - ERequestResume" );
  2155             OstTrace0( TRACE_NORMAL, DUP7_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - ERequestResume" );
  1951             OstTrace0( TRACE_NORMAL, DUP7_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - ERequestResume" );
  2156             iManualPauseEnabled = EFalse;
       
  2157             // If for some reason, mds session is not (yet) ready, only inform that
       
  2158             // server state is no longer paused, but do not restart actual harvesting
       
  2159             // yet.
       
  2160             if( !iMdeSessionInitialized )
       
  2161                 {
       
  2162                 iHarvesterEventManager->SendEventL( EHEObserverTypeOverall, EHEStateResumed );
       
  2163                 if( iHarvesterStatusObserver )
       
  2164                     {
       
  2165                     iHarvesterStatusObserver->ResumeReady( KErrNone );
       
  2166                     }
       
  2167                 break;
       
  2168                 }
       
  2169             ResumeHarvesterL();
  1952             ResumeHarvesterL();
  2170             iHarvesterEventManager->SendEventL( EHEObserverTypeOverall, EHEStateResumed );
  1953             iHarvesterEventManager->SendEventL( EHEObserverTypeOverall, EHEStateResumed );
  2171             if( iHarvesterStatusObserver )
  1954             if( iHarvesterStatusObserver )
  2172             	{
  1955             	{
  2173                 iHarvesterStatusObserver->ResumeReady( KErrNone );
  1956                 iHarvesterStatusObserver->ResumeReady( KErrNone );
  2200 // RunError
  1983 // RunError
  2201 // ---------------------------------------------------------------------------
  1984 // ---------------------------------------------------------------------------
  2202 //
  1985 //
  2203 TInt CHarvesterAO::RunError( TInt aError )
  1986 TInt CHarvesterAO::RunError( TInt aError )
  2204     {
  1987     {
  2205     WRITELOG1( "CHarvesterAO::RunError, error: %d", aError );
  1988     WRITELOG( "CHarvesterAO::RunError" );
  2206     OstTrace0( TRACE_NORMAL, CHARVESTERAO_RUNERROR, "CHarvesterAO::RunError" );
  1989     OstTrace0( TRACE_NORMAL, CHARVESTERAO_RUNERROR, "CHarvesterAO::RunError" );
  2207     
  1990     
  2208     switch( iNextRequest )
  1991     switch( iNextRequest )
  2209         {
  1992         {
  2210         case ERequestHarvest:
  1993         case ERequestHarvest:
  2211             {
  1994             {
  2212             WRITELOG( "CHarvesterAO::RunError - state ERequestHarvest" );
  1995             WRITELOG( "CHarvesterAO::RunError - state ERequestHarvest" );
  2213             OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_RUNERROR, "CHarvesterAO::RunError - state ERequestHarvest" );
  1996             OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_RUNERROR, "CHarvesterAO::RunError - state ERequestHarvest" );
  2214             if( aError == KErrDiskFull || aError == KErrNoMemory )
       
  2215                 {
       
  2216                 SetNextRequest( ERequestIdle );
       
  2217                 }
       
  2218             }
       
  2219         break;
       
  2220         
       
  2221         case ERequestContainerPlaceholder:
       
  2222             {
       
  2223             WRITELOG( "CHarvesterAO::RunError - state ERequestContainerPlaceholder" );
       
  2224             OstTrace0( TRACE_NORMAL, DUP5_CHARVESTERAO_RUNERROR, "CHarvesterAO::RunError - state ERequestContainerPlaceholder" );
       
  2225             if( aError == KErrDiskFull || aError == KErrNoMemory )
       
  2226                 {
       
  2227                 SetNextRequest( ERequestIdle );
       
  2228                 }
       
  2229             }
  1997             }
  2230         break;
  1998         break;
  2231         
  1999         
  2232         case ERequestPause:
  2000         case ERequestPause:
  2233             {
  2001             {
  2340     WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL()");
  2108     WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL()");
  2341     OstTrace0( TRACE_NORMAL, CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL" );
  2109     OstTrace0( TRACE_NORMAL, CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL" );
  2342     
  2110     
  2343     if( MMdSHarvesterDiskSpaceObserver::EMore == aDiskSpaceDirection )
  2111     if( MMdSHarvesterDiskSpaceObserver::EMore == aDiskSpaceDirection )
  2344         {
  2112         {
       
  2113         WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL() - disk full");
       
  2114         OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL - disk full" );        
       
  2115         iDiskFull = EFalse;
       
  2116         }
       
  2117     else
       
  2118         {
  2345         WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL() - disk space available");
  2119         WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL() - disk space available");
  2346         OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL - disk space available" );
  2120         OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL - disk space available" );
  2347         iDiskFull = EFalse;
       
  2348         }
       
  2349     else
       
  2350         {
       
  2351         WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL() - disk full");
       
  2352         OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL - disk full" );        
       
  2353         iDiskFull = ETrue;
  2121         iDiskFull = ETrue;
  2354         if( iServerPaused )
  2122         if( iServerPaused )
  2355             {
  2123             {
  2356             return;
  2124             return;
  2357             }
  2125             }
  2361         {
  2129         {
  2362         // cache monitored events
  2130         // cache monitored events
  2363         PauseMonitoring();   
  2131         PauseMonitoring();   
  2364         PauseHarvester();    
  2132         PauseHarvester();    
  2365         }
  2133         }
  2366     else if( iServerPaused )
  2134     else if( !iRamFull && !iManualPauseEnabled && iServerPaused )
  2367         {
  2135         {
  2368         // resume monitoring
  2136         // resume monitoring
  2369         ResumeMonitoring();
  2137         ResumeMonitoring();
  2370         TRAP_IGNORE( ResumeHarvesterL() );    
  2138         TRAP_IGNORE( ResumeHarvesterL() );    
  2371         }
  2139         }
  2554             SetNextRequest( CHarvesterAO::ERequestHarvest );
  2322             SetNextRequest( CHarvesterAO::ERequestHarvest );
  2555             }
  2323             }
  2556         }
  2324         }
  2557     else
  2325     else
  2558         {
  2326         {
       
  2327         HarvestCompleted( hd->ClientId(), hd->Uri(), KErrUnknown );
  2559         delete hd;
  2328         delete hd;
  2560         hd = NULL;
  2329         hd = NULL;
  2561         err = KErrUnknown;
  2330         err = KErrUnknown;
  2562         }
  2331         }
  2563     
  2332     
  2564     if (!aMessage.IsNull())
  2333     if (!aMessage.IsNull())
  2565         {
  2334         {
  2566         aMessage.Complete( err );
  2335         aMessage.Complete( err );
  2567         }
       
  2568     else if( err != KErrNone )
       
  2569         {
       
  2570         HarvestCompleted( aMessage.Identity(), uri->Des(), err );
       
  2571         }
  2336         }
  2572     
  2337     
  2573     albumIds.Close();
  2338     albumIds.Close();
  2574     }
  2339     }
  2575   
  2340   
  2756     		SetNextRequest( CHarvesterAO::ERequestHarvest );
  2521     		SetNextRequest( CHarvesterAO::ERequestHarvest );
  2757     		}
  2522     		}
  2758     	}
  2523     	}
  2759     else
  2524     else
  2760         {
  2525         {
       
  2526         HarvestCompleted( hd->ClientId(), hd->Uri(), KErrUnknown );  
  2761         delete hd;
  2527         delete hd;
  2762         hd = NULL;
  2528         hd = NULL;
  2763         err = KErrUnknown;
  2529         err = KErrUnknown;
  2764         }
  2530         }
  2765 
  2531 
  2766     if (!aMessage.IsNull())
  2532     if (!aMessage.IsNull())
  2767         {
  2533         {
  2768         aMessage.Complete( err );
  2534         aMessage.Complete( err );
  2769         }
       
  2770     else if( err != KErrNone )
       
  2771         {
       
  2772         HarvestCompleted( aMessage.Identity(), uri->Des(), err );
       
  2773         }
  2535         }
  2774     
  2536     
  2775     albumIds.Close();
  2537     albumIds.Close();
  2776     }
  2538     }
  2777 
  2539 
  2932             	{
  2694             	{
  2933             	iHarvestFileMessages.Remove( i );
  2695             	iHarvestFileMessages.Remove( i );
  2934             	continue;
  2696             	continue;
  2935             	}
  2697             	}
  2936             
  2698             
       
  2699             //if (aMessage.Identity() == msg.Identity())
  2937             if( &req.iSession == &aSession )
  2700             if( &req.iSession == &aSession )
  2938             	{
  2701             	{
  2939             	err = KErrNone;
  2702             	err = KErrNone;
  2940 	            if (!req.iMessage.IsNull())
  2703 	            if (!req.iMessage.IsNull())
  2941 	            	{
  2704 	            	{
  3185 		const RPointerArray<HBufC>& aIgnorePaths,
  2948 		const RPointerArray<HBufC>& aIgnorePaths,
  3186         TBool aCheckDrive )
  2949         TBool aCheckDrive )
  3187 	{
  2950 	{
  3188 	WRITELOG("CHarvesterAO::BootScanL() - begin");
  2951 	WRITELOG("CHarvesterAO::BootScanL() - begin");
  3189     OstTrace0( TRACE_NORMAL, CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - begin" );
  2952     OstTrace0( TRACE_NORMAL, CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - begin" );
       
  2953     	
       
  2954     TInt drive( -1 );
       
  2955     TInt massStorageError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, drive ) );
       
  2956     if( massStorageError == KErrNone )
       
  2957         {
       
  2958         TVolumeInfo massStorageVolumeInfo;
       
  2959         iFs.Volume( massStorageVolumeInfo, drive );
       
  2960         const TUint32 massStorageMediaId( massStorageVolumeInfo.iUniqueID );
       
  2961         massStorageError = DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, drive );
       
  2962         if( massStorageError == KErrNone )
       
  2963             {
       
  2964             iFs.Volume( massStorageVolumeInfo, drive );
       
  2965             // Update mass storage media id if the mass storage is not memory card
       
  2966             if( massStorageVolumeInfo.iUniqueID != massStorageMediaId && massStorageMediaId != 0 )
       
  2967                 {
       
  2968                 iMdEHarvesterSession->CheckMassStorageMediaId( massStorageMediaId );
       
  2969                 }
       
  2970             }
       
  2971         }
  3190 	
  2972 	
  3191 	TVolumeInfo volumeInfo;
  2973 	TVolumeInfo volumeInfo;
  3192 	iFs.Volume( volumeInfo, EDriveC );
  2974 	iFs.Volume( volumeInfo, EDriveC );
  3193 
  2975 
  3194 	iMdEHarvesterSession->SetFilesToNotPresent( volumeInfo.iUniqueID, ETrue );
  2976 	iMdEHarvesterSession->SetFilesToNotPresent( volumeInfo.iUniqueID, ETrue );
  3266 					if( !IsDescInArray( path, aIgnorePaths ) )
  3048 					if( !IsDescInArray( path, aIgnorePaths ) )
  3267 						{
  3049 						{
  3268 						WRITELOG("CHarvesterAO::BootScanL() - scanFolders.AppendL");
  3050 						WRITELOG("CHarvesterAO::BootScanL() - scanFolders.AppendL");
  3269 						OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - scanFolders.AppendL" );
  3051 						OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - scanFolders.AppendL" );
  3270 						TScanItem* item = new (ELeave) TScanItem();
  3052 						TScanItem* item = new (ELeave) TScanItem();
  3271 						CleanupStack::PushL( item );
       
  3272 						item->iPath = name->AllocL();
  3053 						item->iPath = name->AllocL();
  3273 						item->iPreinstalled = MdeConstants::MediaObject::ENotPreinstalled;
  3054 						item->iPreinstalled = MdeConstants::MediaObject::ENotPreinstalled;
  3274 						CleanupStack::Pop( item );
  3055 						aScanItems.AppendL( item );
  3275 						aScanItems.AppendL( item ); // ownership is transferred
       
  3276 						}
  3056 						}
  3277 					}
  3057 					}
  3278 				else
  3058 				else
  3279 					{
  3059 					{
  3280 					TPtrC filename = *name;
  3060 					TPtrC filename = *name;
  3330 	                        hd->SetObjectType( EPlaceholder );
  3110 	                        hd->SetObjectType( EPlaceholder );
  3331 	                        hd->SetOrigin( MdeConstants::Object::EOther );
  3111 	                        hd->SetOrigin( MdeConstants::Object::EOther );
  3332 	                        hd->SetClientData( phData );
  3112 	                        hd->SetClientData( phData );
  3333 
  3113 
  3334 	                        CleanupStack::Pop( phData );
  3114 	                        CleanupStack::Pop( phData );
  3335 							
  3115 	                        hdArray.Append( hd );
  3336 	                        if(hdArray.Append( hd ) != KErrNone )
       
  3337 	                            {
       
  3338                                 delete hd;
       
  3339                                 hd = NULL;
       
  3340 	                            }
       
  3341 						    }
  3116 						    }
  3342 						CleanupStack::PopAndDestroy( &results );
  3117 						CleanupStack::PopAndDestroy( &results );
  3343 						CleanupStack::PopAndDestroy( &fileInfos );
  3118 						CleanupStack::PopAndDestroy( &fileInfos );
  3344 						CleanupStack::PopAndDestroy( &uris );
  3119 						CleanupStack::PopAndDestroy( &uris );
  3345 						}
  3120 						}
  3360 	iQueue->MonitorEvent( hdArray );
  3135 	iQueue->MonitorEvent( hdArray );
  3361 	CleanupStack::PopAndDestroy( &hdArray ); 
  3136 	CleanupStack::PopAndDestroy( &hdArray ); 
  3362 
  3137 
  3363 	iMdEHarvesterSession->RemoveFilesNotPresent( volumeInfo.iUniqueID, ETrue );
  3138 	iMdEHarvesterSession->RemoveFilesNotPresent( volumeInfo.iUniqueID, ETrue );
  3364 	
  3139 	
       
  3140 	iMassMemoryIdChecked = ETrue;
       
  3141 	
  3365 	WRITELOG("CHarvesterAO::BootScanL() - end");
  3142 	WRITELOG("CHarvesterAO::BootScanL() - end");
  3366 	OstTrace0( TRACE_NORMAL, DUP5_CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - end" );
  3143 	OstTrace0( TRACE_NORMAL, DUP5_CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - end" );
  3367 	}
  3144 	}
  3368 
  3145 
  3369 void CHarvesterAO::SetHarvesterStatusObserver( MHarvesterStatusObserver* aObserver )
  3146 void CHarvesterAO::SetHarvesterStatusObserver( MHarvesterStatusObserver* aObserver )
  3452 
  3229 
  3453 	// cache monitored events
  3230 	// cache monitored events
  3454 	PauseMonitoring();
  3231 	PauseMonitoring();
  3455 	PauseHarvester();
  3232 	PauseHarvester();
  3456 	
  3233 	
  3457     iReadyPHArray.Compress();
  3234 	iPHArray.Compress();
  3458     iContainerPHArray.Compress();
  3235 	iReadyPHArray.Compress();
  3459     iPHArray.Compress();
  3236 	iContainerPHArray.Compress();
  3460     iTempReadyPHArray.Compress();
       
  3461 	}
  3237 	}
  3462 
  3238 
  3463 void CHarvesterAO::MemoryGood()
  3239 void CHarvesterAO::MemoryGood()
  3464 	{
  3240 	{
  3465     WRITELOG("CHarvesterAO::MemoryGood()");    
  3241     WRITELOG("CHarvesterAO::MemoryGood()");    
  3466     OstTrace0( TRACE_NORMAL, CHARVESTERAO_MEMORYGOOD, "CHarvesterAO::MemoryGood" );
  3242     OstTrace0( TRACE_NORMAL, CHARVESTERAO_MEMORYGOOD, "CHarvesterAO::MemoryGood" );
  3467     
  3243     
  3468     iRamFull = EFalse;
  3244     iRamFull = EFalse;
  3469     
  3245     
  3470     if( iServerPaused )
  3246     if( !iDiskFull && !iManualPauseEnabled && iServerPaused )
  3471         {
  3247         {
  3472         // resume monitoring
  3248         // resume monitoring
  3473         ResumeMonitoring();
  3249         ResumeMonitoring();
  3474     
  3250     
  3475         TRAP_IGNORE( ResumeHarvesterL() );    
  3251         TRAP_IGNORE( ResumeHarvesterL() );