bluetooth/btcomm/src/sdpclientcsy.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btcomm/src/sdpclientcsy.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,228 @@
+// Copyright (c) 1997-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:
+// sdpclientcsy.cpp - all the sdp parser code
+// 
+//
+
+#include <bluetooth/logger.h>
+#include <cs_port.h>
+#include "btcomm.h"
+#include "sdpclientcsy.h"
+#include <es_sock.h>
+#include <e32cons.h>
+#include <bt_sock.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_BT_COMM);
+#endif
+
+// RFComm specific attribute 'snatcher' objects for the SDP attribute query
+// CRFCommAttribs
+CRFCommAttribs* CRFCommAttribs::NewL(MSdpElementBuilder* /*aParent*/)
+	{
+	CRFCommAttribs* cl=new (ELeave) CRFCommAttribs;
+	return cl;
+	}
+
+CRFCommAttribs::CRFCommAttribs()
+	{
+	}
+
+CRFCommAttribs::~CRFCommAttribs()
+	{
+	delete iPortAttrib;
+	}
+
+MSdpElementBuilder* CRFCommAttribs::StartListL()
+	{
+	return this;
+	}
+
+MSdpElementBuilder* CRFCommAttribs::EndListL()
+	{
+	return this;
+	}
+
+MSdpElementBuilder* CRFCommAttribs::BuildUintL(const TDesC8& /*aInt*/)
+	{
+	return this;
+	}
+
+MSdpElementBuilder* CRFCommAttribs::BuildDESL()
+	{
+	return this;
+	}
+
+
+MSdpElementBuilder* CRFCommAttribs::BuildUUIDL(const TUUID& aUUID)
+/**
+	Go and get RFComm UUID info.
+*/
+	{
+#ifdef _DEBUG
+	TBuf8<40> desUUID;
+	desUUID = aUUID.ShortestForm();
+	TBuf<40> readableUUID;
+	readableUUID.Copy(desUUID);
+
+	LOG1(_L("CRFCommAttribs::BuildUUIDL(%S) main entry\n"), &readableUUID);
+#endif
+	if (iPortAttrib!=NULL)
+		{
+		LOG(_L("iPortAttrib already exists, returning it."));
+		return iPortAttrib; // i.e go to the get RFComm port 'snatching' state
+		// although this will not always be correct, but suits us for now
+		}
+	if(aUUID==TUUID(TUint16(KSDPRFCommUUID)))  
+		{		
+#ifdef _DEBUG
+		LOG1(_L("CRFCommAttribs::BuildUUIDL(%S) if =RFCOMMUUID\n"), &readableUUID);
+#endif
+		iRfcommUUID=TUUID(aUUID);
+		LOG(_L("CRFCommPortAttribs NewL"));
+		iPortAttrib = CRFCommPortAttrib::NewL(this);
+		LOG(_L("CRFCommPortAttribs - NewL survived"));
+		return iPortAttrib;
+		}
+
+	LOG2(_L("CRFCommAttribs - return this = 0x%08x, iPortAttrib = 0x%08x"), this, iPortAttrib);
+	return this;
+	}
+
+void CRFCommAttribs::Print(TUint /*aIndent*/)
+	{
+	}
+
+TInt CRFCommAttribs::GetRFCommPort(TUint8& aServerChannel)
+	{
+	if (!iPortAttrib)
+		{
+		// the SDP response was syntactically correct, but semantically wrong
+		// so we'd never have created the iPortAttrib object
+		return KErrNotFound;
+		}
+	else
+		{
+		aServerChannel = iPortAttrib->GetRFCommPort();
+		return KErrNone;
+		}
+	}
+
+// CRFCommPortAttrib
+
+CRFCommPortAttrib* CRFCommPortAttrib::NewL(MSdpElementBuilder* aParent)
+	{
+	CRFCommPortAttrib* cl=new (ELeave) CRFCommPortAttrib(aParent);
+	return cl;
+	}
+
+CRFCommPortAttrib::CRFCommPortAttrib(MSdpElementBuilder* aParent) : iParent(aParent)
+	{
+	}
+
+CRFCommPortAttrib::~CRFCommPortAttrib()
+	{
+	}
+
+
+MSdpElementBuilder* CRFCommPortAttrib::BuildUintL(const TDesC8& aUint)
+	{
+	if(aUint.Length() > 4) // 4 being the 32bit TUint byte size
+		User::Leave(KErrArgument);
+	iPort=static_cast<TUint8>(GetUint(aUint));
+
+	if(iPort<(TUint)KMinRfcommServerChannel || iPort>(TUint)KMaxRfcommServerChannel) //30 is max RFComm port
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	return iParent;
+	}
+
+TUint CRFCommPortAttrib::GetUint(const TDesC8& aData)
+	{
+	switch(aData.Length())
+		{
+	case 0:
+		return 0;
+	case 1:
+		return aData[0];
+	case 2:
+		return BigEndian::Get16(aData.Ptr());
+	case 4:
+		return BigEndian::Get32(aData.Ptr());
+	default:
+		//ParsePanic(EGetUintBadDescriptorLength); //FIXME
+		return 0;
+		}
+	}
+
+TUint8 CRFCommPortAttrib::GetRFCommPort()
+	{
+	return iPort;
+	}
+
+//this builder checks to see if the UUID is in the Service Class ID list attribute
+CRFCommClass* CRFCommClass::NewL(const TUUID& aUUID)
+	{
+	CRFCommClass* cl=new (ELeave) CRFCommClass(aUUID);
+	return cl;
+	}
+
+CRFCommClass::CRFCommClass(const TUUID& aUUID)
+	: iUUID(aUUID), iNService(EFalse)
+	{
+	}
+
+CRFCommClass::~CRFCommClass()
+	{
+	}
+
+MSdpElementBuilder* CRFCommClass::StartListL()
+	{
+	return this;
+	}
+
+MSdpElementBuilder* CRFCommClass::EndListL()
+	{
+	return this;
+	}
+
+MSdpElementBuilder* CRFCommClass::BuildUintL(const TDesC8& /*aInt*/)
+	{
+	return this;
+	}
+
+MSdpElementBuilder* CRFCommClass::BuildDESL()
+	{
+	return this;
+	}
+
+
+MSdpElementBuilder* CRFCommClass::BuildUUIDL(const TUUID& aUUID)
+/**
+	The meat, if the UUID is in the service class list then this is the record we want.
+*/
+	{
+	if(aUUID==iUUID)  
+		{		
+		iNService=ETrue;
+		}
+	return this;
+	}
+
+TBool CRFCommClass::InService()
+	{
+	return iNService;
+	}