bluetooth/btexample/example/btproperties/BTProperties.cpp
changeset 0 29b1cd4cb562
child 22 786b94c6f0a4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btexample/example/btproperties/BTProperties.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,180 @@
+// 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:
+//
+
+#include <e32base.h>
+#include <e32std.h>
+#include <e32test.h>
+#include <bt_subscribe.h>
+#include <bt_sock.h>
+#include "BTProperties.h"
+
+_LIT(KNumLinks, "Number of links:");
+_LIT(KConnecting, "Connecting...");
+_LIT(KRegistry, "Registry changed.");
+_LIT(KLimited, "Limited discoverable:");
+_LIT(KScanning, "Scans:"); // could resolve this into discoverable/connectable
+_LIT(KDeviceClass, "DeviceClass:");
+_LIT(KDeviceName, "DeviceName:");
+_LIT(KCorruptRegistry, "Registry reset at this point:");
+_LIT(KDiscovering, "Discovering...");
+
+GLDEF_D RTest test(_L("Bluetooth P&S Subscription Tests"));
+
+void ShowAddress()
+/**
+	Shows the example of using a synchronous Get to retrieve local BTAddr
+
+*/
+	{
+	RProperty property;
+	TBuf8<6> addr;
+
+	TInt err = property.Get(KPropertyUidBluetoothCategory,
+					KPropertyKeyBluetoothGetLocalDeviceAddress, addr);
+
+	if (err)
+		test.Printf(_L("P&S: ERROR retrieving local address\n"));
+	else
+		{
+		TBTDevAddr localAddress(addr);
+		TBuf<20> dispBuf;
+		localAddress.GetReadable(dispBuf);
+		test.Printf(_L("Local address = 0x%S\n"),&dispBuf);
+		}
+	}
+
+void TestL()
+	{
+	// first do a sync test
+	ShowAddress();
+
+	RPointerArray<CSubscriber> subscribers;
+
+	//ignoring errors!
+	subscribers.Append(CSubscriber::NewL(test, KPropertyKeyBluetoothGetPHYCount, KNumLinks));
+	subscribers.Append(CSubscriber::NewL(test, KPropertyKeyBluetoothGetRegistryTableChange, KRegistry));
+	subscribers.Append(CSubscriber::NewL(test, KPropertyKeyBluetoothGetConnectingStatus, KConnecting));
+	subscribers.Append(CSubscriber::NewL(test, KPropertyKeyBluetoothGetScanningStatus, KScanning));
+	subscribers.Append(CSubscriber::NewL(test, KPropertyKeyBluetoothGetLimitedDiscoverableStatus, KLimited));
+	subscribers.Append(CSubscriber::NewL(test, KPropertyKeyBluetoothGetDeviceClass, KDeviceClass));
+	subscribers.Append(CSubscriber::NewL(test, KPropertyKeyBluetoothGetCorruptRegistryResetIndication, KCorruptRegistry));
+	subscribers.Append(CDeviceNameSubscriber::NewL(test, KPropertyKeyBluetoothGetDeviceName, KDeviceName));
+ 	subscribers.Append(CSubscriber::NewL(test, KPropertyKeyBluetoothHostResolverActive, KDiscovering));
+
+	test.Printf(_L("%d Subscribers\n"), subscribers.Count());
+
+	for (TInt i=0; i<subscribers.Count(); i++)
+		subscribers[i]->Start();
+
+	CActiveScheduler::Start();
+	subscribers.ResetAndDestroy();
+	}
+
+
+CSubscriber* CSubscriber::NewL(RTest& aTest, TUint aKey, const TDesC& aString)
+	{
+	CSubscriber* s = new(ELeave) CSubscriber(aTest, aString);
+	CleanupStack::PushL(s);
+	s->ConstructL(aKey);
+	CleanupStack::Pop(s);
+	return s;
+	}
+
+CSubscriber::CSubscriber(RTest& aTest, const TDesC& aString)
+: CActive(EPriorityStandard), iTest(aTest), iString(aString)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CSubscriber::~CSubscriber()
+	{
+	Cancel();
+	}
+
+void CSubscriber::ConstructL(TUint aKey)
+	{
+	User::LeaveIfError(iProperty.Attach(KPropertyUidBluetoothCategory, aKey));
+	}
+
+void CSubscriber::Start()
+	{
+	iProperty.Subscribe(iStatus);
+	SetActive();
+	}
+
+void CSubscriber::RunL()
+	{
+	Start();
+	TInt val;
+	iProperty.Get(val);
+
+	iTest.Printf(_L("%S = %d\n"), &iString, val);
+	}
+
+void CSubscriber::DoCancel()
+	{
+	iProperty.Cancel();
+	}
+
+/*************************************************************************/
+//
+// CDeviceNameSubscriber Implementation
+// 
+CDeviceNameSubscriber* CDeviceNameSubscriber::NewL(RTest& aTest, TUint aKey, const TDesC& aString)
+	{
+	CDeviceNameSubscriber* s = new(ELeave) CDeviceNameSubscriber(aTest, aString);
+	CleanupStack::PushL(s);
+	s->ConstructL(aKey);
+	CleanupStack::Pop(s);
+	return s;
+	}
+
+CDeviceNameSubscriber::CDeviceNameSubscriber(RTest& aTest, const TDesC& aString)
+: CSubscriber(aTest,aString)
+	{
+	}
+
+CDeviceNameSubscriber::~CDeviceNameSubscriber()
+	{
+	// No need to cancel since it's done in the base class
+	}
+
+void CDeviceNameSubscriber::RunL()
+	{
+	Start();
+	
+	TBuf16<KHCILocalDeviceNameMaxLength> val;
+	iProperty.Get(val);
+
+	iTest.Printf(_L("%S = %S\n"), &iString, &val);
+	}
+
+
+TInt E32Main()
+	{
+	CTrapCleanup* cleanupStack=CTrapCleanup::New();
+	CActiveScheduler::Install(new CActiveScheduler);
+
+	TRAPD(err,TestL());	//	Ignore err
+
+	if (err != KErrNone)
+		{
+		test.Printf(_L("Error %d"), err);
+		test.Getch();
+		}
+
+	delete cleanupStack;
+	return err;
+	}