[BLE] add addConnectStateChangeListener and removeConnectStateChangeListener methods.
authorLukasz Bardeli <l.bardeli@samsung.com>
Mon, 11 May 2015 08:58:57 +0000 (10:58 +0200)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Mon, 11 May 2015 10:00:27 +0000 (19:00 +0900)
[Verification] Code compiles without errors

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

index ba97617ea47791a0ed4854bbd3ce564db08004c9..716393f0049ff3e4e75757bb88e5ef105afcdb67 100644 (file)
@@ -660,15 +660,38 @@ BluetoothLEDevice.prototype.getService = function() {
 BluetoothLEDevice.prototype.addConnectStateChangeListener = function() {
     console.log('Entered BluetoothLEDevice.addConnectStateChangeListener()');
 
-    //TODO validate
-    //TODO call c++ layer
+    var args = AV.validateMethod(arguments, [
+        {
+            name: 'listener',
+            type: AV.Types.LISTENER,
+            values: ['onconnected', 'ondisconnected']
+        }
+    ]);
+
+    var that = this;
+
+    var func = function(event) {
+        if (event.address === that.address && args.listener[event.action]) {
+            args.listener[event.action](that);
+        }
+    }
+
+    var watchId = _bleConnectChangeListener.addListener(func);
+
+    return watchId;
 };
 
 BluetoothLEDevice.prototype.removeConnectStateChangeListener = function() {
     console.log('Entered BluetoothLEDevice.removeConnectStateChangeListener()');
 
-    //TODO validate
-    //TODO call c++ layer
+    var args = AV.validateMethod(arguments, [
+        {
+            name: 'watchID',
+            type: AV.Types.LONG
+        }
+    ]);
+
+    _bleConnectChangeListener.removeListener(args.watchID);
 };
 
 // class BluetoothDevice ////////////////////////////////////////////////////
@@ -1743,6 +1766,15 @@ var _bluetoothGATTCharacteristicListener = _multipleListenerBuilder(
     'BluetoothGATTCharacteristic_removeValueChangeListener'
 );
 
+var _bleConnectChangeListener = _multipleListenerBuilder(
+    'BluetoothLEConnectChangeCallback',
+    function(listener, event) {
+        listener(event);
+    },
+    'BluetoothLEDevice_addConnectStateChangeListener',
+    'BluetoothLEDevice_removeConnectStateChangeListener'
+);
+
 BluetoothGATTCharacteristic.prototype.addValueChangeListener = function() {
   console.log('Entered BluetoothGATTCharacteristic.addValueChangeListener()');
 
index 271a3ceb165c701ce6af5cb258095dd43a09d9b9..0596821b2e588c599c4b78cf8ef05edcfc788a74 100644 (file)
@@ -43,11 +43,17 @@ const std::string kServiceUuids = "serviceuuids";
 const std::string kManufacturerData = "manufacturerData";
 const std::string kId = "id";
 const std::string kData = "data";
+const std::string kAction = "action";
+
+const std::string kOnConnected = "onconnected";
+const std::string kOnDisconnected = "ondisconnected";
+const std::string kConnectChangeEvent = "BluetoothLEConnectChangeCallback";
 
 }
 
 BluetoothLEDevice::BluetoothLEDevice(BluetoothInstance& instance)
-    : instance_(instance) {
+    : instance_(instance),
+      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) {
     LoggerE("Can't add connection state listener: %d", ret);
@@ -339,11 +345,19 @@ void BluetoothLEDevice::GetService(const picojson::value& data,
 void BluetoothLEDevice::AddConnectStateChangeListener(
     const picojson::value& data, picojson::object& out) {
   LoggerD("Entered");
+
+  is_listener_set_ = true;
+
+  ReportSuccess(out);
 }
 
 void BluetoothLEDevice::RemoveConnectStateChangeListener(
     const picojson::value& data, picojson::object& out) {
   LoggerD("Entered");
+
+  is_listener_set_ = false;
+
+  ReportSuccess(out);
 }
 
 void BluetoothLEDevice::GattConnectionState(int result, bool connected,
@@ -357,6 +371,25 @@ void BluetoothLEDevice::GattConnectionState(int result, bool connected,
     return;
   }
 
+  if (le_device->is_listener_set_) {
+
+    picojson::value value = picojson::value(picojson::object());
+    picojson::object* data_obj = &value.get<picojson::object>();
+    if (connected) {
+      LoggerD("OnConnected");
+      data_obj->insert(std::make_pair(kAction, picojson::value(kOnConnected)));
+    } else {
+      LoggerD("OnDisconnected");
+      data_obj->insert(
+          std::make_pair(kAction, picojson::value(kOnDisconnected)));
+    }
+
+    data_obj->insert(
+        std::make_pair(kDeviceAddress, picojson::value(remote_address)));
+
+    le_device->instance_.FireEvent(kConnectChangeEvent, value);
+  }
+
   auto it = le_device->connecting_.find(remote_address);
   if (le_device->connecting_.end() == it) {
     LoggerW("Given address is not in waiting connections list");
index b8100842a716dd5a7e82ce330a0cfe8209ba708b..2a1a8ac67289ef2c504075cbcc082195531052a3 100644 (file)
@@ -54,6 +54,7 @@ class BluetoothLEDevice {
 
   BluetoothInstance& instance_;
   std::unordered_map<std::string, double> connecting_;
+  bool is_listener_set_;
 };
 
 }  // namespace bluetooth