camerauis/cameraapp/generic/src/CamDriveChangeNotifier.cpp
branchRCL_3
changeset 54 bac7acad7cb3
equal deleted inserted replaced
53:61bc0f252b2b 54:bac7acad7cb3
       
     1 /*
       
     2 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include    <pathinfo.h>
       
    22 #include    <driveinfo.h>
       
    23 #include    <UsbWatcherInternalPSKeys.h>
       
    24 #include    <usbpersonalityids.h>
       
    25 
       
    26 #include    "CamDriveChangeNotifier.h"
       
    27 #include    "camlogging.h"
       
    28 #include    "CamUtility.h"
       
    29 
       
    30 
       
    31 _LIT(KDriveE, "E:\\");
       
    32 _LIT(KDriveF, "F:\\");
       
    33 
       
    34 const TInt KUSBTimeout = 1000000;  //1 sec
       
    35 
       
    36 // ============================ MEMBER FUNCTIONS ===============================
       
    37 
       
    38 // -----------------------------------------------------------------------------
       
    39 // CCamDriveChangeNotifier::CCamDiskChangeListener::NewL
       
    40 // -----------------------------------------------------------------------------
       
    41 //
       
    42 CCamDriveChangeNotifier::CCamDiskChangeListener* 
       
    43     CCamDriveChangeNotifier::CCamDiskChangeListener::NewLC(
       
    44                   RFs& aFs,
       
    45                   TDriveNumber aDrive,                                         
       
    46                   CCamDriveChangeNotifier& aObserver )
       
    47   {
       
    48   PRINT( _L( "Camera => CCamDiskChangeListener::NewLC" ) );
       
    49 
       
    50   CCamDiskChangeListener* self = 
       
    51         new( ELeave ) CCamDiskChangeListener( aFs, aDrive, aObserver );
       
    52   CleanupStack::PushL( self );
       
    53 
       
    54   PRINT( _L( "Camera <= CCamDiskChangeListener::NewLC" ) );
       
    55   return self;
       
    56   }
       
    57 
       
    58 // -----------------------------------------------------------------------------
       
    59 // CCamDriveChangeNotifier::CCamDiskChangeListener::~CCamDiskChangeListener
       
    60 // -----------------------------------------------------------------------------
       
    61 //
       
    62 CCamDriveChangeNotifier::CCamDiskChangeListener::~CCamDiskChangeListener()
       
    63   {
       
    64   PRINT( _L( "Camera => CCamDiskChangeListener::~CCamDiskChangeListener" ) );
       
    65   Cancel();
       
    66   PRINT( _L( "Camera <= CCamDiskChangeListener::~CCamDiskChangeListener" ) );
       
    67   }
       
    68 
       
    69 // -----------------------------------------------------------------------------
       
    70 // CCamDriveChangeNotifier::CCamDiskChangeListener::CCamDiskChangeListener
       
    71 // -----------------------------------------------------------------------------
       
    72 //
       
    73 CCamDriveChangeNotifier::CCamDiskChangeListener::CCamDiskChangeListener(
       
    74                   RFs& aFs,
       
    75                   TDriveNumber aDrive,                                         
       
    76                   CCamDriveChangeNotifier& aObserver )
       
    77     : CActive( CActive::EPriorityIdle ),
       
    78       iFs( aFs ),
       
    79       iDrive( aDrive ),
       
    80       iObserver( aObserver )                                          
       
    81   {
       
    82   CActiveScheduler::Add( this );
       
    83   }
       
    84     
       
    85 // -----------------------------------------------------------------------------
       
    86 // CCamDriveChangeNotifier::CCamDiskChangeListener::Start
       
    87 // -----------------------------------------------------------------------------
       
    88 //
       
    89 void CCamDriveChangeNotifier::CCamDiskChangeListener::Start()
       
    90   {
       
    91   PRINT( _L( "Camera => CCamDiskChangeListener::Start" ) );
       
    92   if ( !IsActive() )
       
    93     {
       
    94     PRINT( _L( "Camera <> CCamDiskChangeListener::Start SetActive()" ) );
       
    95         
       
    96     // Start listening for change events
       
    97     if(iDrive == EDriveE)
       
    98         {
       
    99         iFs.NotifyChange( ENotifyDisk, iStatus, KDriveE );
       
   100         }
       
   101     else if( iDrive == EDriveF )
       
   102         {
       
   103         iFs.NotifyChange( ENotifyDisk, iStatus, KDriveF );
       
   104         }
       
   105     else
       
   106         {
       
   107         iFs.NotifyChange( ENotifyDisk, iStatus );
       
   108         }
       
   109     
       
   110     SetActive();
       
   111     }
       
   112   PRINT( _L( "Camera <= CCamDiskChangeListener::Start" ) );
       
   113   }
       
   114 
       
   115 // -----------------------------------------------------------------------------
       
   116 // CCamDriveChangeNotifier::CCamDiskChangeListener::Stop
       
   117 // -----------------------------------------------------------------------------
       
   118 //
       
   119 void CCamDriveChangeNotifier::CCamDiskChangeListener::Stop()
       
   120   {
       
   121   PRINT( _L( "Camera => CCamDiskChangeListener::Stop" ) );
       
   122   Cancel();
       
   123   PRINT( _L( "Camera <= CCamDiskChangeListener::Stop" ) );
       
   124   }
       
   125 
       
   126 // -----------------------------------------------------------------------------
       
   127 // CCamDriveChangeNotifier:::CCamDiskChangeListener::DoCancel
       
   128 // -----------------------------------------------------------------------------
       
   129 //
       
   130 void CCamDriveChangeNotifier::CCamDiskChangeListener::DoCancel()
       
   131   {
       
   132   PRINT( _L( "Camera => CCamDiskChangeListener::DoCancel" ) );
       
   133   iFs.NotifyChangeCancel();
       
   134   PRINT( _L( "Camera <= CCamDiskChangeListener::DoCancel" ) );
       
   135   }
       
   136 
       
   137 // -----------------------------------------------------------------------------
       
   138 // CCamDriveChangeNotifier::CCamDiskChangeListener::RunL
       
   139 // -----------------------------------------------------------------------------
       
   140 //
       
   141 void CCamDriveChangeNotifier::CCamDiskChangeListener::RunL()
       
   142   {
       
   143   PRINT1( _L( "Camera => CCamDiskChangeListener::RunL, iStatus: %d" ), iStatus.Int() );
       
   144   TInt ret = KErrNone;
       
   145   
       
   146   if ( iStatus == KErrNone )
       
   147     {
       
   148     TUint driveStatus;  
       
   149     ret = DriveInfo::GetDriveStatus(iFs, iDrive, driveStatus );
       
   150     
       
   151     if( ret == KErrNone)
       
   152         {
       
   153         if( !( driveStatus & DriveInfo::EDrivePresent ) ||
       
   154                 ( ( driveStatus & DriveInfo::EDrivePresent ==  DriveInfo::EDrivePresent ) &&
       
   155                   ( driveStatus & DriveInfo::EDriveInUse ==  DriveInfo::EDriveInUse ) ) )
       
   156             {
       
   157             RDebug::Print(_L("CCamDiskChangeListener::RunL Dismount:%d"),iDrive);
       
   158             ret = iObserver.NotifyChangeL( MCamDriveChangeNotifierObserver::EDriveDismount );
       
   159             }
       
   160         else if( ( driveStatus & DriveInfo::EDrivePresent ) == DriveInfo::EDrivePresent )
       
   161             {
       
   162             RDebug::Print(_L("CCamDiskChangeListener::RunL Mount:%d"),iDrive);
       
   163             ret = iObserver.NotifyChangeL( MCamDriveChangeNotifierObserver::EDriveMount );
       
   164             }
       
   165         }
       
   166 
       
   167     if( ret == KErrNone )
       
   168       {
       
   169       Start();
       
   170       }
       
   171     }
       
   172   else if ( iStatus == KErrNotReady )
       
   173     {
       
   174     // Give other threads chance to run	
       
   175     User::After( 0 );	
       
   176     Start();
       
   177     }	
       
   178 
       
   179   PRINT( _L( "Camera <= CCamDiskChangeListener::RunL" ) );
       
   180   }
       
   181 
       
   182                 
       
   183 // -----------------------------------------------------------------------------
       
   184 // CCamDriveChangeNotifier::CCamDriveChangeNotifier
       
   185 // -----------------------------------------------------------------------------
       
   186 //
       
   187 CCamDriveChangeNotifier::CCamDriveChangeNotifier(
       
   188                                     RFs& aFs,
       
   189                                     MCamDriveChangeNotifierObserver& aObserver )
       
   190     : iObserver( aObserver ),
       
   191       iFs( aFs )
       
   192   {
       
   193   }
       
   194 
       
   195 // -----------------------------------------------------------------------------
       
   196 // CCamDriveChangeNotifier::NewL
       
   197 // -----------------------------------------------------------------------------
       
   198 //
       
   199 CCamDriveChangeNotifier* CCamDriveChangeNotifier::NewL(
       
   200                                   RFs& aFs,
       
   201                                   MCamDriveChangeNotifierObserver& aObserver )
       
   202   {
       
   203   PRINT( _L( "Camera => CCamDriveChangeNotifier::NewL" ) );
       
   204 
       
   205   CCamDriveChangeNotifier* self =
       
   206                       new( ELeave ) CCamDriveChangeNotifier( aFs, aObserver );
       
   207   
       
   208   self->ConstructL();
       
   209   
       
   210   PRINT( _L( "Camera <= CCamDriveChangeNotifier::NewL" ) );
       
   211   return self;
       
   212   }
       
   213 
       
   214 
       
   215 // Destructor
       
   216 CCamDriveChangeNotifier::~CCamDriveChangeNotifier()
       
   217   {
       
   218   PRINT( _L( "Camera => CCamDriveChangeNotifier::~CCamDriveChangeNotifier" ) );
       
   219   CancelMonitoring();
       
   220   iListeners.ResetAndDestroy();
       
   221   if( iUsbMSWatcher )
       
   222       {
       
   223       if( iUsbMSWatcher->IsActive() )
       
   224           {
       
   225           iUsbMSWatcher->Cancel();
       
   226           }
       
   227       delete iUsbMSWatcher;
       
   228       iUsbMSWatcher = NULL;
       
   229       }
       
   230   if ( iUSBTimer )
       
   231       {
       
   232       if( iUSBTimer->IsActive() )
       
   233           {
       
   234           iUSBTimer->Cancel();
       
   235           }
       
   236       delete iUSBTimer;
       
   237       iUSBTimer = NULL;
       
   238       }
       
   239   PRINT( _L( "Camera <= CCamDriveChangeNotifier::~CCamDriveChangeNotifier" ) );
       
   240   }
       
   241 
       
   242 // -----------------------------------------------------------------------------
       
   243 // CCamDriveChangeNotifier::StartMonitoring
       
   244 // -----------------------------------------------------------------------------
       
   245 //
       
   246 void CCamDriveChangeNotifier::StartMonitoring()
       
   247   {
       
   248   PRINT( _L( "Camera => CCamDriveChangeNotifier::StartMonitoring" ) );
       
   249 
       
   250   for ( TInt i = iListeners.Count(); --i >= 0; )
       
   251     {
       
   252     iListeners[i]->Start();
       
   253     }
       
   254   
       
   255   iUsbMSWatcher->Subscribe();
       
   256   
       
   257   PRINT( _L( "Camera <= CCamDriveChangeNotifier::StartMonitoring" ) );
       
   258   }
       
   259 
       
   260 // -----------------------------------------------------------------------------
       
   261 // CCamDriveChangeNotifier::CancelMonitoring
       
   262 // -----------------------------------------------------------------------------
       
   263 //
       
   264 void CCamDriveChangeNotifier::CancelMonitoring()
       
   265   {
       
   266   PRINT( _L( "Camera => CCamDriveChangeNotifier::CancelMonitoring" ) );
       
   267 
       
   268   for ( TInt i = iListeners.Count(); --i >= 0; )
       
   269     {
       
   270     iListeners[i]->Stop();
       
   271     }
       
   272   //iUsbMSWatcher->Cancel();
       
   273   PRINT( _L( "Camera <= CCamDriveChangeNotifier::CancelMonitoring" ) );
       
   274   }
       
   275     
       
   276 // -----------------------------------------------------------------------------
       
   277 // CCamDriveChangeNotifier::NotifyChangeL
       
   278 // -----------------------------------------------------------------------------
       
   279 //
       
   280 TInt CCamDriveChangeNotifier::NotifyChangeL( 
       
   281                   MCamDriveChangeNotifierObserver::TCamDriveChangeType aType )
       
   282   {
       
   283   PRINT( _L( "Camera => CCamDriveChangeNotifier::NotifyChangeL" ) );
       
   284   TInt ret = iObserver.DriveChangeL( aType );
       
   285   if ( ret == KErrNone && aType == 
       
   286                             MCamDriveChangeNotifierObserver::EDriveDismount )
       
   287     {
       
   288     PRINT( _L("Camera <> iFs.AllowDismount( EDriveE )") )
       
   289     iFs.AllowDismount( EDriveE );
       
   290     PRINT( _L("Camera <> iFs.AllowDismount( EDriveD )") )
       
   291     iFs.AllowDismount( EDriveF );
       
   292     }
       
   293         
       
   294   PRINT( _L( "Camera <= CCamDriveChangeNotifier::NotifyChangeL" ) );        
       
   295   return ret;
       
   296   }
       
   297 
       
   298 // -----------------------------------------------------------------------------
       
   299 // CCamDriveChangeNotifier::SendAllowDismount
       
   300 // -----------------------------------------------------------------------------
       
   301 //
       
   302 void CCamDriveChangeNotifier::SendAllowDismount()
       
   303   {
       
   304   PRINT( _L( "Camera => CCamDriveChangeNotifier::SendAllowDismount" ) );
       
   305   iFs.AllowDismount( EDriveE );
       
   306   iFs.AllowDismount( EDriveF );
       
   307   StartMonitoring();
       
   308   PRINT( _L( "Camera <= CCamDriveChangeNotifier::SendAllowDismount" ) );
       
   309   }
       
   310 
       
   311 // -----------------------------------------------------------------------------
       
   312 // CCamDriveChangeNotifier::HandlePropertyChangedL
       
   313 // -----------------------------------------------------------------------------
       
   314 //
       
   315 void CCamDriveChangeNotifier::HandlePropertyChangedL( const TUid& aCategory, const TUint aKey )
       
   316     {
       
   317     PRINT( _L( "Camera => CCamDriveChangeNotifier::HandlePropertyChangedL" ) );
       
   318     if(KPSUidUsbWatcher == aCategory && 
       
   319        KUsbWatcherSelectedPersonality == aKey)
       
   320         {
       
   321         TInt value = 0;
       
   322         iUsbMSWatcher->Get( value );
       
   323         if( KUsbPersonalityIdMS == value )
       
   324             {
       
   325             PRINT( _L( "Camera => CCamDriveChangeNotifier::HandlePropertyChangedL StartTimer" ) );
       
   326             iUSBTimer->Cancel();
       
   327             iUSBTimer->StartTimer();
       
   328             }
       
   329         else
       
   330             {
       
   331             if( iMassStorageModeOn )
       
   332                 {
       
   333                 PRINT( _L("CCamDriveChangeNotifier::HandlePropertyChangedL KUsbPersonalityIdMS Off") );
       
   334                 iMassStorageModeOn = EFalse;
       
   335                 iObserver.DriveChangeL( MCamDriveChangeNotifierObserver::EDriveUSBMassStorageModeOff );
       
   336                 }
       
   337             }
       
   338         }
       
   339     
       
   340     PRINT( _L( "Camera <= CCamDriveChangeNotifier::HandlePropertyChangedL" ) );
       
   341     }
       
   342 
       
   343 // -----------------------------------------------------------------------------
       
   344 // CCamDriveChangeNotifier::ConstructL
       
   345 // -----------------------------------------------------------------------------
       
   346 //
       
   347 void CCamDriveChangeNotifier::ConstructL()
       
   348     {
       
   349     
       
   350     iListeners.AppendL( CCamDiskChangeListener::NewLC( iFs, EDriveE, 
       
   351                           *this ) );
       
   352     
       
   353     iListeners.AppendL( CCamDiskChangeListener::NewLC( iFs, EDriveF, 
       
   354                          *this ) );  
       
   355     
       
   356     iUsbMSWatcher = CCamPropertyWatcher::NewL(*this, KPSUidUsbWatcher, 
       
   357                         KUsbWatcherSelectedPersonality );
       
   358     
       
   359     iUSBTimer = CCamTimer::NewL( KUSBTimeout, TCallBack(USBTimerCallBack, this));
       
   360     CleanupStack::Pop(); // listener
       
   361     CleanupStack::Pop(); // listener 2
       
   362     //if USB has been inserted as Mass Storage, USB timer need to start
       
   363     TInt value = 0;
       
   364     iUsbMSWatcher->Get( value );
       
   365     if( iUSBTimer && KUsbPersonalityIdMS == value ) 
       
   366         {
       
   367         iUSBTimer->Cancel();
       
   368         iUSBTimer->StartTimer();
       
   369         }
       
   370     
       
   371     StartMonitoring();
       
   372 
       
   373     }
       
   374 
       
   375 // -----------------------------------------------------------------------------
       
   376 // CCamDriveChangeNotifier::USBTimerCallBackL
       
   377 // -----------------------------------------------------------------------------
       
   378 //
       
   379 void CCamDriveChangeNotifier::USBTimerCallBackL()
       
   380     {
       
   381     TInt value = 0;
       
   382     iUsbMSWatcher->Get( value );
       
   383     if( KUsbPersonalityIdMS == value )
       
   384         {
       
   385         PRINT( _L("CCamDriveChangeNotifier::USBTimerCallBackL KUsbPersonalityIdMS On") );
       
   386         iMassStorageModeOn = ETrue;
       
   387         iObserver.DriveChangeL( MCamDriveChangeNotifierObserver::EDriveUSBMassStorageModeOn );
       
   388         }
       
   389     else
       
   390         {
       
   391         if( iMassStorageModeOn )
       
   392             {
       
   393             PRINT( _L("CCamDriveChangeNotifier::USBTimerCallBackL KUsbPersonalityIdMS Off") );
       
   394             iMassStorageModeOn = EFalse;
       
   395             iObserver.DriveChangeL( MCamDriveChangeNotifierObserver::EDriveUSBMassStorageModeOff );
       
   396             }
       
   397         }
       
   398     }
       
   399         
       
   400 // -----------------------------------------------------------------------------
       
   401 // CCamDriveChangeNotifier::USBTimerCallBack
       
   402 // -----------------------------------------------------------------------------
       
   403 //
       
   404 TInt CCamDriveChangeNotifier::USBTimerCallBack( TAny* aPtr )
       
   405     {
       
   406     CCamDriveChangeNotifier* self = static_cast<CCamDriveChangeNotifier*>(aPtr);
       
   407     if( self )
       
   408         {
       
   409         TRAP_IGNORE( self->USBTimerCallBackL() );
       
   410         }
       
   411     return KErrNone;
       
   412     }
       
   413 
       
   414 //  End of File