diff -r 000000000000 -r c53acadfccc6 harvester/monitorplugins/mmcplugin/src/mmcmonitorplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/harvester/monitorplugins/mmcplugin/src/mmcmonitorplugin.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,348 @@ +/* +* 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: Monitors MMC insertions and removals.* +*/ + + +#include "mmcmonitorplugin.h" +#include "harvesterlog.h" +#include "mdsfileserverpluginclient.h" +#include "fsutil.h" +#include "harvestercenreputil.h" +#include + +#include + +_LIT( KColon, ":" ); + +// construct/destruct +CMMCMonitorPlugin* CMMCMonitorPlugin::NewL() + { + CMMCMonitorPlugin* self = new (ELeave) CMMCMonitorPlugin(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void CMMCMonitorPlugin::ConstructL() // second-phase constructor + { + WRITELOG( "CMMCMonitorPlugin::ConstructL" ); + + iMMCMonitor = CMMCMonitorAO::NewL(); + iMountTask = CMMCMountTaskAO::NewL(); + iUsbMonitor = CMMCUsbAO::NewL(); + iMdEClient = NULL; + } + +CMMCMonitorPlugin::~CMMCMonitorPlugin() // destruct + { + WRITELOG( "CMMCMonitorPlugin::~CMMCMonitorPlugin" ); + + if (iMMCMonitor) + { + iMMCMonitor->StopMonitoring(); + delete iMMCMonitor; + } + + if (iUsbMonitor) + { + iUsbMonitor->StopMonitoring(); + delete iUsbMonitor; + } + + if (iMountTask) + { + delete iMountTask; + } + + delete iMmcScanner; + delete iHddScanner; + } + +TBool CMMCMonitorPlugin::StartMonitoring( MMonitorPluginObserver& aObserver, + CMdESession* aMdEClient, CContextEngine* /*aCtxEngine*/, + CHarvesterPluginFactory* aHarvesterPluginFactory ) + { + WRITELOG( "CMMCMonitorPlugin::StartMonitoring" ); + + iObserver = &aObserver; + TRAPD( err, iMdEClient = CMdEHarvesterSession::NewL( *aMdEClient ) ); + if( err != KErrNone ) + { + return EFalse; + } + + iMountTask->SetMonitorObserver( aObserver ); + iMountTask->SetMdeSession( iMdEClient ); + iMountTask->SetHarvesterPluginFactory( aHarvesterPluginFactory ); + + // get present media IDs before last shutdown + RArray medias; + TRAP_IGNORE( iMdEClient->GetPresentMediasL( medias ) ); + + // update db present status + TRAP( err, StartMonitoringAllMMCsL( medias ) ); + if ( err != KErrNone ) + { + return EFalse; + } + + TChar driveLetter( 0 ); + TBool presentState( EFalse ); + + TUint32 hdMediaId( 0 ); + hdMediaId = iMountTask->GetInternalDriveMediaId(); + TBool alreadyWaited( EFalse ); + + + for ( TInt i = 0; i < medias.Count(); i++ ) + { + TRAP_IGNORE( iMdEClient->GetMediaL( medias[i].iMediaId, driveLetter, presentState ) ); + + if ( presentState && medias[i].iMediaId != hdMediaId ) + { + // scan MMC if card was in phone + TRAP_IGNORE( iMmcScanner = CMmcScannerAO::NewL( medias[i].iMediaId, iMdEClient, iObserver, + aHarvesterPluginFactory, CActive::EPriorityHigh, alreadyWaited ) ); + alreadyWaited = ETrue; + } + } + + // scan mass storage to catch all chances even if battery dies during operation that should be catched + if( hdMediaId ) + { + TBool exists( EFalse ); + TRAP_IGNORE( exists= iMdEClient->GetMediaL( hdMediaId, driveLetter, presentState ) ); + + if ( exists ) + { + WRITELOG("CMMCMonitorPlugin::StartMonitoring - start mass storage scan"); + + TMdEMediaInfo hdInfo; + hdInfo.iMediaId = hdMediaId; + hdInfo.iDrive = driveLetter; + medias.Append( hdInfo ); + + TRAP_IGNORE( iHddScanner = CMmcScannerAO::NewL( hdMediaId, iMdEClient, iObserver, + aHarvesterPluginFactory, CActive::EPriorityUserInput, alreadyWaited )); + } + } + + iMMCMonitor->StartMonitoring( *this, medias ); + + medias.Close(); + + return iUsbMonitor->StartMonitoring( *this ); + } + +TBool CMMCMonitorPlugin::StopMonitoring() + { + WRITELOG( "CMMCMonitorPlugin::StopMonitoring" ); + + iMMCMonitor->StopMonitoring(); + return iUsbMonitor->StopMonitoring(); + } + +TBool CMMCMonitorPlugin::ResumeMonitoring( MMonitorPluginObserver& /*aObserver*/, + CMdESession* /*aMdEClient*/, CContextEngine* /*aCtxEngine*/, + CHarvesterPluginFactory* /*aHarvesterPluginFactory*/ ) + { + WRITELOG( "CMMCMonitorPlugin::ResumeMonitoring" ); + iMountTask->SetCachingStatus( EFalse ); + return ETrue; + } + +TBool CMMCMonitorPlugin::PauseMonitoring() + { + WRITELOG( "CMMCMonitorPlugin::PauseMonitoring" ); // DEBUG INFO + iMountTask->SetCachingStatus( ETrue ); + return ETrue; + } + +// constructor support +// don't export these, because used only by functions in this DLL, eg our NewLC() +CMMCMonitorPlugin::CMMCMonitorPlugin() // first-phase C++ constructor + { + // No implementation required + } + +void CMMCMonitorPlugin::AddNotificationPathL( TChar aDrive ) + { + WRITELOG( "CMMCMonitorPlugin::AddNotificationPath" ); + + // 1 in length is for aDrive + HBufC* path = HBufC::NewLC( 1 + KColon.iTypeLength ); + TPtr pathPtr = path->Des(); + pathPtr.Append( aDrive ); + pathPtr.Append( KColon ); + + CHarvesterCenRepUtil* cenRepoUtil = CHarvesterCenRepUtil::NewLC(); + cenRepoUtil->AddIgnorePathsToFspL( pathPtr ); + cenRepoUtil->FspEngine().AddNotificationPath( pathPtr ); + CleanupStack::PopAndDestroy( cenRepoUtil ); + CleanupStack::PopAndDestroy( path ); + } + +void CMMCMonitorPlugin::MountEvent( TChar aDriveChar, TUint32 aMediaID, TMMCEventType aEventType ) + { + WRITELOG( "CMMCMonitorPlugin::MountEvent" ); + + TMountData* mountData = NULL; + mountData = new TMountData; + if ( !mountData ) + { + return; + } + if( aMediaID != 0 && aEventType == EMounted) + { + RFs fs; + const TInt err = fs.Connect(); + if ( err != KErrNone ) + { + delete mountData; + return; + } + + TUint status; + TInt drive; + fs.CharToDrive( aDriveChar, drive ); + if( DriveInfo::GetDriveStatus( fs, drive, status ) == KErrNone ) + { + //The "Out of disk space" mde query uses the MdE_Preferences table + if( !(status & DriveInfo::EDriveInternal) ) + { + iMdEClient->AddMemoryCard( aMediaID ); + } + } + + fs.Close(); + } + + mountData->iDrivePath.Append( aDriveChar ); + mountData->iDrivePath.Append( KColon ); + mountData->iMediaID = aMediaID; + + switch ( aEventType ) + { + case EMounted: + { + WRITELOG( "CMMCMonitorPlugin::MountEvent with parameter EMounted" ); + mountData->iMountType = TMountData::EMount; + iMountTask->StartMount( *mountData ); + } + break; + + case EDismounted: + { + if( aMediaID == 0 ) + { + TRAP_IGNORE( mountData->iMediaID = FSUtil::GetPreviousMediaIDL( iMdEClient, aDriveChar ) ); + } + if( mountData->iMediaID ) + { + WRITELOG( "CMMCMonitorPlugin::MountEvent with parameter EDismounted" ); + mountData->iMountType = TMountData::EUnmount; + iMountTask->StartUnmount( *mountData ); + } + } + break; + + case EFormatted: + { + WRITELOG( "CMMCMonitorPlugin::MountEvent with parameter EFormatted" ); + mountData->iMountType = TMountData::EFormat; + iMountTask->StartUnmount( *mountData ); + } + break; + + default: + { + _LIT( KLogPanic, "unknown state" ); + User::Panic( KLogPanic, KErrArgument ); + } + break; + } + } + +void CMMCMonitorPlugin::StartMonitoringAllMMCsL( RArray& aMedias ) + { + WRITELOG( "CMMCMonitorPlugin::StartMonitoringAllMMCs" ); + TInt count( 0 ); + + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + + TDriveInfo driveInfo; + TDriveList driveList; + TInt numOfElements( 0 ); + DriveInfo::GetUserVisibleDrives( fs, + driveList, + numOfElements, + KDriveAttExclude | KDriveAttRemote | KDriveAttRom ); + + TInt i( 0 ); + TChar drive; + const TInt acount = driveList.Length(); + const TInt mediaCount = aMedias.Count(); + + // set removed medias to not present + for ( i = 0; i < mediaCount; i++ ) + { + TInt driveNum(0); + fs.CharToDrive( aMedias[i].iDrive, driveNum ); + TUint32 mediaId = FSUtil::MediaID( fs, driveNum ); + if ( mediaId != aMedias[i].iMediaId ) + { + iMdEClient->SetMediaL( aMedias[i].iMediaId, aMedias[i].iDrive, EFalse ); + } + } + + for ( i = 0; i < acount; i++ ) + { + if ( driveList[i] > 0 ) + { + TUint driveStatus( 0 ); + DriveInfo::GetDriveStatus( fs, i, driveStatus ); + + if ( driveStatus & DriveInfo::EDriveUsbMemory ) + { + driveList[i] = 0; + continue; + } + + fs.Drive( driveInfo, i ); + if ( driveInfo.iDriveAtt & KDriveAttRemovable && driveInfo.iType != EMediaNotPresent ) + { + count++; // DEBUG INFO + + fs.DriveToChar( i, drive ); + + // set media id to MdE + TUint32 mediaId = FSUtil::MediaID( fs, i ); + if ( mediaId != 0 ) + { + iMdEClient->SetMediaL( mediaId, drive, ETrue ); + + AddNotificationPathL( drive ); + } + } + } + } + + CleanupStack::PopAndDestroy( &fs ); + + WRITELOG1( "CMMCMonitorPlugin::StartMonitoringAllMMCs found %d MMCs", count ); + }