harvester/monitorplugins/mmcplugin/src/mmcscannerao.cpp
changeset 0 c53acadfccc6
child 1 acef663c1218
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/harvester/monitorplugins/mmcplugin/src/mmcscannerao.cpp	Mon Jan 18 20:34:07 2010 +0200
@@ -0,0 +1,272 @@
+/*
+* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Scans MMC after phone reboot for file changes*
+*/
+
+#include "mmcscannerao.h"
+#include "harvesterlog.h"
+#include "fsutil.h"
+#include <harvesterdata.h>
+#include <placeholderdata.h>
+#include <centralrepository.h>
+
+_LIT( KColon, ":" );
+
+const TInt KEntryBufferSize = 100;
+const TInt KDefaultDelay = 4;
+const TInt KMillion = 1000000;
+
+const TUid KRepositoryUid = { 0x20007183 };
+const TUint32 KScanDelayKey = 0x00000001;
+
+CMmcScannerAO::CMmcScannerAO( TUint32 aMediaId, 
+		CMdEHarvesterSession* aMdEClient, MMonitorPluginObserver* aObserver, 
+		CHarvesterPluginFactory* aHarvesterPluginFactory, CActive::TPriority aPriority ) : 
+		CTimer( aPriority ), iState( EUninitialized ), iMmcFileList( NULL )   
+	{
+	iMediaId = aMediaId;
+	iMdEClient = aMdEClient;
+	iObserver = aObserver;
+	iHarvesterPluginFactory = aHarvesterPluginFactory;
+	}
+
+CMmcScannerAO* CMmcScannerAO::NewL( TUint32 aMediaId, CMdEHarvesterSession* aMdEClient,
+		MMonitorPluginObserver* aObserver, CHarvesterPluginFactory* aHarvesterPluginFactory, 
+		CActive::TPriority aPriority, TBool aAlreadyWaited )
+	{
+	CMmcScannerAO* self = new ( ELeave ) CMmcScannerAO( aMediaId, aMdEClient, aObserver, 
+			aHarvesterPluginFactory, aPriority );
+	
+	CleanupStack::PushL( self );
+	self->ConstructL( aAlreadyWaited );
+	CleanupStack::Pop( self );
+	return self;
+	}
+
+void CMmcScannerAO::ConstructL( TBool aAlreadyWaited )
+	{
+	CTimer::ConstructL();
+	CActiveScheduler::Add( this ); // Add to scheduler
+	iState = EUninitialized;
+	User::LeaveIfError( iFs.Connect() );
+	iMmcFileList = CMmcFileList::NewL();
+	
+	if( !aAlreadyWaited )
+	    {
+        TInt tmpDelay( KDefaultDelay );
+        TTimeIntervalMicroSeconds32 delay( tmpDelay * KMillion ); 
+        CRepository* repo = CRepository::NewLC( KRepositoryUid );
+        TInt err = repo->Get( KScanDelayKey, tmpDelay );
+        if ( err == KErrNone )
+            {
+            delay = tmpDelay * KMillion;
+            }
+        CleanupStack::PopAndDestroy( repo );
+        After( delay );
+	    }
+	else
+	    {
+	    TTimeIntervalMicroSeconds32 delay( 5 ); 
+	    After( delay );
+	    }
+	}
+
+CMmcScannerAO::~CMmcScannerAO()
+	{
+	Cancel(); // Cancel any request, if outstanding
+	// Delete instance variables if any
+	
+	delete iMmcFileList;
+	
+	iEntryArray.ResetAndDestroy();
+	iEntryArray.Close();
+
+	iHarvestEntryArray.ResetAndDestroy();
+	iHarvestEntryArray.Close();
+	
+	iFs.Close();
+	}
+
+
+void CMmcScannerAO::RunL()
+	{
+	switch( iState )
+		{
+		case( EUninitialized ):
+			{
+			WRITELOG("CMmcScannerAO::RunL - Setting files to not present");
+			iMdEClient->SetFilesToNotPresent( iMediaId, ETrue );
+			SetState( EReadFiles );
+			break;
+			}
+		
+		case( EReadFiles ):
+			{
+			for ( TInt i=0; i < KMaxDrives; i++ )
+				{
+				const TUint32 mediaId = FSUtil::MediaID(iFs, i);
+				if( mediaId == iMediaId )
+					{
+					TChar chr;
+					iFs.DriveToChar( i, chr );
+					i = KMaxDrives;
+					iDrive.Zero();
+					iDrive.Append( chr );
+					iDrive.Append( KColon );
+					}
+				}
+			// drive not found (unmount before scanning delay)
+			if ( iDrive.Length() == 0 )
+				{
+				SetState( EDone );
+				break;
+				}
+			
+			WRITELOG("CMmcScannerAO::RunL - build file list");
+			iMmcFileList->BuildFileListL( iFs, iDrive, iEntryArray );
+			SetState( EProcessFiles );
+			break;
+			}
+		
+		case( EProcessFiles ):
+			{
+			if( iEntryArray.Count() > 0 )
+				{
+				WRITELOG("CMmcScannerAO::RunL - handling file list");
+				iMmcFileList->HandleFileEntryL( *iMdEClient, iEntryArray, 
+						iHarvestEntryArray, iMediaId, iHarvesterPluginFactory );
+				SetState( EHarvestFiles );
+				}
+			else 
+				{
+				SetState( ERemoveNPFiles );
+				}
+			break;
+			}
+		
+		case( EHarvestFiles ):
+			{
+			if ( iHarvestEntryArray.Count() > 0 )
+				{
+				WRITELOG("CMmcScannerAO::RunL - adding new files to harvester queue");
+				HandleReharvestL();
+				SetState( EHarvestFiles );
+				}
+			else
+				{
+				SetState( EProcessFiles );
+				}
+			break;
+			}
+		
+		case( ERemoveNPFiles ):
+			{
+			WRITELOG("CMmcScannerAO::RunL - Removing not present files");
+			iMdEClient->RemoveFilesNotPresent( iMediaId, ETrue );
+			SetState( EDone );
+			break;
+			}
+		
+		case( EDone ):
+			{
+			iFs.Close();
+			break;
+			}
+		
+		default: 
+			break;
+		
+		}
+	}
+
+void CMmcScannerAO::HandleReharvestL()
+	{
+	WRITELOG("CMMCMountTaskAO::HandleReharvestL");
+		
+	TInt batchSize( 0 );
+	RPointerArray<CHarvesterData> hdArray;
+	CleanupClosePushL( hdArray );
+	
+    if ( iHarvestEntryArray.Count() >= KEntryBufferSize )
+        {
+        batchSize = KEntryBufferSize;
+        }
+    else
+        {
+        batchSize = iHarvestEntryArray.Count();
+        }
+        
+    for ( TInt i = 0; i < batchSize; i++ )
+        {
+        CPlaceholderData* ei = iHarvestEntryArray[0];
+
+        HBufC* fileName = ei->Uri().AllocLC();
+        CHarvesterData* hd = CHarvesterData::NewL( fileName );
+		hd->SetOrigin( MdeConstants::Object::EOther );
+		CleanupStack::Pop( fileName );
+
+		if ( ei->PresentState() == EMdsPlaceholder || 
+			 ei->PresentState() == EMdsModified )
+			{
+			hd->SetEventType( EHarvesterEdit );
+			hd->SetObjectType( ENormal );
+			delete ei;
+			}
+		else
+			{
+			hd->SetEventType( EHarvesterAdd );
+			hd->SetObjectType( EPlaceholder );
+			hd->SetClientData( ei );
+			}
+		hdArray.Append( hd );
+        iHarvestEntryArray.Remove( 0 );
+        }
+
+    if( iHarvestEntryArray.Count() == 0 )
+    	{
+    	iHarvestEntryArray.Compress();
+    	}
+    
+	if ( iObserver )
+		{
+		if( hdArray.Count() > 0)
+			{
+			iObserver->MonitorEvent( hdArray );
+			}
+		else
+			{
+			iObserver->MonitorEvent( hdArray[0] );
+			}
+		}
+	
+	CleanupStack::PopAndDestroy( &hdArray ); 
+	}
+	
+
+TInt CMmcScannerAO::RunError( TInt /*aError*/ )
+	{
+	return KErrNone;
+	}
+
+void CMmcScannerAO::SetState( TCMmcScannerAOState aState )
+	{
+	WRITELOG("CMmcScannerAO::SetNextRequest" );
+	if ( !IsActive() )
+		{
+		iState = aState;
+		TRequestStatus* ptrStatus = &iStatus;
+		User::RequestComplete( ptrStatus, KErrNone );
+		SetActive();
+		}
+	}