diff -r d881023c13eb -r cbb1bfb7ebfb mmappcomponents/harvester/server/src/mpxmediaremovalmonitor.cpp --- a/mmappcomponents/harvester/server/src/mpxmediaremovalmonitor.cpp Mon May 03 12:58:40 2010 +0300 +++ b/mmappcomponents/harvester/server/src/mpxmediaremovalmonitor.cpp Fri May 14 16:21:14 2010 +0300 @@ -18,6 +18,7 @@ #include #include +#include #include #include "mpxmediaremovalmonitor.h" @@ -27,14 +28,12 @@ // CMPXMediaRemovalMonitor::CMPXMediaRemovalMonitor ( TInt aDrive, RFs& aFs, MMPXSystemEventObserver& aObserver ) - : CActive(EPriorityHigh), - iDrive( aDrive ), + : iDrive( aDrive ), iFs( aFs ), iDiskRemoved( EFalse ), iObserver( aObserver ) { - CActiveScheduler::Add(this); } @@ -44,19 +43,11 @@ // void CMPXMediaRemovalMonitor::ConstructL() { - MPX_DEBUG1(_L("CMPXMediaRemovalMonitor::ConstructL <---")); + MPX_FUNC("CMPXMediaRemovalMonitor::ConstructL"); + iDiskNotifyHandler = CDiskNotifyHandler::NewL(*this, iFs); + CheckDriveStatus(); - // Initial state - TDriveInfo drive; - User::LeaveIfError(iFs.Drive(drive, TInt(iDrive))); - iDiskRemoved = (drive.iType == EMediaNotPresent); - - // Start listening - TNotifyType notType(ENotifyDisk); - iFs.NotifyChange( notType, iStatus ); - SetActive(); - - MPX_DEBUG1(_L("CMPXMediaRemovalMonitor::ConstructL --->")); + iDiskNotifyHandler->NotifyDisk(); } @@ -99,74 +90,95 @@ // CMPXMediaRemovalMonitor::~CMPXMediaRemovalMonitor() { - Cancel(); + delete iDiskNotifyHandler; + } + +void CMPXMediaRemovalMonitor::CheckDriveStatus() + { + TDriveList driveList; + TInt driveCount(0); + TInt error = DriveInfo::GetUserVisibleDrives( iFs, driveList, driveCount ); + if ( error != KErrNone ) + { + MPX_DEBUG2("CMPXMediaRemovalMonitor::CheckDriveStatus GetUserVisibleDrives failed, error %d", error); + return; + } + for( TInt driveNum = EDriveA; driveNum < EDriveZ; driveNum++ ) + { + if ( driveNum != EDriveC && driveList[driveNum] ) + { + TDriveInfo driveInfo; + if (iFs.Drive(driveInfo, driveNum) == KErrNone) + { + if ( (driveInfo.iType != EMediaNotPresent) && ! (driveInfo.iDriveAtt & KDriveAttRemote) ) + { + TInt error = iDiskNotifyHandler->NotifyDismount( driveNum ); + MPX_DEBUG3("CMPXMediaRemovalMonitor::CheckDriveStatus monitoring drive %d for dismounts, error %d", driveNum, error); + } + } + if ( driveNum == iDrive ) + { + iDiskRemoved = driveInfo.iType == EMediaNotPresent; + } + } + } } - // --------------------------------------------------------------------------- -// Service the request +// Callback when disk state has changed // --------------------------------------------------------------------------- // -void CMPXMediaRemovalMonitor::RunL() +void CMPXMediaRemovalMonitor::HandleNotifyDisk( TInt aError, const TDiskEvent& aEvent ) { - MPX_DEBUG1(_L("CMPXMediaRemovalMonitor::RunL <---")); - - // Re-subscribe to event. - TNotifyType notType(ENotifyDisk); - iFs.NotifyChange( notType, iStatus ); - SetActive(); - - // Check state - TDriveInfo drive; - User::LeaveIfError(iFs.Drive(drive, TInt(iDrive))); - - // Notify Observer - switch(drive.iType) - { - case EMediaNotPresent: - { - if (!iDiskRemoved) + MPX_DEBUG4("-->CMPXMediaRemovalMonitor::HandleNotifyDisk aError=%d event=%d drive=%d", aError, aEvent.iType, aEvent.iDrive); + if ( aError == KErrNone ) + { + if ( aEvent.iType == EDiskRemoved + || aEvent.iType == EDiskStatusChanged && aEvent.iInfo.iType == EMediaNotPresent ) + { + if ( aEvent.iDrive == iDrive && !iDiskRemoved ) { iObserver.HandleSystemEventL( EDiskRemovedEvent, iDrive ); + iDiskRemoved = ETrue; } - iDiskRemoved = ETrue; - break; - } - default: - { - if ( iDiskRemoved && - ( drive.iMediaAtt & ( KMediaAttLockable|KMediaAttLocked|KMediaAttHasPassword ) ) != - ( KMediaAttLockable|KMediaAttLocked|KMediaAttHasPassword ) ) + + } + else if ( ( aEvent.iType == EDiskAdded || aEvent.iType == EDiskStatusChanged ) + && aEvent.iInfo.iType != EMediaNotPresent ) + { + if ( aEvent.iDrive == iDrive + && iDiskRemoved + && ( aEvent.iInfo.iMediaAtt & ( KMediaAttLockable|KMediaAttLocked|KMediaAttHasPassword ) ) + != ( KMediaAttLockable|KMediaAttLocked|KMediaAttHasPassword ) ) { iObserver.HandleSystemEventL( EDiskInsertedEvent, iDrive ); iDiskRemoved = EFalse; } - break; - } + + if ( !( aEvent.iInfo.iDriveAtt & KDriveAttRemote ) ) + { + TInt error = iDiskNotifyHandler->NotifyDismount( aEvent.iDrive ); + MPX_DEBUG3("CMPXMediaRemovalMonitor::HandleNotifyDisk monitoring drive %d for dismounts, error %d", aEvent.iDrive, error); + } + } } - + + MPX_DEBUG1("<--CMPXMediaRemovalMonitor::HandleNotifyDisk"); + } - MPX_DEBUG1(_L("CMPXMediaRemovalMonitor::RunL --->")); - } // --------------------------------------------------------------------------- -// Cancel NotifyChange request from file system +// Callback when disk is about to be dismounted // --------------------------------------------------------------------------- // -void CMPXMediaRemovalMonitor::DoCancel() +void CMPXMediaRemovalMonitor::HandleNotifyDismount( TInt aError, const TDismountEvent& aEvent ) { - iFs.NotifyChangeCancel(); + MPX_DEBUG3("-->CMPXMediaRemovalMonitor::HandleNotifyDismount aError=%d drive=%d", aError, aEvent.iDrive); + if (aError == KErrNone) + { + TRAP_IGNORE( iObserver.HandleSystemEventL( EDiskDismountEvent, aEvent.iDrive ) ); + TInt error = iDiskNotifyHandler->AllowDismount( aEvent.iDrive ); + MPX_DEBUG3("CMPXMediaRemovalMonitor::HandleNotifyDismount allowed dismount of drive %d, error %d", aEvent.iDrive, error); + } + MPX_DEBUG1("<--CMPXMediaRemovalMonitor::HandleNotifyDismount"); } - -// ---------------------------------------------------------------------------- -// Handles a leave occurring in the request completion event handler RunL() -// Don't care if client has a User::Leave() in RunL(), keep monitoring for events -// ---------------------------------------------------------------------------- -// -TInt CMPXMediaRemovalMonitor::RunError(TInt aError) - { - MPX_DEBUG2("CMPXMediaRemovalMonitor::RunError(%d)", aError ); - (void) aError; // avoid compile warning in urel - - return KErrNone; - }