camerauis/cameraapp/generic/src/CamDriveChangeNotifier.cpp
branchRCL_3
changeset 20 38fb6f7eacd5
parent 0 1ddebce53859
child 25 bf64cebf4673
--- a/camerauis/cameraapp/generic/src/CamDriveChangeNotifier.cpp	Wed Apr 14 15:41:04 2010 +0300
+++ b/camerauis/cameraapp/generic/src/CamDriveChangeNotifier.cpp	Tue Apr 27 16:19:06 2010 +0300
@@ -19,12 +19,18 @@
 
 // INCLUDE FILES
 #include    <pathinfo.h>
+#include    <driveinfo.h>
+#include    <usbwatcherinternalpskeys.h>
+#include    <usbpersonalityids.h>
 
 #include    "CamDriveChangeNotifier.h"
 #include    "camlogging.h"
 #include    "CamUtility.h"
 
 
+_LIT(KDriveE, "E:\\");
+_LIT(KDriveF, "F:\\");
+
 // ============================ MEMBER FUNCTIONS ===============================
 
 // -----------------------------------------------------------------------------
@@ -35,13 +41,12 @@
     CCamDriveChangeNotifier::CCamDiskChangeListener::NewLC(
                   RFs& aFs,
                   TDriveNumber aDrive,                                         
-                  MCamDriveChangeNotifierObserver::TCamDriveChangeType aType,
                   CCamDriveChangeNotifier& aObserver )
   {
   PRINT( _L( "Camera => CCamDiskChangeListener::NewLC" ) );
 
   CCamDiskChangeListener* self = 
-        new( ELeave ) CCamDiskChangeListener( aFs, aDrive, aType, aObserver );
+        new( ELeave ) CCamDiskChangeListener( aFs, aDrive, aObserver );
   CleanupStack::PushL( self );
 
   PRINT( _L( "Camera <= CCamDiskChangeListener::NewLC" ) );
@@ -66,12 +71,10 @@
 CCamDriveChangeNotifier::CCamDiskChangeListener::CCamDiskChangeListener(
                   RFs& aFs,
                   TDriveNumber aDrive,                                         
-                  MCamDriveChangeNotifierObserver::TCamDriveChangeType aType,
                   CCamDriveChangeNotifier& aObserver )
     : CActive( CActive::EPriorityIdle ),
       iFs( aFs ),
       iDrive( aDrive ),
-      iType( aType ),
       iObserver( aObserver )                                          
   {
   CActiveScheduler::Add( this );
@@ -89,7 +92,19 @@
     PRINT( _L( "Camera <> CCamDiskChangeListener::Start SetActive()" ) );
         
     // Start listening for change events
-    iFs.NotifyChange( ENotifyDisk, iStatus );
+    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" ) );
@@ -123,13 +138,30 @@
 //
 void CCamDriveChangeNotifier::CCamDiskChangeListener::RunL()
   {
-  PRINT2( _L( "Camera => CCamDiskChangeListener::RunL iType: %d, iStatus: %d" ), iType, iStatus.Int() );
+  PRINT1( _L( "Camera => CCamDiskChangeListener::RunL, iStatus: %d" ), iStatus.Int() );
   TInt ret = KErrNone;
   
   if ( iStatus == KErrNone )
     {
-    ret = iObserver.NotifyChangeL( iType );
-        
+    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();
@@ -145,6 +177,7 @@
   PRINT( _L( "Camera <= CCamDiskChangeListener::RunL" ) );
   }
 
+                
 // -----------------------------------------------------------------------------
 // CCamDriveChangeNotifier::CCamDriveChangeNotifier
 // -----------------------------------------------------------------------------
@@ -170,17 +203,8 @@
   CCamDriveChangeNotifier* self =
                       new( ELeave ) CCamDriveChangeNotifier( aFs, aObserver );
   
-  self->iListeners.AppendL( CCamDiskChangeListener::NewLC( self->iFs, EDriveE, 
-                      MCamDriveChangeNotifierObserver::EDriveMount, *self ) );
-    
-  self->iListeners.AppendL( CCamDiskChangeListener::NewLC( self->iFs, EDriveD, 
-                      MCamDriveChangeNotifierObserver::EDriveMount, *self ) );
+  self->ConstructL();
   
-  CleanupStack::Pop(); // listener
-  CleanupStack::Pop(); // listener 2
-    
-  self->StartMonitoring();
-
   PRINT( _L( "Camera <= CCamDriveChangeNotifier::NewL" ) );
   return self;
   }
@@ -192,6 +216,15 @@
   PRINT( _L( "Camera => CCamDriveChangeNotifier::~CCamDriveChangeNotifier" ) );
   CancelMonitoring();
   iListeners.ResetAndDestroy();
+  if( iUsbMSWatcher )
+      {
+      if( iUsbMSWatcher->IsActive() )
+          {
+          iUsbMSWatcher->Cancel();
+          }
+      delete iUsbMSWatcher;
+      iUsbMSWatcher = NULL;
+      }
   PRINT( _L( "Camera <= CCamDriveChangeNotifier::~CCamDriveChangeNotifier" ) );
   }
 
@@ -207,7 +240,9 @@
     {
     iListeners[i]->Start();
     }
-
+  
+  iUsbMSWatcher->Subscribe();
+  
   PRINT( _L( "Camera <= CCamDriveChangeNotifier::StartMonitoring" ) );
   }
 
@@ -223,7 +258,7 @@
     {
     iListeners[i]->Stop();
     }
-
+  //iUsbMSWatcher->Cancel();
   PRINT( _L( "Camera <= CCamDriveChangeNotifier::CancelMonitoring" ) );
   }
     
@@ -242,7 +277,7 @@
     PRINT( _L("Camera <> iFs.AllowDismount( EDriveE )") )
     iFs.AllowDismount( EDriveE );
     PRINT( _L("Camera <> iFs.AllowDismount( EDriveD )") )
-    iFs.AllowDismount( EDriveD );
+    iFs.AllowDismount( EDriveF );
     }
         
   PRINT( _L( "Camera <= CCamDriveChangeNotifier::NotifyChangeL" ) );        
@@ -257,8 +292,61 @@
   {
   PRINT( _L( "Camera => CCamDriveChangeNotifier::SendAllowDismount" ) );
   iFs.AllowDismount( EDriveE );
-  iFs.AllowDismount( EDriveD );
+  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" ) );
+    TInt value = 0;
+    if(KPSUidUsbWatcher == aCategory && 
+       KUsbWatcherSelectedPersonality == aKey)
+        {
+        iUsbMSWatcher->Get( value );
+        if( KUsbPersonalityIdMS == value )
+            {
+            iMassStorageModeOn = ETrue;
+            iObserver.DriveChangeL( MCamDriveChangeNotifierObserver::EDriveUSBMassStorageModeOn );
+            }
+        else
+            {
+            if( iMassStorageModeOn )
+                {
+                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 );
+    
+    CleanupStack::Pop(); // listener
+    CleanupStack::Pop(); // listener 2
+    
+    StartMonitoring();
+
+    }
 //  End of File