diff -r 000000000000 -r 1bce908db942 natfw/natfwunsaf_protocols/unsaf_codec/src/natfwunsafunknownattributesattribute.cpp --- /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 +#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(iContainedAttributes[i]); + NATFWUNSAFUtils::WriteNetworkOrder16L(ptr, + i * EElementSize, + value); + } + if (count > iContainedAttributes.Count()) + { + TUint16 value = static_cast(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& 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 + }