[Ble] Add getService method.
authorLukasz Bardeli <l.bardeli@samsung.com>
Mon, 11 May 2015 12:57:12 +0000 (14:57 +0200)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Mon, 11 May 2015 13:25:04 +0000 (22:25 +0900)
[Verification] Code compiles without errors.

Change-Id: Ia3e230f6f5c6c772aa833d8db6d1f32002e502da
Signed-off-by: Lukasz Bardeli <l.bardeli@samsung.com>
src/bluetooth/bluetooth_api.js
src/bluetooth/bluetooth_instance.cc
src/bluetooth/bluetooth_instance.h
src/bluetooth/bluetooth_le_device.cc
src/bluetooth/bluetooth_le_device.h

index 4bf1a2f..8376294 100644 (file)
@@ -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() {
index 3f05cd9..d5bde2b 100644 (file)
@@ -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;
index c26b83e..e163b33 100644 (file)
@@ -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
index 0596821..655b49e 100644 (file)
@@ -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<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(
@@ -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());
index 2a1a8ac..fe5362e 100644 (file)
 
 #include <bluetooth.h>
 
+#include <set>
 #include <unordered_map>
 
+#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<std::string, double> connecting_;
   bool is_listener_set_;
+  std::set<std::string> is_connected_;
 };
 
 }  // namespace bluetooth