var validator = xwalk.utils.validator;
var types = validator.Types;
var T = xwalk.utils.type;
+var kIdKey = Symbol();
function createListener(name, c) {
var listenerName = name;
}
function Request(data) {
- Object.defineProperty(this, '_id', {
- value: data.id,
- writable: false,
- enumerable: false
- });
+ this[kIdKey] = data.id;
delete data.id;
function Resource(data) {
Object.defineProperties(this, {
- _id: {
- value: data.id,
- writable: false,
- enumerable: false
- },
observerIds: {
get: function() {
var callArgs = {};
}
});
+ this[kIdKey] = data.id;
+
delete data.id;
var internal = new InternalData(data);
internal.decorate(this);
+
+ this.states = null;
}
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);
}]);
var callArgs = {};
- callArgs.id = this._id;
+ callArgs.id = this[kIdKey];
callArgs.types = args.types;
var result = native.call('IotconResource_addResourceTypes', callArgs);
}]);
var callArgs = {};
- callArgs.id = this._id;
+ callArgs.id = this[kIdKey];
callArgs.interfaces = args.interfaces;
var result = native.call('IotconResource_addResourceInterfaces', callArgs);
}]);
var callArgs = {};
- callArgs.id = this._id;
+ callArgs.id = this[kIdKey];
callArgs.resource = args.resource;
var result = native.call('IotconResource_addChildResource', callArgs);
}]);
var callArgs = {};
- callArgs.id = this._id;
+ callArgs.id = this[kIdKey];
callArgs.resource = args.resource;
var result = native.call('IotconResource_removeChildResource', callArgs);
}]);
var callArgs = {};
- callArgs.id = this._id;
+ callArgs.id = this[kIdKey];
var listener = function(result) {
native.callIfPossible(args.successCallback, native.getResultObject(result));
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]);
}
};
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;
function RemoteResource(data) {
Object.defineProperties(this, {
- _id: {
- value: data.id,
- writable: false,
- enumerable: false
- },
cachedRepresentation: {
get: function() {
var callArgs = {};
}
});
+ this[kIdKey] = data.id;
+
delete data.id;
var internal = new InternalData(data);
}]);
var callArgs = {};
- callArgs.id = this._id;
+ callArgs.id = this[kIdKey];
callArgs.query = args.query;
var callback = function(result) {
}]);
var callArgs = {};
- callArgs.id = this._id;
+ callArgs.id = this[kIdKey];
callArgs.representation = args.representation;
callArgs.query = args.query;
}]);
var callArgs = {};
- callArgs.id = this._id;
+ callArgs.id = this[kIdKey];
callArgs.representation = args.representation;
callArgs.query = args.query;
}]);
var callArgs = {};
- callArgs.id = this._id;
+ callArgs.id = this[kIdKey];
var callback = function(result) {
if (native.isFailure(result)) {
}]);
var callArgs = {};
- callArgs.id = this._id;
+ callArgs.id = this[kIdKey];
callArgs.query = args.query;
callArgs.observePolicy = args.observePolicy;
var that = this;
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);
RemoteResource.prototype.stopCaching = function() {
var callArgs = {};
- callArgs.id = this._id;
+ callArgs.id = this[kIdKey];
var result = native.callSync('IotconRemoteResource_stopCaching', callArgs);
}]);
var callArgs = {};
- callArgs.id = this._id;
+ callArgs.id = this[kIdKey];
var listener = function(result) {
if (native.isFailure(result)) {
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]);
}
};
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;
}
};
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();
return common::TypeMismatchError(std::string(name) + " is required argument"); \
}
+long long GetId(const picojson::object& args) {
+ return static_cast<long long>(args.find(kResourceId)->second.get<double>());
+}
+
+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) {
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
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
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<bool>();
- const bool is_observable = args.find(kIsObservable)->second.get<bool>();
- const auto& resource_types = args.find(kResourceTypes)->second.get<picojson::array>();
- const auto& resource_interfaces = args.find(kResourceInterfaces)->second.get<picojson::array>();
const std::string& uri_path = args.find(kUriPath)->second.get<std::string>();
- 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<picojson::array>() ? interfaces.get<picojson::array>() : 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<picojson::array>() ? types.get<picojson::array>() : picojson::array();
- ret = IotconUtils::ResourceToJson(resource, manager_, &(result.get<picojson::object>()));
- 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<bool>() ? observable.get<bool>() : false) ? IOTCON_RESOURCE_OBSERVABLE : IOTCON_RESOURCE_NO_PROPERTY;
- std::thread{create}.detach();
+ const auto& discoverable = GetArg(args, kIsDiscoverable);
+ properties |= (discoverable.is<bool>() ? discoverable.get<bool>() : false) ? IOTCON_RESOURCE_DISCOVERABLE : IOTCON_RESOURCE_NO_PROPERTY;
- return common::TizenSuccess();
-}
+ const auto& active = GetArg(args, kIsActive);
+ properties |= (active.is<bool>() ? active.get<bool>() : 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<bool>() ? slow.get<bool>() : false) ? IOTCON_RESOURCE_SLOW : IOTCON_RESOURCE_NO_PROPERTY;
+
+ const auto& secure = GetArg(args, kIsSecure);
+ properties |= (secure.is<bool>() ? secure.get<bool>() : false) ? IOTCON_RESOURCE_SECURE : IOTCON_RESOURCE_NO_PROPERTY;
+
+ const auto& explicit_discoverable = GetArg(args, kIsExplicitDiscoverable);
+ properties |= (explicit_discoverable.is<bool>() ? explicit_discoverable.get<bool>() : 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<picojson::object>()));
+ 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) {
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);
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();
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,
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
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_;
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";
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) {
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;