diff -r 000000000000 -r 8c5d936e5675 profilesservices/FileList/Src/CFLDFileListModel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/profilesservices/FileList/Src/CFLDFileListModel.cpp Thu Dec 17 08:52:52 2009 +0200 @@ -0,0 +1,1036 @@ +/* +* Copyright (c) 2002 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: +* This class implements a model of a file list. Features: +* - Contents of multiple folders in the same list +* - Filtering with wildcards (*?) +* - Filtering by maximum file size +* - Sorting (name / date, ascending / descending) +* - Entry presentation formatting using an abstract interface +* The class is inherited from MDesCArray, so it can be used directly +* as a model for a listbox. +* +* +*/ + + +// CLASS HEADER +#include "CFLDFileListModel.h" + +// INTERNAL INCLUDES +#include "CFLDOperationObserver.h" +#include "CFLDChangedItemObserver.h" +#include "CFLDEntryReference.h" +#include "CFLDWaitNote.h" +#include "CFLDPopupList.h" +#include "MFLDEntryFormatter.h" + +// EXTERNAL INCLUDES +#include +#include +#include +#include +#include +#include +#include // For TResourceReader +#include // For RConeResourceLoader +#include // CCoeEnv +#include +#include // For KDC_RESOURCE_FILES_DIR +#include // For R_FLD_WAIT_NOTE +#include // For BaflUtils +#include // For RApaLsSession +#include +#include + +// CONSTANTS +namespace + { + _LIT( KFLDROMDriveLetter, "Z:" ); + const TInt KGranularityFilters( 2 ); + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// + CFLDFileListModel* CFLDFileListModel::NewL( + const TInt aModelResourceId, const TInt aDirectoriesResourceId ) + { + // The default stuff. + CFLDFileListModel* self = + CFLDFileListModel::NewLC( aModelResourceId, aDirectoriesResourceId ); + CleanupStack::Pop( self ); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CFLDFileListModel* CFLDFileListModel::NewLC( + const TInt aModelResourceId, const TInt aDirectoriesResourceId ) + { + CFLDFileListModel* self = + new( ELeave ) CFLDFileListModel(); + CleanupStack::PushL( self ); + self->ConstructL( aModelResourceId, aDirectoriesResourceId ); + return self; + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::CFLDFileListModel +// C++ constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CFLDFileListModel::CFLDFileListModel() + : iExclusiveMimeTypes( KGranularityFilters ), + iExclusiveMediaTypes( KGranularityFilters ), + iDirectoryPaths( KGranularityFilters ), + iRomDirectoryPaths( KGranularityFilters ), + iMaxFileSize( 0 ) + { + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::ConstructL( + const TInt aModelResourceId, const TInt aDirectoriesResourceId ) + { + // Create CLF Operation Observer to monitor, when + // refresh operation has completed + iObserver = CFLDOperationObserver::NewL(); + + // Create Content Listing Engine and a list model + iEngine = ContentListingFactory::NewContentListingEngineLC(); + CleanupStack::Pop(); // iEngine + + // Load CLF definitions from user given resource + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, aModelResourceId ); + iModel = iEngine->CreateListModelLC( *iObserver, reader ); + CleanupStack::Pop(); // iModel + CleanupStack::PopAndDestroy(); // reader + + // Load wait note from default-resource + iWaitNote = CFLDWaitNote::NewL( R_FLD_WAIT_NOTE ); + + // Load directories + CFLDFileListModel::LoadDirectoriesL( aDirectoriesResourceId ); + + // Create changed item observer to monitor, when + // tone selection files are modified or deleted + iChangedItemObserver = CFLDChangedItemObserver::NewL(iWaitNote); + iEngine->AddChangedItemObserverL( *iChangedItemObserver ); + + // Set post filter + iModel->SetPostFilter( this ); + } + +// Destructor + CFLDFileListModel::~CFLDFileListModel() + { + if( iModel ) + { + iModel->CancelRefresh(); + delete iModel; + } + + delete iEngine; + delete iObserver; + delete iChangedItemObserver; + delete iEntryFormatter; + delete iWaitNote; + + iEndNullTextRingingToneArray.ResetAndDestroy(); + iEndNullTextArray.ResetAndDestroy(); + iNullTextRingingToneArray.ResetAndDestroy(); + iNullTextArray.ResetAndDestroy(); + iEntryReferences.ResetAndDestroy(); + iExclusiveMimeTypes.Reset(); + iExclusiveMediaTypes.Reset(); + iDirectoryPaths.Reset(); + iRomDirectoryPaths.Reset(); + iRomRingingToneArray.ResetAndDestroy(); + } + + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::LoadRomDirectoriesL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::LoadDirectoriesL( const TInt aDirectoriesResourceId ) + { + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, aDirectoriesResourceId ); + + // Read ROM directories from resource + TInt count( reader.ReadInt16() ); + while( --count >= 0 ) + { + TPtrC ptr( reader.ReadTPtrC() ); + // Ignore return value + AddRomDirectoryL( ptr ); + } + + // Read directories from resource + count = reader.ReadInt16(); + while( --count >= 0 ) + { + TPtrC ptr( reader.ReadTPtrC() ); + // Ignore return value + AddDirectoryL( ptr ); + } + + CleanupStack::PopAndDestroy(); // reader + } +// ----------------------------------------------------------------------------- +// CFLDFileListModel::AddRomDirectoryL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + TInt CFLDFileListModel::AddRomDirectoryL( const TDesC& aDirectory ) + { + TInt index( 0 ); + if( iRomDirectoryPaths.Find( aDirectory, index ) == 0 ) + { + // A duplicate was found, do not add to the array, return. + return KErrAlreadyExists; + } + + RFs& fsSession( CCoeEnv::Static()->FsSession() ); + // Check that the directory really exists + if ( !BaflUtils::FolderExists( fsSession, aDirectory ) ) + { + return KErrPathNotFound; + } + iRomDirectoryPaths.AppendL( aDirectory ); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::AddDirectoryL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + TInt CFLDFileListModel::AddDirectoryL( const TDesC& aDirectory ) + { + TInt index( 0 ); + if( iDirectoryPaths.Find( aDirectory, index ) == 0 ) + { + // A duplicate was found, do not add to the array, return. + return KErrAlreadyExists; + } + + iDirectoryPaths.AppendL( aDirectory ); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::SetWantedMimeTypesL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::SetWantedMimeTypesL( const MDesCArray& aMimeTypes ) + { + CFLDFileListModel::ResetExclusiveMimeTypes(); + CFLDFileListModel::ResetExclusiveMediaTypes(); + + iModel->SetWantedMimeTypesL( aMimeTypes ); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::SetWantedMediaTypesL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::SetWantedMediaTypesL( + const TArray& aMediaTypes ) + { + CFLDFileListModel::ResetExclusiveMimeTypes(); + CFLDFileListModel::ResetExclusiveMediaTypes(); + + // Temporary solution + RArray array; + TInt count( aMediaTypes.Count() ); + CleanupClosePushL( array ); + for( TInt i = 0; i < count; i++ ) + { + array.AppendL( aMediaTypes[i]); + } + + iModel->SetWantedMediaTypesL( array.Array() ); + CleanupStack::PopAndDestroy( &array ); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::PopulateReferenceListL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + void CFLDFileListModel::PopulateReferenceListL() + { + // Do not allow to update model from changed item observer + iChangedItemObserver->SetFileListModel( NULL ); + + // Send reference of CActiveSchedulerWait to the CLF Operation Observer + iObserver->PrepareForRefresh( iWait ); + + // CLF hogs the processor when doing its refresh. Make sure we'll + // have enough of a slice to be able to handle the End key presses. + RWsSession& wsSession = CCoeEnv::Static()->WsSession(); + wsSession.ComputeMode( RWsSession::EPriorityControlDisabled ); + + // Call refresh to get all music files from the file system to the model + iModel->RefreshL(); + + // Display a wait note if user tries to do something while refresh + // operation of the list model has not finished yet. + if( iObserver->IsRefreshOngoing() && !iWait.IsStarted() ) + { + // View the wait note + if( iWaitNote && !iWaitNote->IsRunning() ) + { + iWaitNote->OpenWaitNoteL(); + } + + // Wait for the refresh operation to complete. Operation Observer will + // stop this wait when the refresh operation has compeleted. + iWait.Start(); // CSI: 10 # the state of iWait is checked above + + // Close the wait note + iWaitNote->CloseWaitNoteL(); + } + + // Back to default behavior + wsSession.ComputeMode( RWsSession::EPriorityControlComputeOff ); + + PopulateListBoxL(); + + if( iPopupList ) + { // Model has updated; list should try to handle it + iPopupList->CancelPreview(); + TRAP_IGNORE( iPopupList->ListBox()->HandleItemAdditionL() ); + // List has updated; set focus to the first item + iPopupList->ListBox()->SetCurrentItemIndexAndDraw( 0 ); + } + + // Allow to update model from changed item observer + // (unless we're displaying ROM tones only) + if( !iRomTonesOnly ) + { + iChangedItemObserver->SetFileListModel( this ); + } + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::ScanRomDirectoriesL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::ScanRomDirectoriesL() + { + CDir* fileList( NULL ); + RFs& fsSession( CCoeEnv::Static()->FsSession() ); + + TInt directoryCount( iRomDirectoryPaths.Count() ); + for( TInt i= 0; iCount() ); + for ( TInt j=0; j tempBuf = item.iName; + HBufC* concateName = HBufC::NewLC( + iRomDirectoryPaths.MdcaPoint(i).Length() + tempBuf.Length() ); + TPtr des = concateName->Des(); + des.Insert(0, iRomDirectoryPaths.MdcaPoint(i) ); + des.Append( tempBuf ); + + // Only files located on ROM must be scanned + // CLF has already scanned other ( supported ) locations + if( ( des.Left( KFLDROMDriveLetter().Length() ).CompareF( + KFLDROMDriveLetter ) == 0 ) ) + { + TParsePtrC parsedName( des ); + + MCLFModifiableItem* clfModifiableItem + = ContentListingFactory::NewModifiableItemLC(); + clfModifiableItem->AddFieldL( ECLFFieldIdFileName, parsedName.NameAndExt() ); + clfModifiableItem->AddFieldL( ECLFFieldIdPath, parsedName.Path() ); + clfModifiableItem->AddFieldL( ECLFFieldIdDrive, parsedName.Drive() ); +#ifdef RD_VIDEO_AS_RINGING_TONE + if( PathInfo::PathType( parsedName.DriveAndPath() ) == PathInfo::EVideosPath ) + { + clfModifiableItem->AddFieldL( ECLFFieldIdMediaType, ECLFMediaTypeVideo); + } + else + { + clfModifiableItem->AddFieldL( ECLFFieldIdMediaType, ECLFMediaTypeSound); + } +#else + clfModifiableItem->AddFieldL( ECLFFieldIdMediaType, ECLFMediaTypeSound); +#endif + clfModifiableItem->AddFieldL( ECLFFieldIdFileNameAndPath, des ); + + // Find out MIME type + RApaLsSession apaLsSession; + User::LeaveIfError( apaLsSession.Connect() ); + CleanupClosePushL( apaLsSession ); + TUid dummyUid = { 0 }; // instantiate as zero + TDataType dataType( dummyUid ); + TInt err = apaLsSession.AppForDocument( parsedName.FullName(), dummyUid, dataType ); + CleanupStack::PopAndDestroy(); // apaLsSession.Close() + if( err == KErrNone ) + { + clfModifiableItem->AddFieldL( ECLFFieldIdMimeType, dataType.Des() ); + User::LeaveIfError( iRomRingingToneArray.Append( clfModifiableItem ) ); + CleanupStack::Pop(); // clfModifiableItem + } + else + { + CleanupStack::PopAndDestroy(); // clfModifiableItem + } + } + CleanupStack::PopAndDestroy( concateName ); + } + CleanupStack::PopAndDestroy( fileList); + } + } + + +// ----------------------------------------------------------------------------- +// CompareEntries +// For sorting entry references alphabetically by tone name. +// ----------------------------------------------------------------------------- +// +TInt CompareEntries(const CFLDEntryReference& entry1, const CFLDEntryReference& entry2 ) + { + TParsePtrC parsed1( entry1.PathAndMediaFileName() ); + TParsePtrC parsed2( entry2.PathAndMediaFileName() ); + + return parsed1.Name().CompareF( parsed2.Name() ); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::ScanRomDirectoriesAndInsertL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::ScanRomDirectoriesAndInsertL() + { + CDir* fileList( NULL ); + RFs fsSession; + User::LeaveIfError( fsSession.Connect() ); + CleanupClosePushL( fsSession ); + + TInt directoryCount( iRomDirectoryPaths.Count() ); + for( TInt i= 0; iCount() ); + for ( TInt j=0; j tempBuf = item.iName; + HBufC* concateName = HBufC::NewLC( + iRomDirectoryPaths.MdcaPoint(i).Length() + tempBuf.Length() ); + TPtr des = concateName->Des(); + des.Insert(0, iRomDirectoryPaths.MdcaPoint(i) ); + des.Append( tempBuf ); + + // Only files located on ROM must be scanned + if( ( des.Left( KFLDROMDriveLetter().Length() ).CompareF( + KFLDROMDriveLetter ) == 0 ) ) + { + // Add file to entry-list + CFLDEntryReference* entryRef = new( ELeave ) CFLDEntryReference(); + CleanupStack::PushL( entryRef ); + HBufC* pathAndMediaFileName = des.AllocL(); + entryRef->SetPathAndMediaFileName( pathAndMediaFileName ); + + TParsePtrC parsedName( des ); + if( PathInfo::PathType( parsedName.DriveAndPath() ) == PathInfo::EVideosPath ) + { + entryRef->SetMediaType( ECLFMediaTypeVideo); + } + else + { + entryRef->SetMediaType( ECLFMediaTypeSound); + } + + iEntryFormatter->FormatL( *entryRef ); + User::LeaveIfError( iEntryReferences.Append( entryRef ) ); + CleanupStack::Pop( entryRef ); + } + CleanupStack::PopAndDestroy( concateName ); + } + CleanupStack::PopAndDestroy( fileList); + } + + TLinearOrder* sorter = + new( ELeave ) TLinearOrder ( CompareEntries ); + iEntryReferences.Sort( *sorter ); + delete sorter; + + CleanupStack::PopAndDestroy(); // fsSession + } + + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::FilterItemsL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::FilterItemsL( const TArray& aItemList, + RPointerArray& aFilteredItemList ) + { + + // Add all found entries into model + TInt count( aItemList.Count() ); + for( TInt i = 0 ; i < count ; ++i ) + { + MCLFItem* item = aItemList[i]; + aFilteredItemList.AppendL( item ); + } + + // Fetch tones from ROM directories + CFLDFileListModel::ScanRomDirectoriesL(); + + // Add all found entries into model + count = iRomRingingToneArray.Count(); + for( TInt i = 0 ; i < count ; ++i ) + { + MCLFItem* item = iRomRingingToneArray[i]; + aFilteredItemList.AppendL( item ); + } + + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::GetPopupList +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CFLDPopupList* CFLDFileListModel::GetPopupList() + { + return iPopupList; + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::AddExclusiveMimeTypeL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::AddExclusiveMimeTypeL( const TDesC& aMimeType ) + { + TInt index( 0 ); + if( iExclusiveMimeTypes.Find( aMimeType, index ) == 0 ) + + { + // A duplicate was found, do not add to the array, just return. + return; + } + iExclusiveMimeTypes.AppendL( aMimeType ); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::AddExclusiveMediaTypeL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::AddExclusiveMediaTypeL( const TInt32 aMediaType ) + { + if( iExclusiveMediaTypes.Find( aMediaType ) != KErrNotFound ) + { + // A duplicate was found, do not add to the array, just return. + return; + } + iExclusiveMediaTypes.AppendL( aMediaType ); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::ResetExclusiveMimeTypes +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::ResetExclusiveMimeTypes() + { + iExclusiveMimeTypes.Reset(); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::ResetExclusiveMediaTypes +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::ResetExclusiveMediaTypes() + { + iExclusiveMediaTypes.Reset(); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::CheckRules +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CFLDFileListModel::CheckRules( + TPtrC& aMimeType, TInt32 aMediaType, TPtrC& aPathAndFileName ) + { + + // Check exclusive MIME types + if( iExclusiveMimeTypes.Count() > 0 ) + { + TInt index( 0 ); + if( iExclusiveMimeTypes.Find( aMimeType, index ) == 0 ) + { + return EFalse; + } + } + + // Check exclusive media types + if( iExclusiveMediaTypes.Count() > 0 ) + { + if( iExclusiveMediaTypes.Find( aMediaType ) != KErrNotFound ) + { + return EFalse; + } + } + + if( ( aPathAndFileName.Left( KFLDROMDriveLetter().Length() ).CompareF( + KFLDROMDriveLetter ) == 0 ) ) + { + // ROM tones are accepted always + return ETrue; + } + + // Check defined pathes + if( iDirectoryPaths.Count() > 0 ) + { + TParsePtrC parsedName( aPathAndFileName ); + TInt index( 0 ); + if( iDirectoryPaths.Find( parsedName.DriveAndPath(), index ) != 0 ) + { + // File is not part of defined path set + return EFalse; + } + } + + // File is part of defined path set or then no directory paths are defined + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::PopulateListBoxL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::PopulateListBoxL() + { + // Add all items to the list box + TInt countItems( iModel->ItemCount() ); + TInt error; + + for( TInt i = 0; i < countItems; i++ ) + { + // Check name and path + TPtrC fieldValueNameAndPath; + error = iModel->Item( i ).GetField( + ECLFFieldIdFileNameAndPath, fieldValueNameAndPath ); + + if( error == KErrNone ) + { + // Check media type + TInt32 mediaTypeValue; + error = iModel->Item( i ).GetField( + ECLFFieldIdMediaType, mediaTypeValue ); + + if( error == KErrNone ) + { + // Check MIME type + TPtrC fieldValueMime; + error = iModel->Item( i ).GetField( + ECLFFieldIdMimeType, fieldValueMime ); + + if( error == KErrNone ) + { + // Check include/exclude rules + if( CFLDFileListModel::CheckRules( + fieldValueMime, mediaTypeValue, + fieldValueNameAndPath ) ) + { + // Everything seems to be ok, + // now check file-size limit + if ( iMaxFileSize ) + { + if ( CheckToneFileSizeL( + fieldValueNameAndPath, iMaxFileSize) + != KErrNone ) + { + continue; + } + } + // Finally, add file to entry-list + CFLDEntryReference* entryRef + = new( ELeave ) CFLDEntryReference(); + CleanupStack::PushL( entryRef ); + HBufC* pathAndMediaFileName + = fieldValueNameAndPath.AllocL(); + entryRef->SetPathAndMediaFileName( + pathAndMediaFileName ); + entryRef->SetMediaType( mediaTypeValue ); + iEntryFormatter->FormatL( *entryRef ); + User::LeaveIfError( + iEntryReferences.Append( entryRef ) ); + CleanupStack::Pop( entryRef ); + } + } + } + } + } + + if( countItems == 0 ) + { + // No tones from CLF -- likely out of memory. Scan for ROM tones only. + HBufC* errorText = StringLoader::LoadLC( + R_FLD_QTN_PROFILES_ERROR_NOT_ENOUGH_MEMORY ); + CAknErrorNote* note = new( ELeave ) CAknErrorNote( ETrue ); + note->ExecuteLD( *errorText ); + CleanupStack::PopAndDestroy( errorText ); + + iRomTonesOnly = ETrue; + ScanRomDirectoriesAndInsertL(); + } + + } + + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::RefreshEntryListL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + void CFLDFileListModel::RefreshEntryListL() + { + iRomTonesOnly = EFalse; + + iRomRingingToneArray.ResetAndDestroy(); + iEntryReferences.ResetAndDestroy(); + PopulateReferenceListL(); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::SetPopupList +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::SetPopupList( CFLDPopupList* aPopupList ) + { + iPopupList = aPopupList; + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::MdcaPoint +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + TPtrC16 CFLDFileListModel::MdcaPoint( TInt aIndex ) const + { + TInt nullItemCount( iNullTextArray.Count() ); + if( aIndex < nullItemCount ) + { + // Points to a null item in the beginning of the list. + return iNullTextArray[aIndex]->Des(); + } + TInt referenceListCount( iEntryReferences.Count() ); + if( aIndex >= referenceListCount + nullItemCount ) + { + // Points to a null item in the end of the list. + return iEndNullTextArray[aIndex - referenceListCount - nullItemCount] + ->Des(); + } + + // The index points to one of the directory entries + return iEntryReferences[aIndex - nullItemCount] + ->FormattedPresentation().Des(); + + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::MdcaCount +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + TInt CFLDFileListModel::MdcaCount() const + { + return iNullTextArray.Count() + + iEntryReferences.Count() + iEndNullTextArray.Count(); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::SetEntryFormatter +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + void CFLDFileListModel::SetEntryFormatter( MFLDEntryFormatter* aFormatter ) + { + delete iEntryFormatter; + iEntryFormatter = aFormatter; + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::InsertNullItemL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + void CFLDFileListModel::InsertNullItemL( const TDesC& aItemText ) + { + InsertNullItemL( aItemText, KNullDesC ); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::InsertNullItemL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + void CFLDFileListModel::InsertNullItemL( + const TDesC& aItemText, const TDesC& aFileName ) + { + HBufC* text = iEntryFormatter->FormatTextLC( aItemText ); + // Takes ownership + User::LeaveIfError( iNullTextArray.Append( text ) ); + CleanupStack::Pop( text ); + + text = aFileName.AllocLC(); + // Takes ownership + User::LeaveIfError( iNullTextRingingToneArray.Append( text ) ); + CleanupStack::Pop( text ); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::InsertEndNullItemL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + void CFLDFileListModel::InsertEndNullItemL( const TDesC& aItemText ) + { + InsertEndNullItemL( aItemText, KNullDesC ); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::InsertEndNullItemL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + void CFLDFileListModel::InsertEndNullItemL( + const TDesC& aItemText, const TDesC& aFileName ) + { + HBufC* text = iEntryFormatter->FormatTextLC( aItemText ); + // Takes ownership + User::LeaveIfError( iEndNullTextArray.Append( text ) ); + CleanupStack::Pop( text ); + + text = aFileName.AllocLC(); + // Takes ownership + User::LeaveIfError( iEndNullTextRingingToneArray.Append( text ) ); + CleanupStack::Pop( text ); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::GetFileName +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + void CFLDFileListModel::GetFileName( TDes& aFileName, const TInt aIndex ) + { + TInt nullItemCount( iNullTextRingingToneArray.Count() ); + if( aIndex < nullItemCount ) + { + // Points to a null item in the beginning of the list. + aFileName.Copy( iNullTextRingingToneArray[aIndex]->Des() ); + return; + } + TInt referenceListCount( iEntryReferences.Count() ); + if( aIndex >= referenceListCount + nullItemCount ) + { + // Points to a null item in the end of the list. + aFileName.Copy( iEndNullTextRingingToneArray[ + aIndex - referenceListCount - nullItemCount]->Des() ); + return; + } + + // The index points to one of the directory entries + CFLDEntryReference& entry = *iEntryReferences[aIndex - nullItemCount]; + aFileName.Copy( entry.PathAndMediaFileName().Des() ); + + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::FindFileL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + TInt CFLDFileListModel::FindFileL( const TDesC& aFileName ) + { + TInt ret( KErrNotFound ); + TInt count( MdcaCount() ); + TFileName fileName( KNullDesC ); + for( TInt index( 0 ); index < count; index++ ) + { + GetFileNameAtIndex( index, fileName ); + if( fileName.CompareF( aFileName ) == 0 ) + { + ret = index; + break; + } + } + return ret; + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::GetFileNameAtIndex +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::GetFileNameAtIndex( + TInt aIndex, TDes& aFileName ) const + { + TInt nullItemCount( iNullTextRingingToneArray.Count() ); + if( aIndex < nullItemCount ) + { + // Points to a null item in the beginning of the list. + aFileName.Copy( iNullTextRingingToneArray[aIndex]->Des() ); + return; + } + TInt referenceListCount( iEntryReferences.Count() ); + if( aIndex >= referenceListCount + nullItemCount ) + { + // Points to a null item in the end of the list. + aFileName.Copy( iEndNullTextRingingToneArray[ + aIndex - referenceListCount - nullItemCount]->Des() ); + return; + } + + // The index points to one of the directory entries + CFLDEntryReference& entry = *iEntryReferences[aIndex - nullItemCount]; + aFileName.Copy( entry.PathAndMediaFileName().Des() ); + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::MediaFileType +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt32 CFLDFileListModel::MediaFileType( const TDesC& aFileName ) const + { + if( iRomTonesOnly ) + { + // Model is empty, get media type from entry reference + for(TInt i = 0; i < iEntryReferences.Count(); i++) + { + if( aFileName.CompareF( iEntryReferences[i]->PathAndMediaFileName() ) == 0 ) + { + return iEntryReferences[i]->MediaType(); + } + } + } + else + { + TInt countItems( iModel->ItemCount() ); + for( TInt i = 0; i < countItems; i++ ) + { + // Get value of requested field and add item to the list box + TPtrC fieldValue; + TInt error( iModel->Item( i ).GetField( + ECLFFieldIdFileNameAndPath, fieldValue ) ); + + if( error == KErrNone ) + { + if( aFileName.CompareF( fieldValue ) == 0 ) + { + TInt32 mediaTypeValue; + TInt error( iModel->Item( i ).GetField( + ECLFFieldIdMediaType, mediaTypeValue ) ); + + if( error == KErrNone ) + { + return mediaTypeValue; + } + } + } + } + } + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::SetMaxFileSize +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CFLDFileListModel::SetMaxFileSize( const TInt aMaxFileSize ) + { + iMaxFileSize = aMaxFileSize; + } + +// ----------------------------------------------------------------------------- +// CFLDFileListModel::CheckToneFileSizeL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CFLDFileListModel::CheckToneFileSizeL( + const TDesC& aFile, TInt aSizeLimit ) + { + RFs& fsSession( CCoeEnv::Static()->FsSession() ); + + // Get file size + TInt size = 0; + TInt error = KErrNone; + + TEntry entry; + if ( fsSession.Entry( aFile, entry ) == KErrNone ) + { + size = entry.iSize; + } + + // Check. NOTE: now if file size couldn't be determined, check fails. + if ( aSizeLimit && size > aSizeLimit ) + { + error = KErrTooBig; + } + + return error; + } + + +// End of File