/*
* Copyright (c) 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: CNcdKeyValueMap declaration
*
*/
#ifndef C_NCDKEYVALUEMAP_H
#define C_NCDKEYVALUEMAP_H
#include "e32base.h"
class RWriteStream;
class RReadStream;
class CNcdKeyValuePair;
/**
* Map implementation
*/
class CNcdKeyValueMap : public CBase
{
public:
typedef TInt KeyValueIndex;
public:
/**
* Creator
*/
static CNcdKeyValueMap* NewL();
/**
* Creator
*/
static CNcdKeyValueMap* NewLC();
/**
* Copy constructor
*/
static CNcdKeyValueMap* NewL( const CNcdKeyValueMap& aOther );
/**
* Cloner
*/
CNcdKeyValueMap* CloneL() const;
/**
* Destructor
*/
~CNcdKeyValueMap();
public:
/**
* Adds a key-value pair
*
* @note Always adds a new pair even if the key already exists.
* ValueByKey and KeyExists -methods return the oldest instance of the key
*
* @param aKey Key name
* @param aValue Data
*/
void AddL( const TDesC& aKey, const TDesC& aValue );
/**
* Adds a key-value pair.
*
* @note Always adds a new pair even if the key already exists.
* ValueByKey and KeyExists -methods return the oldest instance of the key
*
* @param aPair Pair to add. The ownership of the pair is transferred
* to the CNcdKeyValueMap if the operation is successful.
* @note If a leave occurs, it is the responsibility of the caller to
* delete the pair.
*/
void AddL( CNcdKeyValuePair* aPair );
/**
* Adds a new or replaces an old key-value pair.
*
* If the key already exists, the old value is replaced with the new one
*
* @param aPair Pair to add. The ownership of the pair is transferred
* to the CNcdKeyValueMap if the operation is successful.
* @note If a leave occurs, it is the responsibility of the caller to
* delete the pair.
*/
void ReplaceL( CNcdKeyValuePair* aPair );
/**
* Removes key-value pair.
*
* @note If the key exists more than once, then the oldest
* instance is removed.
*
* @param aKey Key
* @return KErrNotFound if the pair was not found
*/
TInt Remove( const TDesC& aKey );
/**
* Returns an array of all key-value pairs
*
* @return Array of headers
*/
RPointerArray<CNcdKeyValuePair>& Pairs();
/**
* Returns an array of all key-value pairs
*
* @return Array of headers
*/
const RPointerArray<CNcdKeyValuePair>& Pairs() const;
/**
* Searches for the value that matches the key
*
* @param aPair Wanted key
* @return Header
* @exception KErrNotFound if a matching value was not found
*/
const TDesC& ValueByKeyL( const TDesC& aKey ) const;
KeyValueIndex KeyExists( const TDesC& aKey ) const;
const TDesC& ValueByIndex( const KeyValueIndex& aIndex ) const;
KeyValueIndex PairExists( const CNcdKeyValuePair& aPair ) const;
/**
* Deletes all key-value pairs
*/
void ResetAndDestroy();
/**
* Resets the array but doesn't delete the pairs
*/
void Reset();
/**
* Appends a map.
*
* Simply appends key-value -pairs from the given map to this
* map. No key collision checks are made.
*
* @param aMap Map
*/
void AppendL( const CNcdKeyValueMap& aMap );
/**
* Externalizes the map
*
* @param aStream Target stream
*/
void ExternalizeL( RWriteStream& aStream ) const;
/**
* Externalizes the map to a RBuf8
*
* @param aTarge Target buffer.
*/
void ExternalizeL( RBuf8& aTarget ) const;
/**
* Internalizes the map
*
* @param aStream Source stream
*/
void InternalizeL( RReadStream& aStream );
private:
/**
* Constructor
*/
CNcdKeyValueMap();
/**
* Copy constructor
*/
CNcdKeyValueMap( const CNcdKeyValueMap& aOther );
/**
* 2nd phase copy constructor
*/
void ConstructL( const CNcdKeyValueMap& aOther );
private:
/**
* Searches for the pair that matches the key in the given
* pair
*
* @param aPair Key-value pair that has the wanted key set
* @return A value
* @note aPair is popped from the Cleanupstack and deleted
* @exception KErrNotFound if a matching header was not found
*/
const TDesC& FindValueL( CNcdKeyValuePair* aPair ) const;
private:
RPointerArray<CNcdKeyValuePair> iPairs;
};
#endif // C_NCDKEYVALUEMAP_H