diff -r 5315654608de -r 08c6ee43b396 idlehomescreen/xmluirendering/dom/src/xndomstringpool.cpp --- a/idlehomescreen/xmluirendering/dom/src/xndomstringpool.cpp Thu Jan 07 12:39:41 2010 +0200 +++ b/idlehomescreen/xmluirendering/dom/src/xndomstringpool.cpp Mon Jan 18 20:10:36 2010 +0200 @@ -19,7 +19,7 @@ // INCLUDE FILES #include "xndomstringpool.h" - +#include "xndomstringpooloptimizer.h" // ============================ LOCAL FUNCTIONS ================================ @@ -30,9 +30,9 @@ // might leave. // ----------------------------------------------------------------------------- // -CXnDomStringPool::CXnDomStringPool() +CXnDomStringPool::CXnDomStringPool( const TBool aAllowDuplicates ) : + iAllowDuplicates( aAllowDuplicates ) { - iStringPoolOffsetCurrent = iStringPoolOffsetNext = 0; } // ----------------------------------------------------------------------------- @@ -49,9 +49,10 @@ // Two-phased constructor. // ----------------------------------------------------------------------------- // -CXnDomStringPool* CXnDomStringPool::NewL() +CXnDomStringPool* CXnDomStringPool::NewL( const TBool aAllowDuplicates ) { - CXnDomStringPool* self = new( ELeave ) CXnDomStringPool; + CXnDomStringPool* self = + new( ELeave ) CXnDomStringPool( aAllowDuplicates ); CleanupStack::PushL( self ); self->ConstructL(); @@ -66,9 +67,10 @@ // Two-phased stream constructor. // ----------------------------------------------------------------------------- // -CXnDomStringPool* CXnDomStringPool::NewL( RReadStream& aStream ) +CXnDomStringPool* CXnDomStringPool::NewL( RReadStream& aStream, + const TBool aAllowDuplicates ) { - CXnDomStringPool* self = new( ELeave ) CXnDomStringPool; + CXnDomStringPool* self = new( ELeave ) CXnDomStringPool( aAllowDuplicates ); CleanupStack::PushL( self ); aStream >> *self; CleanupStack::Pop(self); @@ -84,6 +86,7 @@ CXnDomStringPool::~CXnDomStringPool() { iStringPool.ResetAndDestroy(); + iStringPoolOptimizer.Close(); } // ----------------------------------------------------------------------------- @@ -91,15 +94,23 @@ // ----------------------------------------------------------------------------- // CXnDomStringPool* CXnDomStringPool::CloneL() - { - CXnDomStringPool* clone = CXnDomStringPool::NewL(); + { + CXnDomStringPool* clone = NULL; + if( iAllowDuplicates ) + { + clone = CXnDomStringPool::NewL( ETrue ); + } + else + { + clone = CXnDomStringPool::NewL( EFalse ); + } CleanupStack::PushL( clone ); TInt count( iStringPool.Count() ); - for ( TInt i=0; iDes().AllocLC(); - clone->iStringPool.AppendL( tmp ); + clone->DoAddStringL( tmp ); CleanupStack::Pop( tmp ); } CleanupStack::Pop( clone ); @@ -110,32 +121,56 @@ // CXnDomNode::AddStringL // ----------------------------------------------------------------------------- // -EXPORT_C TInt CXnDomStringPool::AddStringL( const TDesC8& aString ) - { - TBool found( EFalse ); - TInt index( 0 ); - - TInt count( iStringPool.Count() ); - for (; index < count && !found; ) +TInt CXnDomStringPool::AddStringL( const TDesC8& aString ) + { + TInt index = iStringPoolOptimizer.GetIndex( aString ); + + if( index == KErrNotFound ) + { + HBufC8* string = aString.AllocLC(); + index = DoAddStringL( string ); + CleanupStack::Pop( string ); + } + + return index; + } + +// ----------------------------------------------------------------------------- +// CXnDomNode::AddStringL +// ----------------------------------------------------------------------------- +// +TInt CXnDomStringPool::AddStringL( HBufC8* aString ) + { + if( !aString ) { - if ( iStringPool[ index ]->Des().Compare( aString ) == 0 ) - { - found = ETrue; - } - else - { - index++; - } + User::Leave( KErrArgument ); + } + + TInt index = iStringPoolOptimizer.GetIndex( *aString ); + + if( index == KErrNotFound ) + { + index = DoAddStringL( aString ); + } + else + { + delete aString; } - if ( !found ) + + return index; + } + +// ----------------------------------------------------------------------------- +// CXnDomNode::AddStringL +// ----------------------------------------------------------------------------- +// +void CXnDomStringPool::AddAllL( CXnDomStringPool& aStringPool ) + { + const TInt count = aStringPool.Count(); + for( TInt i = 0; i < count; i++ ) { - HBufC8* tmp = aString.AllocLC(); - iStringPool.AppendL( tmp ); - CleanupStack::Pop( tmp ); - index = iStringPool.Count()-1; //Last item - iStringPoolOffsetNext++; - } - return index; + AddStringL( aStringPool.String( i ) ); + } } // ----------------------------------------------------------------------------- @@ -143,10 +178,17 @@ // ----------------------------------------------------------------------------- // const TDesC8& CXnDomStringPool::String( const TInt aStringRef ) - { - return (*iStringPool[ aStringRef ]); + { + if( aStringRef >= 0 && aStringRef < iStringPool.Count() ) + { + return (*iStringPool[ aStringRef ]); + } + else + { + return KNullDesC8; + } } - + // ----------------------------------------------------------------------------- // CXnDomStringPool::Size // ----------------------------------------------------------------------------- @@ -167,6 +209,15 @@ } // ----------------------------------------------------------------------------- +// CXnDomStringPool::Count +// ----------------------------------------------------------------------------- +// +TInt CXnDomStringPool::Count() const + { + return iStringPool.Count(); + } + +// ----------------------------------------------------------------------------- // CXnDomStringPool::ExternalizeL // ----------------------------------------------------------------------------- // @@ -189,27 +240,39 @@ void CXnDomStringPool::InternalizeL( RReadStream& aStream ) { TInt len(0); - TInt16 count ( aStream.ReadInt16L() ); - - iStringPoolOffsetCurrent = iStringPoolOffsetNext; - iStringPoolOffsetNext += count; + TInt16 count ( aStream.ReadInt16L() ); for ( TInt i=0; i