bluetooth/btsdp/database/EncoderVisitor.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btsdp/database/EncoderVisitor.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,151 @@
+// Copyright (c) 2000-2009 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:
+//
+
+/**
+ @internalTechnology
+ @released
+*/
+
+#include "EncoderVisitor.h"
+#include <btsdp.h>
+#include "DataEncoder.h"
+#include "SDPDatabase.h"
+#include "sdputil.h"
+
+/** Creates a new CAttrEncoderVisitor and leaves it on the cleanup stack.
+
+@param aEncoder a TElementEncoder to be used by this CAttrEncoderVisitor.
+@return A new CAttrEncoderVisitor.
+*/
+EXPORT_C CAttrEncoderVisitor *CAttrEncoderVisitor::NewLC(TElementEncoder aEncoder)
+	{
+	CAttrEncoderVisitor *self = new(ELeave) CAttrEncoderVisitor(aEncoder);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+/** Creates a new CAttrEncoderVisitor.
+
+@param aEncoder a TElementEncoder to be used by this CAttrEncoderVisitor.
+@return A new CAttrEncoderVisitor.
+*/
+EXPORT_C CAttrEncoderVisitor *CAttrEncoderVisitor::NewL(TElementEncoder aEncoder)
+	{
+	CAttrEncoderVisitor *self = CAttrEncoderVisitor::NewLC(aEncoder);
+	CleanupStack::Pop();
+	return self;
+	}
+
+CAttrEncoderVisitor::CAttrEncoderVisitor(TElementEncoder aEncoder)
+	: iEncoder(aEncoder)
+	{
+	}
+
+void CAttrEncoderVisitor::ConstructL()
+	{
+	}
+
+CAttrEncoderVisitor::~CAttrEncoderVisitor()
+	{
+	}
+
+/**
+Encode attribute in aSrcAttr into buffer supplied in the encoder.
+
+@param aEncoder A TElementEncoder with a buffer large enough to contain the 
+				encoded value.
+@leave ESdpUnexpectedAttributeValueType If the attribute is of an unknown type.
+@leave Positive value equal to the number of bytes of the encoded value which 
+	   did not fit in the write buffer of the TElementEncoder which is provided 
+	   as aEncoder.  To calculate the size of write buffer needed  use the 
+	   TElementEncoder::EncodedSize function.
+@see TElementEncoder::EncodedSize
+*/
+EXPORT_C void CAttrEncoderVisitor::EncodeAttributeL(TElementEncoder aEncoder, CSdpAttrValue &aSrcAttr)
+	{
+	CAttrEncoderVisitor *self = CAttrEncoderVisitor::NewLC(aEncoder);
+	aSrcAttr.AcceptVisitorL(*self);
+	CleanupStack::PopAndDestroy();
+	}
+
+/**
+Encode attribute in aSrcAttr into buffer supplied at construction.
+
+@leave ESdpUnexpectedAttributeValueType If the attribute is of an unknown type.
+@leave Positive value equal to the number of bytes of the encoded value which 
+	   did not fit in the write buffer of the TElementEncoder.  This was provided 
+	   at construction.  To calculate the size of write buffer needed  use the 
+	   TElementEncoder::EncodedSize function.
+@see TElementEncoder::EncodedSize
+*/
+EXPORT_C void CAttrEncoderVisitor::EncodeAttributeL(CSdpAttrValue &aSrcAttr)
+	{
+	aSrcAttr.AcceptVisitorL(*this);
+	}
+
+
+void CAttrEncoderVisitor::VisitAttributeL(CSdpAttr &aAttribute)
+	{
+	iEncoder.WriteUint(aAttribute.AttributeID(), sizeof(TSdpAttributeID));
+	}
+
+void CAttrEncoderVisitor::VisitAttributeValueL(CSdpAttrValue &aValue, TSdpElementType aType)
+	{
+	TUint rem=0;
+	switch(aType)
+		{
+	case ETypeNil:
+		rem = iEncoder.WriteNil();
+		break;
+	case ETypeUint:
+	case ETypeInt:
+	case ETypeUUID:
+	case ETypeString:
+	case ETypeURL:
+		rem = iEncoder.WriteElement(aType, aValue.Des());
+		break;
+	case ETypeBoolean:
+		rem = iEncoder.WriteBoolean(aValue.Bool());
+		break;
+	case ETypeDES:
+		rem = iEncoder.WriteDES(aValue.DataSize());
+		break;
+	case ETypeDEA:
+		rem = iEncoder.WriteDEA(aValue.DataSize());
+		break;
+	case ETypeEncoded:
+		rem= iEncoder.WriteDesc(aValue.Des());
+		break;
+	default:
+		User::Leave(ESdpUnexpectedAttributeValueType);
+		}
+
+
+	if (rem)
+		User::Leave(rem);
+	}
+
+void CAttrEncoderVisitor::StartListL(CSdpAttrValueList &/*aList*/)
+	{
+	}
+
+void CAttrEncoderVisitor::EndListL()
+	{
+	}
+
+
+
+