diff -r 000000000000 -r c53acadfccc6 harvester/monitorplugins/mmcplugin/src/mmcscannerao.cpp --- /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 +#include +#include + +_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 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(); + } + }