diff -r 491b3ed49290 -r 65326cf895ed filemanager/GFLM/src/CGflmDirectoryListingCache.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filemanager/GFLM/src/CGflmDirectoryListingCache.cpp Wed Sep 01 12:31:07 2010 +0100 @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2002-2006 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: Provides directory listing cache +* +*/ + + + +// INCLUDE FILES +#include "CGflmDirectoryListingCache.h" +#include "GFLM.hrh" +#include "GflmUtils.h" +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#else +#include +#include +#endif +#include + + +// CONSTANTS +const TInt KListingGranularity = 0x2000; // 8KB + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CGflmDirectoryListingCache::CGflmDirectoryListingCache +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CGflmDirectoryListingCache::CGflmDirectoryListingCache( + RFs& aFss, + const TBool& aCancelIndicator ) : + iFss( aFss ), + iCancelIndicator( aCancelIndicator ) + { + } + +// ----------------------------------------------------------------------------- +// CGflmDirectoryListingCache::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CGflmDirectoryListingCache* CGflmDirectoryListingCache::NewL( + RFs& aFss, + const TBool& aCancelIndicator ) + { + return new( ELeave ) CGflmDirectoryListingCache( + aFss, aCancelIndicator ); + } + +// ----------------------------------------------------------------------------- +// CGflmDirectoryListingCache::~CGflmDirectoryListingCache() +// ----------------------------------------------------------------------------- +// +CGflmDirectoryListingCache::~CGflmDirectoryListingCache() + { + delete iCache; + } + +// ----------------------------------------------------------------------------- +// CGflmDirectoryListingCache::ClearCache() +// ----------------------------------------------------------------------------- +// +void CGflmDirectoryListingCache::ClearCache() + { + iClearCache = ETrue; + } + +// ----------------------------------------------------------------------------- +// CGflmDirectoryListingCache::ListingL() +// Looks if a directory's listing is already loaded and returns it. If the +// the listing is not found, it's read and added to the cache. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +const CGflmDirectoryListingCache::CEntryArray* + CGflmDirectoryListingCache::ListingL( const TDesC& aDirectory ) + { + + TIMESTAMP( "GFLM listing fetch started: " ) + + // Clear directory cache first if needed + if ( iClearCache ) + { + delete iCache; + iCache = NULL; + iClearCache = EFalse; + } + + // Check if directory is already cached + TBool found( EFalse ); + if ( iCache && !aDirectory.Compare( *( iCache->iDirectory ) ) ) + { + found = ETrue; + } + + if ( !found ) + { + // Read directory to cache + CListingNamePair* newPair = CListingNamePair::NewLC( aDirectory ); + GetDirL( *newPair ); + CleanupStack::Pop( newPair ); + delete iCache; + iCache = NULL; + iCache = newPair; + } + + TIMESTAMP( "GFLM listing fetch ended: " ) + + return iCache->iListing; + } + +// ----------------------------------------------------------------------------- +// CGflmDirectoryListingCache::GetDirL +// ----------------------------------------------------------------------------- +// +void CGflmDirectoryListingCache::GetDirL( CListingNamePair& aPair ) + { + RDir dir; + User::LeaveIfError( dir.Open( + iFss, + *aPair.iDirectory, + KEntryAttNormal | KEntryAttDir ) ); + CleanupClosePushL( dir ); + + TInt err( KErrNone ); + + do + { + if ( iCancelIndicator ) + { + // User has canceled the operation, abort + User::Leave( KErrCancel ); + } + + err = dir.Read( iEntryBuffer ); + if ( err == KErrNone || err == KErrEof ) + { + TInt entryCount( iEntryBuffer.Count() ); + if ( !entryCount ) + { + break; + } + for ( TInt i( 0 ); i < entryCount; i++ ) + { + const TEntry& entry( iEntryBuffer[ i ] ); + TInt entrySize( EntrySize( entry, ETrue ) ); + aPair.iListing->AppendL( entry, entrySize ); + } + } + + }while ( err == KErrNone ); + + if ( err != KErrNone && err != KErrEof ) + { + User::Leave( err ); + } + + CleanupStack::PopAndDestroy( &dir ); + } + +// ----------------------------------------------------------------------------- +// CGflmDirectoryListingCache::CListingNamePair::~CListingNamePair() +// ----------------------------------------------------------------------------- +// +CGflmDirectoryListingCache::CListingNamePair::~CListingNamePair() + { + delete iDirectory; + + if ( iListing ) + { + iListing->Reset(); + delete iListing; + } + } + +// ----------------------------------------------------------------------------- +// CGflmDirectoryListingCache::CListingNamePair::ConstructL() +// ----------------------------------------------------------------------------- +// +void CGflmDirectoryListingCache::CListingNamePair::ConstructL( + const TDesC& aDirectory ) + { + iDirectory = aDirectory.AllocL(); + iListing = new( ELeave ) CEntryArray( KListingGranularity ); + } + +// ----------------------------------------------------------------------------- +// CGflmDirectoryListingCache::CListingNamePair::NewLC() +// ----------------------------------------------------------------------------- +// +CGflmDirectoryListingCache::CListingNamePair* + CGflmDirectoryListingCache::CListingNamePair::NewLC( + const TDesC& aDirectory ) + { + CListingNamePair* self = new ( ELeave ) CListingNamePair(); + CleanupStack::PushL( self ); + self->ConstructL( aDirectory ); + return self; + } + +// End of File