webengine/wrtharvester/src/wrtusbhandler.cpp
branchRCL_3
changeset 93 79859ed3eea9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/wrtharvester/src/wrtusbhandler.cpp	Tue Aug 31 16:17:46 2010 +0300
@@ -0,0 +1,262 @@
+//
+// ============================================================================
+//  Name     : WidgetMMCHandler.cpp
+//  Part of  : SW Installer UIs / WidgetInstallerUI
+//
+//  Description: Handle notifications of MMC events.
+//
+//
+//  Version     : 3.1
+//
+//  Copyright © 2006 Nokia Corporation.
+//  This material, including documentation and any related
+//  computer programs, is protected by copyright controlled by
+//  Nokia Corporation. All rights are reserved. Copying,
+//  including reproducing, storing, adapting or translating, any
+//  or all of this material requires the prior written consent of
+//  Nokia Corporation. This material also contains confidential
+//  information which may not be disclosed to others without the
+//  prior written consent of Nokia Corporation.
+// ==============================================================================
+///
+
+// INCLUDE FILES
+#include "wrtusbhandler.h"
+#include "wrtharvester.h"
+#include "wrtusbhandler.h"
+#include <driveinfo.h>
+
+// CONSTANTS
+
+
+static TInt TimerCallBack( TAny* ptr )
+{    
+    CWrtUsbHandler* temp = static_cast<CWrtUsbHandler*>(ptr);
+    if(temp)
+        {
+        temp->DeleteTimer();
+        temp->DoScanAndUpdate();       
+        }
+    return 0;    
+}
+// ============================================================================
+// CWrtUsbHandler::NewL()
+// two-phase constructor
+//
+// @since 3.1
+// @param aRegistry - Widget registry for callback.
+// @param aFs - file session
+// @return pointer to CWrtUsbHandler
+// ============================================================================
+//
+CWrtUsbHandler* CWrtUsbHandler::NewL(
+    CWrtHarvester* aHarvester,
+    RFs& aFs )
+    {
+    CWrtUsbHandler* self =
+        new(ELeave) CWrtUsbHandler( aHarvester , aFs );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ============================================================================
+// CWrtUsbHandler::CWrtUsbHandler()
+// C++ default constructor
+//
+// @since 3.1
+// ============================================================================
+//
+CWrtUsbHandler::CWrtUsbHandler( CWrtHarvester* aHarvester,
+                                      RFs& aFs )
+    : CActive( CActive::EPriorityUserInput ),
+      iHarvester( aHarvester ),
+      iFs( aFs ),
+      iDriveFlags( 0 )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// ============================================================================
+// CWrtUsbHandler::ConstructL()
+// Symbian default constructor
+//
+// @since 3.1
+// ============================================================================
+//
+void CWrtUsbHandler::ConstructL()
+    {
+    if ( KErrNone != ScanDrives( iDriveFlags ) )
+        {
+        iDriveFlags = 0;
+        }        
+    }
+
+// ============================================================================
+// CWrtUsbHandler::~CWrtUsbHandler()
+// destructor
+//
+// @since 3.1
+// ============================================================================
+CWrtUsbHandler::~CWrtUsbHandler()
+    {
+    Cancel();
+    }
+
+// ============================================================================
+// CWrtUsbHandler::Start()
+// Start monitoring.
+//
+// @since 5.0
+// ============================================================================
+void CWrtUsbHandler::Start()
+    {
+    iFs.NotifyChange( ENotifyDisk, iStatus );
+    SetActive();
+    }
+
+// ============================================================================
+// CWrtUsbHandler::RunL()
+// Handle notifications of MMC events.
+//
+// @since 3.1
+// ============================================================================
+void CWrtUsbHandler::RunL()
+    {
+    if ( iStatus == KErrNone )
+        {
+        //Call back Timer
+        iCallBackTimer = CPeriodic::NewL(CActive::EPriorityLow);
+        iCallBackTimer->Start(10000000,0,TCallBack(&TimerCallBack,this));         
+        }
+    }
+
+void CWrtUsbHandler::DoScanAndUpdate()
+    {
+    TInt err = 0;
+    TInt driveFlags = 0;
+    TInt deltaDriveFlags = 0;
+    if ( KErrNone == ScanDrives( driveFlags ) )
+        {
+        deltaDriveFlags = iDriveFlags ^ driveFlags;
+        iDriveFlags = driveFlags;
+        }
+    
+    if ( deltaDriveFlags )
+        {           
+        //Unpluging USB from Mass storage . . . 
+        if(iHarvester->IsInMSMode() == 1)
+            {                  
+            iHarvester->SetMSMode(0);
+            iHarvester->ClearAllOperations();
+            TRAP(err, iHarvester->UpdateL() );            
+            iFs.NotifyChange( ENotifyDisk, iStatus );
+            SetActive();
+            return;
+            }
+
+        TVolumeInfo volInfo;
+        TInt temp = deltaDriveFlags;
+        TBool massMemAltered = EFalse;        
+        for(TInt DriveNo = EDriveA+1 ; DriveNo<=EDriveY; DriveNo++ )
+            {   
+            temp =  temp >> 1;
+            if( temp & 01)
+                {
+                TUint status(0);
+                err = DriveInfo::GetDriveStatus( iFs, DriveNo , status );
+                if(!err && (status & DriveInfo::EDriveExternallyMountable) && (status & DriveInfo::EDriveInternal ))
+                    {
+                    //Internal Memory
+                    massMemAltered = ETrue;
+                    }                     
+                }            
+            }
+       if( massMemAltered )
+           {           
+           iHarvester->SetMSMode(1);            
+           }
+       
+        TRAP( err, iHarvester->UpdateL() ); 
+        }
+    iFs.NotifyChange( ENotifyDisk, iStatus );
+    SetActive();
+    }
+
+
+// ============================================================================
+// CWrtUsbHandler::RunError()
+// Ignore errors from RunL.
+//
+// @since 5.0
+// ============================================================================
+TInt CWrtUsbHandler::RunError( TInt /* aError */ )
+    {
+    return KErrNone; // indicates error was handled
+    }
+
+// ============================================================================
+// CWrtUsbHandler::DoCancel()
+// Cancel the MMC event handler
+//
+// @since 3.1
+// ============================================================================
+void CWrtUsbHandler::DoCancel()
+    {
+    iFs.NotifyChangeCancel();
+    }
+
+/* Scans drives and records a bit flag for those that exist and are
+ * suitable for installing widgets to.
+ */
+TInt CWrtUsbHandler::ScanDrives( TInt& aDriveFlags )
+    {
+    // List all drives in the system
+    TDriveList driveList;
+    TInt error = iFs.DriveList( driveList );
+    if ( KErrNone == error )
+        {
+        for ( TInt driveNumber = EDriveY;
+              driveNumber >= EDriveA;
+              driveNumber-- )
+            {
+            // The drives that will be filtered out are the same ones that
+            // WidgetInstaller filters out in CWidgetUIHandler::SelectDriveL()
+            if ( (EDriveD == driveNumber)
+                 || !driveList[driveNumber] )
+                {
+                // EDriveD is a temporary drive usually a RAM disk
+                continue;
+                }
+
+            TVolumeInfo volInfo;
+            if ( iFs.Volume( volInfo, driveNumber ) != KErrNone )
+                {
+                // volume is not usable (e.g. no media card inserted)
+                continue;
+                }
+            if ( (volInfo.iDrive.iType == EMediaNotPresent) ||
+                 (volInfo.iDrive.iType == EMediaRom) ||
+                 (volInfo.iDrive.iType == EMediaRemote) ||
+                 (volInfo.iDrive.iDriveAtt & KDriveAttRom) ||
+                 (volInfo.iDrive.iDriveAtt & KDriveAttSubsted) )
+                {
+                // not a suitable widget install drive
+                continue;
+                }
+
+            // found a usable drive
+            aDriveFlags |= (1 << driveNumber);
+          
+            }
+        }
+
+    return error;
+    }
+void CWrtUsbHandler::DeleteTimer()
+    {
+    iCallBackTimer->Cancel();
+    delete iCallBackTimer;
+    iCallBackTimer = NULL; 
+    }