From: Piotr Kosko
Date: Wed, 17 Feb 2016 09:08:46 +0000 (+0100)
Subject: [Iotcon] Added setConnectionChangeListener
X-Git-Tag: submit/tizen/20160222.104327^2~10
X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3b2d01c60e3c366193199ddecb6e38f2a6b34667;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git
[Iotcon] Added setConnectionChangeListener
[Verification] Code compiles. Checked cleaning handles, but not listener calls.
Change-Id: I890cb53b4f2b8d5ea57617d73277dea2b8508da5
Signed-off-by: Piotr Kosko
---
diff --git a/src/iotcon/iotcon_api.js b/src/iotcon/iotcon_api.js
index 7548ac05..dab068b1 100644
--- a/src/iotcon/iotcon_api.js
+++ b/src/iotcon/iotcon_api.js
@@ -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]);
}
};
diff --git a/src/iotcon/iotcon_instance.cc b/src/iotcon/iotcon_instance.cc
index 8634735a..be20d1e3 100644
--- a/src/iotcon/iotcon_instance.cc
+++ b/src/iotcon/iotcon_instance.cc
@@ -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(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();
+
+ obj.insert(std::make_pair(kId, picojson::value{static_cast(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,
diff --git a/src/iotcon/iotcon_utils.h b/src/iotcon/iotcon_utils.h
index 4decbc5a..280b11e4 100644
--- a/src/iotcon/iotcon_utils.h
+++ b/src/iotcon/iotcon_utils.h
@@ -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)