Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(270)

Unified Diff: device/bluetooth/bluetooth_low_energy_win_fake.cc

Issue 1676073002: Implement BluetoothLowEnergyWrapperFake for Bluetooth test fixture (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: device/bluetooth/bluetooth_low_energy_win_fake.cc
diff --git a/device/bluetooth/bluetooth_low_energy_win_fake.cc b/device/bluetooth/bluetooth_low_energy_win_fake.cc
index d1ef1df5148e3d248fe2b29ba8e0337248f6b25a..5e76becaf8fbabf9dcfe1ae85a81096ae9be9f51 100644
--- a/device/bluetooth/bluetooth_low_energy_win_fake.cc
+++ b/device/bluetooth/bluetooth_low_energy_win_fake.cc
@@ -4,6 +4,13 @@
#include "device/bluetooth/bluetooth_low_energy_win_fake.h"
+#include "base/strings/stringprintf.h"
+
+namespace {
+const char kPlatformNotSupported[] =
+ "Bluetooth Low energy is only supported on Windows 8 and later.";
+} // namespace
+
namespace device {
namespace win {
@@ -13,24 +20,207 @@ BluetoothLowEnergyWrapperFake::~BluetoothLowEnergyWrapperFake() {}
bool BluetoothLowEnergyWrapperFake::EnumerateKnownBluetoothLowEnergyDevices(
ScopedVector<BluetoothLowEnergyDeviceInfo>* devices,
std::string* error) {
- NOTIMPLEMENTED();
- return false;
+ if (!IsBluetoothLowEnergySupported()) {
+ *error = kPlatformNotSupported;
+ return false;
+ }
+
+ for (auto device : simulated_devices_) {
+ BluetoothLowEnergyDeviceInfo* device_info =
+ new BluetoothLowEnergyDeviceInfo();
+ *device_info = *(device.second->device_info);
+ devices->push_back(device_info);
+ }
+ return true;
}
bool BluetoothLowEnergyWrapperFake::
EnumerateKnownBluetoothLowEnergyGattServiceDevices(
ScopedVector<BluetoothLowEnergyDeviceInfo>* devices,
std::string* error) {
- NOTIMPLEMENTED();
- return false;
+ if (!IsBluetoothLowEnergySupported()) {
+ *error = kPlatformNotSupported;
+ return false;
+ }
+
+ for (auto device : simulated_devices_) {
+ for (auto service : device.second->primary_services) {
+ BluetoothLowEnergyDeviceInfo* device_info =
+ new BluetoothLowEnergyDeviceInfo();
+ *device_info = *(device.second->device_info);
+ base::string16 path = GenerateBLEGattServiceDevicePath(
+ device.second->device_info->path.value(),
+ service.second->service_info->AttributeHandle);
+ device_info->path = base::FilePath(path);
+ devices->push_back(device_info);
+ }
+ }
+ return true;
}
bool BluetoothLowEnergyWrapperFake::EnumerateKnownBluetoothLowEnergyServices(
const base::FilePath& device_path,
ScopedVector<BluetoothLowEnergyServiceInfo>* services,
std::string* error) {
- NOTIMPLEMENTED();
- return false;
+ if (!IsBluetoothLowEnergySupported()) {
+ *error = kPlatformNotSupported;
+ return false;
+ }
+
+ base::string16 device_address =
+ ExtractDeviceAddressFromDevicePath(device_path.value());
+ base::string16 service_attribute_handle =
+ ExtractServiceAttributeHandleFromDevicePath(device_path.value());
+
+ BLEDevicesMap::iterator it_d = simulated_devices_.find(
+ std::string(device_address.begin(), device_address.end()));
+ CHECK(it_d != simulated_devices_.end());
+
+ // |service_attribute_handle| is empty means |device_path| is a BLE device
+ // path, otherwise it is a BLE Gatt service device path.
+ if (service_attribute_handle.empty()) {
+ // Return all primary services for BLE device.
+ for (auto primary_service : it_d->second->primary_services) {
+ BluetoothLowEnergyServiceInfo* service_info =
+ new BluetoothLowEnergyServiceInfo();
+ service_info->uuid = primary_service.second->service_info->ServiceUuid;
+ service_info->attribute_handle =
+ primary_service.second->service_info->AttributeHandle;
+ services->push_back(service_info);
+ }
+ } else {
+ // Return correspond Gatt service for BLE Gatt service device.
scheib 2016/02/08 20:23:00 ...corresponding GATT service for BLE GATT...
gogerald1 2016/02/08 22:20:38 Done.
+ BLEGattServicesMap::iterator it_s =
+ it_d->second->primary_services.find(std::string(
+ service_attribute_handle.begin(), service_attribute_handle.end()));
+ CHECK(it_s != it_d->second->primary_services.end());
+ BluetoothLowEnergyServiceInfo* service_info =
+ new BluetoothLowEnergyServiceInfo();
+ service_info->uuid = it_s->second->service_info->ServiceUuid;
+ service_info->attribute_handle =
+ it_s->second->service_info->AttributeHandle;
+ services->push_back(service_info);
+ }
+
+ return true;
+}
+
+BLEDevice* BluetoothLowEnergyWrapperFake::SimulateBLEDevice(
+ std::string device_name,
+ BLUETOOTH_ADDRESS device_address) {
+ BLEDevice* device = new BLEDevice();
+ BluetoothLowEnergyDeviceInfo* device_info =
+ new BluetoothLowEnergyDeviceInfo();
+ std::string string_device_address =
+ BluetoothAddressToCanonicalString(device_address);
+ device_info->path =
+ base::FilePath(GenerateBLEDevicePath(string_device_address));
+ device_info->friendly_name = device_name;
+ device_info->address = device_address;
+ device->device_info.reset(device_info);
+ simulated_devices_.set(string_device_address, scoped_ptr<BLEDevice>(device));
+ return device;
+}
+
+BLEGattService* BluetoothLowEnergyWrapperFake::SimulateBLEGattService(
+ BLEDevice* device,
+ std::string uuid) {
+ CHECK(device);
+
+ BLEGattService* service = new BLEGattService();
+ PBTH_LE_GATT_SERVICE service_info = new BTH_LE_GATT_SERVICE[1];
+ std::string string_device_address =
+ BluetoothAddressToCanonicalString(device->device_info->address);
+ service_info->AttributeHandle =
+ GenerateAUniqueAttributeHandle(string_device_address);
+ service_info->ServiceUuid = CanonicalStringToBTH_LE_UUID(uuid);
+ service->service_info.reset(service_info);
+ device->primary_services.set(std::to_string(service_info->AttributeHandle),
+ scoped_ptr<BLEGattService>(service));
+ return service;
+}
+
+USHORT BluetoothLowEnergyWrapperFake::GenerateAUniqueAttributeHandle(
+ std::string device_address) {
+ BLEAttributeHandleTable::iterator it =
+ attribute_handle_table_.find(device_address);
+ if (it != attribute_handle_table_.end()) {
+ USHORT max_attribute_handle = *(it->second->rbegin());
scheib 2016/02/08 20:23:00 Oh, then let's not use it, looking at it I see Sco
gogerald1 2016/02/08 22:20:38 Done. Do not notice this deprecation.
+ if (max_attribute_handle < 0xFFFF) {
+ USHORT new_attribute_handle = max_attribute_handle + 1;
+ it->second->insert(new_attribute_handle);
+ return new_attribute_handle;
+ } else {
+ USHORT i = 1;
+ for (; i < 0xFFFF; i++) {
+ if (it->second->find(i) == it->second->end())
+ break;
+ }
+ if (i >= 0xFFFF)
+ return 0;
+ it->second->insert(i);
+ return i;
+ }
+ }
+
+ USHORT smallest_att_handle = 1;
+ std::set<USHORT>* new_set = new std::set<USHORT>();
+ new_set->insert(smallest_att_handle);
+ attribute_handle_table_.set(device_address,
+ scoped_ptr<std::set<USHORT>>(new_set));
+ return smallest_att_handle;
+}
+
+base::string16 BluetoothLowEnergyWrapperFake::GenerateBLEDevicePath(
+ std::string device_address) {
+ return base::string16(device_address.begin(), device_address.end());
+}
+
+base::string16 BluetoothLowEnergyWrapperFake::GenerateBLEGattServiceDevicePath(
+ base::string16 resident_device_path,
+ USHORT service_attribute_handle) {
+ return resident_device_path + L"/" +
+ std::to_wstring(service_attribute_handle);
+}
+
+base::string16
+BluetoothLowEnergyWrapperFake::ExtractDeviceAddressFromDevicePath(
+ base::string16 path) {
+ std::size_t found = path.find('/');
+ if (found != base::string16::npos) {
+ return path.substr(0, found - 1);
+ }
+ return path;
+}
+
+base::string16
+BluetoothLowEnergyWrapperFake::ExtractServiceAttributeHandleFromDevicePath(
+ base::string16 path) {
+ std::size_t found = path.find('/');
+ if (found == base::string16::npos)
+ return base::string16();
+ return path.substr(found + 1);
+}
+
+BTH_LE_UUID BluetoothLowEnergyWrapperFake::CanonicalStringToBTH_LE_UUID(
+ std::string uuid) {
+ BTH_LE_UUID win_uuid;
+ // Only short UUIDs (4 hex digits) have beened used in BluetoothTest right
+ // now. Need fix after using long UUIDs.
+ win_uuid.IsShortUuid = true;
+ unsigned int data[1];
+ int result = sscanf_s(uuid.c_str(), "%04x", &data[0]);
+ CHECK(result == 1);
+ win_uuid.Value.ShortUuid = data[0];
+ return win_uuid;
+}
+
+std::string BluetoothLowEnergyWrapperFake::BluetoothAddressToCanonicalString(
+ const BLUETOOTH_ADDRESS& btha) {
+ std::string result = base::StringPrintf(
+ "%02X:%02X:%02X:%02X:%02X:%02X", btha.rgBytes[5], btha.rgBytes[4],
+ btha.rgBytes[3], btha.rgBytes[2], btha.rgBytes[1], btha.rgBytes[0]);
+ return result;
}
} // namespace win

Powered by Google App Engine
This is Rietveld 408576698