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)