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() {
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;
using common::ErrorCode;
using common::PlatformResult;
+using common::tools::ReportError;
using common::tools::ReportSuccess;
namespace extension {
}
-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) {
void BluetoothLEDevice::GetService(const picojson::value& data,
picojson::object& out) {
LoggerD("Entered");
+
+ const auto& args = util::GetArguments(data);
+
+ const auto& address = common::FromJson<std::string>(args, "address");
+ const auto& uuid = common::FromJson<std::string>(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<picojson::object>();
+
+ PlatformResult result = service_.GetSpecifiedGATTService(address, uuid,
+ data_obj);
+
+ if (result.IsError()) {
+ ReportError(result, &out);
+ } else {
+ ReportSuccess(response, out);
+ }
}
void BluetoothLEDevice::AddConnectStateChangeListener(
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());
#include <bluetooth.h>
+#include <set>
#include <unordered_map>
+#include "bluetooth/bluetooth_gatt_service.h"
+
#include "common/picojson.h"
#include "common/platform_result.h"
class BluetoothLEDevice {
public:
- explicit BluetoothLEDevice(BluetoothInstance& instance);
+ explicit BluetoothLEDevice(BluetoothInstance& instance, BluetoothGATTService& service);
~BluetoothLEDevice();
void Connect(const picojson::value& data, picojson::object& out);
const char *remote_address, void *user_data);
BluetoothInstance& instance_;
+ BluetoothGATTService& service_;
std::unordered_map<std::string, double> connecting_;
bool is_listener_set_;
+ std::set<std::string> is_connected_;
};
} // namespace bluetooth