160 lines
3.4 KiB
C++
160 lines
3.4 KiB
C++
/*
|
|
* Copyright 2007 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com
|
|
* All rights reserved. Distributed under the terms of the MIT License.
|
|
*/
|
|
|
|
|
|
#include <bluetooth/DiscoveryAgent.h>
|
|
#include <bluetooth/DiscoveryListener.h>
|
|
#include <bluetooth/RemoteDevice.h>
|
|
#include <bluetooth/DeviceClass.h>
|
|
#include <bluetooth/bdaddrUtils.h>
|
|
#include <bluetooth/debug.h>
|
|
|
|
#include <bluetooth/HCI/btHCI_event.h>
|
|
|
|
#include <bluetoothserver_p.h>
|
|
|
|
#include <Message.h>
|
|
|
|
|
|
namespace Bluetooth {
|
|
|
|
|
|
/* hooks */
|
|
void
|
|
DiscoveryListener::DeviceDiscovered(RemoteDevice* btDevice, DeviceClass cod)
|
|
{
|
|
CALLED();
|
|
}
|
|
|
|
|
|
void
|
|
DiscoveryListener::InquiryStarted(status_t status)
|
|
{
|
|
CALLED();
|
|
}
|
|
|
|
|
|
void
|
|
DiscoveryListener::InquiryCompleted(int discType)
|
|
{
|
|
CALLED();
|
|
}
|
|
|
|
|
|
/* private */
|
|
|
|
/* A LocalDevice is always referenced in any request to the
|
|
* Bluetooth server therefore is going to be needed in any
|
|
*/
|
|
void
|
|
DiscoveryListener::SetLocalDeviceOwner(LocalDevice* ld)
|
|
{
|
|
CALLED();
|
|
fLocalDevice = ld;
|
|
}
|
|
|
|
|
|
RemoteDevicesList
|
|
DiscoveryListener::GetRemoteDevicesList(void)
|
|
{
|
|
CALLED();
|
|
return fRemoteDevicesList;
|
|
}
|
|
|
|
|
|
void
|
|
DiscoveryListener::MessageReceived(BMessage* message)
|
|
{
|
|
CALLED();
|
|
int8 status;
|
|
|
|
switch (message->what) {
|
|
case BT_MSG_INQUIRY_DEVICE:
|
|
{
|
|
const struct inquiry_info* inquiryInfo;
|
|
ssize_t size;
|
|
RemoteDevice* rd = NULL;
|
|
bool duplicatedFound = false;
|
|
|
|
// TODO: Loop for all inquiryInfo!
|
|
if (message->FindData("info", B_ANY_TYPE, 0,
|
|
(const void**)&inquiryInfo, &size) == B_OK) {
|
|
// Skip duplicated replies
|
|
for (int32 index = 0 ; index < fRemoteDevicesList.CountItems();
|
|
index++) {
|
|
bdaddr_t b1 = fRemoteDevicesList.ItemAt(index)
|
|
->GetBluetoothAddress();
|
|
|
|
if (bdaddrUtils::Compare(inquiryInfo->bdaddr, b1)) {
|
|
// update these values
|
|
fRemoteDevicesList.ItemAt(index)->fPageRepetitionMode
|
|
= inquiryInfo->pscan_rep_mode;
|
|
fRemoteDevicesList.ItemAt(index)->fScanPeriodMode
|
|
= inquiryInfo->pscan_period_mode;
|
|
fRemoteDevicesList.ItemAt(index)->fScanMode
|
|
= inquiryInfo->pscan_mode;
|
|
fRemoteDevicesList.ItemAt(index)->fClockOffset
|
|
= inquiryInfo->clock_offset;
|
|
|
|
duplicatedFound = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!duplicatedFound) {
|
|
rd = new RemoteDevice(inquiryInfo->bdaddr,
|
|
(uint8*)inquiryInfo->dev_class);
|
|
fRemoteDevicesList.AddItem(rd);
|
|
// keep all inquiry reported data
|
|
rd->SetLocalDeviceOwner(fLocalDevice);
|
|
rd->fPageRepetitionMode = inquiryInfo->pscan_rep_mode;
|
|
rd->fScanPeriodMode = inquiryInfo->pscan_period_mode;
|
|
rd->fScanMode = inquiryInfo->pscan_mode;
|
|
rd->fClockOffset = inquiryInfo->clock_offset;
|
|
|
|
DeviceDiscovered( rd, rd->GetDeviceClass());
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
case BT_MSG_INQUIRY_STARTED:
|
|
if (message->FindInt8("status", &status) == B_OK) {
|
|
fRemoteDevicesList.MakeEmpty();
|
|
InquiryStarted(status);
|
|
}
|
|
break;
|
|
|
|
case BT_MSG_INQUIRY_COMPLETED:
|
|
InquiryCompleted(BT_INQUIRY_COMPLETED);
|
|
break;
|
|
|
|
case BT_MSG_INQUIRY_TERMINATED: /* inquiry was cancelled */
|
|
InquiryCompleted(BT_INQUIRY_TERMINATED);
|
|
break;
|
|
|
|
case BT_MSG_INQUIRY_ERROR:
|
|
InquiryCompleted(BT_INQUIRY_ERROR);
|
|
break;
|
|
|
|
default:
|
|
BLooper::MessageReceived(message);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
DiscoveryListener::DiscoveryListener()
|
|
:
|
|
BLooper(),
|
|
fRemoteDevicesList(BT_MAX_RESPONSES)
|
|
{
|
|
CALLED();
|
|
// TODO: Make a better handling of the running not running state
|
|
Run();
|
|
}
|
|
|
|
} /* end namespace Bluetooth */
|