ncdengine/provider/src/ncdattributes.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/src/ncdattributes.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,547 @@
+/*
+* 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:   Implementation of CNcdAttributes
+*
+*/
+
+
+#include <s32strm.h>
+
+#include "ncdattributes.h"
+#include "catalogsutils.h"
+#include "catalogsdebug.h"
+
+// Checks that the given attribute value is in range
+#define ASSERT_ATTRIBUTE_IN_RANGE( attribute )                          \
+    NCD_ASSERT_ALWAYS( ( RangeLowerLimit() <= (attribute) ) &&          \
+        ( (attribute) < RangeUpperLimit() ), ENcdPanicIndexOutOfRange );
+
+// Checks that the given type can be written to the attribute
+#define ASSERT_ATTRIBUTE_WRITABLE( attribute, writetype )               \
+    NCD_ASSERT_ALWAYS(                                                  \
+        attribute.iType == writetype ||                                 \
+        attribute.iType == EAttributeTypeUndefined,                     \
+        ENcdPanicInvalidArgument );
+
+// Checks that the given type can be read from the attribute
+#define ASSERT_ATTRIBUTE_READABLE( attribute, readtype )                \
+    NCD_ASSERT_ALWAYS(                                                  \
+        attribute.iType == readtype,                                    \
+        ENcdPanicInvalidArgument );
+        
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C CNcdAttributes* CNcdAttributes::NewL( 
+    TInt aUpperLimit, 
+    TInt aLowerLimit )
+    {
+    CNcdAttributes* self = new( ELeave ) CNcdAttributes( 
+        aUpperLimit, aLowerLimit );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C CNcdAttributes* CNcdAttributes::NewL( 
+    RReadStream& aStream,
+    TInt aUpperLimit, 
+    TInt aLowerLimit )
+    {
+    CNcdAttributes* self = new( ELeave ) CNcdAttributes( 
+        aUpperLimit, aLowerLimit );
+    CleanupStack::PushL( self );
+    self->InternalizeL( aStream );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C CNcdAttributes* CNcdAttributes::NewL( 
+    const CNcdAttributes& aAttributes )
+    {
+    CNcdAttributes* self = new( ELeave ) CNcdAttributes( 
+        aAttributes.RangeUpperLimit(), 
+        aAttributes.RangeLowerLimit() );
+    CleanupStack::PushL( self );
+    self->ConstructL( aAttributes );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C CNcdAttributes::~CNcdAttributes()
+    {
+    DLTRACEIN((""));
+    ClearAttributes();
+    }
+    
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C TInt CNcdAttributes::RangeLowerLimit() const
+    {
+    return iLowerLimit;
+    }
+    
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C TInt CNcdAttributes::RangeUpperLimit() const
+    {
+    return iUpperLimit;
+    }
+
+
+// ---------------------------------------------------------------------------
+// TInt32 Attribute setter
+// L-method mainly in order to be consistent with the string setter and
+// also in preparation for changing the asserts to leaves
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C void CNcdAttributes::SetAttributeL( TInt aAttribute, TInt32 aValue )
+    {
+    DLTRACEIN(("aAttribute: %d, aValue: %d", aAttribute, aValue));
+    
+    TAttribute& attrib = Attribute( aAttribute );
+    
+    ASSERT_ATTRIBUTE_WRITABLE( attrib, EAttributeTypeInt32 );
+    
+    attrib.iType = EAttributeTypeInt32;
+    attrib.iAttribute.iInt32 = aValue;
+    }
+    
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C void CNcdAttributes::SetAttributeL( 
+    TInt aAttribute, 
+    const TDesC& aValue )
+    {
+    DLTRACEIN(( _L("aAttribute: %d, aValue: %S"), aAttribute, &aValue ));
+    
+    TAttribute& attrib = Attribute( aAttribute );
+    
+    ASSERT_ATTRIBUTE_WRITABLE( attrib, EAttributeTypeString16 );
+    
+    HBufC* tempValue = aValue.AllocL();
+    
+    delete attrib.iAttribute.iString16;
+    attrib.iAttribute.iString16 = tempValue;
+    
+    attrib.iType = EAttributeTypeString16;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C const TDesC& CNcdAttributes::AttributeString16( 
+    TInt aAttribute ) const
+    {
+    DLTRACEIN(("aAttribute: %d", aAttribute));
+    
+    const TAttribute& attrib = Attribute( aAttribute );
+    
+    if ( attrib.iType == EAttributeTypeUndefined ) 
+        {
+        DLTRACEOUT(("Not set"));
+        return KNullDesC;
+        }
+        
+    ASSERT_ATTRIBUTE_READABLE( attrib, EAttributeTypeString16 );
+    
+    DASSERT( attrib.iAttribute.iString16 );
+    DLTRACEOUT(( _L("value: %S"), 
+        attrib.iAttribute.iString16 ));
+        
+    return *attrib.iAttribute.iString16;
+    }
+     
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C TInt32 CNcdAttributes::AttributeInt32( TInt aAttribute ) const
+    {
+    DLTRACEIN(("aAttribute: %d", aAttribute));
+    
+    const TAttribute& attrib = Attribute( aAttribute );
+
+    if ( attrib.iType == EAttributeTypeUndefined ) 
+        {
+        DLTRACEOUT(("Not set"));
+        return 0;
+        }
+    
+    ASSERT_ATTRIBUTE_READABLE( attrib, EAttributeTypeInt32 );
+    
+    DLTRACEOUT(("value: %d", attrib.iAttribute.iInt32 ));
+    return attrib.iAttribute.iInt32;    
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C CNcdAttributes::TAttributeType CNcdAttributes::AttributeType( 
+    TInt aAttribute ) const
+    {
+    DLTRACEIN(("aAttribute: %d", aAttribute));
+    return Attribute( aAttribute ).iType;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C void CNcdAttributes::ExternalizeL( RWriteStream& aStream ) const
+    {
+    DLTRACEIN((""));
+    aStream.WriteInt32L( iLowerLimit );
+    aStream.WriteInt32L( iUpperLimit );
+    
+    DLTRACE(("Externalizing %d attributes", iAttributes.Count() ));
+    DASSERT( iAttributes.Count() == ArraySize() );
+    for ( TInt i = 0; i < iAttributes.Count(); ++i ) 
+        {
+        ExternalizeAttributeL( iAttributes[i], aStream );
+        }
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C void CNcdAttributes::InternalizeL( RReadStream& aStream )
+    {
+    DLTRACEIN((""));    
+    TInt lowerLimit = aStream.ReadInt32L();
+    
+    // Lower limits are not allowed to change
+    if ( lowerLimit != iLowerLimit ) 
+        {
+        DLERROR(("Lower limits don't match, leaving"));
+        User::Leave( KErrArgument );
+        }
+    
+    // Ensure that upperlimit is in the allowed range
+    NCD_ASSERT_ALWAYS( iUpperLimit > 0 && iUpperLimit > iLowerLimit, 
+        ENcdPanicIndexOutOfRange );
+    
+    // Read stored upper limit, this will be overridden by the
+    // upper limit given for NewL
+    TInt upperLimit = aStream.ReadInt32L();
+    
+    // Reset attribute array to correct amount of attributes
+    ResetAttributesL();
+    
+    // Read either all values from the stream or only those that fit 
+    // the current limits.
+    TInt count = Min( upperLimit, iUpperLimit ) - iLowerLimit;
+    
+    DLTRACE(("Internalizing %d attributes", count));
+    for ( TInt i = 0; i < count; ++i )
+        {
+        iAttributes[i] = InternalizeAttributeL( aStream );
+        }
+    
+    TInt leftOvers = upperLimit - iUpperLimit;
+    // Check if some attributes were not read from the stream    
+    if ( leftOvers ) 
+        {
+        DLTRACE(("Reading and deleting %d leftover attributes", leftOvers));
+        while ( leftOvers-- ) 
+            {
+            TAttribute attribute = InternalizeAttributeL( aStream );
+            DeleteAttribute( attribute );
+            }
+        }
+    DLTRACEOUT(("Attributes internalized successfully" ));
+    }
+    
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+CNcdAttributes::CNcdAttributes( TInt aUpperLimit, TInt aLowerLimit ) 
+    : iLowerLimit( aLowerLimit ), 
+      iUpperLimit( aUpperLimit )
+    {
+    }
+    
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//        
+void CNcdAttributes::ConstructL()
+    {
+    DLTRACEIN(("Upper limit: %d, lower limit: %d", 
+        iUpperLimit, iLowerLimit ));
+        
+    NCD_ASSERT_ALWAYS( iUpperLimit > 0 && iUpperLimit > iLowerLimit, 
+        ENcdPanicIndexOutOfRange );
+
+    ResetAttributesL();
+    }
+
+
+// ---------------------------------------------------------------------------
+// ConstructL for copying the attributes
+// ---------------------------------------------------------------------------
+//        
+void CNcdAttributes::ConstructL( const CNcdAttributes& aAttributes )
+    {
+    DLTRACEIN((""));
+    TInt count = ArraySize();
+    DASSERT( count == aAttributes.iAttributes.Count() );
+    
+    iAttributes.ReserveL( count );
+    for ( TInt i = 0; i < count; ++i )
+        {
+        iAttributes.Append( CopyAttributeL( aAttributes.iAttributes[i] ) );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// Clear attribute array
+// ---------------------------------------------------------------------------
+//        
+void CNcdAttributes::ClearAttributes()
+    {
+    DLTRACEIN((""));
+    for ( TInt i = 0; i < iAttributes.Count(); ++i ) 
+        {
+        DeleteAttribute( iAttributes[i] );
+        }
+    iAttributes.Reset();
+    }
+
+
+// ---------------------------------------------------------------------------
+// Reset attribute array
+// ---------------------------------------------------------------------------
+//        
+void CNcdAttributes::ResetAttributesL()
+    {
+    DLTRACEIN((""));
+    ClearAttributes();
+    
+    TInt size = ArraySize();
+    DLTRACE(("Resetting the array with %d attributes", size));
+    iAttributes.ReserveL( size );
+    TAttribute attrib;
+    
+    while( size-- ) 
+        {
+        iAttributes.Append( attrib );
+        }    
+    DLTRACEOUT(("Array size: %d", iAttributes.Count() ));
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+TInt CNcdAttributes::ArraySize() const
+    {
+    return iUpperLimit - iLowerLimit;
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+void CNcdAttributes::ExternalizeAttributeL( 
+    const TAttribute& aAttribute, RWriteStream& aStream ) const    
+    {
+    DLTRACEIN((""));    
+    ExternalizeEnumL( aAttribute.iType, aStream );
+    switch( aAttribute.iType ) 
+        {
+        case EAttributeTypeInt32:
+            {
+            DLTRACE(("Int"));
+            aStream.WriteInt32L( aAttribute.iAttribute.iInt32 );
+            break;
+            }
+
+        case EAttributeTypeString16:
+            {
+            DLTRACE(("String"));
+            ExternalizeDesL( *aAttribute.iAttribute.iString16, aStream );
+            break;
+            }
+        
+        case EAttributeTypeUndefined:
+            {
+            DLTRACE(("Undefined"));
+            // Nothing to do
+            break;
+            }
+            
+        default:
+            NCD_ASSERT_ALWAYS( 0, ENcdPanicIndexOutOfRange );
+        }        
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+CNcdAttributes::TAttribute CNcdAttributes::InternalizeAttributeL( 
+    RReadStream& aStream ) const    
+    {
+    DLTRACEIN((""));  
+    TAttribute attribute;
+    InternalizeEnumL( attribute.iType, aStream );
+    
+    switch( attribute.iType ) 
+        {
+        case EAttributeTypeInt32:
+            {
+            attribute.iAttribute.iInt32 = aStream.ReadInt32L();
+            break;
+            }
+
+        case EAttributeTypeString16:
+            {
+            InternalizeDesL( attribute.iAttribute.iString16, aStream );
+            break;
+            }
+        
+        case EAttributeTypeUndefined:
+            {
+            // Nothing to do
+            break;
+            }
+            
+        default:
+            NCD_ASSERT_ALWAYS( 0, ENcdPanicIndexOutOfRange );
+        }        
+    DLTRACEOUT(("Read attribute of type: %d", attribute.iType ));
+    return attribute; 
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+void CNcdAttributes::DeleteAttribute( TAttribute& aAttribute ) 
+    {
+    DLTRACEIN((""));
+    if ( aAttribute.iType == EAttributeTypeString16 ) 
+        {
+        delete aAttribute.iAttribute.iString16;
+        aAttribute.iAttribute.iString16 = NULL;
+        }    
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+CNcdAttributes::TAttribute CNcdAttributes::CopyAttributeL( 
+    const TAttribute& aAttribute ) const
+    {
+    DLTRACEIN((""));
+    TAttribute copy;
+    copy.iType = aAttribute.iType;
+    
+    switch( aAttribute.iType ) 
+        {
+        case EAttributeTypeInt32:
+            {
+            copy.iAttribute.iInt32 = aAttribute.iAttribute.iInt32;
+            break;
+            }
+
+        case EAttributeTypeString16:
+            {
+            if ( aAttribute.iAttribute.iString16 ) 
+                {                
+                copy.iAttribute.iString16 = 
+                    aAttribute.iAttribute.iString16->AllocL();
+                }
+            break;
+            }
+        
+        case EAttributeTypeUndefined:
+            {
+            // Nothing to do
+            break;
+            }
+            
+        default:
+            NCD_ASSERT_ALWAYS( 0, ENcdPanicIndexOutOfRange );
+        } 
+    return copy;       
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+const CNcdAttributes::TAttribute& CNcdAttributes::Attribute( 
+    TInt aAttribute ) const
+    {
+    DLTRACEIN(("aAttribute: %d", aAttribute));
+    ASSERT_ATTRIBUTE_IN_RANGE( aAttribute );
+    return iAttributes[ aAttribute - iLowerLimit ];
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+CNcdAttributes::TAttribute& CNcdAttributes::Attribute( TInt aAttribute )
+    {
+    DLTRACEIN(("aAttribute: %d", aAttribute));
+    ASSERT_ATTRIBUTE_IN_RANGE( aAttribute );
+    return iAttributes[ aAttribute - iLowerLimit ];
+    }