From 7862a764d05d5f12576b994186397a580bd0d12d Mon Sep 17 00:00:00 2001 From: Lukasz Bardeli Date: Mon, 11 May 2015 14:57:12 +0200 Subject: [PATCH] [Ble] Add getService method. [Verification] Code compiles without errors. Change-Id: Ia3e230f6f5c6c772aa833d8db6d1f32002e502da Signed-off-by: Lukasz Bardeli --- src/bluetooth/bluetooth_api.js | 22 +++++++++++++-- src/bluetooth/bluetooth_instance.cc | 4 +-- src/bluetooth/bluetooth_instance.h | 2 +- src/bluetooth/bluetooth_le_device.cc | 40 +++++++++++++++++++++++++++- src/bluetooth/bluetooth_le_device.h | 7 ++++- 5 files changed, 68 insertions(+), 7 deletions(-) diff --git a/src/bluetooth/bluetooth_api.js b/src/bluetooth/bluetooth_api.js index 4bf1a2fd..8376294c 100644 --- a/src/bluetooth/bluetooth_api.js +++ b/src/bluetooth/bluetooth_api.js @@ -653,8 +653,26 @@ BluetoothLEDevice.prototype.getService = function() { console.log('Entered BluetoothLEDevice.getService()'); xwalk.utils.checkPrivilegeAccess(Privilege.BLUETOOTH); - //TODO validate - //TODO call c++ layer + + var args = AV.validateMethod(arguments, [ + { + name: 'uuid', + type: AV.Types.STRING + } + ]); + + var callArgs = { + uuid : args.uuid, + address : this.address + }; + + var result = native.callSync('BluetoothLEDevice_getService', callArgs); + + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } else { + return BluetoothGATTService(native.getResultObject(result)); + } }; BluetoothLEDevice.prototype.addConnectStateChangeListener = function() { diff --git a/src/bluetooth/bluetooth_instance.cc b/src/bluetooth/bluetooth_instance.cc index 3f05cd91..d5bde2ba 100644 --- a/src/bluetooth/bluetooth_instance.cc +++ b/src/bluetooth/bluetooth_instance.cc @@ -22,8 +22,8 @@ BluetoothInstance::BluetoothInstance() : bluetooth_service_handler_(bluetooth_adapter_), bluetooth_socket_(bluetooth_adapter_), bluetooth_le_adapter_(*this), - bluetooth_le_device_(*this), - bluetooth_gatt_service_(*this) + bluetooth_gatt_service_(*this), + bluetooth_le_device_(*this, bluetooth_gatt_service_) { LoggerD("Entered"); using std::placeholders::_1; diff --git a/src/bluetooth/bluetooth_instance.h b/src/bluetooth/bluetooth_instance.h index c26b83eb..e163b33e 100644 --- a/src/bluetooth/bluetooth_instance.h +++ b/src/bluetooth/bluetooth_instance.h @@ -44,8 +44,8 @@ class BluetoothInstance: public common::ParsedInstance { BluetoothServiceHandler bluetooth_service_handler_; BluetoothSocket bluetooth_socket_; BluetoothLEAdapter bluetooth_le_adapter_; - BluetoothLEDevice bluetooth_le_device_; BluetoothGATTService bluetooth_gatt_service_; + BluetoothLEDevice bluetooth_le_device_; }; } // namespace bluetooth diff --git a/src/bluetooth/bluetooth_le_device.cc b/src/bluetooth/bluetooth_le_device.cc index 0596821b..655b49e6 100644 --- a/src/bluetooth/bluetooth_le_device.cc +++ b/src/bluetooth/bluetooth_le_device.cc @@ -25,6 +25,7 @@ using common::ErrorCode; using common::PlatformResult; +using common::tools::ReportError; using common::tools::ReportSuccess; namespace extension { @@ -51,8 +52,10 @@ const std::string kConnectChangeEvent = "BluetoothLEConnectChangeCallback"; } -BluetoothLEDevice::BluetoothLEDevice(BluetoothInstance& instance) +BluetoothLEDevice::BluetoothLEDevice(BluetoothInstance& instance, + BluetoothGATTService& service) : instance_(instance), + service_(service), is_listener_set_(false) { int ret = bt_gatt_set_connection_state_changed_cb(GattConnectionState, this); if (BT_ERROR_NONE != ret && BT_ERROR_ALREADY_DONE != ret) { @@ -340,6 +343,33 @@ void BluetoothLEDevice::Disconnect(const picojson::value& data, void BluetoothLEDevice::GetService(const picojson::value& data, picojson::object& out) { LoggerD("Entered"); + + const auto& args = util::GetArguments(data); + + const auto& address = common::FromJson(args, "address"); + const auto& uuid = common::FromJson(args, "uuid"); + + auto it = is_connected_.find(address); + if (it == is_connected_.end()) { + LoggerE("Bluetooth low energy device is not connected"); + ReportError( + PlatformResult(ErrorCode::INVALID_STATE_ERR, + "Bluetooth low energy device is not connected"), + &out); + return; + } + + picojson::value response = picojson::value(picojson::object()); + picojson::object *data_obj = &response.get(); + + PlatformResult result = service_.GetSpecifiedGATTService(address, uuid, + data_obj); + + if (result.IsError()) { + ReportError(result, &out); + } else { + ReportSuccess(response, out); + } } void BluetoothLEDevice::AddConnectStateChangeListener( @@ -371,6 +401,14 @@ void BluetoothLEDevice::GattConnectionState(int result, bool connected, return; } + if (connected) { + le_device->is_connected_.insert(remote_address); + } else { + le_device->is_connected_.erase(remote_address); + // inform that this device is not connected anymore + le_device->service_.TryDestroyClient(remote_address); + } + if (le_device->is_listener_set_) { picojson::value value = picojson::value(picojson::object()); diff --git a/src/bluetooth/bluetooth_le_device.h b/src/bluetooth/bluetooth_le_device.h index 2a1a8ac6..fe5362ec 100644 --- a/src/bluetooth/bluetooth_le_device.h +++ b/src/bluetooth/bluetooth_le_device.h @@ -19,8 +19,11 @@ #include +#include #include +#include "bluetooth/bluetooth_gatt_service.h" + #include "common/picojson.h" #include "common/platform_result.h" @@ -31,7 +34,7 @@ class BluetoothInstance; class BluetoothLEDevice { public: - explicit BluetoothLEDevice(BluetoothInstance& instance); + explicit BluetoothLEDevice(BluetoothInstance& instance, BluetoothGATTService& service); ~BluetoothLEDevice(); void Connect(const picojson::value& data, picojson::object& out); @@ -53,8 +56,10 @@ class BluetoothLEDevice { const char *remote_address, void *user_data); BluetoothInstance& instance_; + BluetoothGATTService& service_; std::unordered_map connecting_; bool is_listener_set_; + std::set is_connected_; }; } // namespace bluetooth -- 2.34.1