bluetooth/btsdp/test/builddb.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btsdp/test/builddb.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,1465 @@
+// Copyright (c) 2005-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:
+// Build a static SDP Database
+// 
+//
+
+#include "SDPDatabase.h"
+
+
+// Offsets and constants
+/*const TInt KRecordHandleOffset = 9;
+const TInt KTotalCountOffset = 5;
+const TInt KCurrentCountOffset = 7;
+const TInt KErrorCodeOffset = 5;
+const TInt KAttributeByteCountOffset = 5;
+const TInt KAttributeListOffset = 7;*/
+
+
+void BuildRecordZeroL(CSdpDatabase* aDb)
+/**
+ Record 0 should be used when a server instance is created.
+ note that attributes 2, 5 and 0x201 should be updated.
+ also note only English, pas de Francais, keine Deutsch, non Espanol
+**/
+	{
+	TBuf8<2> attrId;
+	TBuf8<4> val;
+	CSdpServRecord* theRec = CSdpServRecord::NewL();
+	CleanupStack::PushL(theRec);
+
+
+	// Set Attr 0 (Record handle) to 0
+	attrId.FillZ(2);
+	val.FillZ(4);
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	// Set Attr 1 (service class list) to list with UUID = 0x1000
+	attrId[0] = 0x00;
+	attrId[1] = 0x01;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1000)))
+		->EndListL();
+
+	// Set Attr 2 (service record state) to 0
+	attrId[0] = 0x00;
+	attrId[1] = 0x02;
+	val.FillZ(4);
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+
+	// Set attr 4 (protocol list) to L2CAP, no RFCOMM, no OBEX
+	attrId[0] = 0x00;
+	attrId[1] = 0x04;
+	val.FillZ(4);
+	val[3] = 1;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0100))) // L2CAP
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 5 (browse group list) to list with one UUID
+	// 0x1000 (SDP server class)
+// this should be updated with other service classes when other services are added.
+	attrId[0] = 0x00;
+	attrId[1] = 5;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint32(0x1002)))
+		->EndListL();
+
+	// Set Attr 0x006 (language base)
+	attrId[0] = 0x00;
+	attrId[1] = 0x06;
+	TUint16 lang = 0x656e;
+	TUint16 coding = 0x006a;
+	TUint16 base = 0x0100;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUintL(TSdpIntBuf<TUint16>(lang)) // english
+			->BuildUintL(TSdpIntBuf<TUint16>(coding)) // UTF-8
+			->BuildUintL(TSdpIntBuf<TUint16>(base)) // language base
+		->EndListL();
+
+	// Set Attr 0x007 (time to live) to 1200 (0x4B0) seconds (20 minutes)
+	attrId[0] = 0x00;
+	attrId[1] = 0x07;
+	val.FillZ(4);
+	val[2]=4;
+	val[3]=0xb0;
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	// Set Attr 0x008 (availability) to 0xff - fully available - not in use
+	attrId[0] = 0x00;
+	attrId[1] = 0x08;
+	TBuf8<1> val4;
+	val4.FillZ(1);
+	val4[0]=0xff;
+	theRec->BuildUintL(attrId)->BuildUintL(val4);
+
+
+	// Set Attr 0x100 (default Name) to string
+	attrId[0] = 0x01;
+	attrId[1] = 0;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("SDP Server"));
+
+	// Set Attr 0x101 (def. description) to string
+	attrId[0] = 0x01;
+	attrId[1] = 1;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("EPOC SDP server UPF-4"));
+
+	// Set Attr 0x102 (def. provider) to Symbian
+	attrId[0] = 0x01;
+	attrId[1] = 2;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("Symbian Ltd."));
+
+	// Set Attr 0x201 (service database state) to 0
+	attrId[0] = 0x02;
+	attrId[1] = 0x01;
+	val.FillZ(4);
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	CleanupStack::Pop();
+	// Add the record into the database
+	aDb->AddRecord(theRec);
+}
+
+
+
+// this is a real dummy database which doesn't conform to the service class attribute numbering
+CSdpDatabase *BuildDbL()
+	{
+	CSdpDatabase *theDb = CSdpDatabase::NewL();
+	
+	// First Record
+	CSdpServRecord *theRec = CSdpServRecord::NewL();
+
+	// Set Attr 0 (Record handle) to 0
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(0))->BuildUintL(TSdpIntBuf<TUint32>(0));
+	// Set Attr 0x100 (default Name) to string
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(0x100))->BuildStringL(_L8("SDP Server"));
+	// Set Attr 0x102 (def. provider) to Symbian
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(0x102))->BuildStringL(_L8("Symbian Ltd."));
+	// Set Attr 0x101 (def. description) to string
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(0x101))->BuildStringL(_L8("EPOC SDP server test suite"));
+	// Set Attr 1 (service class list) to list with one UUID = 0x1000 (SDP server service)
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(1))->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint32(0x1000)))
+		->EndListL();
+	// Add the record into the database
+	theDb->AddRecord(theRec);
+
+	// Second Record
+	theRec = CSdpServRecord::NewL();
+
+	// Set Attr 0 (Record handle) to 0x11223344
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(0))->BuildUintL(TSdpIntBuf<TUint32>(0x11223344));
+	// Set Attr 0x100 (default Name) to string
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(0x100))->BuildStringL(_L8("Dummy Service"));
+	// Set Attr 0x101 (def. description) to string
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(0x101))->BuildStringL(_L8("A Test SDP record"));
+	// Set Attr 1 (service class list) to list with Two UUID = 0x1000, 0x55667788
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(1))->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint32(0x1000)))
+			->BuildUUIDL(TUUID(TUint32(0x55667788)))
+		->EndListL();
+	// Set Attr 3 (service ID) to a bogoid 0x9999
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(3))->BuildUUIDL(TUUID(TUint16(0x9999)));
+	// Add the record into the database
+	theDb->AddRecord(theRec);
+
+	// Third Record
+	theRec = CSdpServRecord::NewL();
+
+	// Set Attr 0 (Record handle) to 0x9899
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(0))->BuildUintL(TSdpIntBuf<TUint32>(0x9899));
+	// Set Attr 0x100 (default Name) to string
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(0x100))->BuildStringL(_L8("Another dummy service"));
+	// Set Attr 0x101 (def. description) to string
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(0x101))->BuildStringL(_L8("This is the second service on SDP"));
+	// Set Attr 1 (service class list) to list with one UUID = 0x1105 (OBEX Push)
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(1))->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint32(0x1105)))
+		->EndListL();
+	// Set attr 4 (protocol list) to L2CAP, RFCOMM (DLCI=5)
+
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(4))->BuildDESL()
+		->StartListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0100))) // L2CAP
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0003))) // RFCOMM
+				->BuildUintL(TSdpIntBuf<TUint32>(5))	// DLCI = 5
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0008))) // OBEX
+			->EndListL()
+		->EndListL();
+
+	// Add the record into the database
+	theDb->AddRecord(theRec);
+
+	return theDb;
+	}
+
+
+// this is the nearest thing to a real database. 
+// originally for UPF4, but record 0 removed above.
+	
+CSdpDatabase *BuildUpf4DbL()
+	{
+	CSdpDatabase *theDb = CSdpDatabase::NewL();
+	
+	TBuf8<2> attrId;
+	TBuf8<4> val;
+	CSdpServRecord *theRec = CSdpServRecord::NewL();
+// all attribute IDs are BIG ENDian 
+
+// Record 0 should be used when a server instance is created.
+// note that attributes 2, 5 and 0x201 should be updated.
+// also note only English, pas de Francais, keine Deutsch, non Espanol
+	BuildRecordZeroL(theDb);
+	
+// Second Record DUN service
+
+	attrId.FillZ(2);
+	val.FillZ(4);
+	// Set Attr 0 (Record handle) to 0x00010000
+	val[0] = 0x00;
+	val[1] = 0x01;
+	val[2] = 0x00;
+	val[3] = 0x00;
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	// Set Attr 1 (service class list) to list with Two UUID = 0x1103, 0x1201
+	attrId[0] = 0x00;
+	attrId[1] = 0x01;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1103))) // dial up networking
+			->BuildUUIDL(TUUID(TUint16(0x1201))) // generic networking
+		->EndListL();
+
+	// Set attr 4 (protocol list) to L2CAP, RFCOMM (DLCI=1), no OBEX
+	attrId[0] = 0x00;
+	attrId[1] = 0x04;
+	val.FillZ(4);
+	val[3] = 1;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0100))) // L2CAP
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0003))) // RFCOMM
+				->BuildUintL(TSdpIntBuf<TUint8>(1)) // DLCI = 1
+//				->BuildUintL(val) was four bytes	// DLCI = 1 
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x005 (browse group list) to public root
+	attrId[0] = 0x00;
+	attrId[1] = 0x05;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1002))) // publicBrowseRoot
+		->EndListL();
+
+	// Set Attr 0x006 (language base)
+	attrId[0] = 0x00;
+	attrId[1] = 0x06;
+/*	val.FillZ(2);
+	val[0] = 0x65;
+	val[1] = 0x6e;
+	TBuf8<2> val2;
+	TBuf8<2> val3;
+	val2.FillZ(2);
+	val3.FillZ(2);
+	val2[1] = 0x6a;
+	val3[0] = 0x01;
+*/
+	TUint16 lang = 0x656e;
+	TUint16 coding = 0x006a;
+	TUint16 base = 0x0100;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUintL(TSdpIntBuf<TUint16>(lang)) // english
+			->BuildUintL(TSdpIntBuf<TUint16>(coding)) // UTF-8
+			->BuildUintL(TSdpIntBuf<TUint16>(base)) // language base
+		->EndListL();
+
+	// Set Attr 0x009 (profile descriptor list) to Dun version 1.00
+	attrId[0] = 0x00;
+	attrId[1] = 0x09;
+	val.FillZ(2);
+	val[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(KDialUpNetworkingUUID))) // Dialup Networking
+				->BuildUintL(val)	// version 0x100
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x100 (default Name) to string
+	attrId[1] = 0x00;
+	attrId[0] = 0x01;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("Dial-up networking"));
+	
+	// Add the record into the database
+	theDb->AddRecord(theRec);
+
+	
+
+	// Third Record Fax
+	theRec = CSdpServRecord::NewL();
+
+	attrId.FillZ(2);
+	val.FillZ(4);
+	// Set Attr 0 (Record handle) to 0x00010001
+	val[0] = 0x00;
+	val[1] = 0x01;
+	val[2] = 0x00;
+	val[3] = 0x01;
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	// Set Attr 1 (service class list) to list with Two UUID = 0x1111, 0x1204
+	attrId[0] = 0x00;
+	attrId[1] = 0x01;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1111))) // Fax
+			->BuildUUIDL(TUUID(TUint16(0x1204))) // generic telephony
+		->EndListL();
+
+	// Set attr 4 (protocol list) to L2CAP, RFCOMM (DLCI=2), no OBEX
+	attrId[0] = 0x00;
+	attrId[1] = 0x04;
+	val.FillZ(4);
+	val[3] = 2;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0100))) // L2CAP
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0003))) // RFCOMM
+				->BuildUintL(val)	// DLCI = 2
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x005 (browse group list) to public root
+	attrId[0] = 0x00;
+	attrId[1] = 0x05;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1002))) // publicBrowseRoot
+		->EndListL();
+
+	// Set Attr 0x006 (language base)
+	attrId[0] = 0x00;
+	attrId[1] = 0x06;
+	lang = 0x656e;
+	coding = 0x006a;
+	base = 0x0100;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUintL(TSdpIntBuf<TUint16>(lang)) // english
+			->BuildUintL(TSdpIntBuf<TUint16>(coding)) // UTF-8
+			->BuildUintL(TSdpIntBuf<TUint16>(base)) // language base
+		->EndListL();
+
+	// Set Attr 0x009 (profile descriptor list) to Dun version 1.00
+	attrId[0] = 0x00;
+	attrId[1] = 0x09;
+	val.FillZ(2);
+	val[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(KFaxUUID))) // Fax
+				->BuildUintL(val)	// version 0x100
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x100 (default Name) to string
+	attrId[1] = 0x00;
+	attrId[0] = 0x01;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("Fax"));
+	
+	// Add the record into the database
+	theDb->AddRecord(theRec);
+
+	// Fourth Record Obex
+	theRec = CSdpServRecord::NewL();
+
+	attrId.FillZ(2);
+	val.FillZ(4);
+	// Set Attr 0 (Record handle) to 0x00010001
+	val[0] = 0x00;
+	val[1] = 0x01;
+	val[2] = 0x00;
+	val[3] = 0x02;
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	// Set Attr 1 (service class list) to list with One UUID = 0x1105
+	attrId[0] = 0x00;
+	attrId[1] = 0x01;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1105))) // Obex
+		->EndListL();
+
+	// Set attr 4 (protocol list) to L2CAP, RFCOMM (DLCI=3), OBEX
+	attrId[0] = 0x00;
+	attrId[1] = 0x04;
+	val.FillZ(4);
+	val[3] = 3;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0100))) // L2CAP
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0003))) // RFCOMM
+				->BuildUintL(val)	// DLCI = 3
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0008))) // Obex
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x005 (browse group list) to public root
+	attrId[0] = 0x00;
+	attrId[1] = 0x05;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1002))) // publicBrowseRoot
+		->EndListL();
+
+	// Set Attr 0x006 (language base)
+	attrId[0] = 0x00;
+	attrId[1] = 0x06;
+	lang = 0x656e;
+	coding = 0x006a;
+	base = 0x0100;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUintL(TSdpIntBuf<TUint16>(lang)) // english
+			->BuildUintL(TSdpIntBuf<TUint16>(coding)) // UTF-8
+			->BuildUintL(TSdpIntBuf<TUint16>(base)) // language base
+		->EndListL();
+
+	// Set Attr 0x009 (profile descriptor list) to Obex version 1.00
+	attrId[0] = 0x00;
+	attrId[1] = 0x09;
+
+	val.FillZ(2);
+	val[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(KObexUUID))) // Obex
+				->BuildUintL(val)	// version 0x100
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x100 (default Name) to string
+	attrId[1] = 0x00;
+	attrId[0] = 0x01;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("OBEX Objext Push"));
+	
+	// Add the record into the database
+	theDb->AddRecord(theRec);
+
+	return theDb;
+	}
+
+void BuildContinuationString(CSdpServRecord* aRec, TSdpAttributeID aID, TUint16 aLen)
+	{
+	HBufC8* buf = HBufC8::NewMaxL(aLen+1); //believe it or not printing requires null termination of string
+	TPtr8 bptr = buf->Des();
+	bptr.SetLength(0);
+	TPtrC8 base(_L8("Rhubarb"));
+	TChar ch;
+	for(TUint i = 0; i<aLen; ++i)
+		{
+		ch = base.Ptr()[i%(base.Length())];
+		//bptr[i] = ch; //bptr's length already set to aLen
+		bptr.Append(ch);
+		}
+	aRec->BuildUintL(TSdpIntBuf<TUint16>(aID))->BuildStringL(bptr);
+	delete buf;
+	}
+
+void BuildContinuationRecord(CSdpDatabase* aDb, TSdpAttributeID aID, TUint16 aStringLen)
+	{
+	CSdpServRecord* theRec = aDb->NewRecordL(); //this will set-up the handle attribute
+
+	// Set Attr 1 (service class list) to list with one UUID = KSdpContTestUUID 
+	// (Single UUID common to all records in a continuation test database)
+	// Add the record into the database
+	theRec->BuildUintL(TSdpIntBuf<TUint16>(1))->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(KSdpContTestUUID))
+		->EndListL();
+	// Set Attr 0x100 (default Name) to string
+	BuildContinuationString(theRec, aID, aStringLen);
+	}
+
+CSdpDatabase* BuildContinuationDbL()
+	{
+	CSdpDatabase *theDb = CSdpDatabase::NewL();
+	
+	// Record 0 should be used when a server instance is created.
+	// note that attributes 2, 5 and 0x201 should be updated.
+	// also note only English, pas de Francais, keine Deutsch, non Espanol
+	BuildRecordZeroL(theDb);
+	
+	// Build records containing increasingly long strings
+	for(TUint16 i = 1; i<200; ++i)
+		{
+		//5 lines for 1: prevent warnings.
+		TUint16 attrID(i);
+		attrID+=2;
+		TUint16 len(i);
+		len*=5;
+		BuildContinuationRecord(theDb, attrID, len);
+		}
+
+	return theDb;
+	}
+
+CSdpDatabase* BuildNestedListDbL()
+	{
+	CSdpDatabase *theDb = CSdpDatabase::NewL();
+	
+	// Record 0 should be used when a server instance is created.
+	// note that attributes 2, 5 and 0x201 should be updated.
+	// also note only English, pas de Francais, keine Deutsch, non Espanol
+	BuildRecordZeroL(theDb);
+	
+	// Build records containing increasingly long strings
+	for(TUint16 i = 1; i<200; ++i)
+		{
+		//5 lines for 1: prevent warnings.
+		TUint16 attrID(i);
+		attrID+=2;
+		TUint16 len(i);
+		len*=5;
+		BuildContinuationRecord(theDb, attrID, len);
+		}
+
+	return theDb;
+	}
+
+
+
+CSdpDatabase* BuildTBTDbL()
+	{
+	CSdpDatabase* theDb = CSdpDatabase::NewL();
+	
+	TBuf8<2> attrId;
+	TBuf8<4> val;
+	TBuf8<2> val1;
+	CSdpServRecord* theRec = CSdpServRecord::NewL();
+// all attribute IDs are BIG ENDian 
+
+// First Record DUN service. This record will have a value for each attribute so it
+// can be used for the attribute queries.
+
+	attrId.FillZ(2);
+	val.FillZ(4);
+	val1.FillZ(2);
+	// Set Attr 0 (Record handle) to 0x00010000
+	val[0] = 0x00;
+	val[1] = 0x01;
+	val[2] = 0x00;
+	val[3] = 0x00;
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	// Set Attr 1 (service class list) to list with Three UUIDs = 0x1103, 0x1201 and 0x1000.
+	attrId[0] = 0x00;
+	attrId[1] = 0x01;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(KDialUpNetworkingUUID))
+			->BuildUUIDL(TUUID(KGenericNetworkingUUID)) 
+			->BuildUUIDL(TUUID(KServiceDiscoveryServerServiceClassUUID))
+		->EndListL();
+
+	// Set Attr 2 (service record state) to 0.
+	val.FillZ(4);
+	attrId[0] = 0x00;
+	attrId[1] = 0x02;
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	// Set attr 3 (service id) to 0x0001
+	attrId[0] = 0x00;
+	attrId[1] = 0x03;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(0x0001))
+		->EndListL();
+
+	// Set attr 4 (protocol list) to L2CAP, RFCOMM (DLCI=1), no OBEX
+	attrId[0] = 0x00;
+	attrId[1] = 0x04;
+	val1.FillZ(2);
+	val1[1] = 1;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0100))) // L2CAP
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0003))) // RFCOMM
+				->BuildUintL(val1)	// DLCI = 1
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x005 (browse group list) to public root
+	attrId[0] = 0x00;
+	attrId[1] = 0x05;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1002))) // publicBrowseRoot
+		->EndListL();
+
+	// Set Attr 0x006 (language base)
+	attrId[0] = 0x00;
+	attrId[1] = 0x06;
+	val.FillZ(2);
+	val[0] = 0x65;
+	val[1] = 0x6e;
+	TBuf8<2> val2;
+	TBuf8<2> val3;
+	val2.FillZ(2);
+	val3.FillZ(2);
+	val2[1] = 0x6a;
+	val3[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUintL(val) // english
+			->BuildUintL(val2) // UTF-8
+			->BuildUintL(val3) // language base
+		->EndListL();
+
+
+	// Set Attr 0x007 (service info time to live) to 0x0000 (not used).
+	attrId[0] = 0x00;
+	attrId[1] = 0x07;
+	val.FillZ(4);
+
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	// Set Attr 0x008 (service availability) to 0xff (not currently in use).
+	attrId[0] = 0x00;
+	attrId[1] = 0x08;
+	TBuf8<1> ff;
+	ff.FillZ(1);
+	ff[0] = 0xff;	
+
+	theRec->BuildUintL(attrId)->BuildUintL(ff);
+
+	// Set Attr 0x009 (profile descriptor list) to Dun version 1.00
+	attrId[0] = 0x00;
+	attrId[1] = 0x09;
+
+	val.FillZ(2);
+	val[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(KDialUpNetworkingUUID))) 
+				->BuildUintL(val)	// version 0x100
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x00a (Documentation URL) to "http://my.fake/public/documentation/*".
+	attrId[0] = 0x00;
+	attrId[1] = 0x0a;
+
+	theRec->BuildUintL(attrId)->BuildURLL(_L8("http://my.fake/public/documentation.doc"));
+
+	// Set Attr 0x00b (Client Executable URL) to "http://my.fake/public/*/client.exe".
+	attrId[0] = 0x00;
+	attrId[1] = 0x0b;
+
+	theRec->BuildUintL(attrId)->BuildURLL(_L8("http://my.fake/public/*/client.exe"));
+
+	// Set Attr 0x00c (ICON URL) to "http://my.fake/public/icons/*".
+	attrId[0] = 0x00;
+	attrId[1] = 0x0c;
+
+	theRec->BuildUintL(attrId)->BuildURLL(_L8("http://my.fake/public/icons/*"));
+		
+	// Set Attr 0x100 (service Name) to string
+	attrId[0] = 0x01;
+	attrId[1] = 0x00;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("Dial-up networking"));
+
+	// Set Attr 0x101 (service description) to string
+	attrId[0] = 0x01;
+	attrId[1] = 0x01;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("Dummy description for dial-up-networking"));
+
+	// Set Attr 0x102 (provider name) to string
+	attrId[0] = 0x01;
+	attrId[1] = 0x02;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("PAN team"));
+
+	// Set attr 0x200 (version number list) to version 1.1
+	attrId[0]=0x02;
+	attrId[1]=0x00;
+	val1.FillZ(2);
+	val1[0]=0x01;
+	val1[1]=0x01;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUintL(val1)
+		->EndListL();
+
+
+	//Set Attr 0x201 (Service database state) to 0
+	attrId[0]=0x02;
+	attrId[1]=0x01;
+	val.FillZ(4);
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	// Add the record into the database
+	theDb->AddRecord(theRec);
+
+// Second Record Fax
+	theRec = CSdpServRecord::NewL();
+
+	attrId.FillZ(2);
+	val.FillZ(4);
+	// Set Attr 0 (Record handle) to 0x00010001
+	val[0] = 0x00;
+	val[1] = 0x01;
+	val[2] = 0x00;
+	val[3] = 0x01;
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	// Set Attr 1 (service class list) to list with Two UUID = 0x1111, 0x1204
+	attrId[0] = 0x00;
+	attrId[1] = 0x01;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(KFaxUUID)) 
+			->BuildUUIDL(TUUID(KGenericTelephonyUUID)) 
+		->EndListL();
+
+
+	// Set attr 4 (protocol list) to L2CAP, RFCOMM (DLCI=2), no OBEX
+	attrId[0] = 0x00;
+	attrId[1] = 0x04;
+	val.FillZ(4);
+	val[3] = 2;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0100))) // L2CAP
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0003))) // RFCOMM
+				->BuildUintL(val)	// DLCI = 2
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x005 (browse group list) to public root
+	attrId[0] = 0x00;
+	attrId[1] = 0x05;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1002))) // publicBrowseRoot
+		->EndListL();
+
+	// Set Attr 0x006 (language base)
+	attrId[0] = 0x00;
+	attrId[1] = 0x06;
+	val.FillZ(2);
+	val[0] = 0x65;
+	val[1] = 0x6e;
+	val2.FillZ(2);
+	val3.FillZ(2);
+	val2[1] = 0x6a;
+	val3[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUintL(val) // english
+			->BuildUintL(val2) // UTF-8
+			->BuildUintL(val3) // language base
+		->EndListL();
+
+	// Set Attr 0x009 (profile descriptor list) to Dun version 1.00
+	attrId[0] = 0x00;
+	attrId[1] = 0x09;
+
+	val.FillZ(2);
+	val[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(KFaxUUID))) // Fax
+				->BuildUintL(val)	// version 0x100
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x00a (Documentation URL) to a very long value, for use with continuation
+	attrId[0] = 0x00;
+	attrId[1] = 0x0a;
+
+	TBuf8<654> urlBuf;
+	urlBuf.Append(_L8("http://"));
+	for(TInt r = 0; r < 160; r ++)
+	{
+		urlBuf.Append(_L8("url/"));
+	}	
+	urlBuf.Append(_L8("url.doc"));
+	theRec->BuildUintL(attrId)->BuildURLL(urlBuf);
+
+
+	// Set Attr 0x100 (default Name) to string
+	attrId[1] = 0x00;
+	attrId[0] = 0x01;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("Fax"));
+	
+	// Add the record into the database
+	theDb->AddRecord(theRec);
+
+// Third Record Obex
+	theRec = CSdpServRecord::NewL();
+
+	attrId.FillZ(2);
+	val.FillZ(4);
+	// Set Attr 0 (Record handle) to 0x00010001
+	val[0] = 0x00;
+	val[1] = 0x01;
+	val[2] = 0x00;
+	val[3] = 0x02;
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	// Set Attr 1 (service class list) to list with One UUID = 0x1105
+	attrId[0] = 0x00;
+	attrId[1] = 0x01;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(KObexUUID))) // Obex
+		->EndListL();
+
+	// Set attr 4 (protocol list) to L2CAP, RFCOMM (DLCI=3), OBEX
+	attrId[0] = 0x00;
+	attrId[1] = 0x04;
+	val.FillZ(4);
+	val[3] = 3;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0100))) // L2CAP
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0003))) // RFCOMM
+				->BuildUintL(val)	// DLCI = 3
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0008))) // Obex
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x005 (browse group list) to public root
+	attrId[0] = 0x00;
+	attrId[1] = 0x05;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1002))) // publicBrowseRoot
+		->EndListL();
+
+	// Set Attr 0x006 (language base)
+	attrId[0] = 0x00;
+	attrId[1] = 0x06;
+	val.FillZ(2);
+	val[0] = 0x65;
+	val[1] = 0x6e;
+	val2.FillZ(2);
+	val3.FillZ(2);
+	val2[1] = 0x6a;
+	val3[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUintL(val) // english
+			->BuildUintL(val2) // UTF-8
+			->BuildUintL(val3) // language base
+		->EndListL();
+
+	// Set Attr 0x009 (profile descriptor list) to Obex version 1.00
+	attrId[0] = 0x00;
+	attrId[1] = 0x09;
+
+	val.FillZ(2);
+	val[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(KObexUUID))) // Obex
+				->BuildUintL(val)	// version 0x100
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x100 (default Name) to string
+	attrId[1] = 0x00;
+	attrId[0] = 0x01;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("OBEX Objext Push"));
+	
+	// Add the record into the database
+	theDb->AddRecord(theRec);
+
+	// Now add a load more records to force continuation for the service search
+	//
+	for(TUint8 i = 0; i < 200; i ++)
+	{
+		theRec = CSdpServRecord::NewL();
+
+		attrId.FillZ(2);
+		val.FillZ(4);
+		// Set Attr 0 (Record handle) to 0x00010003
+		val[0] = 0x00;
+		val[1] = 0x01;
+		val[2] = 0x00;
+		val[3] = TUint8(i+3);
+		theRec->BuildUintL(attrId)->BuildUintL(val);
+		// Set Attr 1 (service class list) to list with UUID = 0x1108
+		attrId[0] = 0x00;
+		attrId[1] = 0x01;
+		theRec->BuildUintL(attrId)->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(0x1108))
+			->EndListL();
+		// Add the record into the database
+		theDb->AddRecord(theRec);
+	}
+	return theDb;
+	}
+
+
+
+	
+	
+void AddBrowseGroupRecord(CSdpDatabase& aDb, TUUID aBrowseUUID)
+	{
+	CSdpServRecord* theRec = aDb.NewRecordL();
+
+	TBuf8<2> attrId;
+	TBuf8<4> val;
+	attrId.FillZ(2);
+	val.FillZ(4);
+
+	// Set Attr 1 (service class list) to list with One UUID = 0x1001
+	attrId[0] = 0x00;
+	attrId[1] = 0x01;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(KBrowseGroupDescriptorServiceClassUUID))) // BrowseGroup(DescriptorList)
+		->EndListL();
+
+	// Set Attr 0x005 (browse group list) to public root
+	attrId[0] = 0x00;
+	attrId[1] = 0x05;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1002))) // publicBrowseRoot
+		->EndListL();
+
+	// Set Attr 0x200 (default Name) to string
+	attrId[1] = 0x00;
+	attrId[0] = 0x02;
+
+	theRec->BuildUintL(attrId)->BuildUUIDL(aBrowseUUID);
+	}
+
+
+void AddBrowsableRecord(CSdpDatabase& aDb, TUUID aBrowseUUID)
+	{
+	CSdpServRecord* theRec = aDb.NewRecordL();
+
+	TBuf8<2> attrId;
+	TBuf8<4> val;
+	attrId.FillZ(2);
+	val.FillZ(4);
+
+	// Set Attr 1 (service class list) to list with UUID = 0x1108
+	attrId[0] = 0x00;
+	attrId[1] = 0x01;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(0x1108))
+		->EndListL();
+
+	// Set Attr 0x005 (browse group list) to public root
+	attrId[0] = 0x00;
+	attrId[1] = 0x05;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(aBrowseUUID) // publicBrowseRoot
+		->EndListL();
+	}
+
+
+
+
+
+CSdpDatabase* BuildPrequalDbL()
+	{
+	CSdpDatabase* theDb = CSdpDatabase::NewL();
+	
+	TInt i;
+	TBuf8<2> attrId;
+	TBuf8<4> val;
+	TBuf8<2> val1;
+	CSdpServRecord* theRec = theDb->NewRecordL();
+// all attribute IDs are BIG ENDian 
+
+// Prequal Dummy Service Record. Designed to respond to SA tests - 
+// where, it seems, the initial service search is done using UUIDs 1101 and 0011.
+// This record will have a value for each attribute so it
+// can be used for the attribute queries.
+	attrId.FillZ(2);
+	val.FillZ(4);
+	val1.FillZ(2);
+
+	// Set Attr 1 (service class list) to list with UUID = 0x1108
+	attrId[0] = 0x00;
+	attrId[1] = 0x01;
+	MSdpElementBuilder* bdr;
+	bdr = theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(0x0011))
+			->BuildUUIDL(TUUID(KDialUpNetworkingUUID));
+	//TUint16 x = 0x1201;
+	//while(x<0x120a)
+	//	bdr->BuildUUIDL(TUUID(x++));
+	bdr->EndListL();
+
+	// Set Attr 2 (service record state) to 0.
+	val.FillZ(4);
+	attrId[0] = 0x00;
+	attrId[1] = 0x02;
+	val[0] = 0xdd;
+	val[1] = 0xdd;
+	val[2] = 0xdd;
+	val[3] = 0xcd;
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	// Set attr 3 (service id) to 0x0001
+	attrId[0] = 0x00;
+	attrId[1] = 0x03;
+	theRec->BuildUintL(attrId)
+			->BuildUUIDL(TUUID(0xeeee));
+
+	// Set attr 4 (protocol list) to L2CAP, RFCOMM (DLCI=1), no OBEX
+	attrId[0] = 0x00;
+	attrId[1] = 0x04;
+	val1.FillZ(2);
+	val1[1] = 1;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0001)))
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0100))) // L2CAP
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0003))) // RFCOMM
+				->BuildUintL(TSdpIntBuf<TUint8>(1)) // DLCI = 1
+			->EndListL()
+		->EndListL();
+	
+	// Set Attr 0x005 (browse group list) to public root
+	attrId[0] = 0x00;
+	attrId[1] = 0x05;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1002))) // publicBrowseRoot
+		->EndListL();
+
+	// Set Attr 0x006 (language base)
+	attrId[0] = 0x00;
+	attrId[1] = 0x06;
+	val.FillZ(2);
+	//val.SetLength(2);
+	val[0] = 0x65;
+	val[1] = 0x6e;
+	TBuf8<2> val2;
+	TBuf8<2> val3;
+	val2.FillZ(2);
+	val3.FillZ(2);
+	val2[1] = 0x6a;
+	val3[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUintL(val) // english
+			->BuildUintL(val2) // UTF-8
+			->BuildUintL(val3) // language base
+		->EndListL();
+
+
+	// Set Attr 0x007 (service info time to live) to 0x0000 (not used).
+	attrId[0] = 0x00;
+	attrId[1] = 0x07;
+	//val.SetLength(4);
+	val.FillZ(4);
+	val[0] = 0xcc;
+	val[1] = 0xcc;
+	val[2] = 0xcc;
+	val[3] = 0xcc;
+
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+	// Set Attr 0x008 (service availability) to 0xff (not currently in use).
+	attrId[0] = 0x00;
+	attrId[1] = 0x08;
+	TBuf8<1> ff;
+	ff.FillZ(1);
+	ff[0] = 0xbb;	
+
+	theRec->BuildUintL(attrId)->BuildUintL(ff);
+
+	// Set Attr 0x009 (profile descriptor list) to Dun version 1.00
+	attrId[0] = 0x00;
+	attrId[1] = 0x09;
+	val.FillZ(2);
+	val[0] = 0x01;
+	val[1] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(KSerialPortUUID))) 
+				->BuildUintL(val)	// version 0x100
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x00a (Documentation URL) to "http://www.documentation.url/*".
+	attrId[0] = 0x00;
+	attrId[1] = 0x0a;
+
+	theRec->BuildUintL(attrId)->BuildURLL(_L8("http://www.documentation.url"));
+
+	// Set Attr 0x00b (Client Executable URL) to "http://url.i86-microsoft-win2000/".
+	attrId[0] = 0x00;
+	attrId[1] = 0x0b;
+
+	theRec->BuildUintL(attrId)->BuildURLL(_L8("http://url.i86-microsoft-win2000/"));
+
+	// Set Attr 0x00c (ICON URL) to "http://url.32x32x8.png/icon".
+	attrId[0] = 0x00;
+	attrId[1] = 0x0c;
+
+	theRec->BuildUintL(attrId)->BuildURLL(_L8("http://url.32x32x8.png/icon"));
+	//theRec->BuildUintL(attrId)->BuildStringL(_L8("http://url.32x32x8.png/icon/"));
+		
+	// Set Attr 0x100 (service Name) to string
+	//BuildContinuationString(theRec, 0x100, 0x200);
+	attrId[0] = 0x01;
+	attrId[1] = 0x00;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("Indigo_Chat_Security_Mode_1"));
+
+	// Set Attr 0x101 (service description) to string
+	attrId[0] = 0x01;
+	attrId[1] = 0x01;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("ServiceDescriptionAttributeValue"));
+		// Set Attr 0x102 (provider name) to string
+	attrId[0] = 0x01;
+	attrId[1] = 0x02;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("ServiceProviderAttributeValue"));
+
+	// Set attr 0x200 (version number list) to version 1.1
+	attrId[0]=0x02;
+	attrId[1]=0x00;
+	val1.FillZ(2);
+	val1[0]=0x01;
+	val1[1]=0x01;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUintL(val1)
+		->EndListL();
+
+
+	//Set Attr 0x201 (Service database state) to 0
+	attrId[0]=0x02;
+	attrId[1]=0x01;
+	val.FillZ(4);
+	val[3] = 0x0e;
+	theRec->BuildUintL(attrId)->BuildUintL(val);
+
+// Second Record Fax
+	theRec = theDb->NewRecordL();
+
+	attrId.FillZ(2);
+	val.FillZ(4);
+
+	// Set Attr 1 (service class list) to list with Two UUID = 0x1111, 0x1204
+	attrId[0] = 0x00;
+	attrId[1] = 0x01;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(KFaxUUID)) 
+			->BuildUUIDL(TUUID(KGenericTelephonyUUID)) 
+		->EndListL();
+
+
+	// Set attr 4 (protocol list) to L2CAP, RFCOMM (DLCI=2), no OBEX
+	attrId[0] = 0x00;
+	attrId[1] = 0x04;
+	val.FillZ(4);
+	val[3] = 2;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0100))) // L2CAP
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0003))) // RFCOMM
+				->BuildUintL(val)	// DLCI = 2
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x005 (browse group list) to public root
+	attrId[0] = 0x00;
+	attrId[1] = 0x05;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1002))) // publicBrowseRoot
+		->EndListL();
+
+	// Set Attr 0x006 (language base)
+	attrId[0] = 0x00;
+	attrId[1] = 0x06;
+	val.FillZ(2);
+	val[0] = 0x65;
+	val[1] = 0x6e;
+	val2.FillZ(2);
+	val3.FillZ(2);
+	val2[1] = 0x6a;
+	val3[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUintL(val) // english
+			->BuildUintL(val2) // UTF-8
+			->BuildUintL(val3) // language base
+		->EndListL();
+
+	// Set Attr 0x009 (profile descriptor list) to Dun version 1.00
+	attrId[0] = 0x00;
+	attrId[1] = 0x09;
+	val.FillZ(2);
+	val[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(KFaxUUID))) // Fax
+				->BuildUintL(val)	// version 0x100
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x00a (Documentation URL) to a very long value, for use with continuation
+	attrId[0] = 0x00;
+	attrId[1] = 0x0a;
+
+	TBuf8<654> urlBuf;
+	urlBuf.Append(_L8("http://"));
+	for(TInt r = 0; r < 160; r ++)
+	{
+		urlBuf.Append(_L8("url/"));
+	}
+	urlBuf.Append(_L8("url.doc"));
+	theRec->BuildUintL(attrId)->BuildURLL(urlBuf);
+
+
+	// Set Attr 0x100 (default Name) to string
+	attrId[1] = 0x00;
+	attrId[0] = 0x01;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("Fax"));
+	
+// Third Record Obex
+	theRec = theDb->NewRecordL();
+
+	attrId.FillZ(2);
+	val.FillZ(4);
+
+	// Set Attr 1 (service class list) to list with One UUID = 0x1105
+	attrId[0] = 0x00;
+	attrId[1] = 0x01;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(KObexUUID))) // Obex
+		->EndListL();
+
+	// Set attr 4 (protocol list) to L2CAP, RFCOMM (DLCI=3), OBEX
+	attrId[0] = 0x00;
+	attrId[1] = 0x04;
+	val.FillZ(4);
+	val[3] = 3;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0100))) // L2CAP
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0003))) // RFCOMM
+				->BuildUintL(val)	// DLCI = 3
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0008))) // Obex
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x005 (browse group list) to public root
+	attrId[0] = 0x00;
+	attrId[1] = 0x05;
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint16(0x1002))) // publicBrowseRoot
+		->EndListL();
+
+	// Set Attr 0x006 (language base)
+	attrId[0] = 0x00;
+	attrId[1] = 0x06;
+	val.FillZ(2);
+	val[0] = 0x65;
+	val[1] = 0x6e;
+	val2.FillZ(2);
+	val3.FillZ(2);
+	val2[1] = 0x6a;
+	val3[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()
+			->BuildUintL(val) // english
+			->BuildUintL(val2) // UTF-8
+			->BuildUintL(val3) // language base
+		->EndListL();
+
+	// Set Attr 0x009 (profile descriptor list) to Obex version 1.00
+	attrId[0] = 0x00;
+	attrId[1] = 0x09;
+	val.FillZ(4);
+	val[0] = 0x01;
+
+	theRec->BuildUintL(attrId)->BuildDESL()
+		->StartListL()->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(KObexUUID))) // Obex
+				->BuildUintL(val)	// version 0x100
+			->EndListL()
+		->EndListL();
+
+	// Set Attr 0x100 (default Name) to string
+	attrId[1] = 0x00;
+	attrId[0] = 0x01;
+	theRec->BuildUintL(attrId)->BuildStringL(_L8("OBEX Objext Push"));
+
+
+	// Now add browse test stuff
+	//
+	AddBrowseGroupRecord(*theDb, TUUID(0xbbcb));
+	AddBrowseGroupRecord(*theDb, TUUID(0xbbdb));
+	AddBrowseGroupRecord(*theDb, TUUID(0xbbeb));
+	AddBrowseGroupRecord(*theDb, TUUID(0xbbfb));
+	AddBrowseGroupRecord(*theDb, TUUID(0xccec));
+	AddBrowseGroupRecord(*theDb, TUUID(0xccfc));
+	AddBrowseGroupRecord(*theDb, TUUID(0xaaba));
+	AddBrowseGroupRecord(*theDb, TUUID(0xaaca));
+
+	AddBrowsableRecord(*theDb, TUUID(0xbbcb));
+	AddBrowsableRecord(*theDb, TUUID(0xbbdb));
+	AddBrowsableRecord(*theDb, TUUID(0xbbeb));
+	AddBrowsableRecord(*theDb, TUUID(0xbbfb));
+	AddBrowsableRecord(*theDb, TUUID(0xccec));
+	AddBrowsableRecord(*theDb, TUUID(0xccfc));
+	AddBrowsableRecord(*theDb, TUUID(0xaaba));
+	AddBrowsableRecord(*theDb, TUUID(0xaaca));
+
+
+
+	// Now add a load more records to force continuation for the service search
+	//
+	for(i = 0; i < 165; i ++)
+	{
+		theRec = theDb->NewRecordL();
+
+		attrId.FillZ(2);
+		val.FillZ(4);
+
+		// Set Attr 1 (service class list) to list with UUID = 0x1108
+		attrId[0] = 0x00;
+		attrId[1] = 0x01;
+		theRec->BuildUintL(attrId)->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(0x1101))
+			->EndListL();
+	}
+	return theDb;
+	}