diff -r 000000000000 -r 05e9090e2422 skins/AknSkins/srvsrc/AknsDriveMaster.cpp --- /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