[Iotcon] Added setConnectionChangeListener
authorPiotr Kosko <p.kosko@samsung.com>
Wed, 17 Feb 2016 09:08:46 +0000 (10:08 +0100)
committerPiotr Kosko <p.kosko@samsung.com>
Thu, 18 Feb 2016 13:40:59 +0000 (14:40 +0100)
[Verification] Code compiles. Checked cleaning handles, but not listener calls.

Change-Id: I890cb53b4f2b8d5ea57617d73277dea2b8508da5
Signed-off-by: Piotr Kosko <p.kosko@samsung.com>
src/iotcon/iotcon_api.js
src/iotcon/iotcon_instance.cc
src/iotcon/iotcon_utils.h

index 7548ac050288a23ab0a8ffd1cc310a5795b57ba8..dab068b17fe65666525923e7aaeaf422e93b063d 100644 (file)
@@ -840,21 +840,12 @@ RemoteResource.prototype.setConnectionChangeListener = function() {
   var args = validator.validateMethod(arguments, [{
     name: 'successCallback',
     type: types.FUNCTION
-  }, {
-    name: 'errorCallback',
-    type: types.FUNCTION,
-    optional: true,
-    nullable: true
   }]);
 
   var callArgs = prepareResourceInfo(this);
 
   var listener = function(result) {
-    if (native.isFailure(result)) {
-      native.callIfPossible(args.errorCallback, native.getErrorObject(result));
-    } else {
-      args.successCallback(native.getResultObject(result));
-    }
+    args.successCallback(result.data);
   };
 
   var result = native.callSync('IotconRemoteResource_setConnectionChangeListener', callArgs);
@@ -862,6 +853,7 @@ RemoteResource.prototype.setConnectionChangeListener = function() {
   if (native.isFailure(result)) {
     throw native.getErrorObject(result);
   } else {
+    manageId(this, native.getResultObject(result));
     connectionChangeListener.addListener(this[kIdKey], listener);
   }
 };
@@ -874,6 +866,7 @@ RemoteResource.prototype.unsetConnectionChangeListener = function() {
   if (native.isFailure(result)) {
     throw native.getErrorObject(result);
   } else {
+    manageId(this, native.getResultObject(result));
     connectionChangeListener.removeListener(this[kIdKey]);
   }
 };
index 8634735aa7aead67c433d72893aab267a101f963..be20d1e3d6007cfe46b16b4f24150e49f8bca7eb 100644 (file)
@@ -43,6 +43,8 @@ long long GetId(const picojson::object& args) {
 const common::ListenerToken kResourceRequestListenerToken{"ResourceRequestListener"};
 const common::ListenerToken kFindResourceListenerToken{"FindResourceListener"};
 const common::ListenerToken kPresenceEventListenerToken{"PresenceEventListener"};
+const common::ListenerToken kRemoteResourceConnectionChangeListener
+                                {"RemoteResourceConnectionChangeListener"};
 
 const std::string kObserverIds = "observerIds";
 const std::string kQos = "qos";
@@ -580,14 +582,56 @@ common::TizenResult IotconInstance::RemoteResourceStopCaching(const picojson::ob
   return common::TizenSuccess{IotconClientManager::GetInstance().RemoveRemoteResource(ptr)};
 }
 
+static void MonitoringCallback(iotcon_remote_resource_h resource,
+                                 iotcon_remote_resource_state_e state, void *user_data) {
+  ScopeLogger();
+  FoundRemoteInfo* ptr = static_cast<FoundRemoteInfo*>(user_data);
+  if (ptr->connection_listener) {
+    picojson::value json_result = picojson::value(IOTCON_REMOTE_RESOURCE_ALIVE == state);
+    ptr->connection_listener(common::TizenSuccess(), json_result);
+  } else {
+    LoggerD("Post function not present, just ignoring");
+  }
+}
+
 common::TizenResult IotconInstance::RemoteResourceSetConnectionChangeListener(const picojson::object& args) {
   ScopeLogger();
-  return common::UnknownError("Not implemented");
+  FoundRemoteInfoPtr ptr;
+  auto result = IotconUtils::RemoteResourceFromJson(args, &ptr);
+  if (!result) {
+    LogAndReturnTizenError(result, ("Failed to create remote resource handle"));
+  }
+  result = IotconUtils::ConvertIotconError(
+      iotcon_remote_resource_start_monitoring(ptr->handle, MonitoringCallback, ptr.get()));
+  if (!result) {
+    return result;
+  }
+  ptr->connection_listener = [this, ptr](const common::TizenResult& res, const picojson::value& v) {
+    picojson::value response{picojson::object{}};
+    auto& obj = response.get<picojson::object>();
+
+    obj.insert(std::make_pair(kId, picojson::value{static_cast<double>(ptr->id)}));
+    obj.insert(std::make_pair("data", v));
+
+    Post(kRemoteResourceConnectionChangeListener, common::TizenSuccess{response});
+  };
+
+  return common::TizenSuccess{IotconClientManager::GetInstance().StoreRemoteResource(ptr)};
 }
 
 common::TizenResult IotconInstance::RemoteResourceUnsetConnectionChangeListener(const picojson::object& args) {
   ScopeLogger();
-  return common::UnknownError("Not implemented");
+  FoundRemoteInfoPtr ptr;
+  auto result = IotconUtils::RemoteResourceFromJson(args, &ptr);
+  if (!result) {
+    LogAndReturnTizenError(result, ("Failed to create remote resource handle"));
+  }
+  result = IotconUtils::ConvertIotconError(iotcon_remote_resource_stop_monitoring(ptr->handle));
+  if (!result) {
+    return result;
+  }
+  ptr->connection_listener = nullptr;
+  return common::TizenSuccess{IotconClientManager::GetInstance().RemoveRemoteResource(ptr)};
 }
 
 void IotconInstance::ResourceFoundCallback(iotcon_remote_resource_h resource,
index 4decbc5a9686525a8db381f237a92e07e54f1160..280b11e4758ad5743833c3f6c3f60632aaa90b41 100644 (file)
@@ -114,6 +114,7 @@ struct FoundRemoteInfo {
   iotcon_remote_resource_h handle;
   short ref_count; // counter for registered listeners for this handle
   //TODO add listeners for each type
+  common::PostCallback connection_listener;
   FoundRemoteInfo() :
     id(0), handle(nullptr), ref_count(1) {} //initialize with 1 (struct is created, so it
                                             //mean that some listener would be created)