contentmgmt/contentaccessfwfordrm/source/cafutils/stringattributeset.cpp
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentmgmt/contentaccessfwfordrm/source/cafutils/stringattributeset.cpp	Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,186 @@
+/*
+* Copyright (c) 2004-2009 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: 
+* attributeset.cpp
+*
+*/
+
+
+#include <s32strm.h>
+#include "stringattributeset.h"
+#include "caferr.h"
+#include "cafutils.h"
+#include "stringAttribute.h"
+
+using namespace ContentAccess;
+
+EXPORT_C RStringAttributeSet::RStringAttributeSet()
+	{
+	}
+
+EXPORT_C void RStringAttributeSet::Close()
+	{
+	// Clean up array
+	iAttributes.ResetAndDestroy();
+	iAttributes.Close();
+	}
+
+EXPORT_C void RStringAttributeSet::AddL(TInt aAttribute)
+	{
+	// Can't have duplicates so if the attribute already exists just reset its
+	// value back to KErrCANotSupported
+	TInt err = SetValue(aAttribute, KNullDesC(), KErrCANotSupported);
+	if(err != KErrNone)
+		{
+		// Doesn't exist so add it
+		AddL(aAttribute, KNullDesC(), KErrCANotSupported);
+		}
+	}
+
+EXPORT_C TInt RStringAttributeSet::GetValue(TInt aAttribute, TDes& aValue) const
+	{
+	TInt i = 0;
+	// Search through the set of attributes until the correct one is found
+	TInt count = iAttributes.Count();
+	for(i  = 0; i < count; i++)
+		{
+		if(iAttributes[i]->Attribute() == aAttribute)
+			{
+			TPtrC value = iAttributes[i]->Value();
+			if(value.Length() > aValue.MaxLength())
+				{
+				return KErrOverflow;
+				}
+			else
+				{
+				aValue.Copy(iAttributes[i]->Value());
+				return iAttributes[i]->Error();
+				}
+			}
+		}
+	// attribute not found 
+	return KErrNotFound;
+	}
+
+EXPORT_C TInt RStringAttributeSet::GetValueLength(TInt aAttribute) const
+	{
+	TInt i = 0;
+	
+	// Search through the set of attributes until the correct one is found
+	TInt count = iAttributes.Count();
+	for(i  = 0; i < count; i++)
+		{
+		if(iAttributes[i]->Attribute() == aAttribute)
+			{
+			return iAttributes[i]->Value().Length();
+			}
+		}
+	return 0;
+	}
+
+
+EXPORT_C TInt RStringAttributeSet::SetValue(TInt aAttribute, const TDesC& aValue, TInt aErrorCode)
+	{
+	TInt i;
+	TInt err = KErrNone;
+	
+	// search through the attributes see if the attribute exists
+	TInt count = iAttributes.Count();
+	for(i  = 0; i < count; i++)
+		{
+		if(iAttributes[i]->Attribute() == aAttribute)
+			{
+			CStringAttribute* temp = NULL;
+			// if it exists replace the current value with the new one
+			TRAP(err, temp = CStringAttribute::NewL(aAttribute, aValue, aErrorCode));
+			if(err == KErrNone)
+				{
+				delete iAttributes[i];
+				iAttributes[i] = temp;
+				}
+			return err;
+			}
+		}
+	return KErrNotFound;
+	}
+		
+EXPORT_C TInt RStringAttributeSet::operator [] (TInt aIndex) const
+		{
+		//  The attribute at a particular index..... NOT the attribute's value
+		return iAttributes[aIndex]->Attribute();
+		}
+
+EXPORT_C TInt RStringAttributeSet::Count() const
+		{
+		// Number of attributes in the set
+		return iAttributes.Count();
+		}
+		
+EXPORT_C void RStringAttributeSet::ExternalizeL(RWriteStream& aStream) const
+	{
+	TInt i;
+	// Write the number of attributes to the stream
+	TInt count = iAttributes.Count();
+	aStream.WriteInt32L(count);
+	
+	// loop through and write each attribute and value to the stream
+	for(i = 0; i < count; i++)
+		{
+		// write the attribute and it's value to the stream
+		aStream.WriteInt32L(iAttributes[i]->Attribute());
+		TCafUtils::WriteDescriptor16L(aStream, iAttributes[i]->Value());
+		aStream.WriteInt32L(iAttributes[i]->Error());
+		}
+	}
+
+EXPORT_C void RStringAttributeSet::InternalizeL(RReadStream& aStream)
+	{
+	TInt i;
+	TInt attribute;
+	TInt errorCode;
+	TInt err;
+	HBufC *value = NULL;
+
+	// Read the number of attributes to internalize
+	TInt count = aStream.ReadInt32L();
+	
+	// loop through all the attributes
+	for(i = 0; i < count; i++)
+		{
+		// Read the attribute and value from the stream
+		attribute = aStream.ReadInt32L();
+		value = TCafUtils::ReadDescriptor16L(aStream);
+		CleanupStack::PushL(value);
+		errorCode = aStream.ReadInt32L();
+		
+		// try setting the attribute value first in case it already exists
+		err = SetValue(attribute, *value, errorCode);
+		if(err != KErrNone)
+			{
+			// Doesn't exist so set a new values
+			AddL(attribute,  *value, errorCode);
+			}
+
+		CleanupStack::PopAndDestroy(value);
+		value = NULL;
+		}
+	}
+
+void RStringAttributeSet::AddL(TInt aAttribute, const TDesC& aValue, TInt aErrorCode)
+	{
+	CStringAttribute* element = CStringAttribute::NewL(aAttribute, aValue, aErrorCode);
+	CleanupStack::PushL(element);
+	User::LeaveIfError(iAttributes.Append(element));
+	CleanupStack::Pop(element);
+	}