commonservices/PlatformEnv/disknotifyhandler/src/diskwatcher.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonservices/PlatformEnv/disknotifyhandler/src/diskwatcher.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,348 @@
+/*
+* Copyright (c) 2007 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:  Class for notify disk watcher
+*
+*/
+
+
+
+//  INCLUDES
+#include <e32std.h>
+#include <f32file.h>
+#include <driveinfo.h>
+#include "diskwatcher.h"
+#include "disknotifyhandler.h"
+#include "disknotifyhandlerdebug.h"
+
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// SetEvent
+// ---------------------------------------------------------------------------
+//
+inline static void SetEvent(
+        MDiskNotifyHandlerCallback::TDiskEvent& aEvent,
+        MDiskNotifyHandlerCallback::TDiskEventType aType,
+        TInt aDrive,
+        const TDriveInfo& aInfo,
+        const TDriveInfo& aPrevInfo )
+    {
+    aEvent.iType = aType;
+    aEvent.iDrive = aDrive;
+    aEvent.iInfo = aInfo;
+    aEvent.iPrevInfo = aPrevInfo;
+    }
+
+// ---------------------------------------------------------------------------
+// SetEmptyDriveInfo
+// ---------------------------------------------------------------------------
+//
+inline static void SetEmptyDriveInfo( TDriveInfo& aInfo )
+    {
+    aInfo.iType = EMediaNotPresent;
+    aInfo.iBattery = EBatNotSupported;
+    aInfo.iDriveAtt = 0;
+    aInfo.iMediaAtt = 0;
+    }
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CDiskWatcher::CDiskWatcher
+// ---------------------------------------------------------------------------
+//
+CDiskWatcher::CDiskWatcher(
+        MDiskNotifyHandlerCallback& aCallback,
+        RFs& aFs ) :
+    CDiskWatcherBase( aCallback, aFs )
+    {
+    FUNC_LOG
+    }
+
+// ---------------------------------------------------------------------------
+// CDiskWatcher::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CDiskWatcher::ConstructL()
+    {
+    FUNC_LOG
+
+    Activate();
+
+    RFs& fs( Fs() );
+    TDriveList drvList;
+    User::LeaveIfError( fs.DriveList( drvList, KDriveAttAll ) );
+
+    TInt count( Min( drvList.Length(), iInfoList.Count() ) );
+    for ( TInt i( 0 ); i < count; ++i )
+        {
+        if ( drvList[ i ] )
+            {
+            iInfoList[ i ].Read( fs, i );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CDiskWatcher::NewL
+// ---------------------------------------------------------------------------
+//
+CDiskWatcher* CDiskWatcher::NewL(
+        MDiskNotifyHandlerCallback& aCallback,
+        RFs& aFs )
+    {
+    FUNC_LOG
+
+    CDiskWatcher* self = new ( ELeave ) CDiskWatcher( aCallback, aFs );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CDiskWatcher::~CDiskWatcher
+// ---------------------------------------------------------------------------
+//
+CDiskWatcher::~CDiskWatcher()
+    {
+    FUNC_LOG
+
+    Cancel();
+    }
+
+// ---------------------------------------------------------------------------
+// CDiskWatcher::WatcherError
+// ---------------------------------------------------------------------------
+//
+void CDiskWatcher::WatcherError(
+        TInt aError,
+        const TBool& /*aKilled*/ )
+    {
+    FUNC_LOG
+
+    LOG_IF_ERROR1( aError, "CDiskWatcher::WatcherError-aError=%d",
+        aError )
+
+    MDiskNotifyHandlerCallback::TDiskEvent event;
+    TDriveInfo emptyDrvInfo;
+    SetEmptyDriveInfo( emptyDrvInfo );
+
+    SetEvent(
+        event,
+        MDiskNotifyHandlerCallback::EDiskError,
+        KErrNotFound,
+        emptyDrvInfo,
+        emptyDrvInfo );
+
+    Callback().HandleNotifyDisk( aError, event );
+    }
+
+// ---------------------------------------------------------------------------
+// CDiskWatcher::ReactivateWatcher
+// ---------------------------------------------------------------------------
+//
+void CDiskWatcher::ReactivateWatcher()
+    {
+    FUNC_LOG
+
+    Activate();
+    }
+
+// ---------------------------------------------------------------------------
+// CDiskWatcher::RunWatcher
+// ---------------------------------------------------------------------------
+//
+void CDiskWatcher::RunWatcher( const TBool& aKilled )
+    {
+    FUNC_LOG
+
+    RFs& fs( Fs() );
+    MDiskNotifyHandlerCallback& callback( Callback() );
+
+    TDriveList drvList;
+    TInt err( fs.DriveList( drvList, KDriveAttAll ) );
+    if ( err != KErrNone )
+        {
+        ERROR_LOG1( "CDiskWatcher::RunWatcher-err1=%d", err )
+        return;
+        }
+
+    TInt count( Min( drvList.Length(), iInfoList.Count() ) );
+    TDriveInfo emptyDrvInfo;
+    SetEmptyDriveInfo( emptyDrvInfo );
+    MDiskNotifyHandlerCallback::TDiskEvent event;
+    TWatcherInfo newInfo;
+
+    for( TInt i( 0 ); i < count; ++i )
+        {
+        TWatcherInfo& info( iInfoList[ i ] );
+        if ( !drvList[ i ] && info.iDriveStatus )
+            {
+            INFO_LOG1( "CDiskWatcher::RunWatcher-Drive %d removed", i )
+
+            // Inform drives removed from drive list
+            SetEvent(
+                event,
+                MDiskNotifyHandlerCallback::EDiskRemoved,
+                i,
+                emptyDrvInfo,
+                info.iDriveInfo );
+
+            callback.HandleNotifyDisk( KErrNone, event );
+            if ( aKilled )
+                {
+                return; // Deleted from callback
+                }
+            info.Reset(); // Set to empty
+            }
+        else if ( drvList[ i ] && !info.iDriveStatus )
+            {
+            INFO_LOG1( "CDiskWatcher::RunWatcher-Drive %d added", i )
+
+            // Inform drives added to drive list
+            info.Read( fs, i );
+            if ( info.iDriveStatus )
+                {
+                SetEvent(
+                    event,
+                    MDiskNotifyHandlerCallback::EDiskAdded,
+                    i,
+                    info.iDriveInfo,
+                    emptyDrvInfo );
+    
+                callback.HandleNotifyDisk( KErrNone, event );
+                if ( aKilled )
+                    {
+                    return;  // Deleted from callback
+                    }
+                }
+            }
+        else if ( drvList[ i ] && info.iDriveStatus )
+            {
+            // Inform drive status changes
+            newInfo.Read( fs, i );
+            if ( info.IsChanged( newInfo ) )
+                {
+                INFO_LOG1( "CDiskWatcher::RunWatcher-Drive %d changed", i )
+
+                SetEvent(
+                    event,
+                    MDiskNotifyHandlerCallback::EDiskStatusChanged,
+                    i,
+                    newInfo.iDriveInfo,
+                    info.iDriveInfo );
+
+                callback.HandleNotifyDisk( KErrNone, event );
+                if ( aKilled )
+                    {
+                    return; // Deleted from callback
+                    }
+                info = newInfo; // Save changed info
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CDiskWatcher::CancelWatcher
+// ---------------------------------------------------------------------------
+//
+void CDiskWatcher::CancelWatcher()
+    {
+    FUNC_LOG
+
+    Fs().NotifyChangeCancel( iStatus );
+    }
+
+// ---------------------------------------------------------------------------
+// CDiskWatcher::Activate
+// ---------------------------------------------------------------------------
+//
+void CDiskWatcher::Activate()
+    {
+    FUNC_LOG
+
+    if ( !IsActive() )
+        {
+        INFO_LOG( "CDiskWatcher::Activate" )
+        Fs().NotifyChange( ENotifyDisk, iStatus );
+        SetActive();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CDiskWatcher::TWatcherInfo::Read
+// ---------------------------------------------------------------------------
+//
+void CDiskWatcher::TWatcherInfo::Read( RFs& aFs, TInt aDrive )
+    {
+    FUNC_LOG
+
+    TInt err( aFs.Drive( iDriveInfo, aDrive ) );
+    LOG_IF_ERROR2( err, "CDiskWatcher::TWatcherInfo::Read-aDrive=%d,err1=%d",
+        aDrive, err )
+    if ( err == KErrNone )
+        {
+        // Needed for detecting USB mass storage mode transition
+        err = DriveInfo::GetDriveStatus( aFs, aDrive, iDriveStatus );
+        LOG_IF_ERROR2( err, "CDiskWatcher::TWatcherInfo::Read-aDrive=%d,err2=%d",
+            aDrive, err )
+        }
+    if ( err != KErrNone )
+        {
+        Reset();
+        }
+    INFO_LOG3(
+        "CDiskWatcher::TWatcherInfo::Read-Drive %d,Status 0x%x,Type %d",
+        aDrive, iDriveStatus, iDriveInfo.iType )
+    INFO_LOG3(
+        "CDiskWatcher::TWatcherInfo::Read-Drive %d,DriveAtt 0x%x,MediaAtt 0x%x",
+        aDrive, iDriveInfo.iDriveAtt, iDriveInfo.iMediaAtt )
+    }
+
+// ---------------------------------------------------------------------------
+// CDiskWatcher::TWatcherInfo::IsChanged
+// ---------------------------------------------------------------------------
+//
+TBool CDiskWatcher::TWatcherInfo::IsChanged(
+        const TWatcherInfo& aNewInfo ) const
+    {
+    FUNC_LOG
+
+    TBool ret( iDriveStatus != aNewInfo.iDriveStatus ||
+               iDriveInfo.iType != aNewInfo.iDriveInfo.iType ||
+               iDriveInfo.iDriveAtt != aNewInfo.iDriveInfo.iDriveAtt ||
+               iDriveInfo.iMediaAtt != aNewInfo.iDriveInfo.iMediaAtt );
+    INFO_LOG3(
+        "CDiskWatcher::TWatcherInfo::IsChanged %d,Status 0x%x,NewStatus 0x%x",
+        ret, iDriveStatus, aNewInfo.iDriveStatus )
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CDiskWatcher::TWatcherInfo::Reset
+// ---------------------------------------------------------------------------
+//
+void CDiskWatcher::TWatcherInfo::Reset()
+    {
+    FUNC_LOG
+
+    SetEmptyDriveInfo( iDriveInfo );
+    iDriveStatus = 0;
+    }
+
+// End of File