From: Pawel Andruszkiewicz Date: Fri, 5 Feb 2016 14:47:30 +0000 (+0100) Subject: [iotcon] Create/Get/Delete methods of server. X-Git-Tag: submit/tizen/20160212.103506^2~10 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d687e6dc29a2d09d1615beb69657693b9cab481b;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [iotcon] Create/Get/Delete methods of server. Change-Id: I4fc40f919a69e91823235048c3fa2d1d32d73746 Signed-off-by: Pawel Andruszkiewicz --- diff --git a/src/iotcon/iotcon_api.js b/src/iotcon/iotcon_api.js index 01f5900b..f3ab15f5 100644 --- a/src/iotcon/iotcon_api.js +++ b/src/iotcon/iotcon_api.js @@ -18,6 +18,7 @@ var native = new xwalk.utils.NativeManager(extension); var validator = xwalk.utils.validator; var types = validator.Types; var T = xwalk.utils.type; +var kIdKey = Symbol(); function createListener(name, c) { var listenerName = name; @@ -290,11 +291,7 @@ function createRepresentation(data) { } function Request(data) { - Object.defineProperty(this, '_id', { - value: data.id, - writable: false, - enumerable: false - }); + this[kIdKey] = data.id; delete data.id; @@ -303,11 +300,6 @@ function Request(data) { function Resource(data) { Object.defineProperties(this, { - _id: { - value: data.id, - writable: false, - enumerable: false - }, observerIds: { get: function() { var callArgs = {}; @@ -320,10 +312,14 @@ function Resource(data) { } }); + this[kIdKey] = data.id; + delete data.id; var internal = new InternalData(data); internal.decorate(this); + + this.states = null; } Resource.prototype.notify = function() { @@ -336,7 +332,7 @@ Resource.prototype.notify = function() { }]); var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; callArgs.observerIds = args.observerIds; var result = native.call('IotconResource_notify', callArgs); @@ -356,7 +352,7 @@ Resource.prototype.addResourceTypes = function() { }]); var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; callArgs.types = args.types; var result = native.call('IotconResource_addResourceTypes', callArgs); @@ -376,7 +372,7 @@ Resource.prototype.addResourceInterfaces = function() { }]); var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; callArgs.interfaces = args.interfaces; var result = native.call('IotconResource_addResourceInterfaces', callArgs); @@ -396,7 +392,7 @@ Resource.prototype.addChildResource = function() { }]); var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; callArgs.resource = args.resource; var result = native.call('IotconResource_addChildResource', callArgs); @@ -416,7 +412,7 @@ Resource.prototype.removeChildResource = function() { }]); var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; callArgs.resource = args.resource; var result = native.call('IotconResource_removeChildResource', callArgs); @@ -435,7 +431,7 @@ Resource.prototype.setRequestListener = function() { }]); var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; var listener = function(result) { native.callIfPossible(args.successCallback, native.getResultObject(result)); @@ -446,20 +442,20 @@ Resource.prototype.setRequestListener = function() { if (native.isFailure(result)) { throw native.getErrorObject(result); } else { - resourceRequestListener.addListener(this._id, listener); + resourceRequestListener.addListener(this[kIdKey], listener); } }; Resource.prototype.unsetRequestListener = function() { var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; var result = native.callSync('IotconRemoteResource_unsetRequestListener', callArgs); if (native.isFailure(result)) { throw native.getErrorObject(result); } else { - resourceRequestListener.removeListener(this._id); + resourceRequestListener.removeListener(this[kIdKey]); } }; @@ -493,7 +489,7 @@ function Response(request) { Response.prototype.send = function() { var callArgs = {}; - callArgs.id = this.request._id; + callArgs.id = this.request[kIdKey]; callArgs.result = this.result; callArgs.representation = this.representation; callArgs.options = this.options; @@ -546,11 +542,6 @@ function State(key, state) { function RemoteResource(data) { Object.defineProperties(this, { - _id: { - value: data.id, - writable: false, - enumerable: false - }, cachedRepresentation: { get: function() { var callArgs = {}; @@ -563,6 +554,8 @@ function RemoteResource(data) { } }); + this[kIdKey] = data.id; + delete data.id; var internal = new InternalData(data); @@ -585,7 +578,7 @@ RemoteResource.prototype.methodGet = function() { }]); var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; callArgs.query = args.query; var callback = function(result) { @@ -624,7 +617,7 @@ RemoteResource.prototype.methodPut = function() { }]); var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; callArgs.representation = args.representation; callArgs.query = args.query; @@ -664,7 +657,7 @@ RemoteResource.prototype.methodPost = function() { }]); var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; callArgs.representation = args.representation; callArgs.query = args.query; @@ -696,7 +689,7 @@ RemoteResource.prototype.methodDelete = function() { }]); var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; var callback = function(result) { if (native.isFailure(result)) { @@ -736,7 +729,7 @@ RemoteResource.prototype.setStateChangeListener = function() { }]); var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; callArgs.query = args.query; callArgs.observePolicy = args.observePolicy; var that = this; @@ -755,26 +748,26 @@ RemoteResource.prototype.setStateChangeListener = function() { if (native.isFailure(result)) { throw native.getErrorObject(result); } else { - stateChangeListener.addListener(this._id, listener); + stateChangeListener.addListener(this[kIdKey], listener); } }; RemoteResource.prototype.unsetStateChangeListener = function() { var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; var result = native.callSync('IotconRemoteResource_unsetStateChangeListener', callArgs); if (native.isFailure(result)) { throw native.getErrorObject(result); } else { - stateChangeListener.removeListener(this._id); + stateChangeListener.removeListener(this[kIdKey]); } }; RemoteResource.prototype.startCaching = function() { var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; var result = native.callSync('IotconRemoteResource_startCaching', callArgs); @@ -785,7 +778,7 @@ RemoteResource.prototype.startCaching = function() { RemoteResource.prototype.stopCaching = function() { var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; var result = native.callSync('IotconRemoteResource_stopCaching', callArgs); @@ -808,7 +801,7 @@ RemoteResource.prototype.setConnectionChangeListener = function() { }]); var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; var listener = function(result) { if (native.isFailure(result)) { @@ -823,20 +816,20 @@ RemoteResource.prototype.setConnectionChangeListener = function() { if (native.isFailure(result)) { throw native.getErrorObject(result); } else { - connectionChangeListener.addListener(this._id, listener); + connectionChangeListener.addListener(this[kIdKey], listener); } }; RemoteResource.prototype.unsetConnectionChangeListener = function() { var callArgs = {}; - callArgs.id = this._id; + callArgs.id = this[kIdKey]; var result = native.callSync('IotconRemoteResource_unsetConnectionChangeListener', callArgs); if (native.isFailure(result)) { throw native.getErrorObject(result); } else { - connectionChangeListener.removeListener(this._id); + connectionChangeListener.removeListener(this[kIdKey]); } }; @@ -1019,34 +1012,35 @@ Client.prototype.getPlatformInfo = function() { function Server() { } +var serverResources = {}; + Server.prototype.createResource = function() { var args = validator.validateMethod(arguments, [{ - name: 'dictionary', - type: types.DICTIONARY + name: 'uriPath', + type: types.STRING }, { - name: 'successCallback', - type: types.FUNCTION + name: 'resourceTypes', + type: types.ARRAY, + values: types.STRING }, { - name: 'errorCallback', - type: types.FUNCTION, + name: 'dictionary', + type: types.DICTIONARY, optional: true, nullable: true }]); - var callArgs = args.dictionary; + var callArgs = args.dictionary || {}; + callArgs.uriPath = args.uriPath; + callArgs.resourceTypes = args.resourceTypes; - var callback = function(result) { - if (native.isFailure(result)) { - native.callIfPossible(args.errorCallback, native.getErrorObject(result)); - } else { - args.successCallback(new Resource(native.getResultObject(result))); - } - }; - - var result = native.call('IotconServer_createResource', callArgs, callback); + var result = native.callSync('IotconServer_createResource', callArgs); if (native.isFailure(result)) { throw native.getErrorObject(result); + } else { + var resource = new Resource(native.getResultObject(result)); + serverResources[resource[kIdKey]] = resource; + return resource; } }; @@ -1055,65 +1049,30 @@ Server.prototype.removeResource = function() { name: 'resource', type: types.PLATFORM_OBJECT, values: Resource - }, { - name: 'successCallback', - type: types.FUNCTION - }, { - name: 'errorCallback', - type: types.FUNCTION, - optional: true, - nullable: true }]); var callArgs = {}; - callArgs.id = args.resource._id; + callArgs.id = args.resource[kIdKey]; - var callback = function(result) { - if (native.isFailure(result)) { - native.callIfPossible(args.errorCallback, native.getErrorObject(result)); - } else { - args.successCallback(); - } - }; - - var result = native.call('IotconServer_removeResource', callArgs, callback); + var result = native.callSync('IotconServer_removeResource', callArgs); if (native.isFailure(result)) { throw native.getErrorObject(result); + } else { + delete serverResources[callArgs.id]; } }; -Server.prototype.updateResource = function() { - var args = validator.validateMethod(arguments, [{ - name: 'resource', - type: types.PLATFORM_OBJECT, - values: Resource - }, { - name: 'successCallback', - type: types.FUNCTION - }, { - name: 'errorCallback', - type: types.FUNCTION, - optional: true, - nullable: true - }]); +Server.prototype.getResources = function() { + var result = []; - var callArgs = {}; - callArgs.id = args.resource._id; - - var callback = function(result) { - if (native.isFailure(result)) { - native.callIfPossible(args.errorCallback, native.getErrorObject(result)); - } else { - args.successCallback(args.resource); + for (var id in serverResources) { + if (serverResources.hasOwnProperty(id)) { + result.push(serverResources[id]); } - }; - - var result = native.call('IotconServer_updateResource', callArgs, callback); - - if (native.isFailure(result)) { - throw native.getErrorObject(result); } + + return result; }; var client = new Client(); diff --git a/src/iotcon/iotcon_instance.cc b/src/iotcon/iotcon_instance.cc index 8e0fe77d..5c2e3f62 100644 --- a/src/iotcon/iotcon_instance.cc +++ b/src/iotcon/iotcon_instance.cc @@ -32,6 +32,21 @@ namespace { return common::TypeMismatchError(std::string(name) + " is required argument"); \ } +long long GetId(const picojson::object& args) { + return static_cast(args.find(kResourceId)->second.get()); +} + +const picojson::value& GetArg(const picojson::object& args, const std::string& name) { + static const picojson::value kNull; + + auto it = args.find(name); + if (args.end() == it) { + return kNull; + } else { + return it->second; + } +} + } // namespace IotconInstance::IotconInstance() : manager_(this) { @@ -58,6 +73,8 @@ IotconInstance::IotconInstance() : manager_(this) { REGISTER_SYNC("IotconClient_removePresenceEventListener", ClientRemovePresenceEventListener); REGISTER_SYNC("Iotcon_getTimeout", GetTimeout); REGISTER_SYNC("Iotcon_setTimeout", SetTimeout); + REGISTER_SYNC("IotconServer_createResource", ServerCreateResource); + REGISTER_SYNC("IotconServer_removeResource", ServerRemoveResource); #undef REGISTER_SYNC @@ -76,9 +93,6 @@ IotconInstance::IotconInstance() : manager_(this) { REGISTER_ASYNC("IotconClient_findResource", ClientFindResource); REGISTER_ASYNC("IotconClient_getDeviceInfo", ClientGetDeviceInfo); REGISTER_ASYNC("IotconClient_getPlatformInfo", ClientGetPlatformInfo); - REGISTER_ASYNC("IotconServer_createResource", ServerCreateResource); - REGISTER_ASYNC("IotconServer_removeResource", ServerRemoveResource); - REGISTER_ASYNC("IotconServer_updateResource", ServerUpdateResource); #undef REGISTER_ASYNC @@ -262,61 +276,63 @@ common::TizenResult IotconInstance::ClientGetPlatformInfo(const picojson::object return common::UnknownError("Not implemented"); } -common::TizenResult IotconInstance::ServerCreateResource(const picojson::object& args, - const common::AsyncToken& token) { +common::TizenResult IotconInstance::ServerCreateResource(const picojson::object& args) { ScopeLogger(); - CHECK_EXIST(args, kIsDiscoverable); - CHECK_EXIST(args, kIsObservable); - CHECK_EXIST(args, kResourceTypes); - CHECK_EXIST(args, kResourceInterfaces); CHECK_EXIST(args, kUriPath); - // TODO: consider support other properties - const bool is_discoverable = args.find(kIsDiscoverable)->second.get(); - const bool is_observable = args.find(kIsObservable)->second.get(); - const auto& resource_types = args.find(kResourceTypes)->second.get(); - const auto& resource_interfaces = args.find(kResourceInterfaces)->second.get(); const std::string& uri_path = args.find(kUriPath)->second.get(); - auto create = [this, is_discoverable, is_observable, - resource_types, uri_path, resource_interfaces, token]() { - ScopeLogger("Create resource"); + const auto& interfaces = GetArg(args, kResourceInterfaces); + const auto& resource_interfaces = interfaces.is() ? interfaces.get() : picojson::array(); - picojson::value result = picojson::value(picojson::object()); - ResourceInfoPtr resource{new ResourceInfo()}; - auto ret = manager_.CreateResource(uri_path, resource_interfaces, resource_types, - is_discoverable, is_observable, resource); - if (!ret) { - Post(token, ret); - return; - } - LoggerD("RESOURCE\nid: %lld\nhandle: %p", resource->id, resource->handle); + const auto& types = GetArg(args, kResourceTypes); + const auto& resource_types = types.is() ? types.get() : picojson::array(); - ret = IotconUtils::ResourceToJson(resource, manager_, &(result.get())); - if (!ret) { - Post(token, ret); - return; - } + int properties = IOTCON_RESOURCE_NO_PROPERTY; - Post(token, common::TizenSuccess{result}); - }; + const auto& observable = GetArg(args, kIsObservable); + properties |= (observable.is() ? observable.get() : false) ? IOTCON_RESOURCE_OBSERVABLE : IOTCON_RESOURCE_NO_PROPERTY; - std::thread{create}.detach(); + const auto& discoverable = GetArg(args, kIsDiscoverable); + properties |= (discoverable.is() ? discoverable.get() : false) ? IOTCON_RESOURCE_DISCOVERABLE : IOTCON_RESOURCE_NO_PROPERTY; - return common::TizenSuccess(); -} + const auto& active = GetArg(args, kIsActive); + properties |= (active.is() ? active.get() : false) ? IOTCON_RESOURCE_ACTIVE : IOTCON_RESOURCE_NO_PROPERTY; -common::TizenResult IotconInstance::ServerRemoveResource(const picojson::object& args, - const common::AsyncToken& token) { - ScopeLogger(); - return common::UnknownError("Not implemented"); + const auto& slow = GetArg(args, kIsSlow); + properties |= (slow.is() ? slow.get() : false) ? IOTCON_RESOURCE_SLOW : IOTCON_RESOURCE_NO_PROPERTY; + + const auto& secure = GetArg(args, kIsSecure); + properties |= (secure.is() ? secure.get() : false) ? IOTCON_RESOURCE_SECURE : IOTCON_RESOURCE_NO_PROPERTY; + + const auto& explicit_discoverable = GetArg(args, kIsExplicitDiscoverable); + properties |= (explicit_discoverable.is() ? explicit_discoverable.get() : false) ? IOTCON_RESOURCE_EXPLICIT_DISCOVERABLE : IOTCON_RESOURCE_NO_PROPERTY; + + ResourceInfoPtr resource{new ResourceInfo()}; + auto ret = manager_.CreateResource(uri_path, resource_interfaces, resource_types, + properties, resource); + if (!ret) { + return ret; + } + + LoggerD("RESOURCE\nid: %lld\nhandle: %p", resource->id, resource->handle); + + picojson::value result = picojson::value(picojson::object()); + ret = IotconUtils::ResourceToJson(resource, manager_, &(result.get())); + if (!ret) { + return ret; + } + + return common::TizenSuccess{result}; } -common::TizenResult IotconInstance::ServerUpdateResource(const picojson::object& args, - const common::AsyncToken& token) { +common::TizenResult IotconInstance::ServerRemoveResource(const picojson::object& args) { ScopeLogger(); - return common::UnknownError("Not implemented"); + + CHECK_EXIST(args, kResourceId); + + return manager_.DestroyResource(GetId(args)); } common::TizenResult IotconInstance::GetTimeout(const picojson::object& args) { diff --git a/src/iotcon/iotcon_instance.h b/src/iotcon/iotcon_instance.h index 0449b9ec..1d0b646f 100644 --- a/src/iotcon/iotcon_instance.h +++ b/src/iotcon/iotcon_instance.h @@ -68,12 +68,8 @@ class IotconInstance : public common::TizenInstance { const common::AsyncToken& token); common::TizenResult ClientGetPlatformInfo(const picojson::object& args, const common::AsyncToken& token); - common::TizenResult ServerCreateResource(const picojson::object& args, - const common::AsyncToken& token); - common::TizenResult ServerRemoveResource(const picojson::object& args, - const common::AsyncToken& token); - common::TizenResult ServerUpdateResource(const picojson::object& args, - const common::AsyncToken& token); + common::TizenResult ServerCreateResource(const picojson::object& args); + common::TizenResult ServerRemoveResource(const picojson::object& args); common::TizenResult GetTimeout(const picojson::object& args); common::TizenResult SetTimeout(const picojson::object& args); diff --git a/src/iotcon/iotcon_server_manager.cc b/src/iotcon/iotcon_server_manager.cc index 99ab26d9..077dccaf 100644 --- a/src/iotcon/iotcon_server_manager.cc +++ b/src/iotcon/iotcon_server_manager.cc @@ -88,8 +88,7 @@ void IotconServerManager::RequestHandler(iotcon_resource_h resource, TizenResult IotconServerManager::CreateResource(const std::string& uri_path, const picojson::array& interfaces_array, const picojson::array& types_array, - bool is_discoverable, - bool is_observable, + int properties, ResourceInfoPtr res_pointer) { ScopeLogger(); @@ -106,11 +105,6 @@ TizenResult IotconServerManager::CreateResource(const std::string& uri_path, return res; } - // TODO consider support other properties - int properties = ((is_discoverable ? IOTCON_RESOURCE_DISCOVERABLE : IOTCON_RESOURCE_NO_PROPERTY) | - (is_observable ? IOTCON_RESOURCE_OBSERVABLE : IOTCON_RESOURCE_NO_PROPERTY) | - IOTCON_RESOURCE_ACTIVE); - // Create resource ret = iotcon_resource_create(uri_path.c_str(), resource_types, @@ -146,5 +140,15 @@ TizenResult IotconServerManager::GetResourceById(long long id, return TizenSuccess(); } +common::TizenResult IotconServerManager::DestroyResource(long long id) { + ScopeLogger(); + + if (resource_map_.erase(id)) { + return TizenSuccess(); + } else { + return LogAndCreateTizenError(NotFoundError, "Resource with specified ID does not exist"); + } +} + } // namespace iotcon } // namespace extension diff --git a/src/iotcon/iotcon_server_manager.h b/src/iotcon/iotcon_server_manager.h index 39593f5a..1fd3865a 100644 --- a/src/iotcon/iotcon_server_manager.h +++ b/src/iotcon/iotcon_server_manager.h @@ -41,10 +41,11 @@ class IotconServerManager { common::TizenResult RestoreHandles(); common::TizenResult CreateResource(const std::string& uri_path, const picojson::array& interfaces_array, - const picojson::array& types_array, bool is_discoverable, - bool is_observable, + const picojson::array& types_array, + int properties, ResourceInfoPtr res_pointer); common::TizenResult GetResourceById(long long id, ResourceInfoPtr* res_pointer) const; + common::TizenResult DestroyResource(long long id); private: IotconInstance* instance_; ResourceInfoMap resource_map_; diff --git a/src/iotcon/iotcon_utils.cc b/src/iotcon/iotcon_utils.cc index a8885501..004b2157 100644 --- a/src/iotcon/iotcon_utils.cc +++ b/src/iotcon/iotcon_utils.cc @@ -29,6 +29,10 @@ namespace iotcon { const std::string kIsDiscoverable = "isDiscoverable"; const std::string kIsObservable = "isObservable"; +const std::string kIsActive = "isActive"; +const std::string kIsSlow = "isSlow"; +const std::string kIsSecure = "isSecure"; +const std::string kIsExplicitDiscoverable = "isExplicitDiscoverable"; const std::string kResourceTypes = "resourceTypes"; const std::string kResourceInterfaces = "resourceInterfaces"; const std::string kResourceChildren = "resources"; @@ -196,10 +200,18 @@ TizenResult IotconUtils::ResourceToJson(ResourceInfoPtr pointer, res->insert(std::make_pair(kResourceInterfaces, picojson::value(InterfacesToArray(ifaces)))); - bool observable = properties & IOTCON_RESOURCE_OBSERVABLE; - res->insert(std::make_pair(kIsObservable, picojson::value(observable))); - bool discoverable = properties & IOTCON_RESOURCE_DISCOVERABLE; - res->insert(std::make_pair(kIsDiscoverable, picojson::value(discoverable))); + bool value = properties & IOTCON_RESOURCE_OBSERVABLE; + res->insert(std::make_pair(kIsObservable, picojson::value(value))); + value = properties & IOTCON_RESOURCE_DISCOVERABLE; + res->insert(std::make_pair(kIsDiscoverable, picojson::value(value))); + value = properties & IOTCON_RESOURCE_ACTIVE; + res->insert(std::make_pair(kIsActive, picojson::value(value))); + value = properties & IOTCON_RESOURCE_SLOW; + res->insert(std::make_pair(kIsSlow, picojson::value(value))); + value = properties & IOTCON_RESOURCE_SECURE; + res->insert(std::make_pair(kIsSecure, picojson::value(value))); + value = properties & IOTCON_RESOURCE_EXPLICIT_DISCOVERABLE; + res->insert(std::make_pair(kIsExplicitDiscoverable, picojson::value(value))); picojson::array children; for (auto iter = pointer->children_ids.begin(); iter != pointer->children_ids.end(); ++iter) { diff --git a/src/iotcon/iotcon_utils.h b/src/iotcon/iotcon_utils.h index f54439ec..8a0bbb5d 100644 --- a/src/iotcon/iotcon_utils.h +++ b/src/iotcon/iotcon_utils.h @@ -32,6 +32,10 @@ namespace iotcon { extern const std::string kIsDiscoverable; extern const std::string kIsObservable; +extern const std::string kIsActive; +extern const std::string kIsSlow; +extern const std::string kIsSecure; +extern const std::string kIsExplicitDiscoverable; extern const std::string kResourceTypes; extern const std::string kResourceInterfaces; extern const std::string kResourceChildren;