1/*
2 * Copyright 2008 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5
6#include <stdio.h>
7#include <stdlib.h>
8
9#include <bluetooth/bdaddrUtils.h>
10#include <bluetooth/LocalDevice.h>
11
12#include <bluetooth/DeviceClass.h>
13#include <bluetooth/DiscoveryAgent.h>
14#include <bluetooth/DiscoveryListener.h>
15
16thread_id mainThread;
17
18class SimpleDiscoveryListener : public DiscoveryListener {
19
20public:
21
22SimpleDiscoveryListener()
23	: DiscoveryListener()
24{
25
26}
27
28
29void
30DeviceDiscovered(RemoteDevice* btDevice, DeviceClass cod)
31{
32	BString classString;
33
34	printf("\t%s: Device %s discovered.\n",__FUNCTION__,
35		bdaddrUtils::ToString(btDevice->GetBluetoothAddress()));
36
37	cod.GetServiceClass(classString);
38	classString << " |";
39	cod.GetMajorDeviceClass(classString);
40	classString << " |";
41	cod.GetMinorDeviceClass(classString);
42
43	printf("\t\t%s: \n", classString.String());
44}
45
46
47void
48InquiryCompleted(int discType)
49{
50	printf("\t%s: Inquiry process has finished ...\n",__FUNCTION__);
51	(void)send_data(mainThread, discType, NULL, 0);
52}
53
54
55void
56InquiryStarted(status_t status)
57{
58	printf("\t%s: Inquiry process has started ...\n",__FUNCTION__);
59}
60
61
62};
63
64
65void
66DumpInfo(LocalDevice* device)
67{
68	DiscoveryAgent* dAgent = device->GetDiscoveryAgent();
69
70	if (dAgent == NULL) {
71		printf("DiscoveryAgent could not be located\n");
72		return;
73	}
74
75	printf("Discovering for  [LocalDevice] %s\t%s\n\n",
76		(device->GetFriendlyName()).String(),
77		bdaddrUtils::ToString(device->GetBluetoothAddress()));
78
79	SimpleDiscoveryListener* dListener = new SimpleDiscoveryListener();
80
81	dAgent->StartInquiry(BT_GIAC, dListener);
82
83	thread_id sender;
84	(void)receive_data(&sender, NULL, 0);
85
86	printf("Retrieving names ...\n");
87
88	for (int32 index = 0 ; index < dAgent->RetrieveDevices(0).CountItems(); index++ ) {
89
90		RemoteDevice* rDevice = dAgent->RetrieveDevices(0).ItemAt(index);
91		printf("\t%s \t@ %s ...\n", rDevice->GetFriendlyName(true).String(),
92			bdaddrUtils::ToString(rDevice->GetBluetoothAddress()));
93
94    }
95
96}
97
98
99static status_t
100LocalDeviceError(status_t status)
101{
102    fprintf(stderr,"No Device/s found");
103
104    return status;
105}
106
107
108int
109main(int argc, char *argv[])
110{
111	mainThread = find_thread(NULL);
112
113	if (argc == 2) {
114		// device specified
115		LocalDevice* device = LocalDevice::GetLocalDevice(atoi(argv[0]));
116		if (device == NULL)
117			return LocalDeviceError(ENODEV);
118
119		DumpInfo(device);
120
121	} else if (argc == 1) {
122		// show all devices
123		LocalDevice* device = NULL;
124
125		printf("Performing discovery for %ld Bluetooth Local Devices ...\n",
126			LocalDevice::GetLocalDeviceCount());
127
128		for (uint32 index = 0 ; index < LocalDevice::GetLocalDeviceCount() ; index++) {
129
130			device = LocalDevice::GetLocalDevice();
131			if (device == NULL) {
132				LocalDeviceError(ENODEV);
133				continue;
134			}
135			DumpInfo(device);
136
137		}
138
139		return B_OK;
140
141	} else {
142		fprintf(stderr,"Usage: bt_dev_info [device]\n");
143		return B_ERROR;
144	}
145}
146