diff -r 000000000000 -r 6a9f87576119 filemanager/Engine/src/CFileManagerItemProperties.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filemanager/Engine/src/CFileManagerItemProperties.cpp Mon Jan 18 20:09:41 2010 +0200 @@ -0,0 +1,602 @@ +/* +* Copyright (c) 2002-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: Holds item information +* +*/ + + +// INCLUDES +#include +#include +#include +#include "CFileManagerItemProperties.h" +#include "CFileManagerUtils.h" +#include "CFilemanagerMimeIconArray.h" +#include "Cfilemanagerfolderarray.h" +#include "Cfilemanageractivesize.h" +#include "CFilemanagerActiveCount.h" +#include "CFileManagerEngine.h" +#include "CGflmGroupItem.h" +#include "CGflmFileSystemItem.h" +#include "CGflmDriveItem.h" +#include "CGflmGlobalActionItem.h" + + +// ============================ MEMBER FUNCTIONS =============================== +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::CFileManagerItemProperties +// +// ----------------------------------------------------------------------------- +// +CFileManagerItemProperties::CFileManagerItemProperties( + CFileManagerUtils& aUtils, + CFileManagerEngine& aEngine ) : + iSize( KErrNotFound ), + iFilesContained( KErrNotFound ), + iFoldersContained( KErrNotFound ), + iOpenFiles( KErrNotFound ), + iUtils( aUtils ), + iEngine( aEngine ) + { + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::NewL +// +// ----------------------------------------------------------------------------- +// +CFileManagerItemProperties* CFileManagerItemProperties::NewL( + const TDesC& aFullPath, + CFileManagerUtils& aUtils, + CFileManagerEngine& aEngine ) + { + CFileManagerItemProperties* self = + new (ELeave) CFileManagerItemProperties( aUtils, aEngine ); + CleanupStack::PushL( self ); + self->ConstructL( aFullPath ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::NewL +// +// ----------------------------------------------------------------------------- +// +CFileManagerItemProperties* CFileManagerItemProperties::NewL( + const CGflmGroupItem& aItem, + CFileManagerUtils& aUtils, + CFileManagerEngine& aEngine ) + { + CFileManagerItemProperties* self = + new (ELeave) CFileManagerItemProperties( aUtils, aEngine ); + CleanupStack::PushL( self ); + self->ConstructL( aItem ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CFileManagerItemProperties::ConstructL( const TDesC& aFullPath ) + { + iFullPath = aFullPath.AllocL(); + + // Setup the rest of entry data when needed first time + if ( CFileManagerUtils::HasFinalBackslash( aFullPath ) ) + { + iState |= EItemDirectory; + } + else + { + iState |= EItemFile; + } + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CFileManagerItemProperties::ConstructL( + const TDesC& aFullPath, const TEntry& aEntry ) + { + iFullPath = aFullPath.AllocL(); + + // Setup all entry data now + SetEntryData( aEntry ); + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CFileManagerItemProperties::ConstructL( const CGflmGroupItem& aItem ) + { + switch ( aItem.Type() ) + { + case CGflmGroupItem::EFile: + case CGflmGroupItem::EDirectory: + { + const CGflmFileSystemItem& fsItem = + static_cast< const CGflmFileSystemItem& >( aItem ); + HBufC* fullPath = fsItem.FullPathLC(); + ConstructL( *fullPath, fsItem.Entry() ); + if ( iUtils.IsRemoteDrive( *fullPath ) ) + { + iState |= EItemRemoteDrive; + } + CleanupStack::PopAndDestroy( fullPath ); + break; + } + case CGflmGroupItem::EDrive: + { + const CGflmDriveItem& drvItem = + static_cast< const CGflmDriveItem& >( aItem ); + iFullPath = drvItem.RootDirectory().AllocL(); +#ifdef RD_MULTIPLE_DRIVE + iName = iUtils.GetDriveNameL( + drvItem.Drive(), + CFileManagerUtils::EMainLayout ); +#else // RD_MULTIPLE_DRIVE + iName = drvItem.Name().AllocL(); +#endif // RD_MULTIPLE_DRIVE + iState |= EItemDrive; + if ( iUtils.IsRemoteDrive( *iFullPath ) ) + { + iState |= EItemRemoteDrive; + } + break; + } + case CGflmGroupItem::EGlobalActionItem: + { + const CGflmGlobalActionItem& actItem = + static_cast< const CGflmGlobalActionItem& >( aItem ); + if ( actItem.Id() == EFileManagerBackupAction ) + { + // Ignore error + iEngine.LatestBackupTime( iModified ); + } + iName = aItem.Name().AllocL(); + // Action items do not have entry data, so mark it as fetched + iState |= EItemAction | EItemEntryDataFetched; + break; + } + default: + { + User::Leave( KErrNotFound ); + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::~CFileManagerItemProperties +// +// ----------------------------------------------------------------------------- +// +CFileManagerItemProperties::~CFileManagerItemProperties() + { + delete iFullPath; + delete iActiveSize; + delete iActiveCount; + delete iName; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::Name() const +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TPtrC CFileManagerItemProperties::Name() const + { + if ( iState & EItemNotFileOrDir ) + { + return iName->Des(); + } + TParsePtrC parse( CFileManagerUtils::StripFinalBackslash( *iFullPath ) ); + return parse.Name(); + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::ModifiedDate() const +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TTime CFileManagerItemProperties::ModifiedDate() const + { + EnsureEntryDataFetched(); + return iModified; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::SizeL() +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt64 CFileManagerItemProperties::SizeL() + { + if ( iState & EItemNotFileOrDir ) + { + return 0; + } + if( iSize == KErrNotFound ) + { + if ( iState & EItemFile ) + { + EnsureEntryDataFetched(); + } + else + { + iSize = FolderSizeL( *iFullPath ); + } + } + return iSize; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::FilesContainedL() +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CFileManagerItemProperties::FilesContainedL() + { + if( iFilesContained == KErrNotFound ) + { + CountItemsL( CFileManagerItemProperties::EFile ); + } + return iFilesContained; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::FoldersContainedL() +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CFileManagerItemProperties::FoldersContainedL() + { + if( iFoldersContained == KErrNotFound ) + { + CountItemsL( CFileManagerItemProperties::EFolder ); + } + return iFoldersContained; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::OpenFilesL() +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CFileManagerItemProperties::OpenFilesL() + { + if( iOpenFiles == KErrNotFound ) + { + CountItemsL( CFileManagerItemProperties::EOpen ); + } + return iOpenFiles; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::TypeL() +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TUint32 CFileManagerItemProperties::TypeL() + { + if( iType == CFileManagerItemProperties::ENotDefined ) + { + iType = iUtils.FileTypeL( *iFullPath ); + } + return iType; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::Ext() const +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TPtrC CFileManagerItemProperties::Ext() const + { + if ( iState & EItemNotFileOrDir ) + { + return TPtrC( KNullDesC ); + } + TParsePtrC parse( *iFullPath ); + TPtrC ext( parse.Ext() ); + return ext; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::CountItemsL +// ----------------------------------------------------------------------------- +// +TInt CFileManagerItemProperties::CountItemsL( + const TFileManagerFileType& aType ) + { + if ( !( iState & ( EItemDirectory | EItemDrive ) ) ) + { + // It's not a folder + return KErrNotFound; + } + + delete iActiveCount; + iActiveCount = NULL; + + iActiveCount = CFileManagerActiveCount::NewL( + iEngine.Fs(), *iFullPath, aType ); + + if ( !iActiveCount->IsProcessDone() ) + { + iEngine.ShowWaitDialogL( *iActiveCount ); + } + + if ( iFilesContained == KErrNotFound ) + { + iFilesContained = iActiveCount->FileCount(); + } + + if ( iFoldersContained == KErrNotFound ) + { + iFoldersContained = iActiveCount->FolderCount(); + } + + if ( iOpenFiles == KErrNotFound ) + { + iOpenFiles = iActiveCount->OpenFiles(); + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::FolderSizeL +// ----------------------------------------------------------------------------- +// +TInt64 CFileManagerItemProperties::FolderSizeL( const TDesC& aFullPath ) + { + if ( !( iState & EItemDirectory ) ) + { + // It's not a folder + return KErrNotFound; + } + + delete iActiveSize; + iActiveSize = NULL; + iActiveSize = CFileManagerActiveSize::NewL( iEngine.Fs(), aFullPath ); + iEngine.ShowWaitDialogL( *iActiveSize ); + return iActiveSize->GetFolderSize(); + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::FullPath() const +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TPtrC CFileManagerItemProperties::FullPath() const + { + if ( iFullPath ) + { + return iFullPath->Des(); + } + return TPtrC( KNullDesC ); + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::NameAndExt() const +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TPtrC CFileManagerItemProperties::NameAndExt() const + { + if ( iState & EItemNotFileOrDir ) + { + return iName->Des(); + } + TParsePtrC parse( CFileManagerUtils::StripFinalBackslash( *iFullPath ) ); + return parse.NameAndExt(); + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::LocalizedName() const +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TPtrC CFileManagerItemProperties::LocalizedName() const + { + if (iState & EItemDirectory ) + { + TPtrC ptr( iUtils.LocalizedName( *iFullPath ) ); + if ( ptr.Length() ) + { + return ptr; + } + } + return NameAndExt(); + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::ModifiedLocalDate() const +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CFileManagerItemProperties::ModifiedLocalDate( + TTime& aTime ) const + { + aTime = ModifiedDate(); // convert from universal time + RTz tz; + TInt err( tz.Connect() ); + if ( err == KErrNone ) + { + err = tz.ConvertToLocalTime( aTime ); + if ( err != KErrNone ) + { + aTime = ModifiedDate(); // use universal time + } + tz.Close(); + } + return err; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::ContainsAnyFilesOrFolders() +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CFileManagerItemProperties::ContainsAnyFilesOrFolders() + { + if ( !( iState & EItemDirectory ) || + ( iState & EItemHasNoFilesOrFolders ) ) + { + return EFalse; + } + if ( iState & EItemHasFilesOrFolders ) + { + return ETrue; + } + TBool ret( CFileManagerUtils::HasAny( + iEngine.Fs(), + *iFullPath, + KEntryAttNormal | KEntryAttDir | KEntryAttHidden | KEntryAttSystem ) ); + if ( ret ) + { + iState |= EItemHasFilesOrFolders; + } + else + { + iState |= EItemHasNoFilesOrFolders; + } + return ret; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::MimeTypeL() +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TPtrC CFileManagerItemProperties::MimeTypeL() + { + if ( iState & EItemNotFileOrDir ) + { + return TPtrC( KNullDesC ); + } + return iUtils.MimeTypeL( *iFullPath ); + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::IsDrive() +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CFileManagerItemProperties::IsDrive() const + { + if ( iState & EItemDrive ) + { + return ETrue; + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::DriveName() +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TPtrC CFileManagerItemProperties::DriveName() const + { + if ( iState & EItemDrive ) + { + return Name(); + } + return iEngine.CurrentDriveName(); + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::IsRemoteDrive() +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CFileManagerItemProperties::IsRemoteDrive() const + { + if ( iState & EItemRemoteDrive ) + { + return ETrue; + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::EnsureEntryDataFetched +// +// ----------------------------------------------------------------------------- +// +void CFileManagerItemProperties::EnsureEntryDataFetched() const + { + if ( iState & EItemEntryDataFetched ) + { + return; + } + + iState |= EItemEntryDataFetched; // Do not try fetch more than once + + TEntry entry; + if ( iEngine.Fs().Entry( *iFullPath, entry ) != KErrNone ) + { + return; + } + + SetEntryData( entry ); + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::SetEntryData +// +// ----------------------------------------------------------------------------- +// +void CFileManagerItemProperties::SetEntryData( const TEntry& aEntry ) const + { + iState |= EItemEntryDataFetched; + + iModified = aEntry.iModified; + + if ( aEntry.IsDir() ) + { + iState |= EItemDirectory; + } + else + { + iState |= EItemFile; + iSize = (TUint) aEntry.iSize; + } + } + +// ----------------------------------------------------------------------------- +// CFileManagerItemProperties::DriveId +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CFileManagerItemProperties::DriveId() const + { + TInt ret( KErrNotFound ); + if ( iFullPath ) + { + ret = TDriveUnit( *iFullPath ); + } + return ret; + } + +// End of File