camerauis/cameraapp/generic/src/CamDriveChangeNotifier.cpp
branchRCL_3
changeset 24 bac7acad7cb3
--- /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    <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:\\");
+
+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<CCamDriveChangeNotifier*>(aPtr);
+    if( self )
+        {
+        TRAP_IGNORE( self->USBTimerCallBackL() );
+        }
+    return KErrNone;
+    }
+
+//  End of File