diff -r 10e98eab6f85 -r a359256acfc6 webengine/osswebengine/cache/src/HttpCacheLookupTable.cpp --- a/webengine/osswebengine/cache/src/HttpCacheLookupTable.cpp Fri Jul 03 15:54:40 2009 +0100 +++ b/webengine/osswebengine/cache/src/HttpCacheLookupTable.cpp Thu Aug 27 07:44:59 2009 +0300 @@ -72,8 +72,8 @@ // void CHttpCacheLookupTable::ConstructL() { - iEntries = new( ELeave )CArrayPtrFlat( KHttpCacheLookupTableSize ); - for( TInt i = 0; i < KHttpCacheLookupTableSize; i++ ) + iEntries = new( ELeave )CArrayPtrFlat( KHttpCacheLookupTableSize ); + for ( TInt i = 0; i < KHttpCacheLookupTableSize; i++ ) { iEntries->AppendL( NULL ); } @@ -118,7 +118,6 @@ } delete iEntries; - } // ----------------------------------------------------------------------------- @@ -140,7 +139,12 @@ } else { +#ifdef __CACHELOG__ + HttpCacheUtil::WriteFormatLog(0, _L(" Added entry %08x to list."), entry); +#endif entry->Accessed(); + iStreamHandler->InitialiseCacheEntryL(*entry); + // lookuptable takes ownership CleanupStack::Pop(); // entry } @@ -156,20 +160,29 @@ { CHttpCacheEntry* entry = NULL; TInt pos( Probe( aUrl, EFalse ) ); - +#ifdef __CACHELOG__ + HttpCacheUtil::WriteUrlToLog(0, _L("CHttpCacheLookupTable::Find"), aUrl); + HttpCacheUtil::WriteFormatLog(0, _L(" Probe returned position %d"), pos); +#endif if ( Valid( pos ) ) { +#ifdef __CACHELOG__ + HttpCacheUtil::WriteFormatLog(0, _L(" Entry %d valid."), pos); +#endif entry = iEntries->At( pos ); - + if ( entry ) { +#ifdef __CACHELOG__ + HttpCacheUtil::WriteFormatLog(0, _L(" BodySize is %d\n State is %d"), entry->BodySize(), entry->State()); +#endif if ( entry->BodySize() == 0 && entry->State() == CHttpCacheEntry::ECacheComplete ) { #ifdef __CACHELOG__ HttpCacheUtil::WriteLogFilenameAndUrl( 0, - _L("CHttpCacheLookupTable::Find - Found ZERO size"), + _L("CHttpCacheLookupTable::Find - Found ZERO size (can't reuse)"), entry->Filename(), entry->Url(), pos, @@ -179,6 +192,9 @@ } } } +#ifdef __CACHELOG__ + HttpCacheUtil::WriteFormatLog(0, _L(" returning entry pointer 0x%08x"), entry); +#endif return entry; } @@ -192,7 +208,10 @@ { TInt status( KErrNotFound ); TInt pos( Probe( aUrl, EFalse ) ); - +#ifdef __CACHELOG__ + HttpCacheUtil::WriteUrlToLog(0, _L("CHttpCacheLookupTable::Remove"), aUrl); + HttpCacheUtil::WriteFormatLog(0, _L(" Probe returned position %d"), pos); +#endif if( Valid( pos ) ) { // remove only nonactive entry @@ -225,7 +244,7 @@ } else { - HttpCacheUtil::WriteLog( 0, _L( "CHttpCacheLookupTable::Remove - item is not valid. cannot be removed" ), pos ); + HttpCacheUtil::WriteFormatLog( 0, _L( "CHttpCacheLookupTable::Remove - item %d is not valid. cannot be removed" ), pos ); } #endif // __CACHELOG__ @@ -233,27 +252,6 @@ } // ----------------------------------------------------------------------------- -// CHttpCacheLookupTable::RemoveByPosition -// -// ----------------------------------------------------------------------------- -// -TInt CHttpCacheLookupTable::RemoveByPosition( TInt aPos ) - { - TInt status( KErrNotFound ); - - if ( Valid( aPos ) ) - { - CHttpCacheEntry* entry = iEntries->At( aPos ); - SetDeleted( aPos ); - delete entry; - iCount--; - status = KErrNone; - } - - return status; - } - -// ----------------------------------------------------------------------------- // CHttpCacheLookupTable::EraseCacheEntry // // ----------------------------------------------------------------------------- @@ -261,7 +259,7 @@ void CHttpCacheLookupTable::EraseCacheEntry( const TDesC8& aUrl ) { TInt pos( Probe( aUrl, EFalse ) ); - + if ( Valid( pos ) ) { Erase( pos ); @@ -320,13 +318,13 @@ TInt count( 0 ); TInt error( KErrNone ); - //1. Tally up + //1. Tally up for (TInt i = 0; i < iEntries->Count(); i++) { if (Valid(i)) count++; } - //2. Preallocation. + //2. Preallocation. TInt existing( aFilenameList.Count() ); error = aFilenameList.Reserve( existing + count ); @@ -337,13 +335,13 @@ { if (Valid(i)) { - //add filename pointer to the array. + //add filename pointer to the array. const TDesC* ptr = &(iEntries->At(i)->Filename()); aFilenameList.Append( ptr ); // no ownership transfer happens here } } } - + return error; } @@ -354,14 +352,22 @@ // ----------------------------------------------------------------------------- // void CHttpCacheLookupTable::InternalizeL( - RFileReadStream& aReadStream, - const TDesC& /*aDirectory*/ ) + RReadStream& aReadStream, + const TDesC& aDirectory ) { // get number of entries TInt version = 0; version = aReadStream.ReadInt32L(); - if( version == KCacheVersionNumber ) + if ( version == KCacheVersionNumber ) { + // read directory stub and validate it + TInt len = aReadStream.ReadInt32L(); + HBufC* dirstub = HBufC::NewLC(len); + TPtr dirstubptr = dirstub->Des(); + aReadStream.ReadL( dirstubptr, len ); + ASSERT( aDirectory.CompareF( dirstubptr ) == 0 ); + CleanupStack::PopAndDestroy( dirstub ); + TInt count( aReadStream.ReadInt32L() ); TInt contentSize( 0 ); TInt err; @@ -370,27 +376,22 @@ // create empty object CHttpCacheEntry* entry = CHttpCacheEntry::NewLC( KNullDesC8, *iEvictionHandler ); // read it - err = entry->Internalize( aReadStream ); - - if ( err == KErrNone && entry->BodySize() > 0 ) + err = entry->Internalize( aReadStream, aDirectory ); + // leave only on no memory + if( err == KErrNone ) { - // cacheEntry is valid, insert into the table + // insert to the table InsertL( entry ); contentSize += entry->HeaderSize(); contentSize += entry->BodySize(); } else if ( err == KErrNoMemory ) { - // Only leave if no memory User::Leave( KErrNoMemory ); } - else if ( entry->BodySize() == 0 ) + else { - // This is an empty cache entry, remove it from file system. - // Use CreateNewFilesL() to open file handles, so we can delete - // the files associated with the cache entry. - iStreamHandler->CreateNewFilesL( *entry ); - iStreamHandler->EraseCacheFile( *entry ); + // suggestions } // takes ownership @@ -415,22 +416,40 @@ // ----------------------------------------------------------------------------- // void CHttpCacheLookupTable::ExternalizeL( - RFileWriteStream& aWriteStream ) + RWriteStream& aWriteStream, const TDesC& aDirectory ) { // write version number and the number of entries - TRAP_IGNORE( aWriteStream.WriteInt32L( KCacheVersionNumber ); - aWriteStream.WriteInt32L( iCount ) ); + TRAP_IGNORE( aWriteStream.WriteInt32L( KCacheVersionNumber ) ); + + // directory stub length + aWriteStream.WriteInt32L( aDirectory.Length() ) ; + // directory stub + aWriteStream.WriteL( aDirectory ); + + // entry count - don't write entries with zero body length, so precalculate this. + TInt goingToWrite = 0; for( TInt i = 0; i < iEntries->Count(); i++ ) { CHttpCacheEntry* entry = iEntries->At( i ); // save complete entries only - if( Valid( i ) ) + if( Valid( i ) && entry->BodySize() > 0 ) + { + goingToWrite++; + } + } + aWriteStream.WriteInt32L( goingToWrite ); + + for( TInt i = 0; i < iEntries->Count(); i++ ) + { + CHttpCacheEntry* entry = iEntries->At( i ); + // save complete entries only + if( Valid( i ) && entry->BodySize() > 0 ) { // save entry TInt err; - err = entry->Externalize( aWriteStream ); + err = entry->Externalize( aWriteStream, aDirectory ); // leave only on no memory - if( err == KErrNoMemory ) + if ( err == KErrNoMemory ) { User::Leave( KErrNoMemory ); } @@ -454,15 +473,27 @@ if ( aCacheEntry ) { pos = Probe( aCacheEntry->Url(), ETrue ); +#ifdef __CACHELOG__ + HttpCacheUtil::WriteUrlToLog(0, _L("CHttpCacheLookupTable::InsertL"), aCacheEntry->Url()); + HttpCacheUtil::WriteFormatLog(0, _L(" Probe returned position %d"), pos); +#endif // double check if( Valid( pos ) ) { +#ifdef __CACHELOG__ + HttpCacheUtil::WriteLog(0, _L(" Valid entry already exists according to Valid(). Rehash table.")); +#endif // try to rehash the table if probe failed ReHashL(); pos = Probe( aCacheEntry->Url(), ETrue ); - +#ifdef __CACHELOG__ + HttpCacheUtil::WriteFormatLog(0, _L(" ReProbe after rehash returned new position %d"), pos); +#endif if( pos == -1 || Valid( pos ) ) { +#ifdef __CACHELOG__ + HttpCacheUtil::WriteLog(0, _L(" Pos already filled (or == -1) - Couldn't find an empty slot to store it.")); +#endif // completly failed pos = -1; } @@ -473,13 +504,15 @@ { iEntries->At( pos ) = aCacheEntry; iCount++; - #ifdef __CACHELOG__ - HttpCacheUtil::WriteLog( 0, _L( "insert new item to the lookuptable" ), pos ); + HttpCacheUtil::WriteFormatLog( 0, _L( "insert new item at %d in the lookuptable" ), pos ); #endif // check if the hashtable is full if ( iCount > ( iEntries->Count() >> 1 ) ) { +#ifdef __CACHELOG__ + HttpCacheUtil::WriteLog(0, _L(" But! hashtable is full - rehash.")); +#endif ReHashL(); } } @@ -687,9 +720,6 @@ if( entry ) { - // delete file associated with this entry - TBool attached( EFalse ); - #ifdef __CACHELOG__ HttpCacheUtil::WriteLogFilenameAndUrl( 0, _L("CHttpCacheLookupTable::Erase"), @@ -697,14 +727,8 @@ entry->Url(), aPos, ELogLookupTablePos ); -#endif - TRAPD( err, attached = iStreamHandler->AttachL( *entry ) ); - if ( err == KErrNone && attached ) - { - iStreamHandler->EraseCacheFile( *entry ); - iStreamHandler->Detach( *entry ); - } - +#endif + iStreamHandler->Erase( *entry ); SetDeleted( aPos ); delete entry; iCount--; @@ -826,7 +850,7 @@ CHttpCacheEntry* myEntry = InsertL(newEntry->Url()); myEntry->SetState( CHttpCacheEntry::ECacheComplete ); myEntry->Accessed(newEntry->LastAccessed(), newEntry->Ref()); - } + } aHttpCacheLookupTable->SetDeleted(pos); delete newEntry; aHttpCacheLookupTable->iCount--; @@ -835,28 +859,32 @@ } // ----------------------------------------------------------------------------- -// CHttpCacheLookupTable::FindCacheEntryIndex +// CHttpCacheLookupTable::BeginEntryIteration +// +// ----------------------------------------------------------------------------- +// +void CHttpCacheLookupTable::BeginEntryIteration(THttpCacheLookupTableEntryIterator& aIter) + { + aIter.iPos = 0; + aIter.iCount = iCount; + } + +// ----------------------------------------------------------------------------- +// CHttpCacheLookupTable::NextEntry // // ----------------------------------------------------------------------------- // -void CHttpCacheLookupTable::FindCacheEntryIndex( - const CHttpCacheEntry& aCacheEntry, - TInt* aIndex ) +const CHttpCacheEntry* CHttpCacheLookupTable::NextEntry(THttpCacheLookupTableEntryIterator& aIter) { - *aIndex = -1; - for ( TInt i = 0; i < iEntries->Count(); i++ ) - { - CHttpCacheEntry* entry = iEntries->At( i ); + const CHttpCacheEntry *entry = NULL; - if ( entry == &aCacheEntry ) - { - if ( aIndex ) - { - *aIndex = i; - } - break; - } + while ( !entry && aIter.iPos < iEntries->Count() ) + { + entry = Valid(aIter.iPos) ? iEntries->At(aIter.iPos) : NULL; + aIter.iPos++; } + + return entry; } // End of File