--- /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;
+ }