diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraapp/generic/src/CamDriveChangeNotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camerauis/cameraapp/generic/src/CamDriveChangeNotifier.cpp Wed Sep 01 12:30:54 2010 +0100 @@ -0,0 +1,414 @@ +/* +* Copyright (c) 2008 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: +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include + +#include "CamDriveChangeNotifier.h" +#include "camlogging.h" +#include "CamUtility.h" + + +_LIT(KDriveE, "E:\\"); +_LIT(KDriveF, "F:\\"); + +const TInt KUSBTimeout = 1000000; //1 sec + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::CCamDiskChangeListener::NewL +// ----------------------------------------------------------------------------- +// +CCamDriveChangeNotifier::CCamDiskChangeListener* + CCamDriveChangeNotifier::CCamDiskChangeListener::NewLC( + RFs& aFs, + TDriveNumber aDrive, + CCamDriveChangeNotifier& aObserver ) + { + PRINT( _L( "Camera => CCamDiskChangeListener::NewLC" ) ); + + CCamDiskChangeListener* self = + new( ELeave ) CCamDiskChangeListener( aFs, aDrive, aObserver ); + CleanupStack::PushL( self ); + + PRINT( _L( "Camera <= CCamDiskChangeListener::NewLC" ) ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::CCamDiskChangeListener::~CCamDiskChangeListener +// ----------------------------------------------------------------------------- +// +CCamDriveChangeNotifier::CCamDiskChangeListener::~CCamDiskChangeListener() + { + PRINT( _L( "Camera => CCamDiskChangeListener::~CCamDiskChangeListener" ) ); + Cancel(); + PRINT( _L( "Camera <= CCamDiskChangeListener::~CCamDiskChangeListener" ) ); + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::CCamDiskChangeListener::CCamDiskChangeListener +// ----------------------------------------------------------------------------- +// +CCamDriveChangeNotifier::CCamDiskChangeListener::CCamDiskChangeListener( + RFs& aFs, + TDriveNumber aDrive, + CCamDriveChangeNotifier& aObserver ) + : CActive( CActive::EPriorityIdle ), + iFs( aFs ), + iDrive( aDrive ), + iObserver( aObserver ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::CCamDiskChangeListener::Start +// ----------------------------------------------------------------------------- +// +void CCamDriveChangeNotifier::CCamDiskChangeListener::Start() + { + PRINT( _L( "Camera => CCamDiskChangeListener::Start" ) ); + if ( !IsActive() ) + { + PRINT( _L( "Camera <> CCamDiskChangeListener::Start SetActive()" ) ); + + // Start listening for change events + if(iDrive == EDriveE) + { + iFs.NotifyChange( ENotifyDisk, iStatus, KDriveE ); + } + else if( iDrive == EDriveF ) + { + iFs.NotifyChange( ENotifyDisk, iStatus, KDriveF ); + } + else + { + iFs.NotifyChange( ENotifyDisk, iStatus ); + } + + SetActive(); + } + PRINT( _L( "Camera <= CCamDiskChangeListener::Start" ) ); + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::CCamDiskChangeListener::Stop +// ----------------------------------------------------------------------------- +// +void CCamDriveChangeNotifier::CCamDiskChangeListener::Stop() + { + PRINT( _L( "Camera => CCamDiskChangeListener::Stop" ) ); + Cancel(); + PRINT( _L( "Camera <= CCamDiskChangeListener::Stop" ) ); + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier:::CCamDiskChangeListener::DoCancel +// ----------------------------------------------------------------------------- +// +void CCamDriveChangeNotifier::CCamDiskChangeListener::DoCancel() + { + PRINT( _L( "Camera => CCamDiskChangeListener::DoCancel" ) ); + iFs.NotifyChangeCancel(); + PRINT( _L( "Camera <= CCamDiskChangeListener::DoCancel" ) ); + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::CCamDiskChangeListener::RunL +// ----------------------------------------------------------------------------- +// +void CCamDriveChangeNotifier::CCamDiskChangeListener::RunL() + { + PRINT1( _L( "Camera => CCamDiskChangeListener::RunL, iStatus: %d" ), iStatus.Int() ); + TInt ret = KErrNone; + + if ( iStatus == KErrNone ) + { + TUint driveStatus; + ret = DriveInfo::GetDriveStatus(iFs, iDrive, driveStatus ); + + if( ret == KErrNone) + { + if( !( driveStatus & DriveInfo::EDrivePresent ) || + ( ( driveStatus & DriveInfo::EDrivePresent == DriveInfo::EDrivePresent ) && + ( driveStatus & DriveInfo::EDriveInUse == DriveInfo::EDriveInUse ) ) ) + { + RDebug::Print(_L("CCamDiskChangeListener::RunL Dismount:%d"),iDrive); + ret = iObserver.NotifyChangeL( MCamDriveChangeNotifierObserver::EDriveDismount ); + } + else if( ( driveStatus & DriveInfo::EDrivePresent ) == DriveInfo::EDrivePresent ) + { + RDebug::Print(_L("CCamDiskChangeListener::RunL Mount:%d"),iDrive); + ret = iObserver.NotifyChangeL( MCamDriveChangeNotifierObserver::EDriveMount ); + } + } + + if( ret == KErrNone ) + { + Start(); + } + } + else if ( iStatus == KErrNotReady ) + { + // Give other threads chance to run + User::After( 0 ); + Start(); + } + + PRINT( _L( "Camera <= CCamDiskChangeListener::RunL" ) ); + } + + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::CCamDriveChangeNotifier +// ----------------------------------------------------------------------------- +// +CCamDriveChangeNotifier::CCamDriveChangeNotifier( + RFs& aFs, + MCamDriveChangeNotifierObserver& aObserver ) + : iObserver( aObserver ), + iFs( aFs ) + { + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::NewL +// ----------------------------------------------------------------------------- +// +CCamDriveChangeNotifier* CCamDriveChangeNotifier::NewL( + RFs& aFs, + MCamDriveChangeNotifierObserver& aObserver ) + { + PRINT( _L( "Camera => CCamDriveChangeNotifier::NewL" ) ); + + CCamDriveChangeNotifier* self = + new( ELeave ) CCamDriveChangeNotifier( aFs, aObserver ); + + self->ConstructL(); + + PRINT( _L( "Camera <= CCamDriveChangeNotifier::NewL" ) ); + return self; + } + + +// Destructor +CCamDriveChangeNotifier::~CCamDriveChangeNotifier() + { + PRINT( _L( "Camera => CCamDriveChangeNotifier::~CCamDriveChangeNotifier" ) ); + CancelMonitoring(); + iListeners.ResetAndDestroy(); + if( iUsbMSWatcher ) + { + if( iUsbMSWatcher->IsActive() ) + { + iUsbMSWatcher->Cancel(); + } + delete iUsbMSWatcher; + iUsbMSWatcher = NULL; + } + if ( iUSBTimer ) + { + if( iUSBTimer->IsActive() ) + { + iUSBTimer->Cancel(); + } + delete iUSBTimer; + iUSBTimer = NULL; + } + PRINT( _L( "Camera <= CCamDriveChangeNotifier::~CCamDriveChangeNotifier" ) ); + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::StartMonitoring +// ----------------------------------------------------------------------------- +// +void CCamDriveChangeNotifier::StartMonitoring() + { + PRINT( _L( "Camera => CCamDriveChangeNotifier::StartMonitoring" ) ); + + for ( TInt i = iListeners.Count(); --i >= 0; ) + { + iListeners[i]->Start(); + } + + iUsbMSWatcher->Subscribe(); + + PRINT( _L( "Camera <= CCamDriveChangeNotifier::StartMonitoring" ) ); + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::CancelMonitoring +// ----------------------------------------------------------------------------- +// +void CCamDriveChangeNotifier::CancelMonitoring() + { + PRINT( _L( "Camera => CCamDriveChangeNotifier::CancelMonitoring" ) ); + + for ( TInt i = iListeners.Count(); --i >= 0; ) + { + iListeners[i]->Stop(); + } + //iUsbMSWatcher->Cancel(); + PRINT( _L( "Camera <= CCamDriveChangeNotifier::CancelMonitoring" ) ); + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::NotifyChangeL +// ----------------------------------------------------------------------------- +// +TInt CCamDriveChangeNotifier::NotifyChangeL( + MCamDriveChangeNotifierObserver::TCamDriveChangeType aType ) + { + PRINT( _L( "Camera => CCamDriveChangeNotifier::NotifyChangeL" ) ); + TInt ret = iObserver.DriveChangeL( aType ); + if ( ret == KErrNone && aType == + MCamDriveChangeNotifierObserver::EDriveDismount ) + { + PRINT( _L("Camera <> iFs.AllowDismount( EDriveE )") ) + iFs.AllowDismount( EDriveE ); + PRINT( _L("Camera <> iFs.AllowDismount( EDriveD )") ) + iFs.AllowDismount( EDriveF ); + } + + PRINT( _L( "Camera <= CCamDriveChangeNotifier::NotifyChangeL" ) ); + return ret; + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::SendAllowDismount +// ----------------------------------------------------------------------------- +// +void CCamDriveChangeNotifier::SendAllowDismount() + { + PRINT( _L( "Camera => CCamDriveChangeNotifier::SendAllowDismount" ) ); + iFs.AllowDismount( EDriveE ); + iFs.AllowDismount( EDriveF ); + StartMonitoring(); + PRINT( _L( "Camera <= CCamDriveChangeNotifier::SendAllowDismount" ) ); + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::HandlePropertyChangedL +// ----------------------------------------------------------------------------- +// +void CCamDriveChangeNotifier::HandlePropertyChangedL( const TUid& aCategory, const TUint aKey ) + { + PRINT( _L( "Camera => CCamDriveChangeNotifier::HandlePropertyChangedL" ) ); + if(KPSUidUsbWatcher == aCategory && + KUsbWatcherSelectedPersonality == aKey) + { + TInt value = 0; + iUsbMSWatcher->Get( value ); + if( KUsbPersonalityIdMS == value ) + { + PRINT( _L( "Camera => CCamDriveChangeNotifier::HandlePropertyChangedL StartTimer" ) ); + iUSBTimer->Cancel(); + iUSBTimer->StartTimer(); + } + else + { + if( iMassStorageModeOn ) + { + PRINT( _L("CCamDriveChangeNotifier::HandlePropertyChangedL KUsbPersonalityIdMS Off") ); + iMassStorageModeOn = EFalse; + iObserver.DriveChangeL( MCamDriveChangeNotifierObserver::EDriveUSBMassStorageModeOff ); + } + } + } + + PRINT( _L( "Camera <= CCamDriveChangeNotifier::HandlePropertyChangedL" ) ); + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::ConstructL +// ----------------------------------------------------------------------------- +// +void CCamDriveChangeNotifier::ConstructL() + { + + iListeners.AppendL( CCamDiskChangeListener::NewLC( iFs, EDriveE, + *this ) ); + + iListeners.AppendL( CCamDiskChangeListener::NewLC( iFs, EDriveF, + *this ) ); + + iUsbMSWatcher = CCamPropertyWatcher::NewL(*this, KPSUidUsbWatcher, + KUsbWatcherSelectedPersonality ); + + iUSBTimer = CCamTimer::NewL( KUSBTimeout, TCallBack(USBTimerCallBack, this)); + CleanupStack::Pop(); // listener + CleanupStack::Pop(); // listener 2 + //if USB has been inserted as Mass Storage, USB timer need to start + TInt value = 0; + iUsbMSWatcher->Get( value ); + if( iUSBTimer && KUsbPersonalityIdMS == value ) + { + iUSBTimer->Cancel(); + iUSBTimer->StartTimer(); + } + + StartMonitoring(); + + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::USBTimerCallBackL +// ----------------------------------------------------------------------------- +// +void CCamDriveChangeNotifier::USBTimerCallBackL() + { + TInt value = 0; + iUsbMSWatcher->Get( value ); + if( KUsbPersonalityIdMS == value ) + { + PRINT( _L("CCamDriveChangeNotifier::USBTimerCallBackL KUsbPersonalityIdMS On") ); + iMassStorageModeOn = ETrue; + iObserver.DriveChangeL( MCamDriveChangeNotifierObserver::EDriveUSBMassStorageModeOn ); + } + else + { + if( iMassStorageModeOn ) + { + PRINT( _L("CCamDriveChangeNotifier::USBTimerCallBackL KUsbPersonalityIdMS Off") ); + iMassStorageModeOn = EFalse; + iObserver.DriveChangeL( MCamDriveChangeNotifierObserver::EDriveUSBMassStorageModeOff ); + } + } + } + +// ----------------------------------------------------------------------------- +// CCamDriveChangeNotifier::USBTimerCallBack +// ----------------------------------------------------------------------------- +// +TInt CCamDriveChangeNotifier::USBTimerCallBack( TAny* aPtr ) + { + CCamDriveChangeNotifier* self = static_cast(aPtr); + if( self ) + { + TRAP_IGNORE( self->USBTimerCallBackL() ); + } + return KErrNone; + } + +// End of File