homescreenpluginsrv/hspsdom/src/hspsdomstringpool.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 00:23:10 +0200
changeset 4 1a2a00e78665
parent 0 79c6a41cd166
child 11 bd874ee5e5e2
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2005,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:  Represent string pool for dom strings
*
*/



// INCLUDE FILES
#include    "hspsdomstringpool.h"


// ============================ LOCAL FUNCTIONS ================================
// -----------------------------------------------------------------------------
// Adds string to string pool. If string doesn't appear yet, it is added to 
// the string pool and index to pool is returned. 
// @param aString String to add 
// @param aArray A pool which holds strings
// @return Index to string pool 
// -----------------------------------------------------------------------------
//
LOCAL_C TInt AddToStringPoolL( const TDesC8& aString, RPointerArray<HBufC8>& aArray )
    {
    TBool found( EFalse );
    TInt index( 0 );
     
    TInt count( aArray.Count() );
    for (; index < count && !found;  )
        {
        if ( aArray[ index ]->Des().Compare( aString ) == 0 )
            {
            found = ETrue;
            }
        else
            {
            index++;
            }    
        }
    if ( !found )
        {
        HBufC8* tmp = aString.AllocLC();
        aArray.AppendL( tmp );
        CleanupStack::Pop( tmp );
        index = aArray.Count()-1;    //Last item
        }
    return index;
    }
// ============================ MEMBER FUNCTIONS ===============================
// -----------------------------------------------------------------------------
// ChspsDomStringPool::ChspsDomStringPool
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
ChspsDomStringPool::ChspsDomStringPool()
    {
    }

// -----------------------------------------------------------------------------
// ChspsDomStringPool::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void ChspsDomStringPool::ConstructL()
    {
    }

// -----------------------------------------------------------------------------
// ChspsDomStringPool::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
ChspsDomStringPool* ChspsDomStringPool::NewL()
    {
    ChspsDomStringPool* self = new( ELeave ) ChspsDomStringPool;
    
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop(self);

    return self;
    }    


// -----------------------------------------------------------------------------
// ChspsDomStringPool::NewL
// Two-phased stream constructor.
// -----------------------------------------------------------------------------
//
ChspsDomStringPool* ChspsDomStringPool::NewL( RReadStream& aStream )
    {
    ChspsDomStringPool* self = new( ELeave ) ChspsDomStringPool;
    CleanupStack::PushL( self );
    aStream >> *self;
    CleanupStack::Pop(self);

    return self;
    }    
    
// -----------------------------------------------------------------------------
// ChspsDomStringPool::~ChspsDomStringPool
// Destructor
// -----------------------------------------------------------------------------
//
ChspsDomStringPool::~ChspsDomStringPool()
    {
    iStringPool.ResetAndDestroy();
    }

// -----------------------------------------------------------------------------
// ChspsDomStringPool::CloneL
// -----------------------------------------------------------------------------
//
ChspsDomStringPool* ChspsDomStringPool::CloneL()
    {
    ChspsDomStringPool* clone = ChspsDomStringPool::NewL();
    CleanupStack::PushL( clone );
    
    TInt count( iStringPool.Count() );
    for ( TInt i=0; i<count; i++ )
        {
        HBufC8* tmp = iStringPool[i]->Des().AllocLC();
        clone->iStringPool.AppendL( tmp );
        CleanupStack::Pop( tmp );
        }
    CleanupStack::Pop( clone );
    return clone;
    }

// -----------------------------------------------------------------------------
// ChspsDomNode::AddStringL
// -----------------------------------------------------------------------------
//
EXPORT_C TInt ChspsDomStringPool::AddStringL( const TDesC8& aString )
    {
    return AddToStringPoolL( aString, iStringPool );
    }

// -----------------------------------------------------------------------------
// ChspsDomNode::String
// -----------------------------------------------------------------------------
//
const TDesC8& ChspsDomStringPool::String( const TInt aStringRef )
    {
    if ( aStringRef < iStringPool.Count() )
        return (*iStringPool[ aStringRef ]);
    else
        return KNullDesC8;
    }
        
// -----------------------------------------------------------------------------
// ChspsDomStringPool::Size
// -----------------------------------------------------------------------------
//
TInt ChspsDomStringPool::Size() const
    {
    TInt size( 0 );
    
    TInt count( iStringPool.Count() );
    for ( TInt i=0; i<count; i++ )
        {
        size += sizeof(TInt16);     //Length
        size++;                     //HBufC control mark
        size++;                     //HBufC control mark
        size += iStringPool[i]->Size();  //Buffer sixe in bytes     
        }
    return size;    
    }

// -----------------------------------------------------------------------------
// ChspsDomStringPool::ExternalizeL
// -----------------------------------------------------------------------------
//
void ChspsDomStringPool::ExternalizeL( RWriteStream& aStream ) const
    {
    TInt count( iStringPool.Count() );
    aStream.WriteInt16L( count );
    
    for ( TInt i=0; i<count; i++ )
        {
        aStream.WriteInt16L( iStringPool[i]->Length() );
        aStream << *iStringPool[i];      
        }
    }

// -----------------------------------------------------------------------------
// ChspsDomStringPool::InternalizeL
// -----------------------------------------------------------------------------
//
void ChspsDomStringPool::InternalizeL( RReadStream& aStream )
    {
    TInt len(0);
    TInt16 count ( aStream.ReadInt16L() );
    
    for ( TInt i=0; i<count; i++ )
        {
        len = aStream.ReadInt16L();
        HBufC8* tmp = HBufC8::NewLC( aStream, len );
        iStringPool.AppendL( tmp );
        CleanupStack::Pop( tmp );
        }
   
    }
//  End of File