diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btcomm/src/sdpclientcsy.cpp --- /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 +#include +#include "btcomm.h" +#include "sdpclientcsy.h" +#include +#include +#include + +#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(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; + }