harvester/server/src/harvesterao.cpp
changeset 54 a3cc46f37772
parent 36 aa5a574040a4
equal deleted inserted replaced
36:aa5a574040a4 54:a3cc46f37772
    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>
       
    23 #include <placeholderdata.h>
    22 #include <placeholderdata.h>
    24 #include <harvesterclientdata.h>
    23 #include <harvesterclientdata.h>
    25 #include <pathinfo.h>
    24 #include <pathinfo.h>
    26 
    25 
    27 using namespace ContentAccess;
    26 using namespace ContentAccess;
    51 // constants
    50 // constants
    52 const TInt32 KFileMonitorPluginUid = 0x20007186;  // file monitor plugin implementation uid
    51 const TInt32 KFileMonitorPluginUid = 0x20007186;  // file monitor plugin implementation uid
    53 
    52 
    54 const TInt KPlaceholderQueueSize = 99;
    53 const TInt KPlaceholderQueueSize = 99;
    55 const TInt KContainerPlaceholderQueueSize = 10;
    54 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(KUndefinedMime, " ");
    64 _LIT(KUndefined, " ");
    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 	CMdENamespaceDef& nsDef = aObjectDef.NamespaceDef();
    79     SetByObjectDefL( aObjectDef );
    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 );
       
    93 	}
    80 	}
    94 
    81 
    95 CHarvesterAoPropertyDefs* CHarvesterAoPropertyDefs::NewL(CMdEObjectDef& aObjectDef)
    82 CHarvesterAoPropertyDefs* CHarvesterAoPropertyDefs::NewL()
    96 	{
    83     {
    97 	CHarvesterAoPropertyDefs* self = 
    84     CHarvesterAoPropertyDefs* self = 
    98 		new (ELeave) CHarvesterAoPropertyDefs();
    85         new (ELeave) CHarvesterAoPropertyDefs();
    99 	CleanupStack::PushL( self );
    86     return self;
   100 	self->ConstructL( aObjectDef );
    87     }
   101 	CleanupStack::Pop( self );
    88 
   102 	return self;
    89 void CHarvesterAoPropertyDefs::SetByObjectDefL(CMdEObjectDef& aObjectDef)
   103 	}
    90     {
   104 
    91     CMdENamespaceDef& nsDef = aObjectDef.NamespaceDef();
       
    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 	
   105 // ---------------------------------------------------------------------------
   107 // ---------------------------------------------------------------------------
   106 // NewLC
   108 // NewLC
   107 // ---------------------------------------------------------------------------
   109 // ---------------------------------------------------------------------------
   108 //
   110 //
   109 CHarvesterAO* CHarvesterAO::NewLC()
   111 CHarvesterAO* CHarvesterAO::NewLC()
   151     iManualPauseEnabled = EFalse;
   153     iManualPauseEnabled = EFalse;
   152     iFastHarvestNeeded = EFalse;
   154     iFastHarvestNeeded = EFalse;
   153     iHarvestingPlaceholders = EFalse;
   155     iHarvestingPlaceholders = EFalse;
   154     
   156     
   155     iUnmountDetected = EFalse;
   157     iUnmountDetected = EFalse;
       
   158     iUnmountHandlingOngoing = EFalse;
   156     iPriorityInterruptDetected = EFalse;
   159     iPriorityInterruptDetected = EFalse;
       
   160     iLocManipulatorConnected = EFalse;
   157     }
   161     }
   158      
   162      
   159 // ---------------------------------------------------------------------------
   163 // ---------------------------------------------------------------------------
   160 // ~CHarvesterAO
   164 // ~CHarvesterAO
   161 // ---------------------------------------------------------------------------
   165 // ---------------------------------------------------------------------------
   166     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_CHARVESTERAO, "CHarvesterAO::~CHarvesterAO" );
   170     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_CHARVESTERAO, "CHarvesterAO::~CHarvesterAO" );
   167     
   171     
   168     Cancel();
   172     Cancel();
   169 
   173 
   170 	iFs.Close();
   174 	iFs.Close();
       
   175 	
       
   176 	iLocManipulator.Close();
   171 	
   177 	
   172 	if (iCtxEngine)
   178 	if (iCtxEngine)
   173 		{
   179 		{
   174 		iCtxEngine->ReleaseInstance();
   180 		iCtxEngine->ReleaseInstance();
   175 		}
   181 		}
   184     
   190     
   185     StopComposers();
   191     StopComposers();
   186     DeleteComposers();
   192     DeleteComposers();
   187 
   193 
   188     delete iDiskFullNotifier;
   194     delete iDiskFullNotifier;
       
   195     iDiskFullNotifier = NULL;
   189 	delete iBackupSubscriber;
   196 	delete iBackupSubscriber;
       
   197 	iBackupSubscriber = NULL;
   190     
   198     
   191     if (iBlacklist)
   199     if (iBlacklist)
   192 		{
   200 		{
   193 		iBlacklist->CloseDatabase();
   201 		iBlacklist->CloseDatabase();
   194 		delete iBlacklist;
   202 		delete iBlacklist;
       
   203 		iBlacklist = NULL;
   195 		}
   204 		}
   196 	delete iReHarvester;
   205 	delete iReHarvester;
       
   206 	iReHarvester = NULL;
   197 
   207 
   198     if ( iHarvestFileMessages.Count() > 0 )
   208     if ( iHarvestFileMessages.Count() > 0 )
   199         {
   209         {
   200         for ( TInt i = iHarvestFileMessages.Count()-1; i >= 0; --i )
   210         for ( TInt i = iHarvestFileMessages.Count()-1; i >= 0; --i )
   201             {
   211             {
   220     
   230     
   221     iTempReadyPHArray.ResetAndDestroy();
   231     iTempReadyPHArray.ResetAndDestroy();
   222     iTempReadyPHArray.Close();
   232     iTempReadyPHArray.Close();
   223     
   233     
   224 	delete iHarvesterOomAO;
   234 	delete iHarvesterOomAO;
       
   235 	iHarvesterOomAO = NULL;
   225     delete iRestoreWatcher;
   236     delete iRestoreWatcher;
       
   237     iRestoreWatcher = NULL;
   226 	delete iOnDemandAO;
   238 	delete iOnDemandAO;
       
   239 	iOnDemandAO = NULL;
   227 	delete iMdEHarvesterSession;
   240 	delete iMdEHarvesterSession;
       
   241 	iMdEHarvesterSession = NULL;
   228 	delete iMdESession;
   242 	delete iMdESession;
       
   243 	iMdESession = NULL;
   229 	delete iQueue;
   244 	delete iQueue;
       
   245 	iQueue = NULL;
   230 	delete iHarvesterPluginFactory;
   246 	delete iHarvesterPluginFactory;
       
   247 	iHarvesterPluginFactory = NULL;
   231 	delete iMdeObjectHandler;
   248 	delete iMdeObjectHandler;
       
   249 	iMdeObjectHandler = NULL;
   232 	delete iUnmountHandlerAO;
   250 	delete iUnmountHandlerAO;
       
   251 	iUnmountHandlerAO = NULL;
   233 	
   252 	
   234 	delete iPropDefs;
   253 	delete iPropDefs;
       
   254 	iPropDefs = NULL;
   235 	delete iCameraExtensionArray;
   255 	delete iCameraExtensionArray;
       
   256 	iCameraExtensionArray = NULL;
   236 	
   257 	
   237     delete iPhoneImagesPath;
   258     delete iPhoneImagesPath;
       
   259     iPhoneImagesPath = NULL;
   238     delete iMmcImagesPath;
   260     delete iMmcImagesPath;
       
   261     iMmcImagesPath = NULL;
   239     
   262     
   240     delete iPhoneVideosPath;
   263     delete iPhoneVideosPath;
       
   264     iPhoneVideosPath = NULL;
   241     delete iMmcVideosPath;
   265     delete iMmcVideosPath;
       
   266     iMmcVideosPath = NULL;
   242     
   267     
   243     delete iPhoneSoundsPath;
   268     delete iPhoneSoundsPath;
       
   269     iPhoneSoundsPath = NULL;
   244     delete iMmcSoundsPath;
   270     delete iMmcSoundsPath;
       
   271     iMmcSoundsPath = NULL;
   245 	
   272 	
   246 	RMediaIdUtil::ReleaseInstance();
   273 	RMediaIdUtil::ReleaseInstance();
   247     
   274     
   248     REComSession::FinalClose();
   275     REComSession::FinalClose();
   249     }
   276     }
   291     iHarvesterPluginFactory->SetBlacklist( *iBlacklist );
   318     iHarvesterPluginFactory->SetBlacklist( *iBlacklist );
   292     
   319     
   293     // Reset harvesting status for clients in case blacklisted file was handled
   320     // Reset harvesting status for clients in case blacklisted file was handled
   294     iHarvesterPluginFactory->SendHarvestingStatusEventL( EFalse );
   321     iHarvesterPluginFactory->SendHarvestingStatusEventL( EFalse );
   295     
   322     
       
   323     iPropDefs = CHarvesterAoPropertyDefs::NewL();
       
   324 	
   296     iCameraExtensionArray = new ( ELeave ) CDesCArraySeg( 6 );
   325     iCameraExtensionArray = new ( ELeave ) CDesCArraySeg( 6 );
   297     iCameraExtensionArray->InsertIsqL( KExtensionMp4 );
   326     iCameraExtensionArray->InsertIsqL( KExtensionMp4 );
   298     iCameraExtensionArray->InsertIsqL( KExtensionMpg4 );
   327     iCameraExtensionArray->InsertIsqL( KExtensionMpg4 );
   299     iCameraExtensionArray->InsertIsqL( KExtensionMpeg4 );
   328     iCameraExtensionArray->InsertIsqL( KExtensionMpeg4 );
   300     iCameraExtensionArray->InsertIsqL( KExtension3gp );
   329     iCameraExtensionArray->InsertIsqL( KExtension3gp );
   352     
   381     
   353     TCleanupItem cleanupItem( MdsUtils::CleanupEComArray, &infoArray );
   382     TCleanupItem cleanupItem( MdsUtils::CleanupEComArray, &infoArray );
   354     CleanupStack::PushL( cleanupItem );
   383     CleanupStack::PushL( cleanupItem );
   355     
   384     
   356     CMonitorPlugin::ListImplementationsL( infoArray );
   385     CMonitorPlugin::ListImplementationsL( infoArray );
   357     TInt count( 0 );
   386     const TInt count( infoArray.Count() );
   358     count = infoArray.Count();
       
   359     CMonitorPlugin* plugin = NULL;
   387     CMonitorPlugin* plugin = NULL;
   360     
   388     
   361     for ( TInt i = 0; i < count; i++ )
   389     for ( TInt i = 0; i < count; i++ )
   362         {
   390         {
   363         TUid uid = infoArray[i]->ImplementationUid();    // Create the plug-ins
   391         TUid uid = infoArray[i]->ImplementationUid();    // Create the plug-ins
   408 //
   436 //
   409 void CHarvesterAO::StartMonitoring()
   437 void CHarvesterAO::StartMonitoring()
   410     {
   438     {
   411     WRITELOG( "CHarvesterAO::StartMonitoring()" );
   439     WRITELOG( "CHarvesterAO::StartMonitoring()" );
   412     OstTrace0( TRACE_NORMAL, CHARVESTERAO_STARTMONITORING, "CHarvesterAO::StartMonitoring" );    
   440     OstTrace0( TRACE_NORMAL, CHARVESTERAO_STARTMONITORING, "CHarvesterAO::StartMonitoring" );    
   413     
       
   414     const TInt count( iMonitorPluginArray.Count() );  
   441     const TInt count( iMonitorPluginArray.Count() );  
   415     
   442     
   416     for ( TInt i = 0; i < count; i++ )
   443     for ( TInt i = 0; i < count; i++ )
   417         {
   444         {
   418         iMonitorPluginArray[i]->StartMonitoring( *iQueue, iMdESession, NULL, 
   445         iMonitorPluginArray[i]->StartMonitoring( *iQueue, iMdESession, NULL, 
   427 void CHarvesterAO::StopMonitoring()
   454 void CHarvesterAO::StopMonitoring()
   428     {
   455     {
   429     WRITELOG( "CHarvesterAO::StopMonitoring()" );
   456     WRITELOG( "CHarvesterAO::StopMonitoring()" );
   430     
   457     
   431     OstTrace0( TRACE_NORMAL, CHARVESTERAO_STOPMONITORING, "CHarvesterAO::StopMonitoring" );
   458     OstTrace0( TRACE_NORMAL, CHARVESTERAO_STOPMONITORING, "CHarvesterAO::StopMonitoring" );
   432 
   459     
   433     const TInt count( iMonitorPluginArray.Count() );
   460     for( TInt i = iMonitorPluginArray.Count() - 1; i >=0; i-- )
   434     
       
   435     for ( TInt i = 0; i < count; i++ )
       
   436         {
   461         {
   437         iMonitorPluginArray[i]->StopMonitoring();
   462         iMonitorPluginArray[i]->StopMonitoring();
   438         }
   463         }
   439     }
   464     }
   440 
   465 
   445 void CHarvesterAO::PauseMonitoring()
   470 void CHarvesterAO::PauseMonitoring()
   446     {
   471     {
   447     WRITELOG( "CHarvesterAO::PauseMonitoring()" );
   472     WRITELOG( "CHarvesterAO::PauseMonitoring()" );
   448     OstTrace0( TRACE_NORMAL, CHARVESTERAO_PAUSEMONITORING, "CHarvesterAO::PauseMonitoring" );
   473     OstTrace0( TRACE_NORMAL, CHARVESTERAO_PAUSEMONITORING, "CHarvesterAO::PauseMonitoring" );
   449     
   474     
   450     const TInt count( iMonitorPluginArray.Count() );
   475     for( TInt i = iMonitorPluginArray.Count() - 1; i >=0; i-- )
   451     
       
   452     for ( TInt i = 0; i<count; i++ )
       
   453         {
   476         {
   454         iMonitorPluginArray[i]->PauseMonitoring();
   477         iMonitorPluginArray[i]->PauseMonitoring();
   455         }
   478         }
       
   479     
   456     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_PAUSEMONITORING, "CHarvesterAO::PauseMonitoring - end" );    
   480     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_PAUSEMONITORING, "CHarvesterAO::PauseMonitoring - end" );    
   457     WRITELOG( "CHarvesterAO::PauseMonitoring() - end" );
   481     WRITELOG( "CHarvesterAO::PauseMonitoring() - end" );
   458     }
   482     }
   459 
   483 
   460 // ---------------------------------------------------------------------------
   484 // ---------------------------------------------------------------------------
   484 	{
   508 	{
   485     WRITELOG1( "CHarvesterAO::HandleUnmount(%d)", aMediaId );    
   509     WRITELOG1( "CHarvesterAO::HandleUnmount(%d)", aMediaId );    
   486 	OstTrace1( TRACE_NORMAL, CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount;aMediaId=%d", aMediaId );
   510 	OstTrace1( TRACE_NORMAL, CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount;aMediaId=%d", aMediaId );
   487     
   511     
   488     iUnmountDetected = ETrue;
   512     iUnmountDetected = ETrue;
       
   513     iUnmountHandlingOngoing = ETrue;
   489     
   514     
   490     if( !iServerPaused )
   515     if( !iServerPaused )
   491         {
   516         {
   492         // Stop harvesting for unmount
   517         // Stop harvesting for unmount
   493         PauseMonitoring();
   518         PauseMonitoring();
   516             if( err == KErrNone && mediaId == aMediaId )
   541             if( err == KErrNone && mediaId == aMediaId )
   517                 {
   542                 {
   518                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iReadyPHArray %d", i);
   543                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iReadyPHArray %d", i);
   519                 OstTrace1( TRACE_NORMAL, DUP2_CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount remove iReadyPHArray %d", i );
   544                 OstTrace1( TRACE_NORMAL, DUP2_CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount remove iReadyPHArray %d", i );
   520                 
   545                 
       
   546                 HarvestCompleted( hd->ClientId(), hd->Uri(), KErrCancel );
   521                 delete hd;
   547                 delete hd;
   522                 hd = NULL;
   548                 hd = NULL;
   523                 iReadyPHArray.Remove( i );
   549                 iReadyPHArray.Remove( i );
   524                 removed++;
   550                 removed++;
   525                 arrayCount--;
   551                 arrayCount--;
   553             if( err == KErrNone && mediaId == aMediaId )
   579             if( err == KErrNone && mediaId == aMediaId )
   554                 {
   580                 {
   555                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iPHArray %d", i);
   581                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iPHArray %d", i);
   556                 OstTrace1( TRACE_NORMAL, DUP5_CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount remove iPHArray %d", i );
   582                 OstTrace1( TRACE_NORMAL, DUP5_CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount remove iPHArray %d", i );
   557                 
   583                 
       
   584                 HarvestCompleted( hd->ClientId(), hd->Uri(), KErrCancel );
   558                 delete hd;
   585                 delete hd;
   559 				hd = NULL;
   586 				hd = NULL;
   560                 iPHArray.Remove( i );
   587                 iPHArray.Remove( i );
   561                 removed++;
   588                 removed++;
   562                 arrayCount--;
   589                 arrayCount--;
   589             if( err == KErrNone && mediaId == aMediaId )
   616             if( err == KErrNone && mediaId == aMediaId )
   590                 {
   617                 {
   591                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iContainerPHArray %d", i);
   618                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iContainerPHArray %d", i);
   592                 OstTrace1( TRACE_NORMAL, DUP8_CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount remove iContainerPHArray %d", i );
   619                 OstTrace1( TRACE_NORMAL, DUP8_CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount remove iContainerPHArray %d", i );
   593                 
   620                 
       
   621                 HarvestCompleted( hd->ClientId(), hd->Uri(), KErrCancel );
   594                 delete hd;
   622                 delete hd;
   595 				hd = NULL;
   623 				hd = NULL;
   596                 iContainerPHArray.Remove( i );
   624                 iContainerPHArray.Remove( i );
   597                 removed++;
   625                 removed++;
   598                 arrayCount--;
   626                 arrayCount--;
   620             err = iMediaIdUtil->GetMediaId( hd->Uri(), mediaId );
   648             err = iMediaIdUtil->GetMediaId( hd->Uri(), mediaId );
   621             
   649             
   622             if( err == KErrNone && mediaId == aMediaId )
   650             if( err == KErrNone && mediaId == aMediaId )
   623                 {
   651                 {
   624                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iTempReadyPHArray %d", i);
   652                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iTempReadyPHArray %d", i);
       
   653                 HarvestCompleted( hd->ClientId(), hd->Uri(), KErrCancel );
   625                 delete hd;
   654                 delete hd;
   626                 hd = NULL;
   655                 hd = NULL;
   627                 iTempReadyPHArray.Remove( i );
   656                 iTempReadyPHArray.Remove( i );
   628                 removed++;
   657                 removed++;
   629                 arrayCount--;
   658                 arrayCount--;
   679                     hpi->iQueue.Remove(j);
   708                     hpi->iQueue.Remove(j);
   680 					removed++;
   709 					removed++;
   681 
   710 
   682 					TRAP_IGNORE( iMdESession->CancelObjectL( mdeobj ) );
   711 					TRAP_IGNORE( iMdESession->CancelObjectL( mdeobj ) );
   683 					
   712 					
       
   713 					HarvestCompleted( hd->ClientId(), hd->Uri(), KErrCancel );
   684 					delete hd;
   714 					delete hd;
   685 					hd = NULL;
   715 					hd = NULL;
   686 					}
   716 					}
   687 				}
   717 				}
   688 			
   718 			
   703 		}
   733 		}
   704 	
   734 	
   705     iMediaIdUtil->RemoveMediaId( aMediaId );
   735     iMediaIdUtil->RemoveMediaId( aMediaId );
   706 	
   736 	
   707 	// resume harvesting from last state
   737 	// resume harvesting from last state
   708     if( !iRamFull && !iDiskFull )
   738     iUnmountHandlingOngoing = EFalse;
   709         {
   739     // resume monitoring
   710         // resume monitoring
   740     ResumeMonitoring();
   711         ResumeMonitoring();
   741     TRAP_IGNORE( ResumeHarvesterL() );    
   712         TRAP_IGNORE( ResumeHarvesterL() );    
       
   713         }
       
   714 	}
   742 	}
   715 
   743 
   716 // ---------------------------------------------------------------------------
   744 // ---------------------------------------------------------------------------
   717 // StartComposersL
   745 // StartComposersL
   718 // ---------------------------------------------------------------------------
   746 // ---------------------------------------------------------------------------
   819         iHarvestingPlaceholders = ETrue;
   847         iHarvestingPlaceholders = ETrue;
   820         if( !iFastHarvestNeeded )
   848         if( !iFastHarvestNeeded )
   821             {
   849             {
   822             SetPriority( KHarvesterCustomImportantPriority );
   850             SetPriority( KHarvesterCustomImportantPriority );
   823             }
   851             }
   824     	while( hd != NULL &&
   852     	while( hd &&
   825 				iPHArray.Count() < KPlaceholderQueueSize &&
   853 			   iPHArray.Count() < KPlaceholderQueueSize &&
   826 				hd->ObjectType() == EPlaceholder )
   854 			   hd->ObjectType() == EPlaceholder )
   827     		{
   855     		{
   828         	iPHArray.Append( hd );
   856         	if(iPHArray.Append( hd ) != KErrNone)
   829         	if( hd->Origin() == MdeConstants::Object::ECamera || 
       
   830         	    hd->ObjectType() == EFastHarvest  )
       
   831         	    {
   857         	    {
   832         	    if( !iFastHarvestNeeded )
   858         	    HarvestCompleted( hd->ClientId(), hd->Uri(), KErrNoMemory );
   833         	        {
   859         	    iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
   834                     iFastHarvestNeeded = ETrue;
   860                 delete hd;
   835                     // Fast harvest event must be handled even if MMC handling would be ongoing
   861                 hd = NULL;
   836                     SetPriority( KHarvesterPriorityMonitorPlugin );
       
   837         	        }
       
   838         	    break;
       
   839         	    }
   862         	    }
   840         	else if( iFastHarvestNeeded )
   863         	else
   841         	    {
   864         	    {
   842         	    iFastHarvestNeeded = EFalse;
   865                 if( hd->Origin() == MdeConstants::Object::ECamera || 
   843         	    SetPriority( KHarvesterCustomImportantPriority );
   866                     hd->ObjectType() == EFastHarvest  )
       
   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         	    	}
   844         	    }
   881         	    }
   845         	hd = iQueue->GetNextItem();
   882         	hd = iQueue->GetNextItem();
   846     		}
   883     		}
   847     	
   884     	
   848     	if( iFastHarvestNeeded && iPHArray.Count() > 0 )
   885     	if( iFastHarvestNeeded && iPHArray.Count() > 0 )
   849     	    {
   886     	    {
   850             TRAPD( err, HandlePlaceholdersL( ETrue ) );
   887             TRAPD( err, HandlePlaceholdersL( ETrue ) );
   851 
   888 
   852             // make sure that when HandlePlaceholdersL leaves, iPHArray is cleared
   889             // make sure that when HandlePlaceholdersL leaves unexpectedly, iPHArray is cleared
   853             if ( err != KErrNone )
   890             if ( err != KErrNone )
   854                 {
   891                 {
   855                 iPHArray.ResetAndDestroy();
   892                 if( err != KErrDiskFull )
   856                 iTempReadyPHArray.ResetAndDestroy();
   893                     {
       
   894                     iPHArray.ResetAndDestroy();
       
   895                     iTempReadyPHArray.ResetAndDestroy();
       
   896                     }
   857                 User::Leave( err );
   897                 User::Leave( err );
   858                 }
   898                 }
   859             
   899             
   860             TInt count( iReadyPHArray.Count() );
   900             TInt count( iReadyPHArray.Count() );
   861             for( TInt i = 0; i < count; i++ )
   901             for( TInt i = 0; i < count; i++ )
   875     	
   915     	
   876 		if( hd )
   916 		if( hd )
   877     		{
   917     		{
   878 	    	if( hd->ObjectType() == EPlaceholder )
   918 	    	if( hd->ObjectType() == EPlaceholder )
   879 	    		{
   919 	    		{
   880 	        	iPHArray.Append( hd );
   920 	        	if( iPHArray.Append( hd ) != KErrNone )
       
   921 	        	    {
       
   922 	        	    HarvestCompleted( hd->ClientId(), hd->Uri(), KErrNoMemory ); 
       
   923 	        	    iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
       
   924                     delete hd;
       
   925                     hd = NULL;
       
   926 	        	    }
   881 	    		}
   927 	    		}
   882 	    	else
   928 	    	else
   883 	    		{
   929 	    		{
   884 	    		CheckFileExtensionAndHarvestL( hd );
   930                 if( iReadyPHArray.Append( hd ) != KErrNone)
   885 	    		if( iUnmountDetected )
   931                     {
   886 	    		    {
   932                     delete hd;
   887 	    		    iQueue->Append( hd );
   933                     hd = NULL;
   888 	    		    return;
   934                     }
   889 	    		    }
       
   890 	    		}
   935 	    		}
   891     		}
   936     		}
   892 			
   937 			
   893     	if( iPHArray.Count() > 0 )
   938     	if( iPHArray.Count() > 0 )
   894     		{
   939     		{
   895 	    	TRAPD( err, HandlePlaceholdersL( ETrue ) );
   940 	    	TRAPD( err, HandlePlaceholdersL( ETrue ) );
   896 
   941 
   897 	    	// make sure that when HandlePlaceholdersL leaves, iPHArray is cleared
   942 	    	// make sure that when HandlePlaceholdersL leaves unexpectedly, iPHArray is cleared
   898 	    	if ( err != KErrNone )
   943 	    	if ( err != KErrNone )
   899 	    		{
   944 	    		{
   900 	    		iPHArray.ResetAndDestroy();
   945 	    	    if( err != KErrDiskFull )
   901 	    		iTempReadyPHArray.ResetAndDestroy();
   946 	    	        {
       
   947 	    	        iPHArray.ResetAndDestroy();
       
   948 	    	        iTempReadyPHArray.ResetAndDestroy();
       
   949 	    	        }
   902 	    		User::Leave( err );
   950 	    		User::Leave( err );
   903 	    		}
   951 	    		}
   904     		}
   952     		}
   905     	}
   953     	}
   906     else
   954     else
   909             {
   957             {
   910             SetPriority( KHarvesterPriorityHarvestingPlugin );
   958             SetPriority( KHarvesterPriorityHarvestingPlugin );
   911             }
   959             }
   912         iHarvestingPlaceholders = EFalse;
   960         iHarvestingPlaceholders = EFalse;
   913         CheckFileExtensionAndHarvestL( hd );
   961         CheckFileExtensionAndHarvestL( hd );
   914         if( iUnmountDetected )
   962         if( iUnmountDetected && hd )
   915             {
   963             {
   916             iQueue->Append( hd );
   964             iQueue->Append( hd );
   917             }
   965             }
   918     	}
   966     	}
   919     }
   967     }
   929 
   977 
   930 	RPointerArray<CMdEObject> mdeObjectArray;
   978 	RPointerArray<CMdEObject> mdeObjectArray;
   931 	CleanupClosePushL( mdeObjectArray );
   979 	CleanupClosePushL( mdeObjectArray );
   932 
   980 
   933 	TTimeIntervalSeconds timeOffsetSeconds = User::UTCOffset();
   981 	TTimeIntervalSeconds timeOffsetSeconds = User::UTCOffset();
       
   982 	
       
   983 	CMdENamespaceDef& defNS = iMdESession->GetDefaultNamespaceDefL();
   934 	
   984 	
   935 	TInt endindex( iPHArray.Count() );
   985 	TInt endindex( iPHArray.Count() );
   936 	for( TInt i = 0; i < endindex; i++ )
   986 	for( TInt i = 0; i < endindex; i++ )
   937 		{
   987 		{
   938 		CHarvesterData* hd = iPHArray[i];
   988 		CHarvesterData* hd = iPHArray[i];
   939 		
   989 		
   940 		if( aCheck && iHarvesterPluginFactory->IsContainerFileL( hd->Uri() ) )
   990 		if( aCheck && 
       
   991 		    hd->Origin() != MdeConstants::Object::ECamera &&
       
   992 		    iHarvesterPluginFactory->IsContainerFileL( hd->Uri() ) )
   941 			{
   993 			{
   942 			iContainerPHArray.Append( hd );
   994 			if( iContainerPHArray.Append( hd ) != KErrNone )
       
   995 			    {
       
   996 			    HarvestCompleted( hd->ClientId(), hd->Uri(), KErrNoMemory );
       
   997 			    iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
       
   998                 delete hd;
       
   999                 hd = NULL;
       
  1000 			    }
       
  1001 
   943 			iPHArray.Remove( i );
  1002 			iPHArray.Remove( i );
   944             i--;
  1003 			i--;
   945             endindex--;
  1004 			endindex--;
   946 			continue;
  1005 			continue;
   947 			}
  1006 			}
       
  1007 		
   948 		TBuf<KObjectDefStrSize> objDefStr;
  1008 		TBuf<KObjectDefStrSize> objDefStr;
   949 		
  1009 		
   950 		if( !CheckForCameraItem( hd, objDefStr ) )
  1010 		if( !CheckForCameraItem( hd, objDefStr ) )
   951 		    {
  1011 		    {
   952 		    iHarvesterPluginFactory->GetObjectDefL( *hd, objDefStr );
  1012 		    iHarvesterPluginFactory->GetObjectDefL( hd, objDefStr );
   953 		    }
  1013 		    }
   954 		
  1014 		
   955 		// GetObjectDef can cause context switch, and if unmount happens when this execution is 
  1015 		// GetObjectDef can cause context switch, and if unmount happens when this execution is 
   956 		// interrupted, the ph arrays can be invalid. Thus, abort whole run, and start over to make sure 
  1016 		// interrupted, the ph arrays can be invalid. Thus, abort whole run, and start over to make sure 
   957 		// the arrays are valid.
  1017 		// the arrays are valid.
   958 		if( iUnmountDetected )
  1018 		if( iUnmountDetected )
   959 		    {
  1019 		    {
   960 		    WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - Unmount detected during execution!" );
  1020 		    WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - Unmount detected during execution!" );
   961 		    for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
  1021 		    for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
   962 		        {
  1022 		        {
   963 		        CHarvesterData* hd = iTempReadyPHArray[y];
  1023 		        CHarvesterData* tempHd = iTempReadyPHArray[y];
   964 		        iPHArray.Insert( hd, 0 );
  1024 				
       
  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 		            }
   965 		        }
  1032 		        }
   966 		    iTempReadyPHArray.Reset();
  1033 		    iTempReadyPHArray.Reset();
   967 		    CleanupStack::PopAndDestroy( &mdeObjectArray );
  1034 		    CleanupStack::PopAndDestroy( &mdeObjectArray );
   968 		    return;
  1035 		    return;
   969 		    }
  1036 		    }
   974 		    {
  1041 		    {
   975             WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - Priority interrupt during execution!" );
  1042             WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - Priority interrupt during execution!" );
   976             const TInt currentPHArrayCount( iPHArray.Count() );
  1043             const TInt currentPHArrayCount( iPHArray.Count() );
   977             for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
  1044             for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
   978                 {
  1045                 {
   979                 CHarvesterData* hd = iTempReadyPHArray[y];
  1046                 CHarvesterData* tempHd = iTempReadyPHArray[y];
   980                 if( currentPHArrayCount )
  1047                 if(iPHArray.Insert( tempHd, 0 ) != KErrNone)
   981                     {
  1048                     {
   982                     // Leave the first item in the array as it is the priority item
  1049                     HarvestCompleted( tempHd->ClientId(), tempHd->Uri(), KErrNoMemory );
   983                     iPHArray.Insert( hd, 1 );
  1050                     iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
   984                     }
  1051                     delete tempHd;
   985                 else
  1052                     tempHd = NULL;
   986                     {
       
   987                     iPHArray.Insert( hd, 0 );
       
   988                     }
  1053                     }
   989                 }
  1054                 }
   990             iTempReadyPHArray.Reset();
  1055             iTempReadyPHArray.Reset();
   991             CleanupStack::PopAndDestroy( &mdeObjectArray );
  1056             CleanupStack::PopAndDestroy( &mdeObjectArray );
   992             return;		
  1057             return;		
   993 		    }
  1058 		    }
       
  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 		    }
   994 		
  1081 		
   995 		if( objDefStr.Length() == 0 ||
  1082 		if( objDefStr.Length() == 0 ||
   996 		    ( objDefStr == KInUse ) )
  1083 		    ( objDefStr == KInUse ) )
   997 			{
  1084 			{
   998 		    WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - no objectDef or in use, failing harvesting" );
  1085 #ifdef _DEBUG
       
  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 		        }
   999 			const TInt error( KErrUnknown );
  1109 			const TInt error( KErrUnknown );
  1000             // notify observer, notification is needed even if file is not supported
  1110             // notify observer, notification is needed even if file is not supported
  1001             HarvestCompleted( hd->ClientId(), hd->Uri(), error );
  1111             HarvestCompleted( hd->ClientId(), hd->Uri(), error );
  1002 			delete hd;
  1112 			delete hd;
  1003 			hd = NULL;
  1113 			hd = NULL;
  1006             endindex--;
  1116             endindex--;
  1007 			iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
  1117 			iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
  1008 			continue;
  1118 			continue;
  1009 			}
  1119 			}
  1010 
  1120 
  1011 		CMdENamespaceDef& defNS = iMdESession->GetDefaultNamespaceDefL();
       
  1012 		CMdEObjectDef& mdeObjectDef = defNS.GetObjectDefL( objDefStr );
  1121 		CMdEObjectDef& mdeObjectDef = defNS.GetObjectDefL( objDefStr );
  1013 
  1122 
  1014 		CMdEObject* mdeObject = iMdESession->NewObjectL( mdeObjectDef, hd->Uri() );
  1123 		HBufC* hdUri = hd->Uri().AllocL();
       
  1124 		CleanupStack::PushL( hdUri );
       
  1125 		CMdEObject* mdeObject = iMdESession->NewObjectL( mdeObjectDef, *hdUri );
       
  1126 		CleanupStack::PopAndDestroy( hdUri );
  1015 		CleanupStack::PushL( mdeObject );
  1127 		CleanupStack::PushL( mdeObject );
  1016 		
  1128 		
  1017 		CPlaceholderData* phData = NULL;
  1129 		CPlaceholderData* phData = NULL;
  1018 
  1130 
  1019 		if( hd->TakeSnapshot() )
  1131 		if( hd->TakeSnapshot() )
  1078 		mdeObject->SetMediaId( phData->MediaId() );
  1190 		mdeObject->SetMediaId( phData->MediaId() );
  1079 	    
  1191 	    
  1080 	    // set placeholder
  1192 	    // set placeholder
  1081 	    mdeObject->SetPlaceholder( ETrue );
  1193 	    mdeObject->SetPlaceholder( ETrue );
  1082 	    
  1194 	    
  1083 	    if( !iPropDefs )
  1195 	    if( !iPropDefs->iCreationDatePropertyDef )
  1084 	    	{
  1196 	        {
  1085 	    	iPropDefs = CHarvesterAoPropertyDefs::NewL( defNS.GetObjectDefL( MdeConstants::Object::KBaseObject ) );
  1197             iPropDefs->SetByObjectDefL( defNS.GetObjectDefL( MdeConstants::Object::KBaseObject ) );
  1086 	    	}
  1198 	        }
  1087 
  1199 
  1088 	    // set file size
  1200 	    // set file size
  1089     	mdeObject->AddUint32PropertyL( *iPropDefs->iSizePropertyDef, phData->FileSize() );
  1201     	mdeObject->AddUint32PropertyL( *iPropDefs->iSizePropertyDef, phData->FileSize() );
  1090 
  1202 
  1091 	    // set creation date
  1203 	    // set creation date
  1104             {
  1216             {
  1105             mdeObject->AddTextPropertyL( *iPropDefs->iItemTypePropertyDef, mimeType );
  1217             mdeObject->AddTextPropertyL( *iPropDefs->iItemTypePropertyDef, mimeType );
  1106             }
  1218             }
  1107         else
  1219         else
  1108             {
  1220             {
  1109             mdeObject->AddTextPropertyL( *iPropDefs->iItemTypePropertyDef, KUndefinedMime );
  1221             mdeObject->AddTextPropertyL( *iPropDefs->iItemTypePropertyDef, KUndefined );
  1110             }
  1222             }
  1111 		
  1223 		
  1112         if( hd->Origin() == MdeConstants::Object::ECamera )
  1224         if( hd->Origin() == MdeConstants::Object::ECamera )
  1113             {
  1225             {
  1114             TBool inDefaultFolder( ETrue );
  1226             TBool inDefaultFolder( ETrue );
  1126 	        {
  1238 	        {
  1127 	        mdeObject->AddTextPropertyL( *iPropDefs->iTitlePropertyDef, name );
  1239 	        mdeObject->AddTextPropertyL( *iPropDefs->iTitlePropertyDef, name );
  1128 	        }
  1240 	        }
  1129 	    else
  1241 	    else
  1130 	        {
  1242 	        {
  1131 	        mdeObject->AddTextPropertyL( *iPropDefs->iTitlePropertyDef, KNullDesC );
  1243 	        mdeObject->AddTextPropertyL( *iPropDefs->iTitlePropertyDef, KUndefined );
  1132 	        }
  1244 	        }
  1133 	    
  1245 	    
  1134     	CPlaceholderData* ph = NULL;
  1246     	CPlaceholderData* ph = NULL;
  1135     	if( hd->TakeSnapshot() )
  1247     	if( hd->TakeSnapshot() )
  1136     	    {
  1248     	    {
  1170 		
  1282 		
  1171 	    CleanupStack::PopAndDestroy( phData );
  1283 	    CleanupStack::PopAndDestroy( phData );
  1172 	    
  1284 	    
  1173 	    CleanupStack::Pop( mdeObject );
  1285 	    CleanupStack::Pop( mdeObject );
  1174 		
  1286 		
  1175 	    iTempReadyPHArray.Append( hd );
  1287 	    if(iTempReadyPHArray.Append( hd ) != KErrNone)
       
  1288 	        {
       
  1289 	        HarvestCompleted( hd->ClientId(), hd->Uri(), KErrNoMemory );
       
  1290             delete hd;
       
  1291             hd = NULL;
       
  1292 	        }
  1176 		iPHArray.Remove( i );
  1293 		iPHArray.Remove( i );
  1177         i--;
  1294         i--;
  1178         endindex--;
  1295         endindex--;
  1179 		}
  1296 		}
  1180 	
  1297 	
  1181 	const TInt tempArrayCount( iTempReadyPHArray.Count() );
       
  1182 	for( TInt i( 0 ); i < tempArrayCount; i++ )
       
  1183 	    {
       
  1184 	    CHarvesterData* hd = iTempReadyPHArray[i];
       
  1185 	    iReadyPHArray.Append( hd );
       
  1186 	    }
       
  1187 	iTempReadyPHArray.Reset();
       
  1188 	
       
  1189 	const TInt objectCount = mdeObjectArray.Count();  
  1298 	const TInt objectCount = mdeObjectArray.Count();  
  1190 	
  1299 	
  1191     if( objectCount > 0 )
  1300     if( objectCount > 0 )
  1192 		{
  1301 		{
  1193 		// add object to mde
  1302 		// add object to mde
  1194 		iMdEHarvesterSession->AutoLockL( mdeObjectArray );
  1303 		iMdEHarvesterSession->AutoLockL( mdeObjectArray );
  1195 		const TInt addError( iMdESession->AddObjectsL( mdeObjectArray ) );
  1304 		TInt addError( KErrNone );
       
  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 		
  1196 		if( addError != KErrNone )
  1330 		if( addError != KErrNone )
  1197 		    {
  1331 		    {
  1198 		    // If some error occures, retry
  1332 		    // If some error occures, retry
  1199 		    iMdESession->AddObjectsL( mdeObjectArray );
  1333 		    iMdESession->AddObjectsL( mdeObjectArray );
  1200 		    }
  1334 		    }
  1201 
  1335 
       
  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 		
  1202 	    iHarvesterEventManager->IncreaseItemCount( EHEObserverTypePlaceholder, 
  1349 	    iHarvesterEventManager->IncreaseItemCount( EHEObserverTypePlaceholder, 
  1203 		        objectCount );
  1350 		        objectCount );
  1204 		iHarvesterEventManager->SendEventL( EHEObserverTypePlaceholder, EHEStateStarted, 
  1351 		iHarvesterEventManager->SendEventL( EHEObserverTypePlaceholder, EHEStateStarted, 
  1205 				iHarvesterEventManager->ItemCount( EHEObserverTypePlaceholder ) );
  1352 				iHarvesterEventManager->ItemCount( EHEObserverTypePlaceholder ) );
  1206 		
  1353 		
  1232     TBool isError = EFalse;
  1379     TBool isError = EFalse;
  1233     CMdEObject* mdeObject = &aHD->MdeObject();
  1380     CMdEObject* mdeObject = &aHD->MdeObject();
  1234     const TDesC& uri = aHD->Uri();
  1381     const TDesC& uri = aHD->Uri();
  1235     TBool objectExisted = ETrue;
  1382     TBool objectExisted = ETrue;
  1236     
  1383     
  1237     if( ! mdeObject )
  1384     if( !mdeObject )
  1238     	{
  1385     	{
  1239     	objectExisted = EFalse;
  1386     	objectExisted = EFalse;
  1240     	WRITELOG1( "CHarvesterAO::CheckFileExtensionAndHarvestL() - no mdeobject. URI: %S", &uri );
  1387     	WRITELOG1( "CHarvesterAO::CheckFileExtensionAndHarvestL() - no mdeobject. URI: %S", &uri );
  1241 	    TBuf<KObjectDefStrSize> objDefStr;
  1388 	    TBuf<KObjectDefStrSize> objDefStr;
  1242 		iHarvesterPluginFactory->GetObjectDefL( *aHD, objDefStr );
  1389 		iHarvesterPluginFactory->GetObjectDefL( aHD, objDefStr );
  1243 
  1390 
  1244         // GetObjectDef can cause context switch, and if unmount happens when this execution is 
  1391         // GetObjectDef can cause context switch, and if unmount happens when this execution is 
  1245         // interrupted, the ph data can be invalid. Thus, abort whole run, and start over to make sure 
  1392         // interrupted, the ph data can be invalid. Thus, abort whole run, and start over to make sure 
  1246         // the data is valid.
  1393         // the data is valid.
  1247         if( iUnmountDetected )
  1394         if( !aHD )
  1248             {
  1395             {
  1249             return;
  1396             return;
  1250             }
  1397             }
  1251 		
  1398 		
  1252 		if( objDefStr.Length() == 0 )
  1399 		if( objDefStr.Length() == 0 )
  1347 	
  1494 	
  1348     if( objectExisted && aHD->EventType() == EHarvesterAdd )
  1495     if( objectExisted && aHD->EventType() == EHarvesterAdd )
  1349     	{
  1496     	{
  1350     	iMdESession->RemoveObjectL( aHD->Uri() );
  1497     	iMdESession->RemoveObjectL( aHD->Uri() );
  1351     	}
  1498     	}
       
  1499     
       
  1500     // If context swich occures just right due to RemoveObjectL, check aHD for validity
       
  1501     if( !aHD )
       
  1502         {
       
  1503         return;
       
  1504         }
  1352 	
  1505 	
  1353 	TInt pluginErr = KErrNone;
  1506 	TInt pluginErr = KErrNone;
  1354     TRAPD( err, pluginErr = iHarvesterPluginFactory->HarvestL( aHD ));
  1507     TRAPD( err, pluginErr = iHarvesterPluginFactory->HarvestL( aHD ));
       
  1508     
  1355     if ( err != KErrNone )
  1509     if ( err != KErrNone )
  1356     	{
  1510     	{
  1357     	WRITELOG1( "CHarvesterAO::CheckFileExtensionAndHarvestL() - plugin error: %d", err );
  1511     	WRITELOG1( "CHarvesterAO::CheckFileExtensionAndHarvestL() - plugin error: %d", err );
  1358     	OstTrace1( TRACE_NORMAL, DUP6_CHARVESTERAO_CHECKFILEEXTENSIONANDHARVESTL, "CHarvesterAO::CheckFileExtensionAndHarvestL - plugin error: %d", err );
  1512     	OstTrace1( TRACE_NORMAL, DUP6_CHARVESTERAO_CHECKFILEEXTENSIONANDHARVESTL, "CHarvesterAO::CheckFileExtensionAndHarvestL - plugin error: %d", err );
  1359     	
  1513     	
  1379     	return;
  1533     	return;
  1380     	}
  1534     	}
  1381     
  1535     
  1382     WRITELOG1("CHarvesterAO::CheckFileExtensionAndHarvestL() - ends with error %d", pluginErr );
  1536     WRITELOG1("CHarvesterAO::CheckFileExtensionAndHarvestL() - ends with error %d", pluginErr );
  1383     OstTrace1( TRACE_NORMAL, DUP8_CHARVESTERAO_CHECKFILEEXTENSIONANDHARVESTL, "CHarvesterAO::CheckFileExtensionAndHarvestL) - ends with error %d", pluginErr );
  1537     OstTrace1( TRACE_NORMAL, DUP8_CHARVESTERAO_CHECKFILEEXTENSIONANDHARVESTL, "CHarvesterAO::CheckFileExtensionAndHarvestL) - ends with error %d", pluginErr );
  1384     
       
  1385     SetNextRequest( ERequestHarvest );
       
  1386     }
  1538     }
  1387 
  1539 
  1388 // ---------------------------------------------------------------------------
  1540 // ---------------------------------------------------------------------------
  1389 // HarvestingCompleted
  1541 // HarvestingCompleted
  1390 // ---------------------------------------------------------------------------
  1542 // ---------------------------------------------------------------------------
  1439 	        	if( locData )
  1591 	        	if( locData )
  1440 	        		{
  1592 	        		{
  1441 	        		WRITELOG( "CHarvesterAO::HarvestingCompleted() - Creating location object. " );
  1593 	        		WRITELOG( "CHarvesterAO::HarvestingCompleted() - Creating location object. " );
  1442 	        		OstTrace0( TRACE_NORMAL, DUP6_CHARVESTERAO_HARVESTINGCOMPLETED, "CHarvesterAO::HarvestingCompleted - Creating location object." );
  1594 	        		OstTrace0( TRACE_NORMAL, DUP6_CHARVESTERAO_HARVESTINGCOMPLETED, "CHarvesterAO::HarvestingCompleted - Creating location object." );
  1443 	        		
  1595 	        		
  1444 	        		RLocationObjectManipulator lo;
  1596 	        		TInt loError( KErrNone ); 
  1445 	        		
  1597 	        		if( !iLocManipulatorConnected )
  1446 	        		const TInt loError = lo.Connect();     		
  1598 	        		    {
       
  1599 	        		    loError = iLocManipulator.Connect();
       
  1600 	        		    if( loError == KErrNone )
       
  1601 	        		        {
       
  1602 	        		        iLocManipulatorConnected = ETrue;
       
  1603 	        		        }
       
  1604 	        		    }    		
  1447 	        		
  1605 	        		
  1448 	        		if (loError == KErrNone)
  1606 	        		if (loError == KErrNone)
  1449 	        			{
  1607 	        			{
  1450 	        			TInt err = lo.CreateLocationObject( *locData, aHD->MdeObject().Id() );
  1608 	        			TInt err = iLocManipulator.CreateLocationObject( *locData, aHD->MdeObject().Id() );
  1451 	        			if( err != KErrNone )
  1609 	        			if( err != KErrNone )
  1452 	        				{
  1610 	        				{
  1453 	        				WRITELOG( "CHarvesterAO::HarvestingCompleted() - Location object creation failed!!!" );
  1611 	        				WRITELOG( "CHarvesterAO::HarvestingCompleted() - Location object creation failed!!!" );
  1454 	        				OstTrace0( TRACE_NORMAL, DUP7_CHARVESTERAO_HARVESTINGCOMPLETED, "CHarvesterAO::HarvestingCompleted - Location object creation failed!!!" );
  1612 	        				OstTrace0( TRACE_NORMAL, DUP7_CHARVESTERAO_HARVESTINGCOMPLETED, "CHarvesterAO::HarvestingCompleted - Location object creation failed!!!" );
  1455 	        				
  1613 	        				iLocManipulator.Close();
       
  1614 	        				iLocManipulatorConnected = EFalse;
  1456 	        				}
  1615 	        				}
  1457 	        			}
  1616 	        			}
  1458 	        		else
  1617 	        		else
  1459 	        			{
  1618 	        			{
  1460 	        			WRITELOG( "CHarvesterAO::HarvestingCompleted() - LocationObjectManipulator connect failed!!!" );
  1619 	        			WRITELOG( "CHarvesterAO::HarvestingCompleted() - LocationObjectManipulator connect failed!!!" );
  1461 	        			OstTrace0( TRACE_NORMAL, DUP8_CHARVESTERAO_HARVESTINGCOMPLETED, "CHarvesterAO::HarvestingCompleted - LocationObjectManipulator connect failed!!" );	        			
  1620 	        			OstTrace0( TRACE_NORMAL, DUP8_CHARVESTERAO_HARVESTINGCOMPLETED, "CHarvesterAO::HarvestingCompleted - LocationObjectManipulator connect failed!!" );	        			
  1462 	        			}
  1621 	        			}
  1463 	        		
       
  1464 	        		lo.Close();
       
  1465 	        		}
  1622 	        		}
  1466 	        	
  1623 	        	
  1467 	        	TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 ) );
  1624 	        	TRAP_IGNORE( iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 ) );
  1468 	        	
  1625 	        	
  1469 				delete aHD;
  1626 				delete aHD;
  1510         
  1667         
  1511         WRITELOG( "==============================ERROR done =========================" );
  1668         WRITELOG( "==============================ERROR done =========================" );
  1512         OstTrace0( TRACE_NORMAL, DUP12_CHARVESTERAO_HARVESTINGCOMPLETED, "==============================ERROR done =========================" );
  1669         OstTrace0( TRACE_NORMAL, DUP12_CHARVESTERAO_HARVESTINGCOMPLETED, "==============================ERROR done =========================" );
  1513         
  1670         
  1514         }
  1671         }
  1515            
       
  1516     SetNextRequest( ERequestHarvest );
       
  1517     }
  1672     }
  1518 
  1673 
  1519 // ---------------------------------------------------------------------------
  1674 // ---------------------------------------------------------------------------
  1520 // HandleSessionOpened
  1675 // HandleSessionOpened
  1521 // ---------------------------------------------------------------------------
  1676 // ---------------------------------------------------------------------------
  1658             TRAP_IGNORE( BootRomScanL() );
  1813             TRAP_IGNORE( BootRomScanL() );
  1659             }
  1814             }
  1660         TRAP_IGNORE( BootPartialRestoreScanL() );
  1815         TRAP_IGNORE( BootPartialRestoreScanL() );
  1661 #endif
  1816 #endif
  1662         
  1817         
  1663         if( !iMassMemoryIdChecked )
  1818         // Store the internal mass memory media ID to DB, and update data if necessary
  1664             {
  1819         TInt drive( -1 );
  1665             TInt drive( -1 );
  1820         TInt internalMassStorageError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, drive ) );
  1666             TInt massStorageError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, drive ) );
  1821         if( internalMassStorageError == KErrNone )
  1667             if( massStorageError == KErrNone )
  1822             {
       
  1823             TVolumeInfo internalMassStorageVolumeInfo;
       
  1824             internalMassStorageError = iFs.Volume( internalMassStorageVolumeInfo, drive );
       
  1825             if( internalMassStorageError == KErrNone )
  1668                 {
  1826                 {
  1669                 TVolumeInfo massStorageVolumeInfo;
  1827                 const TUint32 massStorageMediaId( internalMassStorageVolumeInfo.iUniqueID );
  1670                 iFs.Volume( massStorageVolumeInfo, drive );
  1828                 if( massStorageMediaId != 0 )
  1671                 const TUint32 massStorageMediaId( massStorageVolumeInfo.iUniqueID );
       
  1672                 massStorageError = DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, drive );
       
  1673                 if( massStorageError == KErrNone )
       
  1674                     {
  1829                     {
  1675                     iFs.Volume( massStorageVolumeInfo, drive );
  1830                     TUint32 mmcMediaId( 0 );
  1676                     // Update mass storage media id if the mass storage is not memory card
  1831                     TInt mmcDrive( -1 );
  1677                     if( massStorageVolumeInfo.iUniqueID != massStorageMediaId && massStorageMediaId != 0 )
  1832                     TInt mmcError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, mmcDrive ) );
       
  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 )
  1678                         {
  1856                         {
  1679                         iMdEHarvesterSession->CheckMassStorageMediaId( massStorageMediaId );
  1857                         iMdEHarvesterSession->CheckMassStorageMediaId( massStorageMediaId );
  1680                         }
  1858                         }          
  1681                     }
  1859                     }                    
  1682                 }
  1860                 }
  1683             }
  1861             }
  1684         }
  1862         }
  1685     else
  1863     else
  1686         {
  1864         {
  1741     OstTrace0( TRACE_NORMAL, CHARVESTERAO_PAUSEHARVESTER, "CHarvesterAO::PauseHarvester" );
  1919     OstTrace0( TRACE_NORMAL, CHARVESTERAO_PAUSEHARVESTER, "CHarvesterAO::PauseHarvester" );
  1742     
  1920     
  1743     iHarvesterPluginFactory->PauseHarvester( ETrue );
  1921     iHarvesterPluginFactory->PauseHarvester( ETrue );
  1744     iServerPaused = ETrue;
  1922     iServerPaused = ETrue;
  1745     
  1923     
  1746     if( !iRamFull && !iDiskFull && !iUnmountDetected )
       
  1747         {
       
  1748         iManualPauseEnabled = ETrue;
       
  1749         }
       
  1750     
       
  1751     // Everything is paused
  1924     // Everything is paused
  1752     WRITELOG( "CHarvesterAO::PauseHarvester() - Moving paused state paused" );
  1925     WRITELOG( "CHarvesterAO::PauseHarvester() - Moving paused state paused" );
  1753     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_PAUSEHARVESTER, "CHarvesterAO::PauseHarvester - Moving paused state paused" );
  1926     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_PAUSEHARVESTER, "CHarvesterAO::PauseHarvester - Moving paused state paused" );
  1754         
  1927         
  1755     return KErrNone;
  1928     return KErrNone;
  1761 //
  1934 //
  1762 void CHarvesterAO::ResumeHarvesterL()
  1935 void CHarvesterAO::ResumeHarvesterL()
  1763     {
  1936     {
  1764     WRITELOG( "CHarvesterAO::ResumeHarvesterL()" );
  1937     WRITELOG( "CHarvesterAO::ResumeHarvesterL()" );
  1765     OstTrace0( TRACE_NORMAL, CHARVESTERAO_RESUMEHARVESTERL, "CHarvesterAO::ResumeHarvesterL" );
  1938     OstTrace0( TRACE_NORMAL, CHARVESTERAO_RESUMEHARVESTERL, "CHarvesterAO::ResumeHarvesterL" );
       
  1939 
       
  1940     if( iRamFull || iDiskFull || iUnmountHandlingOngoing || iManualPauseEnabled )
       
  1941         {
       
  1942         return;
       
  1943         }
  1766     
  1944     
  1767     iHarvesterPluginFactory->PauseHarvester( EFalse );
  1945     iHarvesterPluginFactory->PauseHarvester( EFalse );
  1768     iServerPaused = EFalse;
  1946     iServerPaused = EFalse;
  1769     
  1947     
  1770     if( !iManualPauseEnabled &&
  1948     if( iNextRequest == ERequestIdle )
  1771         iNextRequest == ERequestIdle )
       
  1772         {
  1949         {
  1773         SetNextRequest( ERequestHarvest );
  1950         SetNextRequest( ERequestHarvest );
  1774         }
  1951         }  
  1775     
       
  1776     iManualPauseEnabled = EFalse;
       
  1777     }
  1952     }
  1778 
  1953 
  1779 // ---------------------------------------------------------------------------
  1954 // ---------------------------------------------------------------------------
  1780 // RunL
  1955 // RunL
  1781 // ---------------------------------------------------------------------------
  1956 // ---------------------------------------------------------------------------
  1807             
  1982             
  1808             iReadyPHArray.Compress();
  1983             iReadyPHArray.Compress();
  1809             iContainerPHArray.Compress();
  1984             iContainerPHArray.Compress();
  1810             iPHArray.Compress();
  1985             iPHArray.Compress();
  1811             iTempReadyPHArray.Compress();
  1986             iTempReadyPHArray.Compress();
       
  1987             
       
  1988             if( iLocManipulatorConnected )
       
  1989                 {
       
  1990                 iLocManipulator.Close();
       
  1991                 iLocManipulatorConnected = EFalse;            
       
  1992                 }
  1812             }
  1993             }
  1813         break;
  1994         break;
  1814 
  1995 
  1815         // data added to harvester queue
  1996         // data added to harvester queue
  1816         case ERequestHarvest:
  1997         case ERequestHarvest:
  1817             {
  1998             {
  1818             WRITELOG( "CHarvesterAO::RunL - ERequestHarvest" );
  1999             WRITELOG( "CHarvesterAO::RunL - ERequestHarvest" );
  1819             OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - ERequestHarvest" );
  2000             OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - ERequestHarvest" );
  1820             
  2001             
  1821             // harvest new items first...
  2002             // harvest new items first
  1822             if ( iQueue->ItemsInQueue() > 0 )
  2003             if ( iQueue->ItemsInQueue() > 0 )
  1823                 {
  2004                 {
  1824                 WRITELOG( "CHarvesterAO::RunL - Items in queue - calling ReadItemFromQueueL()" );
  2005                 WRITELOG( "CHarvesterAO::RunL - Items in queue - calling ReadItemFromQueueL()" );
  1825                 ReadItemFromQueueL();
  2006                 ReadItemFromQueueL();
  1826 				SetNextRequest( ERequestHarvest );
  2007 				SetNextRequest( ERequestHarvest );
  1829 
  2010 
  1830             // no more items to handle from main queue
  2011             // no more items to handle from main queue
  1831             else
  2012             else
  1832                 {
  2013                 {
  1833                 WRITELOG( "CHarvesterAO::RunL - No items in main queue" );
  2014                 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                     }
  1834                 // All registered fast harvested items or placeholders handled at this point     
  2035                 // All registered fast harvested items or placeholders handled at this point     
  1835                 // if container files to harvest, handle those next
  2036                 // if container files to harvest, handle those next
  1836                 if( iContainerPHArray.Count() > 0 )
  2037                 else if( iContainerPHArray.Count() > 0 )
  1837                 	{
  2038                 	{
  1838                     WRITELOG( "CHarvesterAO::RunL - Items in iContainterPHArray - requesting ERequestContainerPlaceholder handling" );
  2039                     WRITELOG( "CHarvesterAO::RunL - Items in iContainterPHArray - requesting ERequestContainerPlaceholder handling" );
  1839                     iFastHarvestNeeded = EFalse;
  2040                     iFastHarvestNeeded = EFalse;
  1840                     iHarvestingPlaceholders = EFalse;
  2041                     iHarvestingPlaceholders = EFalse;
  1841                     SetPriority( KHarvesterPriorityHarvestingPlugin );
  2042                     SetPriority( KHarvesterPriorityHarvestingPlugin );
  1862             		{
  2063             		{
  1863 #ifdef _DEBUG
  2064 #ifdef _DEBUG
  1864             		WRITELOG1("CHarvesterAO::RunL - items in ready pharray: %d", arrayCount );
  2065             		WRITELOG1("CHarvesterAO::RunL - items in ready pharray: %d", arrayCount );
  1865             		OstTrace1( TRACE_NORMAL, DUP3_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - items in ready pharray: %d", arrayCount );
  2066             		OstTrace1( TRACE_NORMAL, DUP3_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - items in ready pharray: %d", arrayCount );
  1866 #endif   		
  2067 #endif   		
  1867             		TInt endIndex( KPlaceholderQueueSize );
  2068             		TInt endIndex( KReadyPlaceholderQueueSize );
  1868             		if( arrayCount < KPlaceholderQueueSize )
  2069             		if( arrayCount < KReadyPlaceholderQueueSize )
  1869             		    {
  2070             		    {
  1870             		    endIndex = arrayCount;
  2071             		    endIndex = arrayCount;
  1871             		    }
  2072             		    }
  1872             		for( TInt i = 0; i < endIndex; i++ )
  2073             		for( TInt i = 0; i < endIndex; i++ )
  1873             			{
  2074             			{
  1905         	TInt count = iContainerPHArray.Count() > KContainerPlaceholderQueueSize ? KContainerPlaceholderQueueSize : iContainerPHArray.Count();
  2106         	TInt count = iContainerPHArray.Count() > KContainerPlaceholderQueueSize ? KContainerPlaceholderQueueSize : iContainerPHArray.Count();
  1906         	TInt i = 0;
  2107         	TInt i = 0;
  1907         	while( i < count )
  2108         	while( i < count )
  1908         		{
  2109         		{
  1909         		CHarvesterData* hd = iContainerPHArray[0];
  2110         		CHarvesterData* hd = iContainerPHArray[0];
  1910         		iPHArray.Append( hd );
  2111         		if( iPHArray.Append( hd ) != KErrNone )
       
  2112         		    {
       
  2113         		    delete hd;
       
  2114         		    hd = NULL;
       
  2115         		    }
  1911         		iContainerPHArray.Remove( 0 );
  2116         		iContainerPHArray.Remove( 0 );
  1912         		i++;
  2117         		i++;
  1913         		}
  2118         		}
  1914         	TRAPD( err, HandlePlaceholdersL( EFalse ) );
  2119         	TRAPD( err, HandlePlaceholdersL( EFalse ) );
  1915 
  2120 
  1916 	    	// make sure that when HandlePlaceholdersL leaves, iPHArray is cleared
  2121             // make sure that when HandlePlaceholdersL leaves unexpectedly, iPHArray is cleared
  1917 	    	if ( err != KErrNone )
  2122             if ( err != KErrNone )
  1918 	    		{
  2123                 {
  1919 	    	    iContainerPHArray.ResetAndDestroy();
  2124                 if( err != KErrDiskFull )
  1920 	    		iPHArray.ResetAndDestroy();
  2125                     {
  1921 	    		iTempReadyPHArray.ResetAndDestroy();
  2126                     iContainerPHArray.ResetAndDestroy();
  1922 	    		User::Leave( err );
  2127                     iPHArray.ResetAndDestroy();
  1923 	    		}
  2128                     iTempReadyPHArray.ResetAndDestroy();
       
  2129                     }
       
  2130                 User::Leave( err );
       
  2131                 }
  1924 	    	SetNextRequest( ERequestHarvest );
  2132 	    	SetNextRequest( ERequestHarvest );
  1925         	}
  2133         	}
  1926         break;
  2134         break;
  1927         
  2135         
  1928         // pause request
  2136         // pause request
  1929         case ERequestPause:
  2137         case ERequestPause:
  1930             {
  2138             {
  1931             WRITELOG( "CHarvesterAO::RunL - ERequestPause" );
  2139             WRITELOG( "CHarvesterAO::RunL - ERequestPause" );
  1932             OstTrace0( TRACE_NORMAL, DUP6_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - ERequestPause" );
  2140             OstTrace0( TRACE_NORMAL, DUP6_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - ERequestPause" );
  1933             User::LeaveIfError( PauseHarvester() );
  2141             User::LeaveIfError( PauseHarvester() );
       
  2142             iManualPauseEnabled = ETrue;
  1934             iHarvesterEventManager->SendEventL( EHEObserverTypeOverall, EHEStatePaused );
  2143             iHarvesterEventManager->SendEventL( EHEObserverTypeOverall, EHEStatePaused );
  1935             if( iHarvesterStatusObserver )
  2144             if( iHarvesterStatusObserver )
  1936             	{
  2145             	{
  1937             	iHarvesterStatusObserver->PauseReady( KErrNone );
  2146             	iHarvesterStatusObserver->PauseReady( KErrNone );
  1938             	}
  2147             	}
  1942         // resume request
  2151         // resume request
  1943         case ERequestResume:
  2152         case ERequestResume:
  1944             {
  2153             {
  1945             WRITELOG( "CHarvesterAO::RunL - ERequestResume" );
  2154             WRITELOG( "CHarvesterAO::RunL - ERequestResume" );
  1946             OstTrace0( TRACE_NORMAL, DUP7_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - ERequestResume" );
  2155             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                 }
  1947             ResumeHarvesterL();
  2169             ResumeHarvesterL();
  1948             iHarvesterEventManager->SendEventL( EHEObserverTypeOverall, EHEStateResumed );
  2170             iHarvesterEventManager->SendEventL( EHEObserverTypeOverall, EHEStateResumed );
  1949             if( iHarvesterStatusObserver )
  2171             if( iHarvesterStatusObserver )
  1950             	{
  2172             	{
  1951                 iHarvesterStatusObserver->ResumeReady( KErrNone );
  2173                 iHarvesterStatusObserver->ResumeReady( KErrNone );
  1978 // RunError
  2200 // RunError
  1979 // ---------------------------------------------------------------------------
  2201 // ---------------------------------------------------------------------------
  1980 //
  2202 //
  1981 TInt CHarvesterAO::RunError( TInt aError )
  2203 TInt CHarvesterAO::RunError( TInt aError )
  1982     {
  2204     {
  1983     WRITELOG( "CHarvesterAO::RunError" );
  2205     WRITELOG1( "CHarvesterAO::RunError, error: %d", aError );
  1984     OstTrace0( TRACE_NORMAL, CHARVESTERAO_RUNERROR, "CHarvesterAO::RunError" );
  2206     OstTrace0( TRACE_NORMAL, CHARVESTERAO_RUNERROR, "CHarvesterAO::RunError" );
  1985     
  2207     
  1986     switch( iNextRequest )
  2208     switch( iNextRequest )
  1987         {
  2209         {
  1988         case ERequestHarvest:
  2210         case ERequestHarvest:
  1989             {
  2211             {
  1990             WRITELOG( "CHarvesterAO::RunError - state ERequestHarvest" );
  2212             WRITELOG( "CHarvesterAO::RunError - state ERequestHarvest" );
  1991             OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_RUNERROR, "CHarvesterAO::RunError - state ERequestHarvest" );
  2213             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                 }
  1992             }
  2229             }
  1993         break;
  2230         break;
  1994         
  2231         
  1995         case ERequestPause:
  2232         case ERequestPause:
  1996             {
  2233             {
  2103     WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL()");
  2340     WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL()");
  2104     OstTrace0( TRACE_NORMAL, CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL" );
  2341     OstTrace0( TRACE_NORMAL, CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL" );
  2105     
  2342     
  2106     if( MMdSHarvesterDiskSpaceObserver::EMore == aDiskSpaceDirection )
  2343     if( MMdSHarvesterDiskSpaceObserver::EMore == aDiskSpaceDirection )
  2107         {
  2344         {
       
  2345         WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL() - disk space available");
       
  2346         OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL - disk space available" );
       
  2347         iDiskFull = EFalse;
       
  2348         }
       
  2349     else
       
  2350         {
  2108         WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL() - disk full");
  2351         WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL() - disk full");
  2109         OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL - disk full" );        
  2352         OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL - disk full" );        
  2110         iDiskFull = EFalse;
       
  2111         }
       
  2112     else
       
  2113         {
       
  2114         WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL() - disk space available");
       
  2115         OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL - disk space available" );
       
  2116         iDiskFull = ETrue;
  2353         iDiskFull = ETrue;
  2117         if( iServerPaused )
  2354         if( iServerPaused )
  2118             {
  2355             {
  2119             return;
  2356             return;
  2120             }
  2357             }
  2124         {
  2361         {
  2125         // cache monitored events
  2362         // cache monitored events
  2126         PauseMonitoring();   
  2363         PauseMonitoring();   
  2127         PauseHarvester();    
  2364         PauseHarvester();    
  2128         }
  2365         }
  2129     else if( !iRamFull && !iManualPauseEnabled && iServerPaused )
  2366     else if( iServerPaused )
  2130         {
  2367         {
  2131         // resume monitoring
  2368         // resume monitoring
  2132         ResumeMonitoring();
  2369         ResumeMonitoring();
  2133         TRAP_IGNORE( ResumeHarvesterL() );    
  2370         TRAP_IGNORE( ResumeHarvesterL() );    
  2134         }
  2371         }
  2318             }
  2555             }
  2319         }
  2556         }
  2320     else
  2557     else
  2321         {
  2558         {
  2322         delete hd;
  2559         delete hd;
       
  2560         hd = NULL;
  2323         err = KErrUnknown;
  2561         err = KErrUnknown;
  2324         }
  2562         }
  2325     
  2563     
  2326     if (!aMessage.IsNull())
  2564     if (!aMessage.IsNull())
  2327         {
  2565         {
  2328         aMessage.Complete( err );
  2566         aMessage.Complete( err );
       
  2567         }
       
  2568     else if( err != KErrNone )
       
  2569         {
       
  2570         HarvestCompleted( aMessage.Identity(), uri->Des(), err );
  2329         }
  2571         }
  2330     
  2572     
  2331     albumIds.Close();
  2573     albumIds.Close();
  2332     }
  2574     }
  2333   
  2575   
  2515     		}
  2757     		}
  2516     	}
  2758     	}
  2517     else
  2759     else
  2518         {
  2760         {
  2519         delete hd;
  2761         delete hd;
       
  2762         hd = NULL;
  2520         err = KErrUnknown;
  2763         err = KErrUnknown;
  2521         }
  2764         }
  2522 
  2765 
  2523     if (!aMessage.IsNull())
  2766     if (!aMessage.IsNull())
  2524         {
  2767         {
  2525         aMessage.Complete( err );
  2768         aMessage.Complete( err );
       
  2769         }
       
  2770     else if( err != KErrNone )
       
  2771         {
       
  2772         HarvestCompleted( aMessage.Identity(), uri->Des(), err );
  2526         }
  2773         }
  2527     
  2774     
  2528     albumIds.Close();
  2775     albumIds.Close();
  2529     }
  2776     }
  2530 
  2777 
  2685             	{
  2932             	{
  2686             	iHarvestFileMessages.Remove( i );
  2933             	iHarvestFileMessages.Remove( i );
  2687             	continue;
  2934             	continue;
  2688             	}
  2935             	}
  2689             
  2936             
  2690             //if (aMessage.Identity() == msg.Identity())
       
  2691             if( &req.iSession == &aSession )
  2937             if( &req.iSession == &aSession )
  2692             	{
  2938             	{
  2693             	err = KErrNone;
  2939             	err = KErrNone;
  2694 	            if (!req.iMessage.IsNull())
  2940 	            if (!req.iMessage.IsNull())
  2695 	            	{
  2941 	            	{
  2939 		const RPointerArray<HBufC>& aIgnorePaths,
  3185 		const RPointerArray<HBufC>& aIgnorePaths,
  2940         TBool aCheckDrive )
  3186         TBool aCheckDrive )
  2941 	{
  3187 	{
  2942 	WRITELOG("CHarvesterAO::BootScanL() - begin");
  3188 	WRITELOG("CHarvesterAO::BootScanL() - begin");
  2943     OstTrace0( TRACE_NORMAL, CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - begin" );
  3189     OstTrace0( TRACE_NORMAL, CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - begin" );
  2944     	
       
  2945     TInt drive( -1 );
       
  2946     TInt massStorageError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, drive ) );
       
  2947     if( massStorageError == KErrNone )
       
  2948         {
       
  2949         TVolumeInfo massStorageVolumeInfo;
       
  2950         iFs.Volume( massStorageVolumeInfo, drive );
       
  2951         const TUint32 massStorageMediaId( massStorageVolumeInfo.iUniqueID );
       
  2952         massStorageError = DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, drive );
       
  2953         if( massStorageError == KErrNone )
       
  2954             {
       
  2955             iFs.Volume( massStorageVolumeInfo, drive );
       
  2956             // Update mass storage media id if the mass storage is not memory card
       
  2957             if( massStorageVolumeInfo.iUniqueID != massStorageMediaId && massStorageMediaId != 0 )
       
  2958                 {
       
  2959                 iMdEHarvesterSession->CheckMassStorageMediaId( massStorageMediaId );
       
  2960                 }
       
  2961             }
       
  2962         }
       
  2963 	
  3190 	
  2964 	TVolumeInfo volumeInfo;
  3191 	TVolumeInfo volumeInfo;
  2965 	iFs.Volume( volumeInfo, EDriveC );
  3192 	iFs.Volume( volumeInfo, EDriveC );
  2966 
  3193 
  2967 	iMdEHarvesterSession->SetFilesToNotPresent( volumeInfo.iUniqueID, ETrue );
  3194 	iMdEHarvesterSession->SetFilesToNotPresent( volumeInfo.iUniqueID, ETrue );
  3039 					if( !IsDescInArray( path, aIgnorePaths ) )
  3266 					if( !IsDescInArray( path, aIgnorePaths ) )
  3040 						{
  3267 						{
  3041 						WRITELOG("CHarvesterAO::BootScanL() - scanFolders.AppendL");
  3268 						WRITELOG("CHarvesterAO::BootScanL() - scanFolders.AppendL");
  3042 						OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - scanFolders.AppendL" );
  3269 						OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - scanFolders.AppendL" );
  3043 						TScanItem* item = new (ELeave) TScanItem();
  3270 						TScanItem* item = new (ELeave) TScanItem();
       
  3271 						CleanupStack::PushL( item );
  3044 						item->iPath = name->AllocL();
  3272 						item->iPath = name->AllocL();
  3045 						item->iPreinstalled = MdeConstants::MediaObject::ENotPreinstalled;
  3273 						item->iPreinstalled = MdeConstants::MediaObject::ENotPreinstalled;
  3046 						aScanItems.AppendL( item );
  3274 						CleanupStack::Pop( item );
       
  3275 						aScanItems.AppendL( item ); // ownership is transferred
  3047 						}
  3276 						}
  3048 					}
  3277 					}
  3049 				else
  3278 				else
  3050 					{
  3279 					{
  3051 					TPtrC filename = *name;
  3280 					TPtrC filename = *name;
  3101 	                        hd->SetObjectType( EPlaceholder );
  3330 	                        hd->SetObjectType( EPlaceholder );
  3102 	                        hd->SetOrigin( MdeConstants::Object::EOther );
  3331 	                        hd->SetOrigin( MdeConstants::Object::EOther );
  3103 	                        hd->SetClientData( phData );
  3332 	                        hd->SetClientData( phData );
  3104 
  3333 
  3105 	                        CleanupStack::Pop( phData );
  3334 	                        CleanupStack::Pop( phData );
  3106 	                        hdArray.Append( hd );
  3335 							
       
  3336 	                        if(hdArray.Append( hd ) != KErrNone )
       
  3337 	                            {
       
  3338                                 delete hd;
       
  3339                                 hd = NULL;
       
  3340 	                            }
  3107 						    }
  3341 						    }
  3108 						CleanupStack::PopAndDestroy( &results );
  3342 						CleanupStack::PopAndDestroy( &results );
  3109 						CleanupStack::PopAndDestroy( &fileInfos );
  3343 						CleanupStack::PopAndDestroy( &fileInfos );
  3110 						CleanupStack::PopAndDestroy( &uris );
  3344 						CleanupStack::PopAndDestroy( &uris );
  3111 						}
  3345 						}
  3126 	iQueue->MonitorEvent( hdArray );
  3360 	iQueue->MonitorEvent( hdArray );
  3127 	CleanupStack::PopAndDestroy( &hdArray ); 
  3361 	CleanupStack::PopAndDestroy( &hdArray ); 
  3128 
  3362 
  3129 	iMdEHarvesterSession->RemoveFilesNotPresent( volumeInfo.iUniqueID, ETrue );
  3363 	iMdEHarvesterSession->RemoveFilesNotPresent( volumeInfo.iUniqueID, ETrue );
  3130 	
  3364 	
  3131 	iMassMemoryIdChecked = ETrue;
       
  3132 	
       
  3133 	WRITELOG("CHarvesterAO::BootScanL() - end");
  3365 	WRITELOG("CHarvesterAO::BootScanL() - end");
  3134 	OstTrace0( TRACE_NORMAL, DUP5_CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - end" );
  3366 	OstTrace0( TRACE_NORMAL, DUP5_CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - end" );
  3135 	}
  3367 	}
  3136 
  3368 
  3137 void CHarvesterAO::SetHarvesterStatusObserver( MHarvesterStatusObserver* aObserver )
  3369 void CHarvesterAO::SetHarvesterStatusObserver( MHarvesterStatusObserver* aObserver )
  3220 
  3452 
  3221 	// cache monitored events
  3453 	// cache monitored events
  3222 	PauseMonitoring();
  3454 	PauseMonitoring();
  3223 	PauseHarvester();
  3455 	PauseHarvester();
  3224 	
  3456 	
  3225 	iPHArray.Compress();
  3457     iReadyPHArray.Compress();
  3226 	iReadyPHArray.Compress();
  3458     iContainerPHArray.Compress();
  3227 	iContainerPHArray.Compress();
  3459     iPHArray.Compress();
       
  3460     iTempReadyPHArray.Compress();
  3228 	}
  3461 	}
  3229 
  3462 
  3230 void CHarvesterAO::MemoryGood()
  3463 void CHarvesterAO::MemoryGood()
  3231 	{
  3464 	{
  3232     WRITELOG("CHarvesterAO::MemoryGood()");    
  3465     WRITELOG("CHarvesterAO::MemoryGood()");    
  3233     OstTrace0( TRACE_NORMAL, CHARVESTERAO_MEMORYGOOD, "CHarvesterAO::MemoryGood" );
  3466     OstTrace0( TRACE_NORMAL, CHARVESTERAO_MEMORYGOOD, "CHarvesterAO::MemoryGood" );
  3234     
  3467     
  3235     iRamFull = EFalse;
  3468     iRamFull = EFalse;
  3236     
  3469     
  3237     if( !iDiskFull && !iManualPauseEnabled && iServerPaused )
  3470     if( iServerPaused )
  3238         {
  3471         {
  3239         // resume monitoring
  3472         // resume monitoring
  3240         ResumeMonitoring();
  3473         ResumeMonitoring();
  3241     
  3474     
  3242         TRAP_IGNORE( ResumeHarvesterL() );    
  3475         TRAP_IGNORE( ResumeHarvesterL() );