harvester/server/src/harvesterao.cpp
branchRCL_3
changeset 47 b73252188534
parent 46 63c982fb92f2
child 49 f23c07ec56e2
equal deleted inserted replaced
46:63c982fb92f2 47:b73252188534
    51 // constants
    51 // constants
    52 const TInt32 KFileMonitorPluginUid = 0x20007186;  // file monitor plugin implementation uid
    52 const TInt32 KFileMonitorPluginUid = 0x20007186;  // file monitor plugin implementation uid
    53 
    53 
    54 const TInt KPlaceholderQueueSize = 99;
    54 const TInt KPlaceholderQueueSize = 99;
    55 const TInt KContainerPlaceholderQueueSize = 10;
    55 const TInt KContainerPlaceholderQueueSize = 10;
       
    56 const TInt KReadyPlaceholderQueueSize = 10;
    56 const TInt KObjectDefStrSize = 20;
    57 const TInt KObjectDefStrSize = 20;
    57 
    58 
    58 _LIT( KTAGDaemonName, "ThumbAGDaemon" );
    59 _LIT( KTAGDaemonName, "ThumbAGDaemon" );
    59 _LIT( KTAGDaemonExe, "thumbagdaemon.exe" );
    60 _LIT( KTAGDaemonExe, "thumbagdaemon.exe" );
    60 
    61 
    74 	{
    75 	{
    75 	}
    76 	}
    76 
    77 
    77 void CHarvesterAoPropertyDefs::ConstructL(CMdEObjectDef& aObjectDef)
    78 void CHarvesterAoPropertyDefs::ConstructL(CMdEObjectDef& aObjectDef)
    78 	{
    79 	{
    79 	CMdENamespaceDef& nsDef = aObjectDef.NamespaceDef();
    80     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 	}
    81 	}
    94 
    82 
    95 CHarvesterAoPropertyDefs* CHarvesterAoPropertyDefs::NewL(CMdEObjectDef& aObjectDef)
    83 CHarvesterAoPropertyDefs* CHarvesterAoPropertyDefs::NewL()
    96 	{
    84     {
    97 	CHarvesterAoPropertyDefs* self = 
    85     CHarvesterAoPropertyDefs* self = 
    98 		new (ELeave) CHarvesterAoPropertyDefs();
    86         new (ELeave) CHarvesterAoPropertyDefs();
    99 	CleanupStack::PushL( self );
    87     return self;
   100 	self->ConstructL( aObjectDef );
    88     }
   101 	CleanupStack::Pop( self );
    89 
   102 	return self;
    90 void CHarvesterAoPropertyDefs::SetByObjectDefL(CMdEObjectDef& aObjectDef)
   103 	}
    91     {
   104 
    92     CMdENamespaceDef& nsDef = aObjectDef.NamespaceDef();
       
    93 
       
    94     // Common property definitions
       
    95     CMdEObjectDef& objectDef = nsDef.GetObjectDefL( MdeConstants::Object::KBaseObject );
       
    96     iCreationDatePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KCreationDateProperty );
       
    97     iLastModifiedDatePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KLastModifiedDateProperty );
       
    98     iSizePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KSizeProperty );
       
    99     iOriginPropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KOriginProperty );
       
   100     iItemTypePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KItemTypeProperty );
       
   101     iTitlePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KTitleProperty );
       
   102     iDefaultFolderPropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KInDefaultFolder );
       
   103     
       
   104     CMdEObjectDef& mediaDef = nsDef.GetObjectDefL( MdeConstants::MediaObject::KMediaObject );
       
   105     iPreinstalledPropertyDef = &mediaDef.GetPropertyDefL( MdeConstants::MediaObject::KPreinstalledProperty );
       
   106     }
       
   107 	
   105 // ---------------------------------------------------------------------------
   108 // ---------------------------------------------------------------------------
   106 // NewLC
   109 // NewLC
   107 // ---------------------------------------------------------------------------
   110 // ---------------------------------------------------------------------------
   108 //
   111 //
   109 CHarvesterAO* CHarvesterAO::NewLC()
   112 CHarvesterAO* CHarvesterAO::NewLC()
   184     
   187     
   185     StopComposers();
   188     StopComposers();
   186     DeleteComposers();
   189     DeleteComposers();
   187 
   190 
   188     delete iDiskFullNotifier;
   191     delete iDiskFullNotifier;
       
   192     iDiskFullNotifier = NULL;
   189 	delete iBackupSubscriber;
   193 	delete iBackupSubscriber;
       
   194 	iBackupSubscriber = NULL;
   190     
   195     
   191     if (iBlacklist)
   196     if (iBlacklist)
   192 		{
   197 		{
   193 		iBlacklist->CloseDatabase();
   198 		iBlacklist->CloseDatabase();
   194 		delete iBlacklist;
   199 		delete iBlacklist;
       
   200 		iBlacklist = NULL;
   195 		}
   201 		}
   196 	delete iReHarvester;
   202 	delete iReHarvester;
       
   203 	iReHarvester = NULL;
   197 
   204 
   198     if ( iHarvestFileMessages.Count() > 0 )
   205     if ( iHarvestFileMessages.Count() > 0 )
   199         {
   206         {
   200         for ( TInt i = iHarvestFileMessages.Count()-1; i >= 0; --i )
   207         for ( TInt i = iHarvestFileMessages.Count()-1; i >= 0; --i )
   201             {
   208             {
   220     
   227     
   221     iTempReadyPHArray.ResetAndDestroy();
   228     iTempReadyPHArray.ResetAndDestroy();
   222     iTempReadyPHArray.Close();
   229     iTempReadyPHArray.Close();
   223     
   230     
   224 	delete iHarvesterOomAO;
   231 	delete iHarvesterOomAO;
       
   232 	iHarvesterOomAO = NULL;
   225     delete iRestoreWatcher;
   233     delete iRestoreWatcher;
       
   234     iRestoreWatcher = NULL;
   226 	delete iOnDemandAO;
   235 	delete iOnDemandAO;
       
   236 	iOnDemandAO = NULL;
   227 	delete iMdEHarvesterSession;
   237 	delete iMdEHarvesterSession;
       
   238 	iMdEHarvesterSession = NULL;
   228 	delete iMdESession;
   239 	delete iMdESession;
       
   240 	iMdESession = NULL;
   229 	delete iQueue;
   241 	delete iQueue;
       
   242 	iQueue = NULL;
   230 	delete iHarvesterPluginFactory;
   243 	delete iHarvesterPluginFactory;
       
   244 	iHarvesterPluginFactory = NULL;
   231 	delete iMdeObjectHandler;
   245 	delete iMdeObjectHandler;
       
   246 	iMdeObjectHandler = NULL;
   232 	delete iUnmountHandlerAO;
   247 	delete iUnmountHandlerAO;
       
   248 	iUnmountHandlerAO = NULL;
   233 	
   249 	
   234 	delete iPropDefs;
   250 	delete iPropDefs;
       
   251 	iPropDefs = NULL;
   235 	delete iCameraExtensionArray;
   252 	delete iCameraExtensionArray;
       
   253 	iCameraExtensionArray = NULL;
   236 	
   254 	
   237     delete iPhoneImagesPath;
   255     delete iPhoneImagesPath;
       
   256     iPhoneImagesPath = NULL;
   238     delete iMmcImagesPath;
   257     delete iMmcImagesPath;
       
   258     iMmcImagesPath = NULL;
   239     
   259     
   240     delete iPhoneVideosPath;
   260     delete iPhoneVideosPath;
       
   261     iPhoneVideosPath = NULL;
   241     delete iMmcVideosPath;
   262     delete iMmcVideosPath;
       
   263     iMmcVideosPath = NULL;
   242     
   264     
   243     delete iPhoneSoundsPath;
   265     delete iPhoneSoundsPath;
       
   266     iPhoneSoundsPath = NULL;
   244     delete iMmcSoundsPath;
   267     delete iMmcSoundsPath;
       
   268     iMmcSoundsPath = NULL;
   245 	
   269 	
   246 	RMediaIdUtil::ReleaseInstance();
   270 	RMediaIdUtil::ReleaseInstance();
   247     
   271     
   248     REComSession::FinalClose();
   272     REComSession::FinalClose();
   249     }
   273     }
   291     iHarvesterPluginFactory->SetBlacklist( *iBlacklist );
   315     iHarvesterPluginFactory->SetBlacklist( *iBlacklist );
   292     
   316     
   293     // Reset harvesting status for clients in case blacklisted file was handled
   317     // Reset harvesting status for clients in case blacklisted file was handled
   294     iHarvesterPluginFactory->SendHarvestingStatusEventL( EFalse );
   318     iHarvesterPluginFactory->SendHarvestingStatusEventL( EFalse );
   295     
   319     
       
   320     iPropDefs = CHarvesterAoPropertyDefs::NewL();
       
   321 	
   296     iCameraExtensionArray = new ( ELeave ) CDesCArraySeg( 6 );
   322     iCameraExtensionArray = new ( ELeave ) CDesCArraySeg( 6 );
   297     iCameraExtensionArray->InsertIsqL( KExtensionMp4 );
   323     iCameraExtensionArray->InsertIsqL( KExtensionMp4 );
   298     iCameraExtensionArray->InsertIsqL( KExtensionMpg4 );
   324     iCameraExtensionArray->InsertIsqL( KExtensionMpg4 );
   299     iCameraExtensionArray->InsertIsqL( KExtensionMpeg4 );
   325     iCameraExtensionArray->InsertIsqL( KExtensionMpeg4 );
   300     iCameraExtensionArray->InsertIsqL( KExtension3gp );
   326     iCameraExtensionArray->InsertIsqL( KExtension3gp );
   352     
   378     
   353     TCleanupItem cleanupItem( MdsUtils::CleanupEComArray, &infoArray );
   379     TCleanupItem cleanupItem( MdsUtils::CleanupEComArray, &infoArray );
   354     CleanupStack::PushL( cleanupItem );
   380     CleanupStack::PushL( cleanupItem );
   355     
   381     
   356     CMonitorPlugin::ListImplementationsL( infoArray );
   382     CMonitorPlugin::ListImplementationsL( infoArray );
   357     TInt count( 0 );
   383     const TInt count( infoArray.Count() );
   358     count = infoArray.Count();
       
   359     CMonitorPlugin* plugin = NULL;
   384     CMonitorPlugin* plugin = NULL;
   360     
   385     
   361     for ( TInt i = 0; i < count; i++ )
   386     for ( TInt i = 0; i < count; i++ )
   362         {
   387         {
   363         TUid uid = infoArray[i]->ImplementationUid();    // Create the plug-ins
   388         TUid uid = infoArray[i]->ImplementationUid();    // Create the plug-ins
   408 //
   433 //
   409 void CHarvesterAO::StartMonitoring()
   434 void CHarvesterAO::StartMonitoring()
   410     {
   435     {
   411     WRITELOG( "CHarvesterAO::StartMonitoring()" );
   436     WRITELOG( "CHarvesterAO::StartMonitoring()" );
   412     OstTrace0( TRACE_NORMAL, CHARVESTERAO_STARTMONITORING, "CHarvesterAO::StartMonitoring" );    
   437     OstTrace0( TRACE_NORMAL, CHARVESTERAO_STARTMONITORING, "CHarvesterAO::StartMonitoring" );    
   413     
       
   414     const TInt count( iMonitorPluginArray.Count() );  
   438     const TInt count( iMonitorPluginArray.Count() );  
   415     
   439     
   416     for ( TInt i = 0; i < count; i++ )
   440     for ( TInt i = 0; i < count; i++ )
   417         {
   441         {
   418         iMonitorPluginArray[i]->StartMonitoring( *iQueue, iMdESession, NULL, 
   442         iMonitorPluginArray[i]->StartMonitoring( *iQueue, iMdESession, NULL, 
   427 void CHarvesterAO::StopMonitoring()
   451 void CHarvesterAO::StopMonitoring()
   428     {
   452     {
   429     WRITELOG( "CHarvesterAO::StopMonitoring()" );
   453     WRITELOG( "CHarvesterAO::StopMonitoring()" );
   430     
   454     
   431     OstTrace0( TRACE_NORMAL, CHARVESTERAO_STOPMONITORING, "CHarvesterAO::StopMonitoring" );
   455     OstTrace0( TRACE_NORMAL, CHARVESTERAO_STOPMONITORING, "CHarvesterAO::StopMonitoring" );
   432 
   456     
   433     const TInt count( iMonitorPluginArray.Count() );
   457     for( TInt i = iMonitorPluginArray.Count() - 1; i >=0; i-- )
   434     
       
   435     for ( TInt i = 0; i < count; i++ )
       
   436         {
   458         {
   437         iMonitorPluginArray[i]->StopMonitoring();
   459         iMonitorPluginArray[i]->StopMonitoring();
   438         }
   460         }
   439     }
   461     }
   440 
   462 
   445 void CHarvesterAO::PauseMonitoring()
   467 void CHarvesterAO::PauseMonitoring()
   446     {
   468     {
   447     WRITELOG( "CHarvesterAO::PauseMonitoring()" );
   469     WRITELOG( "CHarvesterAO::PauseMonitoring()" );
   448     OstTrace0( TRACE_NORMAL, CHARVESTERAO_PAUSEMONITORING, "CHarvesterAO::PauseMonitoring" );
   470     OstTrace0( TRACE_NORMAL, CHARVESTERAO_PAUSEMONITORING, "CHarvesterAO::PauseMonitoring" );
   449     
   471     
   450     const TInt count( iMonitorPluginArray.Count() );
   472     for( TInt i = iMonitorPluginArray.Count() - 1; i >=0; i-- )
   451     
       
   452     for ( TInt i = 0; i<count; i++ )
       
   453         {
   473         {
   454         iMonitorPluginArray[i]->PauseMonitoring();
   474         iMonitorPluginArray[i]->PauseMonitoring();
   455         }
   475         }
       
   476     
   456     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_PAUSEMONITORING, "CHarvesterAO::PauseMonitoring - end" );    
   477     OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_PAUSEMONITORING, "CHarvesterAO::PauseMonitoring - end" );    
   457     WRITELOG( "CHarvesterAO::PauseMonitoring() - end" );
   478     WRITELOG( "CHarvesterAO::PauseMonitoring() - end" );
   458     }
   479     }
   459 
   480 
   460 // ---------------------------------------------------------------------------
   481 // ---------------------------------------------------------------------------
   516             if( err == KErrNone && mediaId == aMediaId )
   537             if( err == KErrNone && mediaId == aMediaId )
   517                 {
   538                 {
   518                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iReadyPHArray %d", i);
   539                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iReadyPHArray %d", i);
   519                 OstTrace1( TRACE_NORMAL, DUP2_CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount remove iReadyPHArray %d", i );
   540                 OstTrace1( TRACE_NORMAL, DUP2_CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount remove iReadyPHArray %d", i );
   520                 
   541                 
       
   542                 HarvestCompleted( hd->ClientId(), hd->Uri(), KErrCancel );
   521                 delete hd;
   543                 delete hd;
   522                 hd = NULL;
   544                 hd = NULL;
   523                 iReadyPHArray.Remove( i );
   545                 iReadyPHArray.Remove( i );
   524                 removed++;
   546                 removed++;
   525                 arrayCount--;
   547                 arrayCount--;
   553             if( err == KErrNone && mediaId == aMediaId )
   575             if( err == KErrNone && mediaId == aMediaId )
   554                 {
   576                 {
   555                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iPHArray %d", i);
   577                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iPHArray %d", i);
   556                 OstTrace1( TRACE_NORMAL, DUP5_CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount remove iPHArray %d", i );
   578                 OstTrace1( TRACE_NORMAL, DUP5_CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount remove iPHArray %d", i );
   557                 
   579                 
       
   580                 HarvestCompleted( hd->ClientId(), hd->Uri(), KErrCancel );
   558                 delete hd;
   581                 delete hd;
   559 				hd = NULL;
   582 				hd = NULL;
   560                 iPHArray.Remove( i );
   583                 iPHArray.Remove( i );
   561                 removed++;
   584                 removed++;
   562                 arrayCount--;
   585                 arrayCount--;
   589             if( err == KErrNone && mediaId == aMediaId )
   612             if( err == KErrNone && mediaId == aMediaId )
   590                 {
   613                 {
   591                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iContainerPHArray %d", i);
   614                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iContainerPHArray %d", i);
   592                 OstTrace1( TRACE_NORMAL, DUP8_CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount remove iContainerPHArray %d", i );
   615                 OstTrace1( TRACE_NORMAL, DUP8_CHARVESTERAO_HANDLEUNMOUNT, "CHarvesterAO::HandleUnmount remove iContainerPHArray %d", i );
   593                 
   616                 
       
   617                 HarvestCompleted( hd->ClientId(), hd->Uri(), KErrCancel );
   594                 delete hd;
   618                 delete hd;
   595 				hd = NULL;
   619 				hd = NULL;
   596                 iContainerPHArray.Remove( i );
   620                 iContainerPHArray.Remove( i );
   597                 removed++;
   621                 removed++;
   598                 arrayCount--;
   622                 arrayCount--;
   620             err = iMediaIdUtil->GetMediaId( hd->Uri(), mediaId );
   644             err = iMediaIdUtil->GetMediaId( hd->Uri(), mediaId );
   621             
   645             
   622             if( err == KErrNone && mediaId == aMediaId )
   646             if( err == KErrNone && mediaId == aMediaId )
   623                 {
   647                 {
   624                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iTempReadyPHArray %d", i);
   648                 WRITELOG1( "CHarvesterAO::HandleUnmount() remove iTempReadyPHArray %d", i);
       
   649                 HarvestCompleted( hd->ClientId(), hd->Uri(), KErrCancel );
   625                 delete hd;
   650                 delete hd;
   626                 hd = NULL;
   651                 hd = NULL;
   627                 iTempReadyPHArray.Remove( i );
   652                 iTempReadyPHArray.Remove( i );
   628                 removed++;
   653                 removed++;
   629                 arrayCount--;
   654                 arrayCount--;
   679                     hpi->iQueue.Remove(j);
   704                     hpi->iQueue.Remove(j);
   680 					removed++;
   705 					removed++;
   681 
   706 
   682 					TRAP_IGNORE( iMdESession->CancelObjectL( mdeobj ) );
   707 					TRAP_IGNORE( iMdESession->CancelObjectL( mdeobj ) );
   683 					
   708 					
       
   709 					HarvestCompleted( hd->ClientId(), hd->Uri(), KErrCancel );
   684 					delete hd;
   710 					delete hd;
   685 					hd = NULL;
   711 					hd = NULL;
   686 					}
   712 					}
   687 				}
   713 				}
   688 			
   714 			
   823             }
   849             }
   824     	while( hd != NULL &&
   850     	while( hd != NULL &&
   825 				iPHArray.Count() < KPlaceholderQueueSize &&
   851 				iPHArray.Count() < KPlaceholderQueueSize &&
   826 				hd->ObjectType() == EPlaceholder )
   852 				hd->ObjectType() == EPlaceholder )
   827     		{
   853     		{
   828         	iPHArray.Append( hd );
   854         	if(iPHArray.Append( hd ) != KErrNone)
   829         	if( hd->Origin() == MdeConstants::Object::ECamera || 
       
   830         	    hd->ObjectType() == EFastHarvest  )
       
   831         	    {
   855         	    {
   832         	    if( !iFastHarvestNeeded )
   856         	    HarvestCompleted( hd->ClientId(), hd->Uri(), KErrNoMemory );
   833         	        {
   857         	    iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
   834                     iFastHarvestNeeded = ETrue;
   858                 delete hd;
   835                     // Fast harvest event must be handled even if MMC handling would be ongoing
   859                 hd = NULL;
   836                     SetPriority( KHarvesterPriorityMonitorPlugin );
       
   837         	        }
       
   838         	    break;
       
   839         	    }
   860         	    }
   840         	else if( iFastHarvestNeeded )
   861         	else
   841         	    {
   862         	    {
   842         	    iFastHarvestNeeded = EFalse;
   863                 if( hd->Origin() == MdeConstants::Object::ECamera || 
   843         	    SetPriority( KHarvesterCustomImportantPriority );
   864                     hd->ObjectType() == EFastHarvest  )
       
   865                     {
       
   866                     if( !iFastHarvestNeeded )
       
   867                         {
       
   868                         iFastHarvestNeeded = ETrue;
       
   869                         // Fast harvest event must be handled even if MMC handling would be ongoing
       
   870                         SetPriority( KHarvesterPriorityMonitorPlugin );
       
   871                         }
       
   872                     break;
       
   873                     }
       
   874                 else if( iFastHarvestNeeded )
       
   875                     {
       
   876                     iFastHarvestNeeded = EFalse;
       
   877                     SetPriority( KHarvesterCustomImportantPriority );
       
   878         	    	}
   844         	    }
   879         	    }
   845         	hd = iQueue->GetNextItem();
   880         	hd = iQueue->GetNextItem();
   846     		}
   881     		}
   847     	
   882     	
   848     	if( iFastHarvestNeeded && iPHArray.Count() > 0 )
   883     	if( iFastHarvestNeeded && iPHArray.Count() > 0 )
   849     	    {
   884     	    {
   850             TRAPD( err, HandlePlaceholdersL( ETrue ) );
   885             TRAPD( err, HandlePlaceholdersL( ETrue ) );
   851 
   886 
   852             // make sure that when HandlePlaceholdersL leaves, iPHArray is cleared
   887             // make sure that when HandlePlaceholdersL leaves unexpectedly, iPHArray is cleared
   853             if ( err != KErrNone )
   888             if ( err != KErrNone )
   854                 {
   889                 {
   855                 iPHArray.ResetAndDestroy();
   890                 if( err != KErrDiskFull )
   856                 iTempReadyPHArray.ResetAndDestroy();
   891                     {
       
   892                     iPHArray.ResetAndDestroy();
       
   893                     iTempReadyPHArray.ResetAndDestroy();
       
   894                     }
   857                 User::Leave( err );
   895                 User::Leave( err );
   858                 }
   896                 }
   859             
   897             
   860             TInt count( iReadyPHArray.Count() );
   898             TInt count( iReadyPHArray.Count() );
   861             for( TInt i = 0; i < count; i++ )
   899             for( TInt i = 0; i < count; i++ )
   875     	
   913     	
   876 		if( hd )
   914 		if( hd )
   877     		{
   915     		{
   878 	    	if( hd->ObjectType() == EPlaceholder )
   916 	    	if( hd->ObjectType() == EPlaceholder )
   879 	    		{
   917 	    		{
   880 	        	iPHArray.Append( hd );
   918 	        	if( iPHArray.Append( hd ) != KErrNone )
       
   919 	        	    {
       
   920 	        	    HarvestCompleted( hd->ClientId(), hd->Uri(), KErrNoMemory ); 
       
   921 	        	    iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
       
   922                     delete hd;
       
   923                     hd = NULL;
       
   924 	        	    }
   881 	    		}
   925 	    		}
   882 	    	else
   926 	    	else
   883 	    		{
   927 	    		{
   884 	    		CheckFileExtensionAndHarvestL( hd );
   928                 if( iReadyPHArray.Append( hd ) != KErrNone)
   885 	    		if( iUnmountDetected )
   929                     {
   886 	    		    {
   930                     delete hd;
   887 	    		    iQueue->Append( hd );
   931                     hd = NULL;
   888 	    		    return;
   932                     }
   889 	    		    }
       
   890 	    		}
   933 	    		}
   891     		}
   934     		}
   892 			
   935 			
   893     	if( iPHArray.Count() > 0 )
   936     	if( iPHArray.Count() > 0 )
   894     		{
   937     		{
   895 	    	TRAPD( err, HandlePlaceholdersL( ETrue ) );
   938 	    	TRAPD( err, HandlePlaceholdersL( ETrue ) );
   896 
   939 
   897 	    	// make sure that when HandlePlaceholdersL leaves, iPHArray is cleared
   940 	    	// make sure that when HandlePlaceholdersL leaves unexpectedly, iPHArray is cleared
   898 	    	if ( err != KErrNone )
   941 	    	if ( err != KErrNone )
   899 	    		{
   942 	    		{
   900 	    		iPHArray.ResetAndDestroy();
   943 	    	    if( err != KErrDiskFull )
   901 	    		iTempReadyPHArray.ResetAndDestroy();
   944 	    	        {
       
   945 	    	        iPHArray.ResetAndDestroy();
       
   946 	    	        iTempReadyPHArray.ResetAndDestroy();
       
   947 	    	        }
   902 	    		User::Leave( err );
   948 	    		User::Leave( err );
   903 	    		}
   949 	    		}
   904     		}
   950     		}
   905     	}
   951     	}
   906     else
   952     else
   909             {
   955             {
   910             SetPriority( KHarvesterPriorityHarvestingPlugin );
   956             SetPriority( KHarvesterPriorityHarvestingPlugin );
   911             }
   957             }
   912         iHarvestingPlaceholders = EFalse;
   958         iHarvestingPlaceholders = EFalse;
   913         CheckFileExtensionAndHarvestL( hd );
   959         CheckFileExtensionAndHarvestL( hd );
   914         if( iUnmountDetected )
   960         if( iUnmountDetected && hd )
   915             {
   961             {
   916             iQueue->Append( hd );
   962             iQueue->Append( hd );
   917             }
   963             }
   918     	}
   964     	}
   919     }
   965     }
   929 
   975 
   930 	RPointerArray<CMdEObject> mdeObjectArray;
   976 	RPointerArray<CMdEObject> mdeObjectArray;
   931 	CleanupClosePushL( mdeObjectArray );
   977 	CleanupClosePushL( mdeObjectArray );
   932 
   978 
   933 	TTimeIntervalSeconds timeOffsetSeconds = User::UTCOffset();
   979 	TTimeIntervalSeconds timeOffsetSeconds = User::UTCOffset();
       
   980 	
       
   981 	CMdENamespaceDef& defNS = iMdESession->GetDefaultNamespaceDefL();
   934 	
   982 	
   935 	TInt endindex( iPHArray.Count() );
   983 	TInt endindex( iPHArray.Count() );
   936 	for( TInt i = 0; i < endindex; i++ )
   984 	for( TInt i = 0; i < endindex; i++ )
   937 		{
   985 		{
   938 		CHarvesterData* hd = iPHArray[i];
   986 		CHarvesterData* hd = iPHArray[i];
   939 		
   987 		
   940 		if( aCheck && iHarvesterPluginFactory->IsContainerFileL( hd->Uri() ) )
   988 		if( aCheck && iHarvesterPluginFactory->IsContainerFileL( hd->Uri() ) )
   941 			{
   989 			{
   942 			iContainerPHArray.Append( hd );
   990 			if( iContainerPHArray.Append( hd ) != KErrNone )
       
   991 			    {
       
   992 			    HarvestCompleted( hd->ClientId(), hd->Uri(), KErrNoMemory );
       
   993 			    iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
       
   994                 delete hd;
       
   995                 hd = NULL;
       
   996 			    }
       
   997 
   943 			iPHArray.Remove( i );
   998 			iPHArray.Remove( i );
   944             i--;
   999 			i--;
   945             endindex--;
  1000 			endindex--;
   946 			continue;
  1001 			continue;
   947 			}
  1002 			}
       
  1003 		
   948 		TBuf<KObjectDefStrSize> objDefStr;
  1004 		TBuf<KObjectDefStrSize> objDefStr;
   949 		
  1005 		
   950 		if( !CheckForCameraItem( hd, objDefStr ) )
  1006 		if( !CheckForCameraItem( hd, objDefStr ) )
   951 		    {
  1007 		    {
   952 		    iHarvesterPluginFactory->GetObjectDefL( *hd, objDefStr );
  1008 		    iHarvesterPluginFactory->GetObjectDefL( hd, objDefStr );
   953 		    }
  1009 		    }
   954 		
  1010 		
   955 		// GetObjectDef can cause context switch, and if unmount happens when this execution is 
  1011 		// 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 
  1012 		// interrupted, the ph arrays can be invalid. Thus, abort whole run, and start over to make sure 
   957 		// the arrays are valid.
  1013 		// the arrays are valid.
   958 		if( iUnmountDetected )
  1014 		if( iUnmountDetected )
   959 		    {
  1015 		    {
   960 		    WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - Unmount detected during execution!" );
  1016 		    WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - Unmount detected during execution!" );
   961 		    for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
  1017 		    for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
   962 		        {
  1018 		        {
   963 		        CHarvesterData* hd = iTempReadyPHArray[y];
  1019 		        CHarvesterData* tempHd = iTempReadyPHArray[y];
   964 		        iPHArray.Insert( hd, 0 );
  1020 				
       
  1021 		        if(iPHArray.Insert( tempHd, 0 ) != KErrNone)
       
  1022 		            {
       
  1023 		            HarvestCompleted( tempHd->ClientId(), tempHd->Uri(), KErrNoMemory );
       
  1024 		            iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
       
  1025                     delete tempHd;
       
  1026                     tempHd = NULL;
       
  1027 		            }
   965 		        }
  1028 		        }
   966 		    iTempReadyPHArray.Reset();
  1029 		    iTempReadyPHArray.Reset();
   967 		    CleanupStack::PopAndDestroy( &mdeObjectArray );
  1030 		    CleanupStack::PopAndDestroy( &mdeObjectArray );
   968 		    return;
  1031 		    return;
   969 		    }
  1032 		    }
   974 		    {
  1037 		    {
   975             WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - Priority interrupt during execution!" );
  1038             WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - Priority interrupt during execution!" );
   976             const TInt currentPHArrayCount( iPHArray.Count() );
  1039             const TInt currentPHArrayCount( iPHArray.Count() );
   977             for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
  1040             for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
   978                 {
  1041                 {
   979                 CHarvesterData* hd = iTempReadyPHArray[y];
  1042                 CHarvesterData* tempHd = iTempReadyPHArray[y];
   980                 if( currentPHArrayCount )
  1043                 if(iPHArray.Insert( tempHd, 0 ) != KErrNone)
   981                     {
  1044                     {
   982                     // Leave the first item in the array as it is the priority item
  1045                     HarvestCompleted( tempHd->ClientId(), tempHd->Uri(), KErrNoMemory );
   983                     iPHArray.Insert( hd, 1 );
  1046                     iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
   984                     }
  1047                     delete tempHd;
   985                 else
  1048                     tempHd = NULL;
   986                     {
       
   987                     iPHArray.Insert( hd, 0 );
       
   988                     }
  1049                     }
   989                 }
  1050                 }
   990             iTempReadyPHArray.Reset();
  1051             iTempReadyPHArray.Reset();
   991             CleanupStack::PopAndDestroy( &mdeObjectArray );
  1052             CleanupStack::PopAndDestroy( &mdeObjectArray );
   992             return;		
  1053             return;		
       
  1054 		    }
       
  1055 	    // Check if disk is full
       
  1056 	    // If disk is detected to be full, no items can be added to MDS db, thus abort the run, and start over 
       
  1057 		// when disk space is available to make sure the arrays are valid.
       
  1058 		else if( iDiskFull )
       
  1059 		    {
       
  1060             WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - No disk space available!" );
       
  1061             for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
       
  1062                 {
       
  1063                 CHarvesterData* tempHd = iTempReadyPHArray[y];
       
  1064             
       
  1065                 if(iPHArray.Insert( tempHd, 0 ) != KErrNone)
       
  1066                     {
       
  1067                     HarvestCompleted( tempHd->ClientId(), tempHd->Uri(), KErrNoMemory );
       
  1068                     iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
       
  1069                     delete tempHd;
       
  1070                     tempHd = NULL;
       
  1071                     }
       
  1072                 }
       
  1073             iTempReadyPHArray.Reset();
       
  1074             CleanupStack::PopAndDestroy( &mdeObjectArray );
       
  1075             User::Leave( KErrDiskFull );
   993 		    }
  1076 		    }
   994 		
  1077 		
   995 		if( objDefStr.Length() == 0 ||
  1078 		if( objDefStr.Length() == 0 ||
   996 		    ( objDefStr == KInUse ) )
  1079 		    ( objDefStr == KInUse ) )
   997 			{
  1080 			{
  1006             endindex--;
  1089             endindex--;
  1007 			iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
  1090 			iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
  1008 			continue;
  1091 			continue;
  1009 			}
  1092 			}
  1010 
  1093 
  1011 		CMdENamespaceDef& defNS = iMdESession->GetDefaultNamespaceDefL();
       
  1012 		CMdEObjectDef& mdeObjectDef = defNS.GetObjectDefL( objDefStr );
  1094 		CMdEObjectDef& mdeObjectDef = defNS.GetObjectDefL( objDefStr );
  1013 
  1095 
  1014 		CMdEObject* mdeObject = iMdESession->NewObjectL( mdeObjectDef, hd->Uri() );
  1096 		HBufC* hdUri = hd->Uri().AllocL();
       
  1097 		CleanupStack::PushL( hdUri );
       
  1098 		CMdEObject* mdeObject = iMdESession->NewObjectL( mdeObjectDef, *hdUri );
       
  1099 		CleanupStack::PopAndDestroy( hdUri );
  1015 		CleanupStack::PushL( mdeObject );
  1100 		CleanupStack::PushL( mdeObject );
  1016 		
  1101 		
  1017 		CPlaceholderData* phData = NULL;
  1102 		CPlaceholderData* phData = NULL;
  1018 
  1103 
  1019 		if( hd->TakeSnapshot() )
  1104 		if( hd->TakeSnapshot() )
  1078 		mdeObject->SetMediaId( phData->MediaId() );
  1163 		mdeObject->SetMediaId( phData->MediaId() );
  1079 	    
  1164 	    
  1080 	    // set placeholder
  1165 	    // set placeholder
  1081 	    mdeObject->SetPlaceholder( ETrue );
  1166 	    mdeObject->SetPlaceholder( ETrue );
  1082 	    
  1167 	    
  1083 	    if( !iPropDefs )
  1168 	    if( !iPropDefs->iCreationDatePropertyDef )
  1084 	    	{
  1169 	        {
  1085 	    	iPropDefs = CHarvesterAoPropertyDefs::NewL( defNS.GetObjectDefL( MdeConstants::Object::KBaseObject ) );
  1170             iPropDefs->SetByObjectDefL( defNS.GetObjectDefL( MdeConstants::Object::KBaseObject ) );
  1086 	    	}
  1171 	        }
  1087 
  1172 
  1088 	    // set file size
  1173 	    // set file size
  1089     	mdeObject->AddUint32PropertyL( *iPropDefs->iSizePropertyDef, phData->FileSize() );
  1174     	mdeObject->AddUint32PropertyL( *iPropDefs->iSizePropertyDef, phData->FileSize() );
  1090 
  1175 
  1091 	    // set creation date
  1176 	    // set creation date
  1170 		
  1255 		
  1171 	    CleanupStack::PopAndDestroy( phData );
  1256 	    CleanupStack::PopAndDestroy( phData );
  1172 	    
  1257 	    
  1173 	    CleanupStack::Pop( mdeObject );
  1258 	    CleanupStack::Pop( mdeObject );
  1174 		
  1259 		
  1175 	    iTempReadyPHArray.Append( hd );
  1260 	    if(iTempReadyPHArray.Append( hd ) != KErrNone)
       
  1261 	        {
       
  1262 	        HarvestCompleted( hd->ClientId(), hd->Uri(), KErrNoMemory );
       
  1263             delete hd;
       
  1264             hd = NULL;
       
  1265 	        }
  1176 		iPHArray.Remove( i );
  1266 		iPHArray.Remove( i );
  1177         i--;
  1267         i--;
  1178         endindex--;
  1268         endindex--;
  1179 		}
  1269 		}
  1180 	
  1270 	
  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();  
  1271 	const TInt objectCount = mdeObjectArray.Count();  
  1190 	
  1272 	
  1191     if( objectCount > 0 )
  1273     if( objectCount > 0 )
  1192 		{
  1274 		{
  1193 		// add object to mde
  1275 		// add object to mde
  1194 		iMdEHarvesterSession->AutoLockL( mdeObjectArray );
  1276 		iMdEHarvesterSession->AutoLockL( mdeObjectArray );
  1195 		const TInt addError( iMdESession->AddObjectsL( mdeObjectArray ) );
  1277 		TInt addError( KErrNone );
       
  1278 		TRAPD( addFailure, addError = iMdESession->AddObjectsL( mdeObjectArray ) );
       
  1279 		if( addFailure == KErrDiskFull )
       
  1280 		    {
       
  1281             WRITELOG( "CHarvesterAO::HandlePlaceholdersL() - No disk space available!" );
       
  1282             for( TInt y( iTempReadyPHArray.Count() -1 ); y >=0; y-- )
       
  1283                 {
       
  1284                 CHarvesterData* tempHd = iTempReadyPHArray[y];
       
  1285         
       
  1286                 if(iPHArray.Insert( tempHd, 0 ) != KErrNone)
       
  1287                     {
       
  1288                     HarvestCompleted( tempHd->ClientId(), tempHd->Uri(), KErrNoMemory );
       
  1289                     iHarvesterEventManager->DecreaseItemCountL( EHEObserverTypeMMC, 1 );
       
  1290                     delete tempHd;
       
  1291                     tempHd = NULL;
       
  1292                     }
       
  1293                 }
       
  1294             iTempReadyPHArray.Reset();
       
  1295             CleanupStack::PopAndDestroy( &mdeObjectArray );
       
  1296             User::Leave( KErrDiskFull );		
       
  1297 		    }
       
  1298 		else if( addFailure != KErrNone )
       
  1299 		    {
       
  1300 		    User::Leave( addFailure );      
       
  1301 		    }
       
  1302 		
  1196 		if( addError != KErrNone )
  1303 		if( addError != KErrNone )
  1197 		    {
  1304 		    {
  1198 		    // If some error occures, retry
  1305 		    // If some error occures, retry
  1199 		    iMdESession->AddObjectsL( mdeObjectArray );
  1306 		    iMdESession->AddObjectsL( mdeObjectArray );
  1200 		    }
  1307 		    }
  1201 
  1308 
       
  1309 	    const TInt tempArrayCount( iTempReadyPHArray.Count() );
       
  1310 	    for( TInt i( 0 ); i < tempArrayCount; i++ )
       
  1311 	        {
       
  1312 	        CHarvesterData* tempHd = iTempReadyPHArray[i];
       
  1313             if(iReadyPHArray.Append( tempHd ) != KErrNone)
       
  1314                  {
       
  1315                  HarvestCompleted( tempHd->ClientId(), tempHd->Uri(), KErrNoMemory );
       
  1316                  delete tempHd;
       
  1317                  tempHd = NULL;
       
  1318                  }
       
  1319 	        }
       
  1320 	    iTempReadyPHArray.Reset();
       
  1321 		
  1202 	    iHarvesterEventManager->IncreaseItemCount( EHEObserverTypePlaceholder, 
  1322 	    iHarvesterEventManager->IncreaseItemCount( EHEObserverTypePlaceholder, 
  1203 		        objectCount );
  1323 		        objectCount );
  1204 		iHarvesterEventManager->SendEventL( EHEObserverTypePlaceholder, EHEStateStarted, 
  1324 		iHarvesterEventManager->SendEventL( EHEObserverTypePlaceholder, EHEStateStarted, 
  1205 				iHarvesterEventManager->ItemCount( EHEObserverTypePlaceholder ) );
  1325 				iHarvesterEventManager->ItemCount( EHEObserverTypePlaceholder ) );
  1206 		
  1326 		
  1232     TBool isError = EFalse;
  1352     TBool isError = EFalse;
  1233     CMdEObject* mdeObject = &aHD->MdeObject();
  1353     CMdEObject* mdeObject = &aHD->MdeObject();
  1234     const TDesC& uri = aHD->Uri();
  1354     const TDesC& uri = aHD->Uri();
  1235     TBool objectExisted = ETrue;
  1355     TBool objectExisted = ETrue;
  1236     
  1356     
  1237     if( ! mdeObject )
  1357     if( !mdeObject )
  1238     	{
  1358     	{
  1239     	objectExisted = EFalse;
  1359     	objectExisted = EFalse;
  1240     	WRITELOG1( "CHarvesterAO::CheckFileExtensionAndHarvestL() - no mdeobject. URI: %S", &uri );
  1360     	WRITELOG1( "CHarvesterAO::CheckFileExtensionAndHarvestL() - no mdeobject. URI: %S", &uri );
  1241 	    TBuf<KObjectDefStrSize> objDefStr;
  1361 	    TBuf<KObjectDefStrSize> objDefStr;
  1242 		iHarvesterPluginFactory->GetObjectDefL( *aHD, objDefStr );
  1362 		iHarvesterPluginFactory->GetObjectDefL( aHD, objDefStr );
  1243 
  1363 
  1244         // GetObjectDef can cause context switch, and if unmount happens when this execution is 
  1364         // 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 
  1365         // interrupted, the ph data can be invalid. Thus, abort whole run, and start over to make sure 
  1246         // the data is valid.
  1366         // the data is valid.
  1247         if( iUnmountDetected )
  1367         if( !aHD )
  1248             {
  1368             {
  1249             return;
  1369             return;
  1250             }
  1370             }
  1251 		
  1371 		
  1252 		if( objDefStr.Length() == 0 )
  1372 		if( objDefStr.Length() == 0 )
  1347 	
  1467 	
  1348     if( objectExisted && aHD->EventType() == EHarvesterAdd )
  1468     if( objectExisted && aHD->EventType() == EHarvesterAdd )
  1349     	{
  1469     	{
  1350     	iMdESession->RemoveObjectL( aHD->Uri() );
  1470     	iMdESession->RemoveObjectL( aHD->Uri() );
  1351     	}
  1471     	}
       
  1472     
       
  1473     // If context swich occures just right due to RemoveObjectL, check aHD for validity
       
  1474     if( !aHD )
       
  1475         {
       
  1476         return;
       
  1477         }
  1352 	
  1478 	
  1353 	TInt pluginErr = KErrNone;
  1479 	TInt pluginErr = KErrNone;
  1354     TRAPD( err, pluginErr = iHarvesterPluginFactory->HarvestL( aHD ));
  1480     TRAPD( err, pluginErr = iHarvesterPluginFactory->HarvestL( aHD ));
       
  1481     
  1355     if ( err != KErrNone )
  1482     if ( err != KErrNone )
  1356     	{
  1483     	{
  1357     	WRITELOG1( "CHarvesterAO::CheckFileExtensionAndHarvestL() - plugin error: %d", err );
  1484     	WRITELOG1( "CHarvesterAO::CheckFileExtensionAndHarvestL() - plugin error: %d", err );
  1358     	OstTrace1( TRACE_NORMAL, DUP6_CHARVESTERAO_CHECKFILEEXTENSIONANDHARVESTL, "CHarvesterAO::CheckFileExtensionAndHarvestL - plugin error: %d", err );
  1485     	OstTrace1( TRACE_NORMAL, DUP6_CHARVESTERAO_CHECKFILEEXTENSIONANDHARVESTL, "CHarvesterAO::CheckFileExtensionAndHarvestL - plugin error: %d", err );
  1359     	
  1486     	
  1379     	return;
  1506     	return;
  1380     	}
  1507     	}
  1381     
  1508     
  1382     WRITELOG1("CHarvesterAO::CheckFileExtensionAndHarvestL() - ends with error %d", pluginErr );
  1509     WRITELOG1("CHarvesterAO::CheckFileExtensionAndHarvestL() - ends with error %d", pluginErr );
  1383     OstTrace1( TRACE_NORMAL, DUP8_CHARVESTERAO_CHECKFILEEXTENSIONANDHARVESTL, "CHarvesterAO::CheckFileExtensionAndHarvestL) - ends with error %d", pluginErr );
  1510     OstTrace1( TRACE_NORMAL, DUP8_CHARVESTERAO_CHECKFILEEXTENSIONANDHARVESTL, "CHarvesterAO::CheckFileExtensionAndHarvestL) - ends with error %d", pluginErr );
  1384     
       
  1385     SetNextRequest( ERequestHarvest );
       
  1386     }
  1511     }
  1387 
  1512 
  1388 // ---------------------------------------------------------------------------
  1513 // ---------------------------------------------------------------------------
  1389 // HarvestingCompleted
  1514 // HarvestingCompleted
  1390 // ---------------------------------------------------------------------------
  1515 // ---------------------------------------------------------------------------
  1510         
  1635         
  1511         WRITELOG( "==============================ERROR done =========================" );
  1636         WRITELOG( "==============================ERROR done =========================" );
  1512         OstTrace0( TRACE_NORMAL, DUP12_CHARVESTERAO_HARVESTINGCOMPLETED, "==============================ERROR done =========================" );
  1637         OstTrace0( TRACE_NORMAL, DUP12_CHARVESTERAO_HARVESTINGCOMPLETED, "==============================ERROR done =========================" );
  1513         
  1638         
  1514         }
  1639         }
  1515            
       
  1516     SetNextRequest( ERequestHarvest );
       
  1517     }
  1640     }
  1518 
  1641 
  1519 // ---------------------------------------------------------------------------
  1642 // ---------------------------------------------------------------------------
  1520 // HandleSessionOpened
  1643 // HandleSessionOpened
  1521 // ---------------------------------------------------------------------------
  1644 // ---------------------------------------------------------------------------
  1658             TRAP_IGNORE( BootRomScanL() );
  1781             TRAP_IGNORE( BootRomScanL() );
  1659             }
  1782             }
  1660         TRAP_IGNORE( BootPartialRestoreScanL() );
  1783         TRAP_IGNORE( BootPartialRestoreScanL() );
  1661 #endif
  1784 #endif
  1662         
  1785         
  1663         if( !iMassMemoryIdChecked )
  1786         // Store the internal mass memory media ID to DB, and update data if necessary
  1664             {
  1787         TInt drive( -1 );
  1665             TInt drive( -1 );
  1788         TInt internalMassStorageError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, drive ) );
  1666             TInt massStorageError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, drive ) );
  1789         if( internalMassStorageError == KErrNone )
  1667             if( massStorageError == KErrNone )
  1790             {
       
  1791             TVolumeInfo internalMassStorageVolumeInfo;
       
  1792             internalMassStorageError = iFs.Volume( internalMassStorageVolumeInfo, drive );
       
  1793             if( internalMassStorageError == KErrNone )
  1668                 {
  1794                 {
  1669                 TVolumeInfo massStorageVolumeInfo;
  1795                 const TUint32 massStorageMediaId( internalMassStorageVolumeInfo.iUniqueID );
  1670                 iFs.Volume( massStorageVolumeInfo, drive );
  1796                 TUint32 mmcMediaId( 0 );
  1671                 const TUint32 massStorageMediaId( massStorageVolumeInfo.iUniqueID );
  1797                 TInt mmcError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, drive ) );
  1672                 massStorageError = DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, drive );
  1798                 if( mmcError == KErrNone )
  1673                 if( massStorageError == KErrNone )
       
  1674                     {
  1799                     {
  1675                     iFs.Volume( massStorageVolumeInfo, drive );
  1800                     TVolumeInfo mmcVolumeInfo;
  1676                     // Update mass storage media id if the mass storage is not memory card
  1801                     mmcError = iFs.Volume( mmcVolumeInfo, drive );
  1677                     if( massStorageVolumeInfo.iUniqueID != massStorageMediaId && massStorageMediaId != 0 )
  1802                     if( mmcError == KErrNone )
       
  1803                         {
       
  1804                         mmcMediaId = mmcVolumeInfo.iUniqueID;
       
  1805                         }
       
  1806                     }
       
  1807                 
       
  1808                 // If removable storage is not found, assume internal mass storage was mounted
       
  1809                 if( mmcError )
       
  1810                     {
       
  1811                     if( massStorageMediaId != 0 )
  1678                         {
  1812                         {
  1679                         iMdEHarvesterSession->CheckMassStorageMediaId( massStorageMediaId );
  1813                         iMdEHarvesterSession->CheckMassStorageMediaId( massStorageMediaId );
  1680                         }
  1814                         }                    
  1681                     }
  1815                     }
       
  1816                 else if( massStorageMediaId != mmcMediaId && 
       
  1817                             massStorageMediaId != 0 )
       
  1818                     {
       
  1819                     iMdEHarvesterSession->CheckMassStorageMediaId( massStorageMediaId );
       
  1820                     }          
  1682                 }
  1821                 }
  1683             }
  1822             }
  1684         }
  1823         }
  1685     else
  1824     else
  1686         {
  1825         {
  1816         case ERequestHarvest:
  1955         case ERequestHarvest:
  1817             {
  1956             {
  1818             WRITELOG( "CHarvesterAO::RunL - ERequestHarvest" );
  1957             WRITELOG( "CHarvesterAO::RunL - ERequestHarvest" );
  1819             OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - ERequestHarvest" );
  1958             OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - ERequestHarvest" );
  1820             
  1959             
  1821             // harvest new items first...
  1960             // harvest new items first
  1822             if ( iQueue->ItemsInQueue() > 0 )
  1961             if ( iQueue->ItemsInQueue() > 0 )
  1823                 {
  1962                 {
  1824                 WRITELOG( "CHarvesterAO::RunL - Items in queue - calling ReadItemFromQueueL()" );
  1963                 WRITELOG( "CHarvesterAO::RunL - Items in queue - calling ReadItemFromQueueL()" );
  1825                 ReadItemFromQueueL();
  1964                 ReadItemFromQueueL();
  1826 				SetNextRequest( ERequestHarvest );
  1965 				SetNextRequest( ERequestHarvest );
  1829 
  1968 
  1830             // no more items to handle from main queue
  1969             // no more items to handle from main queue
  1831             else
  1970             else
  1832                 {
  1971                 {
  1833                 WRITELOG( "CHarvesterAO::RunL - No items in main queue" );
  1972                 WRITELOG( "CHarvesterAO::RunL - No items in main queue" );
       
  1973                 // If interrupts occured, check the normal placeholder array for possible items to
       
  1974                 // be handled before moving on to container or ready placeholders
       
  1975                 if( iPHArray.Count() > 0 )
       
  1976                     {
       
  1977                     WRITELOG( "CHarvesterAO::RunL - Items found in placeholder array" );
       
  1978                     TRAPD( err, HandlePlaceholdersL( ETrue ) );
       
  1979 
       
  1980                     // make sure that when HandlePlaceholdersL leaves unexpectedly, iPHArray is cleared
       
  1981                     if ( err != KErrNone )
       
  1982                         {
       
  1983                         if( err != KErrDiskFull )
       
  1984                             {
       
  1985                             iPHArray.ResetAndDestroy();
       
  1986                             iTempReadyPHArray.ResetAndDestroy();
       
  1987                             }
       
  1988                         User::Leave( err );
       
  1989                         }
       
  1990                     SetNextRequest( ERequestHarvest );
       
  1991                     break;
       
  1992                     }
  1834                 // All registered fast harvested items or placeholders handled at this point     
  1993                 // All registered fast harvested items or placeholders handled at this point     
  1835                 // if container files to harvest, handle those next
  1994                 // if container files to harvest, handle those next
  1836                 if( iContainerPHArray.Count() > 0 )
  1995                 else if( iContainerPHArray.Count() > 0 )
  1837                 	{
  1996                 	{
  1838                     WRITELOG( "CHarvesterAO::RunL - Items in iContainterPHArray - requesting ERequestContainerPlaceholder handling" );
  1997                     WRITELOG( "CHarvesterAO::RunL - Items in iContainterPHArray - requesting ERequestContainerPlaceholder handling" );
  1839                     iFastHarvestNeeded = EFalse;
  1998                     iFastHarvestNeeded = EFalse;
  1840                     iHarvestingPlaceholders = EFalse;
  1999                     iHarvestingPlaceholders = EFalse;
  1841                     SetPriority( KHarvesterPriorityHarvestingPlugin );
  2000                     SetPriority( KHarvesterPriorityHarvestingPlugin );
  1862             		{
  2021             		{
  1863 #ifdef _DEBUG
  2022 #ifdef _DEBUG
  1864             		WRITELOG1("CHarvesterAO::RunL - items in ready pharray: %d", arrayCount );
  2023             		WRITELOG1("CHarvesterAO::RunL - items in ready pharray: %d", arrayCount );
  1865             		OstTrace1( TRACE_NORMAL, DUP3_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - items in ready pharray: %d", arrayCount );
  2024             		OstTrace1( TRACE_NORMAL, DUP3_CHARVESTERAO_RUNL, "CHarvesterAO::RunL - items in ready pharray: %d", arrayCount );
  1866 #endif   		
  2025 #endif   		
  1867             		TInt endIndex( KPlaceholderQueueSize );
  2026             		TInt endIndex( KReadyPlaceholderQueueSize );
  1868             		if( arrayCount < KPlaceholderQueueSize )
  2027             		if( arrayCount < KReadyPlaceholderQueueSize )
  1869             		    {
  2028             		    {
  1870             		    endIndex = arrayCount;
  2029             		    endIndex = arrayCount;
  1871             		    }
  2030             		    }
  1872             		for( TInt i = 0; i < endIndex; i++ )
  2031             		for( TInt i = 0; i < endIndex; i++ )
  1873             			{
  2032             			{
  1911         		iContainerPHArray.Remove( 0 );
  2070         		iContainerPHArray.Remove( 0 );
  1912         		i++;
  2071         		i++;
  1913         		}
  2072         		}
  1914         	TRAPD( err, HandlePlaceholdersL( EFalse ) );
  2073         	TRAPD( err, HandlePlaceholdersL( EFalse ) );
  1915 
  2074 
  1916 	    	// make sure that when HandlePlaceholdersL leaves, iPHArray is cleared
  2075             // make sure that when HandlePlaceholdersL leaves unexpectedly, iPHArray is cleared
  1917 	    	if ( err != KErrNone )
  2076             if ( err != KErrNone )
  1918 	    		{
  2077                 {
  1919 	    	    iContainerPHArray.ResetAndDestroy();
  2078                 if( err != KErrDiskFull )
  1920 	    		iPHArray.ResetAndDestroy();
  2079                     {
  1921 	    		iTempReadyPHArray.ResetAndDestroy();
  2080                     iContainerPHArray.ResetAndDestroy();
  1922 	    		User::Leave( err );
  2081                     iPHArray.ResetAndDestroy();
  1923 	    		}
  2082                     iTempReadyPHArray.ResetAndDestroy();
       
  2083                     }
       
  2084                 User::Leave( err );
       
  2085                 }
  1924 	    	SetNextRequest( ERequestHarvest );
  2086 	    	SetNextRequest( ERequestHarvest );
  1925         	}
  2087         	}
  1926         break;
  2088         break;
  1927         
  2089         
  1928         // pause request
  2090         // pause request
  1978 // RunError
  2140 // RunError
  1979 // ---------------------------------------------------------------------------
  2141 // ---------------------------------------------------------------------------
  1980 //
  2142 //
  1981 TInt CHarvesterAO::RunError( TInt aError )
  2143 TInt CHarvesterAO::RunError( TInt aError )
  1982     {
  2144     {
  1983     WRITELOG( "CHarvesterAO::RunError" );
  2145     WRITELOG1( "CHarvesterAO::RunError, error: %d", aError );
  1984     OstTrace0( TRACE_NORMAL, CHARVESTERAO_RUNERROR, "CHarvesterAO::RunError" );
  2146     OstTrace0( TRACE_NORMAL, CHARVESTERAO_RUNERROR, "CHarvesterAO::RunError" );
  1985     
  2147     
  1986     switch( iNextRequest )
  2148     switch( iNextRequest )
  1987         {
  2149         {
  1988         case ERequestHarvest:
  2150         case ERequestHarvest:
  1989             {
  2151             {
  1990             WRITELOG( "CHarvesterAO::RunError - state ERequestHarvest" );
  2152             WRITELOG( "CHarvesterAO::RunError - state ERequestHarvest" );
  1991             OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_RUNERROR, "CHarvesterAO::RunError - state ERequestHarvest" );
  2153             OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_RUNERROR, "CHarvesterAO::RunError - state ERequestHarvest" );
       
  2154             if( aError == KErrDiskFull || aError == KErrNoMemory )
       
  2155                 {
       
  2156                 SetNextRequest( ERequestIdle );
       
  2157                 }
       
  2158             }
       
  2159         break;
       
  2160         
       
  2161         case ERequestContainerPlaceholder:
       
  2162             {
       
  2163             WRITELOG( "CHarvesterAO::RunError - state ERequestContainerPlaceholder" );
       
  2164             OstTrace0( TRACE_NORMAL, DUP5_CHARVESTERAO_RUNERROR, "CHarvesterAO::RunError - state ERequestContainerPlaceholder" );
       
  2165             if( aError == KErrDiskFull || aError == KErrNoMemory )
       
  2166                 {
       
  2167                 SetNextRequest( ERequestIdle );
       
  2168                 }
  1992             }
  2169             }
  1993         break;
  2170         break;
  1994         
  2171         
  1995         case ERequestPause:
  2172         case ERequestPause:
  1996             {
  2173             {
  2103     WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL()");
  2280     WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL()");
  2104     OstTrace0( TRACE_NORMAL, CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL" );
  2281     OstTrace0( TRACE_NORMAL, CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL" );
  2105     
  2282     
  2106     if( MMdSHarvesterDiskSpaceObserver::EMore == aDiskSpaceDirection )
  2283     if( MMdSHarvesterDiskSpaceObserver::EMore == aDiskSpaceDirection )
  2107         {
  2284         {
       
  2285         WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL() - disk space available");
       
  2286         OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL - disk space available" );
       
  2287         iDiskFull = EFalse;
       
  2288         }
       
  2289     else
       
  2290         {
  2108         WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL() - disk full");
  2291         WRITELOG("CHarvesterAO::HandleDiskSpaceNotificationL() - disk full");
  2109         OstTrace0( TRACE_NORMAL, DUP1_CHARVESTERAO_HANDLEDISKSPACENOTIFICATIONL, "CHarvesterAO::HandleDiskSpaceNotificationL - disk full" );        
  2292         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;
  2293         iDiskFull = ETrue;
  2117         if( iServerPaused )
  2294         if( iServerPaused )
  2118             {
  2295             {
  2119             return;
  2296             return;
  2120             }
  2297             }
  2318             }
  2495             }
  2319         }
  2496         }
  2320     else
  2497     else
  2321         {
  2498         {
  2322         delete hd;
  2499         delete hd;
       
  2500         hd = NULL;
  2323         err = KErrUnknown;
  2501         err = KErrUnknown;
  2324         }
  2502         }
  2325     
  2503     
  2326     if (!aMessage.IsNull())
  2504     if (!aMessage.IsNull())
  2327         {
  2505         {
  2328         aMessage.Complete( err );
  2506         aMessage.Complete( err );
       
  2507         }
       
  2508     else if( err != KErrNone )
       
  2509         {
       
  2510         HarvestCompleted( aMessage.Identity(), uri->Des(), err );
  2329         }
  2511         }
  2330     
  2512     
  2331     albumIds.Close();
  2513     albumIds.Close();
  2332     }
  2514     }
  2333   
  2515   
  2515     		}
  2697     		}
  2516     	}
  2698     	}
  2517     else
  2699     else
  2518         {
  2700         {
  2519         delete hd;
  2701         delete hd;
       
  2702         hd = NULL;
  2520         err = KErrUnknown;
  2703         err = KErrUnknown;
  2521         }
  2704         }
  2522 
  2705 
  2523     if (!aMessage.IsNull())
  2706     if (!aMessage.IsNull())
  2524         {
  2707         {
  2525         aMessage.Complete( err );
  2708         aMessage.Complete( err );
       
  2709         }
       
  2710     else if( err != KErrNone )
       
  2711         {
       
  2712         HarvestCompleted( aMessage.Identity(), uri->Des(), err );
  2526         }
  2713         }
  2527     
  2714     
  2528     albumIds.Close();
  2715     albumIds.Close();
  2529     }
  2716     }
  2530 
  2717 
  2939 		const RPointerArray<HBufC>& aIgnorePaths,
  3126 		const RPointerArray<HBufC>& aIgnorePaths,
  2940         TBool aCheckDrive )
  3127         TBool aCheckDrive )
  2941 	{
  3128 	{
  2942 	WRITELOG("CHarvesterAO::BootScanL() - begin");
  3129 	WRITELOG("CHarvesterAO::BootScanL() - begin");
  2943     OstTrace0( TRACE_NORMAL, CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - begin" );
  3130     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 	
  3131 	
  2964 	TVolumeInfo volumeInfo;
  3132 	TVolumeInfo volumeInfo;
  2965 	iFs.Volume( volumeInfo, EDriveC );
  3133 	iFs.Volume( volumeInfo, EDriveC );
  2966 
  3134 
  2967 	iMdEHarvesterSession->SetFilesToNotPresent( volumeInfo.iUniqueID, ETrue );
  3135 	iMdEHarvesterSession->SetFilesToNotPresent( volumeInfo.iUniqueID, ETrue );
  3039 					if( !IsDescInArray( path, aIgnorePaths ) )
  3207 					if( !IsDescInArray( path, aIgnorePaths ) )
  3040 						{
  3208 						{
  3041 						WRITELOG("CHarvesterAO::BootScanL() - scanFolders.AppendL");
  3209 						WRITELOG("CHarvesterAO::BootScanL() - scanFolders.AppendL");
  3042 						OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - scanFolders.AppendL" );
  3210 						OstTrace0( TRACE_NORMAL, DUP2_CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - scanFolders.AppendL" );
  3043 						TScanItem* item = new (ELeave) TScanItem();
  3211 						TScanItem* item = new (ELeave) TScanItem();
       
  3212 						CleanupStack::PushL( item );
  3044 						item->iPath = name->AllocL();
  3213 						item->iPath = name->AllocL();
  3045 						item->iPreinstalled = MdeConstants::MediaObject::ENotPreinstalled;
  3214 						item->iPreinstalled = MdeConstants::MediaObject::ENotPreinstalled;
  3046 						aScanItems.AppendL( item );
  3215 						CleanupStack::Pop( item );
       
  3216 						aScanItems.AppendL( item ); // ownership is transferred
  3047 						}
  3217 						}
  3048 					}
  3218 					}
  3049 				else
  3219 				else
  3050 					{
  3220 					{
  3051 					TPtrC filename = *name;
  3221 					TPtrC filename = *name;
  3101 	                        hd->SetObjectType( EPlaceholder );
  3271 	                        hd->SetObjectType( EPlaceholder );
  3102 	                        hd->SetOrigin( MdeConstants::Object::EOther );
  3272 	                        hd->SetOrigin( MdeConstants::Object::EOther );
  3103 	                        hd->SetClientData( phData );
  3273 	                        hd->SetClientData( phData );
  3104 
  3274 
  3105 	                        CleanupStack::Pop( phData );
  3275 	                        CleanupStack::Pop( phData );
  3106 	                        hdArray.Append( hd );
  3276 							
       
  3277 	                        if(hdArray.Append( hd ) != KErrNone )
       
  3278 	                            {
       
  3279                                 delete hd;
       
  3280                                 hd = NULL;
       
  3281 	                            }
  3107 						    }
  3282 						    }
  3108 						CleanupStack::PopAndDestroy( &results );
  3283 						CleanupStack::PopAndDestroy( &results );
  3109 						CleanupStack::PopAndDestroy( &fileInfos );
  3284 						CleanupStack::PopAndDestroy( &fileInfos );
  3110 						CleanupStack::PopAndDestroy( &uris );
  3285 						CleanupStack::PopAndDestroy( &uris );
  3111 						}
  3286 						}
  3126 	iQueue->MonitorEvent( hdArray );
  3301 	iQueue->MonitorEvent( hdArray );
  3127 	CleanupStack::PopAndDestroy( &hdArray ); 
  3302 	CleanupStack::PopAndDestroy( &hdArray ); 
  3128 
  3303 
  3129 	iMdEHarvesterSession->RemoveFilesNotPresent( volumeInfo.iUniqueID, ETrue );
  3304 	iMdEHarvesterSession->RemoveFilesNotPresent( volumeInfo.iUniqueID, ETrue );
  3130 	
  3305 	
  3131 	iMassMemoryIdChecked = ETrue;
       
  3132 	
       
  3133 	WRITELOG("CHarvesterAO::BootScanL() - end");
  3306 	WRITELOG("CHarvesterAO::BootScanL() - end");
  3134 	OstTrace0( TRACE_NORMAL, DUP5_CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - end" );
  3307 	OstTrace0( TRACE_NORMAL, DUP5_CHARVESTERAO_BOOTSCANL, "CHarvesterAO::BootScanL - end" );
  3135 	}
  3308 	}
  3136 
  3309 
  3137 void CHarvesterAO::SetHarvesterStatusObserver( MHarvesterStatusObserver* aObserver )
  3310 void CHarvesterAO::SetHarvesterStatusObserver( MHarvesterStatusObserver* aObserver )