ncdengine/engine/src/catalogsstringmanager.cpp
changeset 0 ba25891c3a9e
--- /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;
+    }
+