diff -r 000000000000 -r ba25891c3a9e ncdengine/engine/src/catalogsstringmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/engine/src/catalogsstringmanager.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,255 @@ +/* +* Copyright (c) 2006-2008 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: Implements CCatalogsStringManager class +* +*/ + + +#include "catalogsstringmanager.h" +#include "catalogsrefstring.h" +#include "catalogsconstants.h" + +#include "catalogsdebug.h" + + +CCatalogsStringManager* CCatalogsStringManager::iStringManager = NULL; + + + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +CCatalogsStringManager* CCatalogsStringManager::NewL() + { + CCatalogsStringManager* self = new( ELeave ) CCatalogsStringManager; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Delete +// --------------------------------------------------------------------------- +// +void CCatalogsStringManager::Delete() + { + delete iStringManager; + iStringManager = NULL; + } + + +// --------------------------------------------------------------------------- +// Sets new string manager +// --------------------------------------------------------------------------- +// +void CCatalogsStringManager::SetStringManager( + CCatalogsStringManager* aManager ) + { + delete iStringManager; + iStringManager = aManager; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CCatalogsStringManager::~CCatalogsStringManager() + { + TInt count = iStrings.Count(); + while ( count-- ) + { +#ifdef CATALOGS_BUILD_CONFIG_DEBUG + // Check that every string has refcount 1 + RStringArray& array = iStrings[ count ]; + TInt arrayCount = array.Count(); + while( arrayCount-- ) + { + DLTRACE(( _L("Unreleased string: %S, refcount: %d"), + &array[ arrayCount ]->String(), + array[ arrayCount ]->RefCount() )); + } + DASSERT( array.Count() == 0 ); +#endif + // Call Release() for each string + iStrings[ count ].ResetAndDestroy(); + } + iStrings.Close(); + delete iSearchString; + + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +const CCatalogsRefString& CCatalogsStringManager::StringL( + TInt aType, + const TDesC& aString ) + { + RStringArray& array = ArrayL( aType ); + + TInt index = FindString( array, aString ); + if ( index == KErrNotFound ) + { + + HBufC* copy = aString.AllocL(); + // Ownership is transferred + return AddStringL( array, copy ); + } + + array[index]->AddRef(); + return *array[index]; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +const CCatalogsRefString& CCatalogsStringManager::StringL( + TInt aType, + HBufC* aString ) + { + DASSERT( aString ); + + CleanupStack::PushL( aString ); + RStringArray& array = ArrayL( aType ); + + TInt index = FindString( array, *aString ); + if ( index == KErrNotFound ) + { + + CleanupStack::Pop( aString ); + // Ownership is transferred + return AddStringL( array, aString ); + } + + CleanupStack::PopAndDestroy( aString ); + array[index]->AddRef(); + return *array[index]; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CCatalogsStringManager::ReleaseString( + TInt aType, + const CCatalogsRefString& aString ) + { + // Only nodeidentifiermanager has a reference, release it entirely + if ( aString.Release() == 1 ) + { + // The string MUST be in the array and aType must be correct + DASSERT( iStrings.Count() > aType ); + RStringArray& array = iStrings[ aType ]; + array.Remove( array.FindInOrder( &aString, iOrder ) ); + + // Final delete + aString.Release(); + } + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CCatalogsStringManager::ReleaseString( + TInt aType, + const CCatalogsRefString*& aString ) + { + if ( aString ) + { + ReleaseString( aType, *aString ); + aString = NULL; + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CCatalogsStringManager::CCatalogsStringManager() + : iOrder( CCatalogsRefString::Order ) + { + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CCatalogsStringManager::ConstructL() + { + iSearchString = new( ELeave ) CCatalogsRefSearchString( KNullDesC ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CCatalogsStringManager::RStringArray& + CCatalogsStringManager::ArrayL( TInt aIndex ) + { + while ( aIndex >= iStrings.Count() ) + { + DLTRACE(("Creating new arrays")); + RStringArray array( KStringArrayGranularity ); + CleanupClosePushL( array ); + iStrings.AppendL( array ); + CleanupStack::Pop( &array ); + } + return iStrings[ aIndex ]; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CCatalogsStringManager::FindString( + const RStringArray& aArray, + const TDesC& aString ) const + { + // This is class is a wrapper that is used for searching. It doesn't copy + // the search string + iSearchString->SetString( aString ); + TInt index = aArray.FindInOrder( iSearchString, iOrder ); + return index; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +const CCatalogsRefString& CCatalogsStringManager::AddStringL( + RStringArray& aArray, + HBufC* aString ) + { + // Ownership of aString is transferred. aString is deleted by + // NewLC if it leaves + CCatalogsRefString* refString = CCatalogsRefString::NewLC( aString ); + aArray.InsertInOrderL( refString, iOrder ); + CleanupStack::Pop( refString ); + refString->AddRef(); + return *refString; + } +