natfw/natfwunsaf_protocols/unsaf_codec/src/natfwunsafunknownattributesattribute.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwunsaf_protocols/unsaf_codec/src/natfwunsafunknownattributesattribute.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,231 @@
+/*
+* Copyright (c) 2006-2007 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:   
+*
+*/
+
+
+
+
+#include <es_sock.h>
+#include "natfwunsafunknownattributesattribute.h"
+#include "natfwunsafutils.h"
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFUnknownAttributesAttribute::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CNATFWUNSAFUnknownAttributesAttribute*
+CNATFWUNSAFUnknownAttributesAttribute::NewL()
+    {
+    CNATFWUNSAFUnknownAttributesAttribute* self =
+        CNATFWUNSAFUnknownAttributesAttribute::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFUnknownAttributesAttribute::NewLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CNATFWUNSAFUnknownAttributesAttribute*
+CNATFWUNSAFUnknownAttributesAttribute::NewLC()
+    {
+    CNATFWUNSAFUnknownAttributesAttribute* self =
+        new (ELeave) CNATFWUNSAFUnknownAttributesAttribute();
+    CleanupStack::PushL(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFUnknownAttributesAttribute::DecodeAttributeL
+// -----------------------------------------------------------------------------
+//
+CNATFWUNSAFAttribute*
+CNATFWUNSAFUnknownAttributesAttribute::DecodeAttributeL(
+    const TDesC8& aByteStream)
+    {
+    TUint16 valueLength = ParseLengthL(aByteStream);
+
+    //Stream has to have enough data for the whole value element
+    __ASSERT_ALWAYS(aByteStream.Length() >= EValueOffset + valueLength,
+                    User::Leave(KErrArgument));
+
+    //Check the value length is valid for this attribute
+    CheckLengthL(valueLength);
+
+    CNATFWUNSAFUnknownAttributesAttribute* self =
+        new (ELeave) CNATFWUNSAFUnknownAttributesAttribute();
+    CleanupStack::PushL(self);
+
+    self->DecodeValueL(aByteStream.Mid(EValueOffset, valueLength));
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFUnknownAttributesAttribute::CNATFWUNSAFUnknownAttributesAttribute
+// -----------------------------------------------------------------------------
+//
+CNATFWUNSAFUnknownAttributesAttribute::CNATFWUNSAFUnknownAttributesAttribute() :
+    CNATFWUNSAFAttribute()
+#ifdef TEST_EUNIT
+    , iContainedAttributes(1)
+#endif
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFUnknownAttributesAttribute::~CNATFWUNSAFUnknownAttributesAttribute
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CNATFWUNSAFUnknownAttributesAttribute::
+~CNATFWUNSAFUnknownAttributesAttribute()
+    {
+    iContainedAttributes.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFUnknownAttributesAttribute::Type
+// -----------------------------------------------------------------------------
+//
+CNATFWUNSAFAttribute::TType CNATFWUNSAFUnknownAttributesAttribute::Type() const
+    {
+    __TEST_INVARIANT;
+
+    return EUnknownAttributes;
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFUnknownAttributesAttribute::EncodeValueL
+// If the number of attributes is an odd number, one attribute is repeated.
+// -----------------------------------------------------------------------------
+//
+HBufC8* CNATFWUNSAFUnknownAttributesAttribute::EncodeValueL() const
+    {
+    __TEST_INVARIANT;
+
+    TInt count = iContainedAttributes.Count();
+    if (count & 0x1)
+        {
+        count++;
+        }
+
+    HBufC8* encodedValue = HBufC8::NewLC(count * EElementSize);
+    TPtr8 ptr = encodedValue->Des();
+    ptr.FillZ(count * EElementSize);
+
+    for (TInt i = 0; i < iContainedAttributes.Count(); ++i)
+        {
+        TUint16 value = static_cast<TUint16>(iContainedAttributes[i]);
+        NATFWUNSAFUtils::WriteNetworkOrder16L(ptr,
+                                         i * EElementSize,
+                                         value);
+        }
+    if (count > iContainedAttributes.Count())
+        {
+        TUint16 value = static_cast<TUint16>(iContainedAttributes[0]);
+        NATFWUNSAFUtils::WriteNetworkOrder16L(ptr,
+                                 iContainedAttributes.Count() * EElementSize,
+                                 value);
+        }
+
+    CleanupStack::Pop(encodedValue);
+    return encodedValue;
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFUnknownAttributesAttribute::AddContainedAttributeL
+// -----------------------------------------------------------------------------
+//
+void CNATFWUNSAFUnknownAttributesAttribute::AddContainedAttributeL(
+    TUint16 aAttributeType)
+    {
+    __ASSERT_ALWAYS(iContainedAttributes.Find(aAttributeType) == KErrNotFound,
+                    User::Leave(KErrAlreadyExists));
+
+    iContainedAttributes.AppendL(aAttributeType);
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFUnknownAttributesAttribute::RemoveContainedAttribute
+// -----------------------------------------------------------------------------
+//
+TInt CNATFWUNSAFUnknownAttributesAttribute::RemoveContainedAttribute(
+    TUint16 aAttributeType)
+    {
+    TInt index = iContainedAttributes.Find(aAttributeType);
+
+    if (index == KErrNotFound)
+        {
+        return KErrNotFound;
+        }
+
+    iContainedAttributes.Remove(index);
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFUnknownAttributesAttribute::ContainedAttributes
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const RArray<TUint32>& CNATFWUNSAFUnknownAttributesAttribute::
+ContainedAttributes() const
+    {
+    __TEST_INVARIANT;
+    return iContainedAttributes;
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFUnknownAttributesAttribute::CheckLengthL
+// -----------------------------------------------------------------------------
+//
+void CNATFWUNSAFUnknownAttributesAttribute::CheckLengthL(TInt aLength)
+    {
+    __ASSERT_ALWAYS((aLength % EGranularity) == 0, User::Leave(KErrCorrupt));
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFUnknownAttributesAttribute::DecodeValueL
+// If the number of attributes would be an odd number, one attribute is
+// repeated. The repeated attribute is not placed into iContainedAttributes
+// array.
+// -----------------------------------------------------------------------------
+//
+void CNATFWUNSAFUnknownAttributesAttribute::DecodeValueL(const TDesC8& aValue)
+    {
+    for (TInt pos = 0; pos < aValue.Length(); pos = pos + EElementSize)
+        {
+        TUint attrType = BigEndian::Get16(aValue.Mid(pos).Ptr());
+
+        if (iContainedAttributes.Find(attrType) == KErrNotFound)
+            {
+            iContainedAttributes.AppendL(attrType);
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFUnknownAttributesAttribute::__DbgTestInvariant
+// -----------------------------------------------------------------------------
+//
+void CNATFWUNSAFUnknownAttributesAttribute::__DbgTestInvariant() const
+    {
+#if defined(_DEBUG)
+/*    if ( error )
+        {
+        User::Invariant();
+        } */
+#endif
+    }