2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 var native = new xwalk.utils.NativeManager(extension);
18 var validator = xwalk.utils.validator;
19 var types = validator.Types;
20 var T = xwalk.utils.type;
22 function createListener(name, c) {
23 var listenerName = name;
24 var callback = c || function(response) {
28 var jsListenerRegistered = false;
30 function internalCallback(response) {
31 if (listeners[response.id]) {
32 listeners[response.id](callback(response));
36 function addListener(id, func) {
37 if (!jsListenerRegistered) {
38 native.addListener(listenerName, internalCallback);
39 jsListenerRegistered = true;
45 function removeListener(id) {
50 if (jsListenerRegistered && T.isEmptyObject(listeners)) {
51 native.removeListener(listenerName, internalCallback);
52 jsListenerRegistered = false;
57 addListener: addListener,
58 removeListener: removeListener
62 function InternalData(d) {
64 if (d.hasOwnProperty(prop)) {
70 InternalData.prototype.update = function(dst) {
71 for (var prop in this) {
72 if (this.hasOwnProperty(prop) && dst.hasOwnProperty(prop)) {
78 InternalData.prototype.decorate = function(dst) {
80 function getBuilder(prop) {
81 if (T.isArray(that[prop])) {
83 return that[prop].slice();
91 function setBuilder(prop) {
93 if (d instanceof InternalData) {
98 for (var prop in this) {
99 if (this.hasOwnProperty(prop)) {
100 Object.defineProperty(dst, prop, {
101 get: getBuilder(prop),
102 set: setBuilder(prop),
109 function updateWithInternalData(src, dst) {
110 new InternalData(src).update(dst);
113 function decorateWithData(data, dst) {
114 for (var prop in data) {
115 if (data.hasOwnProperty(prop)) {
116 Object.defineProperty(dst, prop, {
125 var ResponseResult = {
128 RESOURCE_CREATED: 'RESOURCE_CREATED',
129 RESOURCE_DELETED: 'RESOURCE_DELETED',
133 var PresenceResponseResultType = {
139 var PresenceTriggerType = {
142 DESTROYED: 'DESTROYED'
145 var ConnectivityType = {
153 var ResourceInterface = {
160 var ObservePolicy = {
161 IGNORE_OUT_OF_ORDER: 'IGNORE_OUT_OF_ORDER',
162 ACCEPT_OUT_OF_ORDER: 'ACCEPT_OUT_OF_ORDER'
165 var PresenceTriggerType = {
167 REGISTER: 'REGISTER',
168 DEREGISTER: 'DEREGISTER'
171 function DeviceInfo(data) {
172 decorateWithData(data, this);
175 function IotconOption(id, data) {
176 validator.isConstructorCall(this, tizen.IotconOption);
178 Object.defineProperties(this, {
192 function PlatformInfo(data) {
193 decorateWithData(data, this);
196 function PresenceResponse(data) {
197 decorateWithData(data, this);
200 function Query(resourceTypes, resourceInterface, filters) {
201 validator.isConstructorCall(this, tizen.Query);
203 Object.defineProperties(this, {
205 value: resourceTypes || null,
210 value: resourceInterface || null,
215 value: filters || null,
222 function QueryFilter(key, value) {
223 validator.isConstructorCall(this, tizen.QueryFilter);
225 Object.defineProperties(this, {
239 function Representation(uriPath) {
240 validator.isConstructorCall(this, tizen.Representation);
242 Object.defineProperties(this, {
253 resourceInterfaces: {
271 function createRepresentation(data) {
272 var r = new tizen.Representation(data.uriPath);
273 var props = ['resourceTypes', 'resourceInterfaces', 'states'];
275 for (var p = 0; p < props.length; ++p) {
276 if (data[props[p]]) {
277 r[props[p]] = data[props[p]];
281 if (data.representations) {
282 r.representations = [];
283 for (var i = 0; i < data.representations.length; ++i) {
284 r.representations.push(createRepresentation(data.representations[i]));
291 function Request(data) {
292 Object.defineProperty(this, '_id', {
300 decorateWithData(data, this);
303 function Response(request) {
304 validator.isConstructorCall(this, tizen.Response);
306 Object.defineProperties(this, {
330 Response.prototype.send = function() {
332 callArgs.id = this.request._id;
333 callArgs.result = this.result;
334 callArgs.representation = this.representation;
335 callArgs.options = this.options;
337 var result = native.callSync('IotconResponse_send', callArgs);
339 if (native.isFailure(result)) {
340 throw native.getErrorObject(result);
344 function State(key, state) {
345 validator.isConstructorCall(this, tizen.State);
347 Object.defineProperties(this, {
361 function RemoteResource(data) {
362 Object.defineProperties(this, {
368 cachedRepresentation: {
371 callArgs.id = data.id;
372 var result = native.callSync('IotconRemoteResource_getCachedRepresentation', callArgs);
373 return createRepresentation(native.getResultObject(result));
382 var internal = new InternalData(data);
383 internal.decorate(this);
386 RemoteResource.prototype.methodGet = function() {
387 var args = validator.validateMethod(arguments, [{
389 type: types.PLATFORM_OBJECT,
392 name: 'responseCallback',
395 name: 'errorCallback',
396 type: types.FUNCTION,
402 callArgs.id = this._id;
403 callArgs.query = args.query;
405 var callback = function(result) {
406 if (native.isFailure(result)) {
407 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
410 args.responseCallback();
414 var result = native.call('IotconRemoteResource_methodGet', callArgs, callback);
416 if (native.isFailure(result)) {
417 throw native.getErrorObject(result);
421 RemoteResource.prototype.methodPut = function() {
422 var args = validator.validateMethod(arguments, [{
423 name: 'representation',
424 type: types.PLATFORM_OBJECT,
425 values: Representation
428 type: types.PLATFORM_OBJECT,
431 name: 'responseCallback',
434 name: 'errorCallback',
435 type: types.FUNCTION,
441 callArgs.id = this._id;
442 callArgs.representation = args.representation;
443 callArgs.query = args.query;
445 var callback = function(result) {
446 if (native.isFailure(result)) {
447 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
450 args.responseCallback();
454 var result = native.call('IotconRemoteResource_methodPut', callArgs, callback);
456 if (native.isFailure(result)) {
457 throw native.getErrorObject(result);
461 RemoteResource.prototype.methodPost = function() {
462 var args = validator.validateMethod(arguments, [{
463 name: 'representation',
464 type: types.PLATFORM_OBJECT,
465 values: Representation
468 type: types.PLATFORM_OBJECT,
471 name: 'responseCallback',
474 name: 'errorCallback',
475 type: types.FUNCTION,
481 callArgs.id = this._id;
482 callArgs.representation = args.representation;
483 callArgs.query = args.query;
485 var callback = function(result) {
486 if (native.isFailure(result)) {
487 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
490 args.responseCallback();
494 var result = native.call('IotconRemoteResource_methodPost', callArgs, callback);
496 if (native.isFailure(result)) {
497 throw native.getErrorObject(result);
501 RemoteResource.prototype.methodDelete = function() {
502 var args = validator.validateMethod(arguments, [{
503 name: 'responseCallback',
506 name: 'errorCallback',
507 type: types.FUNCTION,
513 callArgs.id = this._id;
515 var callback = function(result) {
516 if (native.isFailure(result)) {
517 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
520 args.responseCallback();
524 var result = native.call('IotconRemoteResource_methodDelete', callArgs, callback);
526 if (native.isFailure(result)) {
527 throw native.getErrorObject(result);
531 var stateChangeListener = createListener('RemoteResourceStateChangeListener');
533 RemoteResource.prototype.setStateChangeListener = function() {
534 var args = validator.validateMethod(arguments, [{
536 type: types.PLATFORM_OBJECT,
539 name: 'observePolicy',
541 values: T.getValues(ObservePolicy)
543 name: 'successCallback',
546 name: 'errorCallback',
547 type: types.FUNCTION,
553 callArgs.id = this._id;
554 callArgs.query = args.query;
555 callArgs.observePolicy = args.observePolicy;
558 var listener = function(result) {
559 if (native.isFailure(result)) {
560 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
562 updateWithInternalData(native.getResultObject(result), that);
563 args.successCallback(that);
567 var result = native.callSync('IotconRemoteResource_setStateChangeListener', callArgs);
569 if (native.isFailure(result)) {
570 throw native.getErrorObject(result);
572 stateChangeListener.addListener(this._id, listener);
576 RemoteResource.prototype.unsetStateChangeListener = function() {
578 callArgs.id = this._id;
580 var result = native.callSync('IotconRemoteResource_unsetStateChangeListener', callArgs);
582 if (native.isFailure(result)) {
583 throw native.getErrorObject(result);
585 stateChangeListener.removeListener(this._id);
589 RemoteResource.prototype.startCaching = function() {
591 callArgs.id = this._id;
593 var result = native.callSync('IotconRemoteResource_startCaching', callArgs);
595 if (native.isFailure(result)) {
596 throw native.getErrorObject(result);
600 RemoteResource.prototype.stopCaching = function() {
602 callArgs.id = this._id;
604 var result = native.callSync('IotconRemoteResource_stopCaching', callArgs);
606 if (native.isFailure(result)) {
607 throw native.getErrorObject(result);
611 var connectionChangeListener = createListener('RemoteResourceConnectionChangeListener');
613 RemoteResource.prototype.setConnectionChangeListener = function() {
614 var args = validator.validateMethod(arguments, [{
615 name: 'successCallback',
618 name: 'errorCallback',
619 type: types.FUNCTION,
625 callArgs.id = this._id;
627 var listener = function(result) {
628 if (native.isFailure(result)) {
629 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
631 args.successCallback(native.getResultObject(result));
635 var result = native.callSync('IotconRemoteResource_setConnectionChangeListener', callArgs);
637 if (native.isFailure(result)) {
638 throw native.getErrorObject(result);
640 connectionChangeListener.addListener(this._id, listener);
644 RemoteResource.prototype.unsetConnectionChangeListener = function() {
646 callArgs.id = this._id;
648 var result = native.callSync('IotconRemoteResource_unsetConnectionChangeListener', callArgs);
650 if (native.isFailure(result)) {
651 throw native.getErrorObject(result);
653 connectionChangeListener.removeListener(this._id);
660 Client.prototype.findResource = function() {
661 var args = validator.validateMethod(arguments, [{
666 name: 'resourceType',
670 name: 'connectivityType',
672 values: T.getValues(ConnectivityType)
674 name: 'successCallback',
677 name: 'errorCallback',
678 type: types.FUNCTION,
684 callArgs.hostAddress = args.hostAddress;
685 callArgs.resourceType = args.resourceType;
686 callArgs.connectivityType = args.connectivityType;
688 var callback = function(result) {
689 if (native.isFailure(result)) {
690 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
692 var rr = new RemoteResource(native.getResultObject(result));
693 args.successCallback(rr);
697 var result = native.call('IotconClient_findResource', callArgs, callback);
699 if (native.isFailure(result)) {
700 throw native.getErrorObject(result);
704 var presenceEventListener = createListener('PresenceEventListener', function(response) {
705 return new PresenceResponse(native.getResultObject(response));
708 Client.prototype.addPresenceEventListener = function() {
709 var args = validator.validateMethod(arguments, [{
714 name: 'resourceType',
717 name: 'connectivityType',
719 values: T.getValues(ConnectivityType)
721 name: 'successCallback',
726 callArgs.hostAddress = args.hostAddress;
727 callArgs.resourceType = args.resourceType;
728 callArgs.connectivityType = args.connectivityType;
730 var result = native.callSync('IotconClient_addPresenceEventListener', callArgs);
732 if (native.isFailure(result)) {
733 throw native.getErrorObject(result);
735 var id = native.getResultObject(result);
736 presenceEventListener.addListener(id, args.successCallback);
741 Client.prototype.removePresenceEventListener = function() {
742 var args = validator.validateMethod(arguments, [{
748 callArgs.id = args.watchId;
750 var result = native.callSync('IotconClient_removePresenceEventListener', callArgs);
752 if (native.isFailure(result)) {
753 throw native.getErrorObject(result);
755 presenceEventListener.removeListener(args.watchId);
759 Client.prototype.getDeviceInfo = function() {
760 var args = validator.validateMethod(arguments, [{
764 name: 'connectivityType',
766 values: T.getValues(ConnectivityType)
768 name: 'successCallback',
771 name: 'errorCallback',
772 type: types.FUNCTION,
778 callArgs.hostAddress = args.hostAddress;
779 callArgs.connectivityType = args.connectivityType;
781 var callback = function(result) {
782 if (native.isFailure(result)) {
783 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
785 args.successCallback(new DeviceInfo(native.getResultObject(result)));
789 var result = native.call('IotconClient_getDeviceInfo', callArgs, callback);
791 if (native.isFailure(result)) {
792 throw native.getErrorObject(result);
796 Client.prototype.getPlatformInfo = function() {
797 var args = validator.validateMethod(arguments, [{
801 name: 'connectivityType',
803 values: T.getValues(ConnectivityType)
805 name: 'successCallback',
808 name: 'errorCallback',
809 type: types.FUNCTION,
815 callArgs.hostAddress = args.hostAddress;
816 callArgs.connectivityType = args.connectivityType;
818 var callback = function(result) {
819 if (native.isFailure(result)) {
820 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
822 args.successCallback(new PlatformInfo(native.getResultObject(result)));
826 var result = native.call('IotconClient_getPlatformInfo', callArgs, callback);
828 if (native.isFailure(result)) {
829 throw native.getErrorObject(result);
833 function Resource() {
839 Server.prototype.createResource = function() {
840 var args = validator.validateMethod(arguments, [{
842 type: types.DICTIONARY
844 name: 'successCallback',
847 name: 'errorCallback',
848 type: types.FUNCTION,
853 var callArgs = args.dictionary;
855 var callback = function(result) {
856 if (native.isFailure(result)) {
857 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
860 args.successCallback();
864 var result = native.call('IotconServer_createResource', callArgs, callback);
866 if (native.isFailure(result)) {
867 throw native.getErrorObject(result);
871 Server.prototype.removeResource = function() {
872 var args = validator.validateMethod(arguments, [{
874 type: types.PLATFORM_OBJECT,
877 name: 'successCallback',
880 name: 'errorCallback',
881 type: types.FUNCTION,
887 callArgs.id = args.resource._id; // TODO: check if this is correct
889 var callback = function(result) {
890 if (native.isFailure(result)) {
891 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
893 args.successCallback();
897 var result = native.call('IotconServer_removeResource', callArgs, callback);
899 if (native.isFailure(result)) {
900 throw native.getErrorObject(result);
904 Server.prototype.updateResource = function() {
905 var args = validator.validateMethod(arguments, [{
907 type: types.PLATFORM_OBJECT,
910 name: 'successCallback',
913 name: 'errorCallback',
914 type: types.FUNCTION,
920 callArgs.id = args.resource._id; // TODO: check if this is correct
922 var callback = function(result) {
923 if (native.isFailure(result)) {
924 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
926 args.successCallback(args.resource);
930 var result = native.call('IotconServer_updateResource', callArgs, callback);
932 if (native.isFailure(result)) {
933 throw native.getErrorObject(result);
937 var client = new Client();
938 var server = new Server();
943 Iotcon.prototype.getClient = function() {
947 Iotcon.prototype.getServer = function() {
951 Iotcon.prototype.getTimeout = function() {
952 var result = native.callSync('Iotcon_getTimeout', {});
954 if (native.isFailure(result)) {
955 throw native.getErrorObject(result);
957 return native.getResultObject(result);
961 Iotcon.prototype.setTimeout = function() {
962 var args = validator.validateMethod(arguments, [{
968 callArgs.timeout = args.timeout;
970 var result = native.callSync('Iotcon_setTimeout', callArgs);
972 if (native.isFailure(result)) {
973 throw native.getErrorObject(result);
978 tizen.IotconOption = IotconOption;
980 tizen.QueryFilter = QueryFilter;
981 tizen.Representation = Representation;
982 tizen.Response = Response;
984 exports = new Iotcon();