Made a minor error with all the messing around with aknlayout.lag which meant it got performed on the default branch.
/*
* Copyright (c) 2003-2005 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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: Variant data type for LIW generic parameters.
*
*/
#ifndef LIW_VARIANT_H
#define LIW_VARIANT_H
// INCLUDES
#include <e32std.h>
#include <s32strm.h>
#include <f32file.h>
#include "liwvarianttype.hrh"
// FORWARD DECLARATIONS
class CLiwGenericParamList;
class MLiwNotifyCallback;
// New variant types
class CLiwContainer;
class CLiwIterable;
class CLiwList;
class CLiwMap;
class MLiwInterface;
class CLiwBuffer;
// CLASS DECLARATION
/**
* Variant data class to hold a value of a TLiwGenericParam instance.
* The variant contains a data type and a value. This class is attached to
* TLiwGenericParam instance which holds the semantic type of the value.
*
* @lib ServiceHandler.lib
* @since Series 60 2.6
* @see TLiwGenericParam
*/
class TLiwVariant
{
public: // Constructors
/**
* Default constructor. Initializes this variant to be empty.
*
* @post IsEmpty()
*/
inline TLiwVariant();
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(TInt32 aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(TInt64 aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(TUint aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(TBool aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(const TUid& aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(const TTime& aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(const TDesC& aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(const HBufC* aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(const TDesC8& aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(const RFile& aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(const CLiwList* aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(const CLiwMap* aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(const MLiwInterface* aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(const CLiwIterable* aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(TReal aValue);
/**
* Constructor from a value.
*
* @param aValue The value to set for this variant object.
*/
inline TLiwVariant(const CLiwBuffer* aValue);
/**
* Copy constructor. Does not take ownership of data.
*
* @param aSrc The source object.
*/
IMPORT_C TLiwVariant(const TLiwVariant& aSrc);
/**
* Assignment operator. Does not take ownership of data.
*
* @param aValue The source object.
*/
IMPORT_C TLiwVariant& TLiwVariant::operator=(const TLiwVariant& aValue);
// This class does not need a destructor because memory allocation
// policy for variant class has been implemented by TLiwGenericParam
// class.
public: // Interface
/**
* Returns the type id of data this variant object is holding.
*/
inline LIW::TVariantTypeId TypeId() const;
/**
* Returns ETrue if this variant is empty (it does not hold any value).
*/
inline TBool IsEmpty() const;
/**
* Retrieves the value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(TInt32& aValue) const;
/**
* Retrieves the value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(TInt64& aValue) const;
/**
* Retrieves the value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(TUid& aValue) const;
/**
* Retrieves the boolean value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(TUint& aValue) const;
/**
* Retrieves the boolean value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(TBool& aValue) const;
/**
* Retrieves the value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(TPtrC& aValue) const;
//needed at least temporarily for data binding integration...
//inline TBool Get(const TPtrC** aValue) const;
/**
* Retrieves the value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(TTime& aValue) const;
/**
* Retrieves the value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(TPtrC8& aValue) const;
/**
* Retrieves the value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(RFile& aValue) const;
/**
* Retrieves the value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(CLiwList& aValue) const;
/**
* Retrieves the value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(CLiwMap& aValue) const;
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function, the default initialized data is returned.
*/
IMPORT_C TInt32 AsTInt32() const;
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function, the default initialized data is returned.
*/
IMPORT_C TInt64 AsTInt64() const;
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function, the default initialized data is returned.
*/
IMPORT_C TBool AsTBool() const;
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function, the default initialized data is returned.
*/
IMPORT_C TBool AsTUint() const;
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function, the default initialized data is returned.
*/
IMPORT_C TUid AsTUid() const;
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function, the default initialized data is returned.
*/
IMPORT_C TPtrC AsDes() const;
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function, the default initialized data is returned.
*/
IMPORT_C TTime AsTTime() const;
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function, the default initialized data is returned.
*/
IMPORT_C TPtrC8 AsData() const;
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function, the default initialized data is returned.
*/
IMPORT_C RFile AsFileHandle() const;
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function default initialized data is returned.
*/
IMPORT_C const CLiwList* AsList() const;
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function default initialized data is returned.
*/
IMPORT_C const CLiwMap* AsMap() const;
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function default initialized data is returned.
*/
IMPORT_C MLiwInterface* AsInterface() const;
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function default initialized data is returned.
*/
IMPORT_C CLiwIterable* AsIterable() const;
/**
* Deletes possibly set value and resets this variant to empty.
*
* @post IsEmpty()
*/
IMPORT_C void Reset();
/**
* Sets integer value to this variant. The previous value is overwritten.
*
* @param aValue Value for this variant object to hold.
* @post *this == aValue
*/
IMPORT_C void Set(TInt32 aValue);
/**
* Sets integer value to this variant. The previous value is overwritten.
*
* @param aValue Value for this variant object to hold.
* @post *this == aValue
*/
IMPORT_C void Set(TInt64 aValue);
/**
* Sets Boolean value to this variant. The previous value is overwritten.
*
* @param aValue Value for this variant object to hold.
* @post *this == aValue
*/
IMPORT_C void Set(TBool aValue);
/**
* Sets Boolean value to this variant. The previous value is overwritten.
*
* @param aValue Value for this variant object to hold.
* @post *this == aValue
*/
IMPORT_C void Set(TUint aValue);
/**
* Sets unique ID value to this variant. The previous value is overwritten.
*
* @param aValue Value for this variant object to hold.
* @post *this == aValue
*/
IMPORT_C void Set(const TUid& aValue);
/**
* Sets date and time value to this variant. The previous value is overwritten.
*
* @param aValue Value for this variant object to hold.
* @post *this == aValue
*/
IMPORT_C void Set(const TTime& aValue);
/**
* Sets constant text reference to this variant.
*
* @param aValue Text value for this variant object to hold.
* @post *this == aValue
*/
IMPORT_C void Set(const TDesC& aValue);
/**
* Sets constant text reference to this variant.
*
* @param aValue Text value for this variant object to hold.
* Ownership is not taken.
*/
inline void Set(const HBufC* aValue);
/**
* Sets constant 8-bit text reference to this variant.
*
* @param aValue Text value for this variant object to hold.
* @post *this == aValue
*/
IMPORT_C void Set(const TDesC8& aValue);
/**
* Sets RFile file handle to this variant.
*
* @param aValue File handle for this variant object to hold.
* @post *this == aValue
*/
IMPORT_C void Set(const RFile& aValue);
/**
* Sets list of variants to this variant.
*
* @param aValue Array of variants for this variant object to hold.
* @postcond *this == aValue
*/
IMPORT_C void Set(const CLiwList* aValue);
/**
* Sets map of variants to this variant.
*
* @param aValue Dictionary of variants for this variant object to hold.
* @postcond *this == aValue
*/
IMPORT_C void Set(const CLiwMap* aValue);
/**
* Sets interface pointer to this variant.
*
* @param aValue Interface pointer for this variant object to hold.
* @postcond *this == aValue
*/
IMPORT_C void Set(const MLiwInterface* aValue);
/**
* Sets list of variants to this variant.
*
* @param aValue Sequence of variants for this variant object to hold.
* @postcond *this == aValue
*/
IMPORT_C void Set(const CLiwIterable* aValue);
/**
* Retrieves the value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(TDes& aValue) const;
/**
* Sets the value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(TDes8& aValue) const;
/**
* Assignment operator for the variant.
*
* @param aValue The source object.
*/
inline TLiwVariant& operator=(const TTime& aValue);
/**
* Assignment operator for the variant.
*
* @param aValue The source object.
*/
inline TLiwVariant& operator=(const TUid& aValue);
/**
* Assignment operator for the variant.
*
* @param aValue The source object.
*/
inline TLiwVariant& operator=(TInt32 aValue);
/**
* Assignment operator for the variant.
*
* @param aValue The source object.
*/
inline TLiwVariant& operator=(TInt64 aValue);
/**
* Assignment operator for the variant.
*
* @param aValue The source object.
*/
inline TLiwVariant& operator=(TBool aValue);
/**
* Assignment operator for the variant.
*
* @param aValue The source object.
*/
inline TLiwVariant& operator=(TUint aValue);
/**
* Assignment operator for the variant.
*
* @param aValue The source object.
*/
inline TLiwVariant& operator=(const TDesC& aValue);
/**
* Assignment operator for the variant.
*
* @param aValue The source object.
*/
inline TLiwVariant& operator=(const HBufC* aValue);
/**
* Assignment operator for the variant.
*
* @param aValue The source object.
*/
inline TLiwVariant& operator=(const TDesC8& aValue);
/**
* Assignment operator for the variant.
*
* @param aValue The source object.
*/
inline TLiwVariant& operator=(const RFile& aValue);
/**
* Assignment operator for the variant.
*
* @param aValue The source.
*/
inline TLiwVariant& operator=(const CLiwList* aValue);
/**
* Assignment operator for the variant.
*
* @param aValue The source.
*/
inline TLiwVariant& operator=(const CLiwMap* aValue);
/**
* Assignment operator for the variant.
*
* @param aValue The source.
*/
inline TLiwVariant& operator=(const MLiwInterface* aValue);
/**
* Assignment operator for the variant.
*
* @param aValue The source.
*/
inline TLiwVariant& operator=(const CLiwIterable* aValue);
public:
/**
* Data copying support for TLiwGenericParam.
* Sets the copy of given variant value to this variant
* @param aValue variant value for this variant object to hold.
* @post *this == aValue
*/
IMPORT_C void SetL(const TLiwVariant& aValue);
/**
* Retrieves the value held by this variant.
*
* @param aValue If this variant's type does not match the
* parameter type, the parameter will not be modified.
* @return ETrue if aValue was set, EFalse if types did not match.
*/
IMPORT_C TBool Get(TReal& aValue) const;
/**
* Sets integer value to this variant. The previous value is overwritten.
*
* @param aValue Value for this variant object to hold.
* @post *this == aValue
*/
IMPORT_C void Set(TReal aValue);
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function, the default initialized data is returned.
*/
IMPORT_C TReal AsTReal() const;
/**
* Assignment operator for the variant.
*
* @param aValue The source object.
*/
inline TLiwVariant& operator=(TReal aValue);
/**
* Sets integer value to this variant. The previous value is overwritten.
*
* @param aValue Value for this variant object to hold.
* @post *this == aValue
*/
IMPORT_C void Set(const CLiwBuffer* aValue);
/**
* Returns the value held by this variant.
*
* @return The value held by this variant. If the data type does not
* match the function, the default initialized data is returned.
*/
IMPORT_C CLiwBuffer* AsBuffer() const;
/**
* Assignment operator for the variant.
*
* @param aValue The source object.
*/
inline TLiwVariant& operator=(const CLiwBuffer* aValue);
/**
* TLiwVariant cleanup method
*
* !!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
* Variants can be pushed into the CleanupStack using this method
* along with TCleanupItem
*
* @ param aObj - TLiwVariant Object but of type TAny* for usage with TCleanupItem
*
* Example 1: Here the client explicitly pushes the variant into the CleanupStack using
* TCleanupItem
*
* @code
* TLiwVariant var;
*
* //The below statement pushes the variant object "var" into the CleanupStack using TCleanupItem and VariantCleanup.
* CleanupStack::PushL( TCleanupItem( TLiwVariant::VariantCleanup , &var ) );
*
* User::Leave(KErrGeneral); //This calls the VariantCleanup method which cleans up TLiwVariant
* CleanupStack::Pop(&var); //These statements are not executed due to "Leave"
* var.Reset();
* @endcode
*
*
* Example 2: Here the client calls the PushL method of TLiwVariant which pushes the object into
* the CleanupStack using TCleanupItem
*
* @code
* TLiwVariant var;
* var.PushL(); //This pushes the variant object "var" into the CleanupStack using TCleanupItem and VariantCleanup.
* User::Leave(KErrGeneral); //This calls the VariantCleanup method which cleans up TLiwVariant
* CleanupStack::Pop(&var); //These statements are not executed due to "Leave"
* var.Reset();
* @endcode
*
* The clients can use the convenient PushL method which is recommended (as shown in e.g 2) rather than
* explicitly pushing the variant object into the CleanupStack using TCleanupItem and VariantCleanup.
*
* @ see PushL() method
*/
IMPORT_C static void VariantCleanup( TAny* aObj );
/**
* A friendly and convenient method to push the TLiwVariant Object into the CleanupStack
*
* !!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
* This method informs the CleanupStack that VariantCleanup method should be called incase of
* any Leave
*
* @code
* TLiwVariant var;
* var.PushL(); //This pushes the variant object "var" into the CleanupStack using TCleanupItem and VariantCleanup.
* User::Leave(KErrGeneral); //This calls the VariantCleanup method which cleans up TLiwVariant
* CleanupStack::Pop(&var); //These statements are not executed
* var.Reset();
* @endcode
*
* This method is recommended than explicitly pushing the parameter object into the CleanupStack
* using TCleanupItem and VariantCleanup.
*
* @see VariantCleanup() method
*/
IMPORT_C void PushL();
private:
/**
* Streaming support for TLiwGenericParam.
* Internalizes this variant from a stream.
*/
void InternalizeL(RReadStream& aStream);
/**
* Streaming support for TLiwGenericParam.
* Externalizes this variant to a stream.
*/
void ExternalizeL(RWriteStream& aStream) const;
/**
* Streaming support for TLiwGenericParam.
* Returns the maximum externalized size of this variant in bytes.
*/
TInt Size() const;
/**
* Destroys any dynamic resource owned by this variant.
*/
void Destroy();
/// Debug invariant
void __DbgTestInvariant() const;
static void CleanupDestroy(TAny* aObj);
operator TCleanupItem();
private: // Data
/// Type of the data this variant is holding
TUint8 iTypeId;
/// POD storage for a 64-bit integer
struct SInt64
{
TInt32 iLow;
TInt32 iHigh;
void InternalizeL(RReadStream& aStream);
void ExternalizeL(RWriteStream& aStream) const;
void Set(const TInt64& aTInt64);
operator TInt64() const;
TBool operator==(const SInt64& aRhs) const;
};
// Data value stored in this variant.
// One of these are effective at a time depending on the iTypeId
//
union UData
{
TInt32 iInt32; // 32-bit integer
TInt64 iLong; // 64-bit integer
SInt64 iInt64; // 64-bit integer
HBufC* iBufC; // owned string pointer
HBufC8* iBufC8; // owned 8-bit data pointer
CLiwList* iList; // List
CLiwMap* iMap; // Map
MLiwInterface* iSession; // Interface Type
CLiwIterable* iIterable; // Iterator
CLiwBuffer* iBuffer;
TBool iBool; //boolean
TUint iUint; //Unsinged Integer
TReal iReal;
};
UData iData; // Data union
TPtrC iPtrC; // Pointer to string
TPtrC8 iPtrC8; // Pointer to 8-bit data
private: // friend declarations
friend IMPORT_C TBool operator==(const TLiwVariant& aLhs, const TLiwVariant& aRhs);
/// TLiwGenericParam needs access to private streaming and copying methods.
friend class TLiwGenericParam;
friend class CLiwCriteriaItem;
};
//definitions of new variant types
// CLASS DECLARATION
/**
* A type of variant class to execute a set of service command operations
* on an interface. The service provider should implement MLiwInterface to group
* set of related operations and offer them as service commands to the consumers.
*
* To maintain its internal state across the execution of service commands and
* enable invocation of operations directly on the interface, service providers
* may offer an interface.
*
* @lib ServiceHandler.lib
*
* @see TLiwVariant
*/
class MLiwInterface
{
public:
/**
* The consumer application should call this method to execute a service
* command directly on the interface. The service provider should
* provide a concrete implementation for the supported service
* command aCmdName. The consumer application should fill in the necessary
* parameters in \em aInParamList.
*
* @param aCmdName the name of the service command which the consumer wants to invoke
* @param aInParamList the input parameter list, can be empty list
* @param [in,out] aOutParamList the output parameter list, can be empty lis. The
* service provider can use the output parameter list to fill in necessary return values
* @param aCmdOptions Options for the command, see TLiwServiceCmdOptions in LiwCommon.hrh.
* @param aCallback callback to be registered by consumer application
*
*
*
* @see TLiwServiceCmdOptions
* @see CLiwGenericParamList
* @see MLiwNotifyCallback
*
*/
virtual void ExecuteCmdL(const TDesC8& aCmdName,
const CLiwGenericParamList& aInParamList,
CLiwGenericParamList& aOutParamList,
TUint aCmdOptions = 0,
MLiwNotifyCallback* aCallback = 0) = 0;
/**
* The service provider should provide a concrete implementation
* for this method. The internal state of the service provider
* implemeting \c MLiwInterface can be reset within this method.
* The consumer application should call this method if there
* are no more service commands to be executed on the interface.
*
*
*
* <p align="center"></p>
*
*/
virtual void Close() = 0;
};
/**
* Base class for the framework supported container types.
* \c CLiwContainer is a self managing, reference counted container.
* This class offers minimal interface to manage the reference counter
* and to serialize the container data into the stream.
*
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
* Since container objects are reference counted, they cannot go with CleanupStack::PushL.
* The issue is solved by using CleanupClosePushL for pushing the container objects into the CleanupStack.
* Hence CLiwContainer::Close method is introduced common to all container objects
*
* All the container data types supported by the framework are
* derived from \c CLiwContainer.
*
* @lib ServiceHandler.lib
*
* @see CLiwContainer::Close
* @see CLiwContainer::PushL
*
* @see CLiwList
* @see CLiwMap
* @see CLiwIterable
*/
class CLiwContainer : public CBase
{
public:
/**
* Serializes the collection entries to an output stream.
* The derving container types from \c CLiwContainer
* should provide a concrete implementation to serialize the collection
* data. The default implementation of this method just leaves with
* an error code \c KErrNotSupported.
*
* @param aOutputStream the output stream to which the data will be streamed
*
* @leave KErrNotSupported whenever this method is called instead
* of a dervied class implementation of this method
*
* @see RWiteStream
*
*/
IMPORT_C virtual void ExternalizeL(RWriteStream& aOutputStream) const;
/**
* Returns the size of collection data values. This default implementation of
* this method leaves with an error code \c KErrNotSupported. Typically, the size
* is calculated based on the size of data type(s) the container holds and the total
* number of entries present in the collection.
*
* @return the size of collection data values
*
* @leave KErrNotSupported whenever this method is called instead
* of derived class implementation of this method
*/
IMPORT_C virtual TInt Size() const;
/**
* Increments the container reference count by one. The reference
* count gets incremented whenever a copy of the data values
* is made.
*
*/
inline void IncRef();
/**
* Decrements the container reference count by one. If there
* are no more references to the container type, this container
* instance will be deleted.
*
*/
inline void DecRef();
/**
* !!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
* Since reference counting does not work with CleanupStack directly,
* CleanupStack::PushL cannot be used for container objects which are reference counted
*
* So CleanupClosePushL method is used for container objects. Hence the need for this method
*
* This method informs the CleanupStack that Close method should be called incase of any Leave
*
* Close() inturn calls DecRef which ensures proper cleanup of container objects
*
*
* Example 1: //Using PushL to push the container object into the CleanupStack using CleanupClosePushL
*
* @code
* CLiwMap* map = CLiwDefaultMap::NewL();
* map->PushL();
* map->InsertL(KNullDesC8,variant); //incase of any leave, CLiwContainer::Close is called
* CleanupStack::PopAndDestroy(map); //CLiwContainer::Close() is called
* @endcode
*
* Example 2: //Using NewLC to push the container object into the CleanupStack using CleanupClosePushL
*
* @code
* CLiwMap* map = CLiwDefaultMap::NewLC();
* map->InsertL(KNullDesC8,variant); //incase of any leave, CLiwContainer::Close is called
* CleanupStack::PopAndDestroy(map); //CLiwContainer::Close() is called
* @endcode
*
* @ see CLiwContainer::NewLC (pushes the container object using CleanupClosePushL)
* @ see CLiwContainer::PushL (pushes the container object using CleanupClosePushL)
*/
IMPORT_C void Close();
/**
* !!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
* A Friendly method to push the CLiwContainer Object into the CleanupStack using CleanupClosePushL
*
* This method informs the CleanupStack that Close method should be called incase of any Leave
*
* @code
* CLiwMap* map = CLiwDefaultMap::NewL();
* map->PushL();
* map->InsertL(KNullDesC8,variant); //incase of any leave, CLiwContainer::Close is called
* CleanupStack::PopAndDestroy(map); //CLiwContainer::Close() is called
* @endcode
*
* @ see CLiwContainer::Close
*/
IMPORT_C void PushL();
protected:
/**
* Protected default constructor. This method is available
* only for the derived container types. The reference
* count is set to its default vale.
*
*/
CLiwContainer() : iRefCount(1) {}
/**
* Destructor.
*
*/
IMPORT_C virtual ~CLiwContainer();
private:
/* Reference counter of the container datatype.
* During the construction, the counter is set to its
* default value of 1. When the counter reaches the value
* of zero (meaning that there are no more references to
* the container data type), the container instance is deleted.
*/
TInt iRefCount;
};
/**
* Abstract interface to iterate over the collection entries.
* The service provider should provide a concrete implementation
* for the iterator.
*
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* Since container objects are reference counted, they cannot go with CleanupStack::PushL.
* The issue is solved by using CleanupClosePushL for pushing the container objects into the CleanupStack.
* Hence CLiwContainer::Close method is introduced common to all container objects
*
* This implies that the object of this concrete implementation class being created should be pushed into the
* CleanupStack using CLiwContainer::PushL.
*
* @lib ServiceHandler.lib
*
* @see CLiwContainer
*
* @see CLiwContainer::Close
* @see CLiwContainer::PushL
*
*/
class CLiwIterable : public CLiwContainer
{
public:
/**
* Resets the iterator. The service provider should provide a concrete
* implementation to reset the iterator.
*
*/
virtual void Reset() = 0;
/**
* Iterates over the collection entries to fetch the next data element.
* The service provider should provide a concrete implementation
* for this method.
*
* @param aEntry contains the next data element and its corresponding data type
*
* @return false if there are no more data elements to be fetched;
* true otherwise
*
*/
virtual TBool NextL(TLiwVariant& aEntry) = 0;
/**
* Default equality operator implementation
*
* @param aIterable the iterator instance to be compared
*
*/
IMPORT_C virtual TBool operator==(CLiwIterable& aIterable);
};
/**
* Abstract interface for an ordered collection or sequence. Typically,
* the collection entries are of type \c TLiwVariant instances.
* \c CLiwList offers abstract methods to:
* <ul>
* <li>access elements based on an index</li>
* <li>remove an element from the collection</li>
* <li>append to an element to the collection</li>
* <li>remove a key-value pair based on a key</li>
* <li>get the total number of stored key-value pairs</li>
* </ul>
* A default concrete implementation is provided in the form of specialized class
* \c CLiwDefaultList
*
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* Since container objects are reference counted, they cannot go with CleanupStack::PushL.
* The issue is solved by using CleanupClosePushL for pushing the container objects into the CleanupStack.
* Hence CLiwContainer::Close method is introduced common to all container objects.
*
* This implies that the object of this concrete implementation class being created should be pushed into the
* CleanupStack using CLiwContainer::PushL.
*
* @lib ServiceHandler.lib
*
* @see CLiwContainer
*
* @see CLiwContainer::Close
* @see CLiwContainer::PushL
*
* @see CLiwDefaultList
*
*/
class CLiwList : public CLiwContainer
{
public:
/**
* Appends an entry to the end of the collection. This is an abstract
* method.
*
* @param aEntry an Element to be added to the end of the collection
*
* @see CLiwDefaultList::AppendL
*/
virtual void AppendL(const TLiwVariant& aEntry) = 0;
/**
* Gets an entry from the collection based on an integeral index.
*
* @param aIndex an index to get an entry from the collection
* @param aEntry the returned element from the collection
*
* !!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
* This is a copy of the value present in the list at the particular index. To ensure proper cleanup
* TLiwVariant::PushL method should be called beforehand.
*
* @return false if no element is found at the passed index;
* true if an element is found
*
* @see CLiwDefaultList::AtL
* @see TLiwVariant::PushL
*/
virtual TBool AtL(TInt aIndex, TLiwVariant& aEntry) const = 0;
/**
* Returns the number of elements present in the collection. This
* is an abstract method.
*
* @return the number of elements; Zero if there are no elements stored
*
* @see CLiwDefaultList::Count
*/
virtual TInt Count() const = 0;
/**
* Removes an element located at the passed index from the collection. This
* is an abstract method.
*
* @param aIndex the index of the element to be removed from the collection
*
* @see CLiwDefaultList::Remove
*/
virtual void Remove(TInt aIndex) = 0;
/**
* Equality operator implementation for collection container.
*
* @param aList the list container to be compared
*
* @return true if the compared list collections are the same; false otherwise
*
* @see CLiwDefaultList::operator==
*/
IMPORT_C virtual TBool operator==(const CLiwList& aList) const;
};
/**
* Abstract interface for an associative array. The collection
* key entries are of type string (Descriptor type) and their
* associated values can be an variant type (\c TLiwVariant).
*
* \c CLiwMap offers abstract methods to:
* <ul>
* <li>insert a key-value pair</li>
* <li>find a stored value based on a key</li>
* <li>get a key based on an index</li>
* <li>remove a key-value pair based on a key</li>
* <li>get the total number of stored key-value pairs</li>
* </ul>
*
* A default concrete implementation is provided in the form of specialized class
* \c CLiwDefaultMap
*
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* Since container objects are reference counted, they cannot go with CleanupStack::PushL.
* The issue is solved by using CleanupClosePushL for pushing the container objects into the CleanupStack.
* Hence CLiwContainer::Close method is introduced common to all container objects.
*
* This implies that the object of this concrete implementation class being created should be pushed into the
* CleanupStack using CLiwContainer::PushL.
*
* @lib ServiceHandler.lib
*
* @see CLiwContainer
*
* @see CLiwContainer::Close
* @see CLiwContainer::PushL
*
* @see TLiwVariant
* @see CLiwDefaultMap
*
*/
class CLiwMap : public CLiwContainer
{
public:
/**
* Inserts a key-value pair element to the map collection. A default
* implementation is provided in \c CLiwDefaultMap.
*
* @param aKey the key to be stored
* @param aValue the value associated with the key to be stored
*
* @see CLiwDefaultMap::InsertL
*/
virtual void InsertL(const TDesC8& aKey, const TLiwVariant& aValue) = 0;
/**
* Finds a value stored in the map collection based on the key. A default
* implementation is provided in \c CLiwDefaultMap.
*
* @param aKey the key to be searched
* @param aFndValue the value associated with the found key
*
* !!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
* This is a copy of the value present in the map for the particular key. To ensure proper cleanup
* TLiwVariant::PushL method should be called beforehand.
*
* @return false if there is no key stored; true otherwise
*
* @see CLiwDefaultMap::FindL
* @see TLiwVariant::PushL
*/
virtual TBool FindL(const TDesC8& aKey, TLiwVariant& aFndValue) const = 0;
/**
* Returns the number of key-value pair stored in the map collection. A default
* implementation is provided in \c CLiwDefaultMap.
*
* @return the number of key-value pair stored in the map collection
*
* @see CLiwDefaultMap::Count
*/
virtual TInt Count() const = 0;
/**
* Returns the key stored at the passed index. A default
* implementation is provided in \c CLiwDefaultMap.
*
* @param aIndex the index of the key to be found
* @param aFndKey the key found at the passed index
*
* @return true if a key-value entry is found at the passed index;
* false otherwise
*
* @see CLiwDefaultMap::AtL
*
*/
virtual TBool AtL(TInt aIndex, TDes8& aFndKey) const = 0;
/**
* Returns the key stored at the passed index. A default
* implementation is provided in \c CLiwDefaultMap.
*
* @param aIndex the index of the key to be found
*
* @return the key if a key-value entry is found at the passed index;
* Leaves otherwise
*
* @see CLiwDefaultMap::AtL
*
*/
// virtual const TDesC8& AtL(TInt aIndex) const = 0;
/**
* Removes a key from the map collection. A default
* implementation is provided in \c CLiwDefaultMap.
*
* @param aKey the key to be removed from the map
*
* @see CLiwDefaultMap::Remove
*/
virtual void Remove(const TDesC8& aKey) = 0;
/**
* Default implementation of equality operator.
*
* @param aMap the map to be compared
*
* @see CLiwDefaultMap::operator==
*
*/
IMPORT_C virtual TBool operator==(const CLiwMap& aMap) const;
};
/**
* An ordered collection or sequence. \c CLiwDefaultList providers
* a default implementation for \c CLiwList. The collection entries are typically
* of type \c TLiwVarian.
*
* This class provides concrete implementation to:
* <ul>
* <li>access elements based on index</li>
* <li>remove an element</li>
* <li>append an element to the end of the list collection</li>
* <li>get the total number of elements stored in the list collection</li>
* </ul>
*
*
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* Since container objects are reference counted, they cannot go with CleanupStack::PushL.
* The issue is solved by using CleanupClosePushL for pushing the container objects into the CleanupStack.
* Hence CLiwContainer::Close method is introduced common to all container objects.
*
* This implies that the object of this concrete implementation class being created should be pushed into the
* CleanupStack using CLiwContainer::PushL.
*
* @lib ServiceHandler.lib
*
* @see CLiwContainer
*
* @see CLiwContainer::Close
* @see CLiwContainer::PushL
*
* @see CLiwList
* @see TLiwVariant
*
*/
class CLiwDefaultList : public CLiwList
{
public:
/**
* Creates and returns a new instace of \c CLiwDefaultList
*
* @code
* void CreateListL()
* {
* CLiwDefaultList* pList = CLiwDefaultList::NewL();
* pList->PushL(); //pushes the List into cleanupstack using CleanupClosePushL
*
* CleanupStack::Pop(pList);
* pList->DecRef();
* }
*
* @endcode
*
* @return an instance of \c CLiwDefaultMap
*
* @ see PushL
* @ see Close
*/
IMPORT_C static CLiwDefaultList* NewL();
/**
* Creates and returns a new instace of \c CLiwDefaultList
*
* @code
* void CreateListL()
* {
* CLiwDefaultList* pList = CLiwDefaultList::NewLC(); //pushes the List into cleanupstack using CleanupClosePushL
*
* CleanupStack::Pop(pList);
* pList->DecRef();
* }
*
* @endcode
*
* @return an instance of \c CLiwDefaultMap
*
* @ see PushL
* @ see Close
*/
IMPORT_C static CLiwDefaultList* NewLC();
/**
* Creates and returns a new instace of \c CLiwDefaultList. The
* collection elements will be generated from the data
* values read from the input stream. This method leaves
* the created instance in the cleanup stack.
*
* @param aInputStream the input stream containing the data
* values to append to the list collection
*
* @return an instance of \c CLiwDefaultList
*/
static CLiwDefaultList* NewLC(RReadStream& aInputStream);
/**
* Appends an entry to the end of the collection. The entry to be
* added is of type \c TLiwVariant.
*
* @param aEntry an Element to be added to the end of the collection
*
*
* A string content being added to the end of the collection
*
* @code
* _LIT8(KLitPbkService,"PhoneBookService");
* CLiwDefaultList* pList = CLiwDefaultList::NewL();
* pList->PushL();
* pList->AppendL(TLiwVariant(KLitPbkService));
* CleanupStack::Pop(pList);
* pList->DecRef();
* @endcode
*
* An integer value being added to the end of the collection
*
* @code
* CLiwDefaultList* pList = CLiwDefaultList::NewL();
* pList->PushL();
* TInt intVal=0;
* pList->AppendL(TLiwVariant(intVal));
* CleanupStack::Pop(pList);
* pList->DecRef();
* @endcode
*
*/
IMPORT_C void AppendL(const TLiwVariant& aEntry);
/**
* Gets an entry from the collection based on an integeral index.
*
* @param aIndex to get an entry from the collection
* @param aEntry the returned element from the collection
*
* @return false if no element is found at the passed index;
* true if an element is found
*
* !!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
* This is a copy of the value present in the list at the particular index. To ensure proper cleanup
* TLiwVariant::PushL method should be called beforehand.
*
*
* An integral value being retrieved from the collection
*
* @code
* CLiwDefaultList* pList = CLiwDefaultList::NewL();
* pList->PushL();
* TInt intVal=1100; //some magic number
* pList->AppendL(TLiwVariant(intVal));
*
* TInt nIndex=0; //only one entry is stored..
* TLiwVariant valFnd;
* valFnd.PushL(); //Pushes the TLiwVariant into the CleanupStack using TCleanupItem
* if(EFalse!=pList->AtL(nIndex,valFnd))
* {
* TInt intValFnd=-1;
* valFnd.Get(intValFnd);
* }
*
* CleanupStack::PopAndDestroy(valFnd); //Pops and Destroys the TLiwVariant object
* CleanupStack::Pop(pList);
* pList->DecRef();
* @endcode
*
* @see TLiwVariant::PushL
*/
IMPORT_C TBool AtL(TInt aIndex, TLiwVariant& aEntry) const;
/**
* Returns the number of elements present in the collection.
*
* @return the number of elements; Zero if there are no elements stored
*
*/
IMPORT_C TInt Count() const;
/**
* Removes an element located at the passed index from the collection.
*
* @param aIndex the index of the element to be removed from the collection
*
*
* An element being removed from the collection
*
* @code
* CLiwDefaultList* pList = CLiwDefaultList::NewL();
* pList->PushL();
* TInt intVal=1100; //some magic number
* pList->AppendL(TLiwVariant(intVal));
*
* TInt nIndex=0; //only one entry is stored..
* pList->Remove(nIndex);
*
* if(0==pList->Count())
* {
* //should be zero
* }
*
* CleanupStack::Pop(pList);
* pList->DecRef();
* @endcode
*
*/
IMPORT_C void Remove(TInt aIndex);
/**
* Serializes the collection data entries to an output stream.
*
* @param aOutputStream the output stream to which the data will be streamed
*
* @see RWiteStream
*/
IMPORT_C void ExternalizeL(RWriteStream& aOutputStream) const;
/**
* Returns the size of the collection. The size is
* calculated based on the total numer of elements
* and the size of each element in the collection
*
* @return the size of the collection
*/
IMPORT_C TInt Size() const;
private:
/*
* Constructor
*/
CLiwDefaultList(CLiwGenericParamList* aList) : iList(aList) {}
/*
* Destructor
*/
IMPORT_C virtual ~CLiwDefaultList();
/*
* the underlying generic parameter list
*/
CLiwGenericParamList* iList;
};
/**
* An associative array or dictionary class. The collection
* key entries are of type string (Descriptor type) and their
* associated values can be an variant type.
*
* \c CLiwDefaultMap provides default map implementation to
* <ul>
* <li>insert a key-value pair</li>
* <li>find a stored value based on a key</li>
* <li>get a key based on an index</li>
* <li>remove a key-value pair based on a key</li>
* <li>get the total number of stored key-value pairs</li>
* </ul>
*
*
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* Since container objects are reference counted, they cannot go with CleanupStack::PushL.
* The issue is solved by using CleanupClosePushL for pushing the container objects into the CleanupStack.
* Hence CLiwContainer::Close method is introduced common to all container objects.
*
* This implies that the object of this concrete implementation class being created should be pushed into the
* CleanupStack using CLiwContainer::PushL.
*
* @lib ServiceHandler.lib
*
* @see CLiwContainer
*
* @see CLiwContainer::Close
* @see CLiwContainer::PushL
*
* @see TLiwVariant
* @see CLiwMap
*
*/
class CLiwDefaultMap : public CLiwMap
{
public:
/*
* Creates an instance of \c CLiwDefaultMap
*
* Instance of the map created, can be pushed into the CleanupStack using PushL()
* to ensure proper cleanup of this container object
*
* @code
* void CreateMapL()
* {
* CLiwDefaultMap* pMap = CLiwDefaultMap::NewL();
* pMap->PushL(); //pushes the map into cleanupstack using CleanupClosePushL
*
* CleanupStack::Pop(pMap);
* pMap->DecRef();
* }
*
* @endcode
*
* @return an instance of \c CLiwDefaultMap
*
* @ see PushL
* @ see Close
*/
IMPORT_C static CLiwDefaultMap* NewL();
/*
* Creates an instance of \c CLiwDefaultMap
*
* Pushes the map into the CleanupStack using CleanupClosePushL
*
* @code
* void CreateMapL()
* {
* CLiwDefaultMap* pMap = CLiwDefaultMap::NewLC(); //pushes the map into cleanupstack using CleanupClosePushL
*
* CleanupStack::Pop(pMap);
* pMap->DecRef();
* }
*
* @endcode
* @return an instance of \c CLiwDefaultMap
*
* @ see Close
*/
IMPORT_C static CLiwDefaultMap* NewLC();
/*
* Creates an instance of \c CLiwDefaultMap and
* fills up the collection entries from the input stream.
* The created instance is left in the cleanupstack.
*
* @return an instance of \c CLiwDefaultMap
*/
static CLiwDefaultMap* NewLC(RReadStream& aInputStream);
/**
* Inserts a key-value pair element to the map collection. If
* the specified key already exists, it will be removed from
* the collection and the new key-value pair will be added to the
* map.
*
* @param aKey the key to be stored
* @param aValue the value associated with the key to be stored
*
*
* @code
* void AddMapEntryL(const TDesC* ptrFirstNameVal)
* {
* _LIT8(KKey,"firstName");
* TBuf8<128> pbkFieldKey(KKey);
*
* CLiwDefaultMap* pMap = CLiwDefaultMap::NewL();
* pMap->PushL(); //pushes the map into cleanupstack using CleanupClosePushL
* pMap->InsertL(pbkFieldKey, TLiwVariant(*ptrFirstNameVal));
* CleanupStack::Pop(pMap);
* pMap->DecRef();
* }
*@endcode
*
*/
IMPORT_C void InsertL(const TDesC8& aKey, const TLiwVariant& aValue);
/**
* Finds a value stored in the map collection based on the key.
*
* @param aKey the key to be searched
* @param aFndValue the value associated with the found key
*
* !!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
* This is a copy of the value present in the map for the particular key. To ensure proper cleanup
* TLiwVariant::PushL method should be called beforehand.
*
* @return false if there is no key stored; true otherwise
*
*
*
* @code
* void FindAnEntryL()
* {
* _LIT8(KKey,"firstName");
* TBuf8<128> pbkFieldKey(KKey);
* TLiwVariant firstNameVal;
* firstNameVal.PushL();
*
* CLiwDefaultMap* pMap = CLiwDefaultMap::NewL();
* pMap->PushL();
* if(EFalse!=pMap->FindL(pbkFieldKey, firstNameVal))
* {
* //key value has been found
* }
*
* CleanupStack::PopAndDestroy(pMap);
* CleanupStack::PopAndDestroy(firstNameVal);
* }
* @endcode
*
* @see TLiwVariant::PushL
*/
IMPORT_C TBool FindL(const TDesC8& aKey, TLiwVariant& aValue) const;
/**
* Returns the number of key-value pair stored in the map collection.
*
* @return the number of key-value pair stored in the map collection
*/
IMPORT_C TInt Count() const;
/**
* Returns the key stored at a specified index.
*
* @param aIndex the index of the key to be found
* @param aFndKey the key found at the passed index
*
* @return true if a key-value entry is found at the passed index;
* false otherwise
*
*
*
* @code
* void FindAnEntryL()
* {
* _LIT8(KKey,"firstName");
* TBuf8<128> pbkFieldKeyVal(KKey);
*
* TInt nIndex=0;
* CLiwDefaultMap* pMap = CLiwDefaultMap::NewL();
* pMap->PushL();
*
* if(EFalse!=pMap->AtL(nIndex, pbkFieldKeyVal))
* {
* //key value has been found
* }
*
* CleanupStack::Pop(pMap);
* pMap->DecRef();
* }
* @endcode
*
*/
IMPORT_C TBool AtL(TInt aIndex, TDes8& aFndKey) const;
/**
* Returns the key stored at a specified index.
*
* @param aIndex the index of the key to be found
* @param aFndKey the key found at the passed index
*
*
* @return the key if a key-value entry is found at the passed index;
* Leaves otherwise
*
*
*
* @code
* void FindAnEntryL()
* {
* _LIT8(KKey,"firstName");
* TBuf8<128> pbkFieldKeyVal(KKey);
*
* TInt nIndex=0;
* CLiwDefaultMap* pMap = CLiwDefaultMap::NewL();
* pMap->PushL();
*
* pbkFieldKeyVal = pMap->AtL(nIndex);
* if(pbkFieldKeyVal)
* {
* //key value has been found
* }
*
* CleanupStack::Pop(pMap);
* pMap->DecRef();
* }
* @endcode
*
*/
IMPORT_C const TDesC8& AtL(TInt aIndex) const;
/**
* Removes a key from the map collection.
*
* @param aKey the key to be removed from the map
*
*
*
* @code
* void RemoveMapEntryL(const TDesC* ptrFirstNameVal)
* {
* _LIT8(KKey,"firstName");
* TBuf8<128> pbkFieldKey(KKey);
* CLiwDefaultMap* pMap = CLiwDefaultMap::NewL();
* pMap->PushL();
*
* pMap->InsertL(pbkFieldKey, TLiwVariant(*ptrFirstNameVal));
* pMap->Remove(pbkFieldKey);
*
* if(0==pMap->Count())
* {
* //no entries stored; removal successful
* }
*
* CleanupStack::Pop(pMap);
* pMap->DecRef();
* }
* @endcode
*
*/
IMPORT_C void Remove(const TDesC8& aKey);
/**
* The container managed data values can be serialized to an output
* stream.
*
* @param aOutputStream the output stream to which the data will be streamed
*
*
*
* @see RWiteStream
*
*/
void ExternalizeL(RWriteStream& aOutputStream) const;
/**
* Returns the size of the collection. The size is
* calculated based on the total numer of key-value elements
* and the size of each pair in the collection
*
* @return the size of the collection
*/
IMPORT_C TInt Size() const;
private:
/*
* Constructor
*/
CLiwDefaultMap(CLiwGenericParamList* aMap) : iMap(aMap) {}
/*
* Destructor
*/
IMPORT_C virtual ~CLiwDefaultMap();
/*
* the underlying generic parameter list
*/
CLiwGenericParamList* iMap;
};
/**
* Abstract generic buffer representation. Class used for passing generic buffer data between
* service provider and the consumers.
* The class offers APIs for the consumers to access the buffer data in a generic manner. Depending on
* the data agreement between the service provider and its consumers, one
* or more of the API operations may be inappropriate e.g. a service provider may not
* support write operation on the buffer
*
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* Since container objects are reference counted, they cannot go with CleanupStack::PushL.
* The issue is solved by using CleanupClosePushL for pushing the container objects into the CleanupStack.
* Hence CLiwContainer::Close method is introduced common to all container objects.
*
* This implies that the object of this concrete implementation class being created should be pushed into the
* CleanupStack using CLiwContainer::PushL.
*
* @lib ServiceHandler.lib
*
* @see CLiwContainer
*
* @see CLiwContainer::Close
* @see CLiwContainer::PushL
*
*/
class CLiwBuffer : public CLiwContainer
{
public:
enum TLiwBufferAccess
{
KLiwBufferNonReadable = 0,
KLiwBufferReadOnly = 1
};
/*
* Returns the pointer to the underlying buffer
*
* @return the pointer to the underlying buffer
*/
virtual TUint8* Buf() const =0;
/*
* Returns the length of the buffer data
*
* @return the length of the buffer data
*/
virtual TInt Len() =0;
/*
* Reads the specified number of bytes of buffer data
*
* @param aPtr the pointer to the area into which buffer data is read
* @param aLength the number of bytes to be read from the buffer
*
* @return KErrNone if the operation is successful; Otherwise
* TLiwBufferAccess::KLiwBufferNonReadable
*
*/
inline virtual TInt Read(TUint8* /*aPtr*/,TInt /*aLength*/)
{
return KLiwBufferNonReadable;
}
/*
* Writes the specified number of bytes into the buffer
*
* @param aPtr the pointer to the data to be written into buffer
* @param aLength the number of bytes to be written into buffer
*
* @return KErrNone if the operation is successful; Otherwise
* TLiwBufferAccess::KLiwBufferReadOnly if writing is not supported
*
*/
inline virtual TInt Write(const TUint8 * /*aPtr*/, TInt /*aLength*/)
{
return KLiwBufferReadOnly;
}
/*
* Releases the buffer. The service provider implementing concrete buffer
* type should provide appropriate implementation
*/
virtual void Release() =0;
/*
* Returns the appropriate type of buffer.
*/
virtual TInt TypeID()=0;
/*
* The concrete implementation of buffer types should perform equality operation
* check
*/
virtual TBool operator==(CLiwBuffer& aBuffer) =0;
};
/**
* Returns ETrue if two variants are equal.
*
* @param aLhs Left hand side.
* @param aRhs Right hand side.
* @return ETrue if equal, EFalse otherwise.
*/
IMPORT_C TBool operator==(const TLiwVariant& aLhs, const TLiwVariant& aRhs);
/**
* Returns ETrue if two variants are not equal.
*
* @param aLhs Left hand side.
* @param aRhs Right hand side.
* @return ETrue if not equal, EFalse otherwise.
*/
inline TBool operator!=(const TLiwVariant& aLhs, const TLiwVariant& aRhs);
/**
* Dumps the contents of aVariant to debug output. Available only in debug builds.
*
* @param aVariant The object to be dumped.
*/
IMPORT_C void Dump(const TLiwVariant& aVariant);
// INLINE FUNCTIONS
#include "liwvariant.inl"
#endif // LIW_VARIANT_H
// End of File