bluetooth/btsdp/test/tsdpdb-ammend.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btsdp/test/tsdpdb-ammend.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,702 @@
+// 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:
+// SDP Database library test code
+// 
+//
+
+
+#include <e32test.h>
+#include <f32file.h>
+#include <e32math.h>
+#include <btsdp.h>
+#include "listener.h"
+#include "reqhandler.h"
+#include "SDPDatabase.h"
+#include "protocolmanl.h"
+#include "MAttributeVisitor.h"
+#include "ServiceSearchVisitor.h"
+#include "DataEncoder.h"
+#include "ExtractorVisitor.h"
+#include "EncoderVisitor.h"
+#include "responsesizevisitor.h"
+#include "debug.h"
+//#ifdef __EPOC32__
+#include <c32comm.h>
+//#endif
+
+GLDEF_D RTest test(_L("SDP database DLL tests"));
+
+#if defined (__WINS__)
+#define PDD_NAME _L("ECDRV")
+#define LDD_NAME _L("ECOMM")
+#else  // __GCC32__
+#define PDD_NAME _L("EUART1")
+#define LDD_NAME _L("ECOMM")
+// #define ETNA_PDD_NAME _L("EUART2") // for debugging over com2
+#endif
+
+CSdpDatabase *BuildDbL();
+CSdpDatabase *BuildUpf4DbL();
+CSdpDatabase* BuildContinuationDbL();
+CSdpDatabase* BuildNestedListDbL();
+CSdpDatabase* BuildPrequalDbL();
+// in Builddb.cpp
+
+void LoadLDD_PDD()
+	{
+	TInt r;
+//#ifdef __EPOC32__
+	r=StartC32();
+	if (r!=KErrNone && r!=KErrAlreadyExists)
+		{
+		test.Printf(_L("Failed %d!\n\r"),r);
+		test(r==KErrNone);
+		}
+	else
+		test.Printf(_L("Started C32\n"));
+//#endif
+	test.Printf(_L("Loading PDD\n"));
+	r=User::LoadPhysicalDevice(PDD_NAME);
+	if (r!=KErrNone && r!=KErrAlreadyExists)
+		{
+		test.Printf(_L("Failed %d!\n\r"),r);
+		test(r==KErrNone);
+		}
+	else 
+		test.Printf(_L("Loaded PDD\n"));
+	test.Printf(_L("Loading LDD\n"));
+	r=User::LoadLogicalDevice(LDD_NAME);
+	if (r!=KErrNone && r!=KErrAlreadyExists)
+		{
+		test.Printf(_L("Failed %d!\n\r"),r);
+		test(r==KErrNone);
+		}
+	else
+		test.Printf(_L("Loaded LDD\n"));
+	}
+
+// plagiarised from tsdp.cpp
+// actually Mel can't cast from Shortest form (TPtrC8) to a TDesC8 without this call
+void HexDes(const TDesC8& aDes)
+	{
+	for (TInt i = 0; i < aDes.Length(); ++i)
+		test.Printf(_L("%02x"), aDes[i]);
+	}
+
+class CAttrPrintVisitor : public CBase, public MAttributeVisitor
+	{
+public:
+	CAttrPrintVisitor(CConsoleBase& aConsole) : iConsole(aConsole) {iIndent=0;}
+	~CAttrPrintVisitor() {/*iConsole.Getch();*/}
+    void VisitAttributeL(CSdpAttr &aAttribute)
+		{
+		Indent();
+		test.Printf(_L("\nID:0x%x:"), aAttribute.AttributeID());
+		}
+	void VisitAttributeValueL(CSdpAttrValue & aValue, TSdpElementType aType)
+		{
+// FIXME need a new object like the match list that will just store the object in
+// FIXME an array, or perhaps just print it ? Is it a visitor ?
+//		CSdpSearchPattern* encAttrList = new (ELeave) CSdpSearchPattern;
+//		CleanupStack::PushL(encAttrList);
+
+//		CElementParser* parser = CElementParser::NewL(encAttrList);
+//		CleanupStack::PushL(parser);
+
+//		TInt rem;
+
+		TBuf16<64> iString;
+//		TInt iFound;
+		switch (aType)
+			{
+			case ETypeString:
+				iString.Copy(aValue.Des());
+				test.Printf(_L("\"%S\""),&iString);
+				break;
+			case ETypeDES:
+				test.Printf(_L(" DES"));
+				break;
+			case ETypeUint:
+				test.Printf(_L(" UInt:0x%x"), aValue.Uint());
+				break;
+			case ETypeUUID:
+				test.Printf(_L(" UUID:0x"));
+				HexDes(aValue.UUID().ShortestForm());
+				break;
+			case ETypeEncoded:
+				HexDes(aValue.Des());  // simplest
+//parse out the elements in this encoded attribute
+//				rem = parser->ParseElementsL(aValue.Des());
+//				CleanupStack::PopAndDestroy(/*parser*/);
+//				for (iFound=0 ; iFound++ ; (iFound < (encAttrList->Length())))
+//				{
+//					VisitAttributeValueL(encAttrList->At(iFound).Value, encAttrList->At(iFound).Type);
+//				}
+//				CleanupStack::PopAndDestroy(/*encAttrList*/);
+				break;
+			default:
+				test.Printf(_L("type %d\n"), aType);
+			}
+		}
+	void StartListL(CSdpAttrValueList &/*aList*/)
+		{
+		++iIndent;
+		test.Printf(_L("{"));
+		}
+    void EndListL()
+		{
+		if(iIndent<=0)
+			{
+			test.Printf(_L("\nERROR! Unmatched EndList!\n"));
+			__DEBUGGER();
+			}
+		test.Printf(_L("}"));
+		--iIndent;
+		}
+private:
+	void Indent() {/*test.SetPos(iIndent)*/;}
+	CConsoleBase &iConsole;
+	TInt iIndent;
+	};
+
+void PrintDb(CSdpDatabase& aDb, CConsoleBase& aConsole)
+	{
+	aConsole.Printf(_L("Printing Database...\n"));
+
+	for(TServRecordIter recIter(aDb.RecordIter()); recIter; recIter++)
+		{// Iterate thru records in Db
+		aConsole.Printf(_L("\n...Printing Record 0x%x\n"), (*recIter).Handle());
+		for(TServAttrIter attrIter((*recIter).AttributeIter()); attrIter; attrIter++)
+			{// Iterate thru attributes in record
+			CAttrPrintVisitor* theVisitor = new CAttrPrintVisitor(aConsole);
+			(*attrIter).AcceptVisitorL(*theVisitor);
+			delete theVisitor;
+			}
+		}
+	}
+
+class CAttrFlogVisitor : public CBase, public MAttributeVisitor
+	{
+public:
+	CAttrFlogVisitor(){}
+    void VisitAttributeL(CSdpAttr &aAttribute)
+		{
+		Indent();
+
+		//3 lines for one here, but prevents warning.
+		TUint id;
+		id= aAttribute.AttributeID(); 
+		FTRACE(FPrint(_L("Attribute ID: 0x%x\n"), id));
+
+		(void)(id != 0); // keep compiler happy by referencing id as an r-value in urel
+		}
+	void VisitAttributeValueL(CSdpAttrValue & aValue, TSdpElementType aType)
+		{
+		TBuf16<64> iString;
+		switch (aType)
+			{
+			case ETypeString:
+				iString.Copy(aValue.Des());
+				FTRACE(FPrint(_L("\"%S\""),&iString));
+				break;
+			case ETypeDES:
+				FTRACE(FPrint(_L(" DES")));
+				break;
+			case ETypeUint:
+				FTRACE(FPrint(_L(" UInt:0x%x"), aValue.Uint()));
+				break;
+			case ETypeUUID:
+				FTRACE(FPrint(_L(" UUID:0x")));
+				HexDes(aValue.UUID().ShortestForm());
+				break;
+			case ETypeEncoded:
+				HexDes(aValue.Des());  // simplest
+				break;
+			default:
+				FTRACE(FPrint(_L("type %d\n"), aType));
+			}
+		}
+    //void VisitAttributeValueL(CSdpAttrValue &aValue, TSdpElementType aType)
+	//	{
+	//	Indent();
+	//	FTRACE(FPrint(_L("(Val: type %d)\n"), aType));
+	//	if(aType==ETypeUUID)
+	//		{
+	//		TUUID u = aValue.UUID();
+	//		FTRACE(FPrint(_L("(Val: uuid 0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x)\n"), 
+	//					  u[0],u[1],u[2],u[3],u[4],u[5],u[6],u[7],u[8],u[9],u[10],u[11],u[12],u[13],u[14],u[15]));
+	//		}
+	//
+	//		}
+    void StartListL(CSdpAttrValueList &/*aList*/)
+		{
+		++iIndent;
+		Indent();
+		FTRACE(FPrint(_L("{\n")));
+		}
+    void EndListL()
+		{
+		if(iIndent<=0)
+			{
+			FTRACE(FPrint(_L("\nERROR! Unmatched EndList!\n")));
+			__DEBUGGER();
+			}
+		Indent();
+		FTRACE(FPrint(_L("}\n")));
+		--iIndent;
+		}
+private:
+	void HexDes(const TDesC8& aDes)
+		{
+		for (TInt i = 0; i < aDes.Length(); ++i)
+			{
+			FTRACE(FPrint(_L("%02x"), aDes[i]));
+			}	
+		}
+
+	void Indent() 
+		{
+		for(TInt i=0; i<iIndent;++i)
+			{
+			FTRACE(FPrint(_L("  ")));
+			}
+		}
+	TInt iIndent;
+	};
+
+
+void FlogDb(CSdpDatabase& aDb)
+	{
+	FTRACE(FPrint(_L("\n\nPrinting Database...\n\n")));
+
+	for(TServRecordIter recIter(aDb.RecordIter()); recIter; recIter++)
+		{// Iterate thru records in Db
+		FTRACE(FPrint(_L("\n...Printing Record 0x%x\n"), (*recIter).Handle()));
+		for(TServAttrIter attrIter((*recIter).AttributeIter()); attrIter; attrIter++)
+			{// Iterate thru attributes in record
+			CAttrFlogVisitor* theVisitor = new CAttrFlogVisitor();
+			(*attrIter).AcceptVisitorL(*theVisitor);
+			delete theVisitor;
+			}
+		}
+	FTRACE(FPrint(_L("\n\nEnd Printing Database...\n\n\n\n")));
+	}
+
+
+
+void RegisterDatabaseInServerL (RSdpDatabase& aDb, CSdpDatabase& aDbStruct)
+	{
+	for(TServRecordIter recIter(aDbStruct.RecordIter()); recIter; recIter++)
+		{// Iterate thru records in Db
+		TServAttrIter attrIter((*recIter).AttributeIter());
+		if(!attrIter) 
+			continue;
+		if((*attrIter).AttributeID() == 0)
+			attrIter++;	//Skip rec handle
+		if(!attrIter) 
+			continue;
+		if((*attrIter).AttributeID() != 1 || (*attrIter).Value().Type() != ETypeDES)
+			continue;
+		// Get service class list
+		TSdpServRecordHandle handle;
+		aDb.CreateServiceRecordL((CSdpAttrValueDES&)(*attrIter).Value(), handle);
+		attrIter++;
+		for(; attrIter; attrIter++)
+			{// Iterate thru attributes in record
+			aDb.UpdateAttributeL(handle, (*attrIter).AttributeID(), (*attrIter).Value());
+			}
+		}
+	}
+ 
+TSdpServRecordHandle BuildPagonisL(RSdpDatabase& aDb, TUUID aUUID, TUint8 aCN)
+/**
+ Record Pagonis should be used when building a record with a protocol ID
+ list consisting of L2CAP and RFCOMM. This record is for a service of class
+ "serial port" - UUID16 0x1101
+ note that attributes 2, 5 and 0x201 should be updated.
+ also note only English, pas de Francais, keine Deutsch, non Espanol
+**/
+	{
+	TBuf8<4> value1;
+	TBuf8<4> value2;
+	TSdpServRecordHandle recHandle;
+	CSdpAttrValue* attrVal = 0;
+	CSdpAttrValueDES* attrValDES = 0;
+
+
+	value1.FillZ(4);
+	value2.FillZ(4);
+
+	// Set Attr 1 (service class list) to list with UUID = 0x1101 (serial port)
+	//													 or 0x1102 (LANP)
+	aDb.CreateServiceRecordL(aUUID, recHandle);
+	test.Printf(_L("Service Record Created - Handle: 0x%x!\n\n"), recHandle);
+
+	// Set Attr 2 (service record state) to 0
+	value1.FillZ(4);
+	attrVal = CSdpAttrValueUint::NewUintL(value1);
+	CleanupStack::PushL(attrVal);
+	aDb.UpdateAttributeL(recHandle, 0x02, *attrVal);
+	CleanupStack::PopAndDestroy();
+	attrVal = 0;
+
+	// Set attr 4 (protocol list) to L2CAP, and RFCOMM
+	value1.FillZ(4);
+	value1[3] = 3;
+	value2.FillZ(4);
+	value2[3] = aCN;
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES);
+	attrValDES
+		->StartListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0100))) // L2CAP
+				->BuildUintL(value1)
+			->EndListL()
+			->BuildDESL()
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint16(0x0003))) // RFCOMM
+				->BuildUintL(value2)
+			->EndListL()
+		->EndListL();
+	aDb.UpdateAttributeL(recHandle, 0x04, *attrValDES);
+	CleanupStack::PopAndDestroy();
+	attrValDES = 0;
+
+	// Set Attr 5 (browse group list) to list with one UUID
+	// 0x1101 (serial port class)
+	// this should be updated with other service classes when other services are added.
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES);
+	attrValDES
+		->StartListL()
+			->BuildUUIDL(TUUID(TUint32(0x1002)))
+		->EndListL();
+	aDb.UpdateAttributeL(recHandle, 0x05, *attrValDES);
+	CleanupStack::PopAndDestroy();
+	attrValDES = 0;
+
+
+	// Set Attr 0x006 (language base)
+	value1.FillZ(4);
+	value1[2] = 0x65;
+	value1[3] = 0x6e;
+	TBuf8<4> val2;
+	TBuf8<4> val3;
+	val2.FillZ(4);
+	val3.FillZ(4);
+	val2[3] = 0x6a;
+	val3[2] = 0x01;
+
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES);
+	attrValDES
+		->StartListL()
+			->BuildUintL(value1) // english
+			->BuildUintL(val2) // UTF-8
+			->BuildUintL(val3) // language base
+		->EndListL();
+	aDb.UpdateAttributeL(recHandle, 0x06, *attrValDES);
+	CleanupStack::PopAndDestroy();
+	attrValDES = 0;
+
+	// Set Attr 0x007 (time to live) to 1200 (0x4B0) seconds (20 minutes)
+	value1.FillZ(4);
+	value1[2]=4;
+	value1[3]=0xb0;
+	attrVal = CSdpAttrValueUint::NewUintL(value1);
+	CleanupStack::PushL(attrVal);
+	aDb.UpdateAttributeL(recHandle, 0x07, *attrVal);
+	CleanupStack::PopAndDestroy();
+	attrVal = 0;
+
+	// Set Attr 0x008 (availability) to 0xff - fully available - not in use
+	value1.FillZ(4);
+	value1[3]=0xff;
+	attrVal = CSdpAttrValueUint::NewUintL(value1);
+	CleanupStack::PushL(attrVal);
+	aDb.UpdateAttributeL(recHandle, 0x08, *attrVal);
+	CleanupStack::PopAndDestroy();
+	attrVal = 0;
+
+
+	// Set Attr 0x100 (default Name) to string
+	attrVal = CSdpAttrValueString::NewStringL(_L8("Pagonis Service"));
+	CleanupStack::PushL(attrVal);
+	aDb.UpdateAttributeL(recHandle, 0x0100, *attrVal);
+	CleanupStack::PopAndDestroy();
+	attrVal = 0;
+
+	// Set Attr 0x101 (def. description) to string
+	attrVal = CSdpAttrValueString::NewStringL(_L8("It's all Greek to me!"));
+	CleanupStack::PushL(attrVal);
+	aDb.UpdateAttributeL(recHandle, 0x0101, *attrVal);
+	CleanupStack::PopAndDestroy();
+	attrVal = 0;
+
+	// Set Attr 0x102 (def. provider) to Symbian
+	attrVal = CSdpAttrValueString::NewStringL(_L8("Symbian Ltd."));
+	CleanupStack::PushL(attrVal);
+	aDb.UpdateAttributeL(recHandle, 0x0102, *attrVal);
+	CleanupStack::PopAndDestroy();
+	attrVal = 0;
+
+	// Set Attr 0x201 (service database state) to 0
+	value1.FillZ(4);
+	attrVal = CSdpAttrValueUint::NewUintL(value1);
+	CleanupStack::PushL(attrVal);
+	aDb.UpdateAttributeL(recHandle, 0x0201, *attrVal);
+	CleanupStack::PopAndDestroy();
+	attrVal = 0;
+
+	return recHandle;
+}
+
+
+void Test0()
+/**
+	Client/server test.
+**/
+	{
+	FLOG(_L("Running test 0"));
+	//FIXME: TRAPD? 
+	test.Start(_L("Test 0 -- Client/Server"));
+	TInt ret;
+	LoadLDD_PDD();
+
+	RSdp sdp;
+	ret = sdp.Connect();
+	if(ret!=KErrNone)
+		{
+		test.End();
+		return;
+		}
+	RSdpDatabase db;
+	ret = db.Open(sdp);
+	if(ret!=KErrNone)
+		{
+		test.End();
+		return;
+		}
+	TSdpServRecordHandle recHandle = 0;
+	TUUID uuid = TUUID(0x20000); //prevents warning
+	db.CreateServiceRecordL(uuid, recHandle);
+	test.Printf(_L("Service Record Created - Handle: 0x%x!\n\n"), recHandle);
+		CSdpAttrValueDES* list = CSdpAttrValueDES::NewDESL(NULL);
+		MSdpElementBuilder* bldr= list;
+		CleanupStack::PushL(list);
+
+		bldr
+			->StartListL()
+				->BuildUUIDL(TUUID(TUint32(0x20002000)))
+				->BuildUUIDL(TUUID(TUint32(0x11112222), TUint32(0x33334444), 
+									  TUint32(0x55556666), TUint32(0x77778888)))
+				->BuildUUIDL(TUUID(TUint32(0x40000)))
+			->EndListL();
+		//db.CreateServiceRecordL(*list, recHandle);
+		CleanupStack::PopAndDestroy(); //list
+		//test.Printf(_L("Service Record Created - Handle: 0x%x!\n\n"), recHandle);
+	//User::WaitForRequest(status);
+	//if(status==KErrNone)
+	//	test.Printf(_L("Service Record Created - Handle: 0x%x!\n\n"), recHandlePckgBuf());
+	//else
+	//	test.Printf(_L("Service Record Creation ERROR %d!\n\n"), status.Int());
+
+	TBuf8<8> buf8(_L8("Mel!"));
+	buf8[1] = 'E';
+	buf8[2] = 'L';
+	TDesC16 buf16(_L("Nicky!"));
+	db.UpdateAttributeL(recHandle, 0x3454, buf8);
+	db.UpdateAttributeL(recHandle, 0x3455, _L("Nicky!"));
+	db.UpdateAttributeL(recHandle, 0x3455, _L("Micky!"));
+	db.UpdateAttributeL(recHandle, 0x3456, 0x9999);
+	db.DeleteAttributeL(recHandle, 0x3456);
+	db.UpdateAttributeL(recHandle, 0x3456, 0x7777);
+	db.DeleteAttributeL(recHandle, 0x5555); //does not exist!
+	//db.DeleteRecordL(recHandleSpecial);
+	db.Close();
+	sdp.Close();
+	test.End();
+	}
+
+
+void Test1()
+/**
+	Client/server test for use with John Pagonis.
+	Suitable database built on client side, and placed in server.
+	Server left alive till user chooses to kill it.
+**/
+	{
+	FLOG(_L("Running test 1"));
+	//FIXME: TRAPD? 
+	test.Start(_L("Test 1 ...\n"));
+	//__BREAKPOINT();
+	
+	TChar c;
+	RSdp sdp;
+	RSdpDatabase db;
+	TInt ret;
+	LoadLDD_PDD();
+
+	test.Printf(_L("About to play with the SDP database\n - make sure the SDP database EXISTS, and then press any key.\n"));
+	test.Getch();
+	test.Next(_L("Opening SDP Database"));
+	ret = sdp.Connect();
+	if(ret!=KErrNone)
+		{
+		if(ret==KErrNotFound)
+			test.Printf(_L("Cannot start sdp server, could not find bluetooth.\n"));
+		else
+			test.Printf(_L("Cannot start sdp server.\n"));
+		test.Next(_L("PRESS ANY KEY.\n"));
+		test.Getch();
+
+		test.End();
+		return;
+		}
+	test(ret==KErrNone);
+	ret = db.Open(sdp);
+	if(ret!=KErrNone)
+		{
+		test.Printf(_L("Starting SDP Server SESSION FAILED.\n"));
+		test.End();
+		return;
+		}
+
+	TSdpServRecordHandle recHandle1 = 0x0010000;
+	TUint16 attrId = 0x01;
+
+
+	CSdpAttrValueDES* attrVal = CSdpAttrValueDES::NewDESL(NULL);
+	CleanupStack::PushL(attrVal);
+	MSdpElementBuilder* bldr = attrVal;
+	bldr->StartListL()->BuildUUIDL(TUUID(TUint16(0x1000)))->EndListL();
+	TRAPD(err, db.UpdateAttributeL(recHandle1, attrId, *attrVal));
+	CleanupStack::PopAndDestroy();
+
+	test.Printf(_L("Update Attribute on Attr %d in Service Record %d in SDP Server's Database returned %d.\n"), attrId, recHandle1, err);
+	test.Printf(_L("Press any key to continue.\n"));
+	test.Getch();
+
+	attrId = 0x3455;
+	TRAP(err, db.UpdateAttributeL(recHandle1, attrId, _L("Nicky!")));
+	test.Printf(_L("Update Attribute on Attr %d in Service Record %d in SDP Server's Database returned %d.\n"), attrId, recHandle1, err);
+	test.Printf(_L("Press any key to continue.\n"));
+	test.Getch();
+
+	attrId = 0x01;
+	TRAP(err, db.DeleteAttributeL(recHandle1, attrId));
+	test.Printf(_L("Delete Attribute on Attr %d in Service Record %d in SDP Server's Database returned %d.\n"), attrId, recHandle1, err);
+	test.Printf(_L("Press any key to continue.\n"));
+	test.Getch();
+
+	TRAP(err, db.DeleteRecordL(recHandle1));
+	test.Printf(_L("Delete Service Record %d in SDP Server's Database returned %d.\n"), attrId, recHandle1, err);
+	test.Printf(_L("Press any key to continue.\n"));
+	test.Getch();
+	db.Close();
+	sdp.Close();
+
+  
+	test.End();
+	}
+
+
+
+
+
+void IntConversionTest()
+/**
+	Checks compiler has done uint-int cast correctly
+	in CSdpAttrValueInt::Int().
+**/
+	{
+	TBuf8<4> tstr;
+	tstr.FillZ(4);
+	tstr[0] = 0xff;
+	tstr[1] = 0xff;
+	tstr[2] = 0xff;
+	tstr[3] = 0xff;
+	TInt ret = 0;
+	CSdpAttrValueInt* avi = 0;
+	avi = CSdpAttrValueInt::NewIntL(tstr);
+	ret = avi->Int();
+	delete avi;
+	avi = 0;
+	__ASSERT_DEBUG(ret==-1, User::Panic(_L("Bad4ByteIntConversion"), KErrGeneral));
+	tstr.SetLength(2);
+	avi = CSdpAttrValueInt::NewIntL(tstr);
+	ret = avi->Int();
+	delete avi;
+	avi = 0;
+	__ASSERT_DEBUG(ret==-1, User::Panic(_L("Bad2ByteIntConversion"), KErrGeneral));
+	//tstr[0] = 0x0e;
+	tstr.SetLength(1);
+	avi = CSdpAttrValueInt::NewIntL(tstr);
+	ret = avi->Int();
+	delete avi;
+	avi = 0;
+	__ASSERT_DEBUG(ret==-1, User::Panic(_L("BadByteIntConversion"), KErrGeneral));
+
+	(void)(ret != 0); // keep compiler happy by referencing ret as an r-value in urel
+
+	return;
+	}
+
+void RunAppL()
+	{
+//	TInt ret;
+	test.Title();
+	test.Start(_L("Running SDP server tests"));
+// For some reason, you have to do the following to
+// ensure that the file server behaves properly.
+	RFs fs;
+	(void)fs.Connect();
+	fs.Close();
+//	TUid uid;
+//	uid.iUid = 0x00ce;
+//	User::SetIdentity(uid);
+// Run through tests
+	IntConversionTest();
+	FOREVER
+		{
+		Test1();
+//		uid = User::Identity();
+		test.Printf(_L("Press 'T' to retry.\r\n"));
+		TInt c = test.Getch();
+		if(c!='t'&&c!='T')break;
+		}
+
+
+	test.Printf(_L("Finished! Press any key...\r\n"));
+	test.Getch();
+	test.End();
+	}
+
+
+TInt E32Main()
+	{
+	//__BREAKPOINT();
+	test.SetLogged(ETrue);
+	test.Title();
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup=CTrapCleanup::New();
+	TRAPD(error,RunAppL()); // Run the App
+	test.Printf(_L("RunAppL left with result: %d"), error);
+	delete cleanup;
+	__UHEAP_MARKEND;
+	test.Close();
+	return KErrNone;
+	}