ncdengine/provider/server/inc/ncdattributes.h
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/server/inc/ncdattributes.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,239 @@
+/*
+* 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:   Definition of ncdattributes interface and
+*                implementation class.
+*
+*/
+
+
+#ifndef C_NCDATTRIBUTES_H
+#define C_NCDATTRIBUTES_H
+
+
+#include <e32base.h>
+
+#include "ncdpanics.h"
+
+class RWriteStream;
+class RReadStream;
+
+/**
+ * Simple attribute container
+ *
+ * Used for setting, getting, storing and loading simple
+ * attributes. Currently supports 16-bit descriptors and TInt32
+ */
+class CNcdAttributes : public CBase
+    {
+public:
+
+    /**
+     * Types of supported attributes
+     */
+    enum TAttributeType 
+        {
+        /**
+         * Attribute type is not set
+         */
+        EAttributeTypeUndefined = 0,
+        
+        /**
+         * Attribute is TInt32
+         */
+        EAttributeTypeInt32,
+        
+        /**
+         * Attribute is a 16-bit descriptor
+         */
+        EAttributeTypeString16
+        };
+    
+public:
+
+    /**
+     * @param aUpperLimit Upper attribute limit is NOT included in the range. Must be >= 0 and > aLowerLimit
+     *
+     */
+    IMPORT_C static CNcdAttributes* NewL( TInt aUpperLimit, TInt aLowerLimit = 0 );
+    
+    /**
+     * @note If given upperlimit differs from the one read from the stream then
+     * the attribute range is adjusted for the given limit.
+     * @leave KErrArgument if aLowerLimit differs from the lower limit read from the stream
+     */
+    IMPORT_C static CNcdAttributes* NewL( 
+        RReadStream& aStream,
+        TInt aUpperLimit, 
+        TInt aLowerLimit = 0 );
+
+    /**
+     * Copy constructor
+     */
+    IMPORT_C static CNcdAttributes* NewL( const CNcdAttributes& aAttributes );
+
+
+    /**
+     * Destructor
+     */
+    IMPORT_C virtual ~CNcdAttributes();
+    
+public:
+   
+    /**
+     * Lower limit getter
+     */
+    IMPORT_C TInt RangeLowerLimit() const;
+    
+    /**
+     * Upper limit getter
+     */
+    IMPORT_C TInt RangeUpperLimit() const;
+
+    /**
+     * TInt32 attribute setter
+     *
+     * @param aAttribute Attribute
+     * @param aValue Value     
+     * @panic ENcdPanicIndexOutOfRange if aAttribute is not 
+     * RangeLowerLimit() <= aAttribute < RangeUpperLimit()
+     * @panic ENcdPanicInvalidArgument if the attribute type is not 
+     * EAttributeTypeInt32 or EAttributeTypeUndefined
+     */
+    IMPORT_C void SetAttributeL( TInt aAttribute, TInt32 aValue );
+    
+    /**
+     * 16-bit descriptor attribute setter
+     *
+     * @param aAttribute Attribute
+     * @param aValue Value
+     * @leave KErrNoMemory if memory runs out
+     * @panic ENcdPanicIndexOutOfRange if aAttribute is not 
+     * RangeLowerLimit() <= aAttribute < RangeUpperLimit()
+     * @panic ENcdPanicInvalidArgument if the attribute type is not 
+     * EAttributeTypeString16 or EAttributeTypeUndefined
+     */
+    IMPORT_C void SetAttributeL( TInt aAttribute, const TDesC& aValue );
+    
+    /**
+     * 16-bit descriptor attribute getter
+     *
+     * @param aAttribute Attribute
+     * @return Value of the attribute
+     * @panic ENcdPanicIndexOutOfRange if aAttribute is not 
+     * RangeLowerLimit() <= aAttribute < RangeUpperLimit()
+     * @panic ENcdPanicInvalidArgument if the attribute type is not 
+     * EAttributeTypeString16
+     */
+    IMPORT_C const TDesC& AttributeString16( TInt aAttribute ) const;
+    
+    
+    /**
+     * TInt32 attribute getter
+     *
+     * @param aAttribute Attribute
+     * @return Value of the attribute
+     * @panic ENcdPanicIndexOutOfRange if aAttribute is not 
+     * RangeLowerLimit() <= aAttribute < RangeUpperLimit()
+     * @panic ENcdPanicInvalidArgument if the attribute type is not 
+     * EAttributeTypeInt32
+     */
+    IMPORT_C TInt32 AttributeInt32( TInt aAttribute ) const;
+
+
+    /**
+     * Attribute type getter
+     * 
+     * @param aAttribute
+     * @return Attribute type
+     * @panic ENcdPanicIndexOutOfRange if aAttribute is not 
+     * RangeLowerLimit() <= aAttribute < RangeUpperLimit()
+     */
+    IMPORT_C TAttributeType AttributeType( TInt aAttribute ) const;
+    
+public:
+
+    IMPORT_C void ExternalizeL( RWriteStream& aStream ) const;
+    IMPORT_C void InternalizeL( RReadStream& aStream );
+
+protected:
+
+    // Union that contains all possible attribute types
+    union TAttributeUnion 
+        {
+        HBufC* iString16;
+        TInt32 iInt32;
+        };
+    
+    // Attribute 
+    struct TAttribute
+        {
+        TAttributeType iType;
+        TAttributeUnion iAttribute;
+        
+        TAttribute() : iType( EAttributeTypeUndefined )
+            {            
+            iAttribute.iString16 = NULL;
+            }            
+        };
+
+
+protected:
+    
+    CNcdAttributes( TInt aUpperLimit, TInt aLowerLimit );
+    void ConstructL();
+    void ConstructL( const CNcdAttributes& aAttributes );
+
+    // Deletes all attributes, array size is reduced to 0
+    void ClearAttributes();
+    
+    // Deletes all attributes and resets the array to have
+    // room for the attribute range, array size == ArraySize()
+    void ResetAttributesL();
+    
+    // Size needed for containing the attribute range
+    TInt ArraySize() const;
+    
+    
+    // Attribute externalization and internalization
+    void ExternalizeAttributeL( 
+        const TAttribute& aAttribute, RWriteStream& aStream ) const;
+
+    TAttribute InternalizeAttributeL( RReadStream& aStream ) const;
+
+    // Deletes attribute's internals
+    void DeleteAttribute( TAttribute& aAttribute );
+    
+    // Copies attribute's internals and returns the copy
+    TAttribute CopyAttributeL( const TAttribute& aAttribute ) const;
+
+    // Indexing methods
+    const TAttribute& Attribute( TInt aAttribute ) const;    
+    TAttribute& Attribute( TInt aAttribute );
+    
+private:
+
+    CNcdAttributes( const CNcdAttributes& );
+    CNcdAttributes& operator=( const CNcdAttributes& );
+    
+private:
+    
+    TInt iLowerLimit;
+    TInt iUpperLimit;
+    
+    // Attribute array
+    RArray<TAttribute> iAttributes;
+    };
+
+
+#endif // M_NCDATTRIBUTES_H