skins/AknSkins/srvsrc/AknsDriveMaster.cpp
changeset 0 05e9090e2422
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/skins/AknSkins/srvsrc/AknsDriveMaster.cpp	Thu Dec 17 09:14:12 2009 +0200
@@ -0,0 +1,384 @@
+/*
+* Copyright (c) 2007-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:  Handles disk drive information
+*
+*/
+
+#include "AknsDriveMaster.h"
+#include "AknsDebug.h"
+
+// Double colon character
+_LIT( KAknsSrvDoubleColon, ":" );
+
+// -----------------------------------------------------------------------------
+// Appends drive letter and double colon to a descriptor.
+// Path should be zero length when calling this method.
+// -----------------------------------------------------------------------------
+//
+void AppendDriveLetterToDes( const TInt aDrive, TDes& aPath )
+    {
+    TChar driveLetter;
+    RFs::DriveToChar( aDrive, driveLetter );
+    aPath.Append( driveLetter );
+    aPath.Append( KAknsSrvDoubleColon );
+    }
+
+// ======== MEMBER FUNCTIONS ========
+// ---------------------------------------------------------------------------
+// CAknsSrvDriveMaster::NewL
+// ---------------------------------------------------------------------------
+//
+CAknsSrvDriveMaster* CAknsSrvDriveMaster::NewL( MAknsSrvDriveObserver* aObserver )
+    {
+    AKNS_TRACE_INFO("CAknsSrvDriveMaster::NewL");
+    CAknsSrvDriveMaster* self = new( ELeave ) CAknsSrvDriveMaster( aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CAknsSrvDriveMaster::~CAknsSrvDriveMaster()
+    {
+    AKNS_TRACE_INFO("CAknsSrvDriveMaster destructor");
+    iStaticDriveArray.Reset();
+    iStaticDriveArray.Close();
+
+    iRemovableDriveArray.Reset();
+    iRemovableDriveArray.Close();
+
+    delete iDiskNotifier;
+    iFsSession.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// Finds and appends skin server's private ROM-drive directory to a string.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvDriveMaster::DefaultSkinDirectoryOnRom( TDes& aPath )
+    {
+    AKNS_TRACE_INFO("CAknsSrvDriveMaster::DefaultSkinDirectoryOnRom");
+    aPath.Zero();
+    TInt drive = KErrNotFound;
+    DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRom, drive );
+    AppendDriveLetterToDes( drive, aPath );
+    if ( aPath.Length() )
+        {
+        aPath.Append( KAknSkinSrvPrivateSkinPath );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Finds and appends skin server's private mass memory drive directory to a string.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvDriveMaster::DefaultSkinDirectoryOnMemoryCard( TDes& aPath )
+    {
+    AKNS_TRACE_INFO("CAknsSrvDriveMaster::DefaultSkinDirectoryOnMemoryCard");
+    aPath.Zero();
+    TInt drive = KErrNotFound;
+    DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, drive );
+    AppendDriveLetterToDes( drive, aPath );
+    if ( aPath.Length() )
+        {
+        aPath.Append( KAknSkinSrvPrivateSkinPath );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Finds and appends skin server's private device drive directory to a string.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvDriveMaster::DefaultSkinDirectoryOnDevice( TDes& aPath )
+    {
+    AKNS_TRACE_INFO("CAknsSrvDriveMaster::DefaultSkinDirectoryOnDevice");
+    aPath.Zero();
+    TInt drive = KErrNotFound;
+    DriveInfo::GetDefaultDrive( DriveInfo::EDefaultPhoneMemory, drive );
+    AppendDriveLetterToDes( drive, aPath );
+    if ( aPath.Length() )
+        {
+        aPath.Append( KAknSkinSrvPrivateSkinPath );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Gets default drive for the drive type.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvDriveMaster::GetDefaultDrive( const TInt& aDriveType, TDes& aDrive )
+    {
+    AKNS_TRACE_INFO("CAknsSrvDriveMaster::GetDefaultDrive");
+    TFileName path;
+    TInt drive = EDriveC;
+    TInt err = DriveInfo::GetDefaultDrive( aDriveType, drive );
+    if ( err == KErrNone )
+        {
+        AppendDriveLetterToDes( drive, aDrive );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Checks if given drive is removable.
+// -----------------------------------------------------------------------------
+//
+TBool CAknsSrvDriveMaster::IsRemovableDrive( RFs& aFileSession, const TDesC& aDrive )
+    {
+    AKNS_TRACE_INFO("CAknsSrvDriveMaster::IsRemovableDrive");
+    TInt drive = EDriveC;
+    RFs::CharToDrive( aDrive[0], drive );
+    return CAknsSrvDriveMaster::IsRemovableDrive( aFileSession, drive );
+    }
+
+// -----------------------------------------------------------------------------
+// Checks if given drive is removable.
+// -----------------------------------------------------------------------------
+//
+TBool CAknsSrvDriveMaster::IsRemovableDrive( RFs& aFileSession, const TInt aDrive )
+    {
+    AKNS_TRACE_INFO("CAknsSrvDriveMaster::IsRemovableDrive 2");
+    TUint driveStatus = 0;
+    TBool retVal = EFalse;
+    TInt err = DriveInfo::GetDriveStatus( aFileSession, aDrive, driveStatus );
+    if ( driveStatus & DriveInfo::EDriveExternallyMountable )
+        {
+        retVal = ETrue;
+        }
+    return retVal;
+    }
+
+// -----------------------------------------------------------------------------
+// Returns number of drives in the device.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvDriveMaster::GetNumberOfDrives( TAknsSrvSkinDriveList aDriveType ) const
+    {
+    AKNS_TRACE_INFO("CAknsSrvDriveMaster::GetNumberOfDrives");
+    TInt drives = 0;
+    if ( aDriveType == EAknsSrvStaticDrive )
+        {
+        drives = iStaticDriveArray.Count();
+        AKNS_TRACE_INFO1("CAknsSrvDriveMaster::GetNumberOfDrives - static drives=%d", drives );
+        }
+    else if ( aDriveType == EAknsSrvRemovableDrive )
+        {
+        drives = iRemovableDriveArray.Count();
+        AKNS_TRACE_INFO1("CAknsSrvDriveMaster::GetNumberOfDrives - removable drives=%d", drives );
+        }
+    else if ( aDriveType == EAknsSrvAnyDrive )
+        {
+        drives = iRemovableDriveArray.Count() + iStaticDriveArray.Count();
+        AKNS_TRACE_INFO1("CAknsSrvDriveMaster::GetNumberOfDrives - all drives=%d", drives );
+        }
+    return drives;
+    }
+
+// -----------------------------------------------------------------------------
+// Gets skin directory as descriptor based on drive type and array loc.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvDriveMaster::SkinDirectoryOnDrive(
+        TAknsSrvSkinDriveList aDriveType,
+        TInt aLocation,
+        TDes& aPath ) const
+    {
+    AKNS_TRACE_INFO("CAknsSrvDriveMaster::SkinDirectoryOnDrive");
+    TInt driveNumber = KErrNotFound;
+    aPath.Zero();
+    if ( aDriveType == EAknsSrvStaticDrive )
+        {
+        if ( iStaticDriveArray.Count() == 0 )
+            {
+            return;
+            }
+        if ( aLocation >= 0 && aLocation <= iStaticDriveArray.Count() )
+            {
+            driveNumber = iStaticDriveArray[ aLocation ];
+            AppendDriveLetterToDes( driveNumber, aPath );
+            aPath.Append( KAknSkinSrvPrivateSkinPath );
+            }
+        }
+    else if ( aDriveType == EAknsSrvRemovableDrive )
+        {
+        if ( iRemovableDriveArray.Count() == 0 )
+            {
+            return;
+            }
+        if ( aLocation >= 0 && aLocation <= iRemovableDriveArray.Count() )
+            {
+            driveNumber = iRemovableDriveArray[ aLocation ];
+            AppendDriveLetterToDes( driveNumber, aPath );
+            aPath.Append( KAknSkinSrvPrivateSkinPath );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Handle disk drive notifications.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvDriveMaster::HandleNotifyDisk(
+        TInt /*aError*/,
+        const TDiskEvent& aEvent )
+    {
+    switch ( aEvent.iType )
+        {
+        // Add drive to arrays.
+        case MDiskNotifyHandlerCallback::EDiskAdded:
+            {
+            TUint driveStatus = KErrNone;
+            DriveInfo::GetDriveStatus( iFsSession, aEvent.iDrive, driveStatus );
+            if ( driveStatus & DriveInfo::EDriveRemote )
+                {
+                return;
+                }
+            if ( ( driveStatus & DriveInfo::EDriveRemovable ) ||
+                      ( driveStatus & DriveInfo::EDriveExternallyMountable ) )
+                {
+                iRemovableDriveArray.Append( aEvent.iDrive );
+                }
+            else if ( driveStatus & DriveInfo::EDriveInternal )
+                {
+                iStaticDriveArray.Append( aEvent.iDrive );
+                }
+            // AknsInstallObserver re-builds the skin list again automatically.
+            break;
+            }
+        // Remove drive from arrays.
+        case MDiskNotifyHandlerCallback::EDiskRemoved:
+            if ( aEvent.iInfo.iDriveAtt & KDriveAttInternal )
+                {
+                TInt loc = iStaticDriveArray.Find( aEvent.iDrive );
+                if ( loc != KErrNotFound )
+                    {
+                    iStaticDriveArray.Remove( loc );
+                    }
+                else
+                    {
+                    AKNS_TRACE_ERROR("CAknsSrvDriveMaster::HandleNotifyDisk unknown removable drive removed" );
+                    }
+                }
+            else
+                {
+                TInt loc = iRemovableDriveArray.Find( aEvent.iDrive );
+                if ( loc != KErrNotFound )
+                    {
+                    iRemovableDriveArray.Remove( loc );
+                    }
+                else
+                    {
+                    AKNS_TRACE_ERROR("CAknsSrvDriveMaster::HandleNotifyDisk unknown static drive removed" );
+                    }
+                }
+            iObserver->NotifyDriveStatusChange( aEvent.iDrive, ETrue );
+            break;
+        case MDiskNotifyHandlerCallback::EDiskStatusChanged:
+            {
+            TBool diskRemoved = EFalse;
+            if( !( aEvent.iInfo.iDriveAtt & KDriveAttInternal ) )
+                {
+                diskRemoved = ( aEvent.iInfo.iType == EMediaNotPresent );
+                }
+            iObserver->NotifyDriveStatusChange( aEvent.iDrive, diskRemoved );
+            }
+            break;
+        default:
+            // Uninteresting event.
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// C++ constructor.
+// -----------------------------------------------------------------------------
+//
+CAknsSrvDriveMaster::CAknsSrvDriveMaster( MAknsSrvDriveObserver* aObserver ) :
+    iObserver( aObserver )
+    {
+    // We need own RFs session, so that this works in line with install observer,
+    TInt err = iFsSession.Connect();
+    AKNS_TRACE_INFO1("CAknsSrv::New RFs connected, ret=%d", err);
+
+    TFileName path;
+    TInt drive = EDriveC;
+    err = DriveInfo::GetDefaultDrive( DriveInfo::EDefaultPhoneMemory, drive );
+    AKNS_TRACE_INFO2("CAknsSrv::New Default Device Drive, ret=%d drive=%d", err, drive );
+    if ( err == KErrNone )
+        {
+        iStaticDriveArray.Append( drive );
+        }
+    err = DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, drive );
+    AKNS_TRACE_INFO2("CAknsSrv::New Default Removable Drive, ret=%d drive=%d", err, drive );
+    if ( err == KErrNone )
+        {
+        iRemovableDriveArray.Append( drive );
+        }
+    TDriveList driveList;
+    TInt driveCount = 0;
+    TUint driveStatus = 0;
+    err = DriveInfo::GetUserVisibleDrives( iFsSession, driveList, driveCount );
+    for ( TInt i = 0; i < KMaxDrives; i++ )
+        {
+        // If drive has been set and it is not the default, append it
+        if ( driveList[i] != 0 &&
+             ( i != iStaticDriveArray[0] &&
+               i != iRemovableDriveArray[0] ) )
+            {
+            driveStatus = 0;
+            err = DriveInfo::GetDriveStatus( iFsSession, i, driveStatus );
+            AKNS_TRACE_INFO3("CAknsSrv::New Drive Found, ret=%d drive=%d status=%d", err, driveList[i], driveStatus );
+            if ( driveStatus & DriveInfo::EDriveRemote ) 
+                {
+                driveCount--;
+                continue;
+                }
+            if ( ( driveStatus & DriveInfo::EDriveRemovable ) ||
+            			( driveStatus & DriveInfo::EDriveExternallyMountable ) )
+                {
+                AKNS_TRACE_INFO("CAknsSrv::New Removable Drive Added ");
+                iRemovableDriveArray.Append( i );
+                }
+            else if ( driveStatus & DriveInfo::EDriveInternal )
+                {
+                AKNS_TRACE_INFO("CAknsSrv::New Static Drive Added ");
+                iStaticDriveArray.Append( i );
+                }
+            driveCount--;
+            }
+
+        // Check if all drives have already been found.
+        if ( !driveCount )
+            {
+            break;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 2nd phase constructor.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvDriveMaster::ConstructL()
+    {
+    AKNS_TRACE_INFO("CAknsSrvDriveMaster::ConstructL");
+    // Start listening for drive events.
+    iDiskNotifier = CDiskNotifyHandler::NewL( *this, iFsSession );
+    User::LeaveIfError( iDiskNotifier->NotifyDisk() );
+    }
+
+// End of file