2 * Copyright (c) 2015 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 validator_ = xwalk.utils.validator;
18 var converter_ = xwalk.utils.converter;
19 var types_ = validator_.Types;
20 var type_ = xwalk.utils.type;
21 var native_ = new xwalk.utils.NativeManager(extension);
23 var DATA_CONTROL_MANAGER_LISTENER_ID = 'DataControlManagerChangeCallback';
30 var DataControlListenersManager = (function() {
32 function changeEvent(event) {
35 if (DataType.SQL === event.type.substr(0,3)) {
36 if (type_.isEmptyObject(this._SQLDataControlCbMap)) {
39 for (var listenerId in this._SQLDataControlCbMap) {
40 if (this._SQLDataControlCbMap.hasOwnProperty(listenerId)) {
41 if (this._SQLDataControlCbMap[listenerId].providerId === event.providerId &&
42 this._SQLDataControlCbMap[listenerId].dataId === event.dataId) {
43 successCallback = this._SQLDataControlCbMap[listenerId].changeCallback;
44 if (type_.isFunction(successCallback)) {
45 successCallback(event.type, {columns: event.columns, values: event.values});
51 if (type_.isEmptyObject(this._MAPDataControlCbMap)) {
54 for (var listenerId in this._MAPDataControlCbMap) {
55 if (this._MAPDataControlCbMap.hasOwnProperty(listenerId)) {
56 if (this._MAPDataControlCbMap[listenerId].providerId === event.providerId &&
57 this._MAPDataControlCbMap[listenerId].dataId === event.dataId) {
58 successCallback = this._MAPDataControlCbMap[listenerId].changeCallback;
59 if (type_.isFunction(successCallback)) {
60 successCallback(event.type, {columns: event.columns, values: event.values});
68 function _DataControlListenerManager() {
69 this._SQLDataControlCbMap = {};
70 this._MAPDataControlCbMap = {};
71 this.lastListenerId = 0;
72 this.changeEvent = changeEvent.bind(this);
75 _DataControlListenerManager.prototype.addChangeListener = function(type, providerId, dataId, changeCallback, errorCallback) {
77 if (DataType.SQL === type) {
78 for (var i in this._SQLDataControlCbMap) {
79 if (this._SQLDataControlCbMap.hasOwnProperty(i) &&
80 this._SQLDataControlCbMap[i].providerId === providerId &&
81 this._SQLDataControlCbMap[i].dataId === dataId) {
82 _realWatchId = this._SQLDataControlCbMap[i].realWatchId;
86 for (var i in this._MAPDataControlCbMap) {
87 if (this._MAPDataControlCbMap.hasOwnProperty(i) &&
88 this._MAPDataControlCbMap[i].providerId === providerId &&
89 this._MAPDataControlCbMap[i].dataId === dataId) {
90 _realWatchId = this._MAPDataControlCbMap[i].realWatchId;
96 var callback = function(result) {
97 if (native_.isFailure(result)) {
98 native_.callIfPossible(errorCallback, native_.getErrorObject(result));
103 native_.call('DataControlConsumerObject_addChangeListener', {
104 providerId: providerId,
109 if (native_.isFailure(result)) {
110 throw native_.getErrorObject(result);
112 result = native_.getResultObject(result);
113 _realWatchId = converter_.toLong(result.watchId, true);
115 if (type_.isEmptyObject(this._SQLDataControlCbMap) &&
116 type_.isEmptyObject(this._MAPDataControlCbMap)) {
117 native_.addListener(DATA_CONTROL_MANAGER_LISTENER_ID, this.changeEvent);
121 if (DataType.SQL === type) {
122 this._SQLDataControlCbMap[++this.lastListenerId] = {'providerId': providerId,
124 'changeCallback': changeCallback,
125 'realWatchId': _realWatchId};
127 this._MAPDataControlCbMap[++this.lastListenerId] = {'providerId': providerId,
129 'changeCallback': changeCallback,
130 'realWatchId': _realWatchId};
133 return this.lastListenerId;
136 _DataControlListenerManager.prototype.removeChangeListener = function(type, providerId, dataId, listenerId) {
137 var _realWatchId = 0;
138 if (DataType.SQL === type &&
139 !type_.isUndefined(this._SQLDataControlCbMap[listenerId])) {
140 _realWatchId = this._SQLDataControlCbMap[listenerId].realWatchId;
141 delete this._SQLDataControlCbMap[listenerId];
142 for (var i in this._SQLDataControlCbMap) {
143 if (this._SQLDataControlCbMap.hasOwnProperty(i) &&
144 this._SQLDataControlCbMap[i].realWatchId === _realWatchId) {
148 } else if (DataType.MAP === type &&
149 !type_.isUndefined(this._MAPDataControlCbMap[listenerId])) {
150 _realWatchId = this._MAPDataControlCbMap[listenerId].realWatchId;
151 delete this._MAPDataControlCbMap[listenerId];
152 for (var i in this._MAPDataControlCbMap) {
153 if (this._MAPDataControlCbMap.hasOwnProperty(i) &&
154 this._MAPDataControlCbMap[i].realWatchId === _realWatchId) {
159 console.log('Type invalid or listener was not added');
163 if (0 != _realWatchId) {
164 native_.call('DataControlConsumerObject_removeChangeListener',{
165 watchId: _realWatchId,
168 if (type_.isEmptyObject(this._SQLDataControlCbMap) &&
169 type_.isEmptyObject(this._MAPDataControlCbMap)) {
170 native_.removeListener(DATA_CONTROL_MANAGER_LISTENER_ID);
175 return _DataControlListenerManager;
179 var listenersManager = new DataControlListenersManager();
181 function SetReadOnlyProperty(obj, n, v) {
182 Object.defineProperty(obj, n, {value: v, writable: false});
185 function DataControlManager() {
186 // constructor of DataControlManager
189 var privUtils_ = xwalk.utils;
191 var getDataControlConsumer = function(providerId, dataId, type) {
192 privUtils_.checkPrivilegeAccess(privUtils_.privilege.DATACONTROL_CONSUMER);
193 var args = validator_.validateArgs(arguments, [
194 {'name': 'providerId', 'type': types_.STRING},
195 {'name': 'dataId', 'type': types_.STRING},
196 {'name': 'type', 'type': types_.ENUM, 'values': [DataType.SQL, DataType.MAP]}
199 var returnObject = null;
200 if (DataType.SQL === type) {
201 returnObject = new SQLDataControlConsumer();
202 } else if (DataType.MAP == type) {
203 returnObject = new MappedDataControlConsumer();
206 SetReadOnlyProperty(returnObject, 'type', args.type); // read only property
207 SetReadOnlyProperty(returnObject, 'providerId', args.providerId); // read only property
208 SetReadOnlyProperty(returnObject, 'dataId', args.dataId); // read only property
214 DataControlManager.prototype.getDataControlConsumer = function(providerId, dataId, type) {
215 return getDataControlConsumer.apply(null, arguments);
218 function DataControlConsumerObject() {
219 // constructor of DataControlConsumerObject
222 DataControlConsumerObject.prototype.addChangeListener = function() {
223 var args = validator_.validateArgs(arguments, [
224 {'name': 'dataChangeCallback', 'type': types_.FUNCTION, optional: false,
226 {'name': 'errorCallback', 'type': types_.FUNCTION, optional: true, nullable: true}
229 var type = DataType.SQL;
230 if (this instanceof MappedDataControlConsumer) {
234 return listenersManager.addChangeListener(type, this.providerId, this.dataId,
235 args.dataChangeCallback, args.errorCallback);
238 DataControlConsumerObject.prototype.removeChangeListener = function() {
239 var args = validator_.validateArgs(arguments, [
240 {'name': 'watchId', 'type': types_.LONG}
243 var type = DataType.SQL;
244 if (this instanceof MappedDataControlConsumer) {
248 listenersManager.removeChangeListener(type, this.providerId, this.dataId, args.watchId);
251 function SQLDataControlConsumer() {
252 // constructor of SQLDataControlConsumer
255 SQLDataControlConsumer.prototype = new DataControlConsumerObject();
256 SQLDataControlConsumer.prototype.constructor = SQLDataControlConsumer;
258 SQLDataControlConsumer.prototype.insert = function() {
259 var args = validator_.validateArgs(arguments, [
260 {'name': 'reqId', 'type': types_.LONG},
261 {'name': 'insertionData', 'type': types_.DICTIONARY},
262 {'name': 'successCallback', 'type': types_.FUNCTION, optional: true, nullable: true},
263 {'name': 'errorCallback', 'type': types_.FUNCTION, optional: true, nullable: true}
266 // doing conversion of all elements to string
267 var ins = validator_.validateArgs([args.insertionData.columns, args.insertionData.values], [
268 {name : 'columns', type : types_.ARRAY, values : types_.STRING},
269 {name : 'values', type : types_.ARRAY, values : types_.STRING}
273 'providerId': this.providerId,
274 'dataId': this.dataId,
276 'insertionData': args.insertionData
280 native_.call('SQLDataControlConsumer_insert', nativeParam, function(result) {
281 if (result.status == 'success') {
282 if (args.successCallback) {
283 args.successCallback(result['requestId'], result['result']);
286 if (result.status == 'error') {
287 if (args.errorCallback) {
288 var err = result['result'];
289 var e = new WebAPIException(err.name, err.message);
290 args.errorCallback(result['requestId'], e);
295 if (native_.isFailure(syncResult)) {
296 throw native_.getErrorObject(syncResult);
300 SQLDataControlConsumer.prototype.update = function() {
301 var args = validator_.validateArgs(arguments, [
302 {'name': 'reqId', 'type': types_.LONG},
303 {'name': 'updateData', 'type': types_.DICTIONARY},
304 {'name': 'where', 'type': types_.STRING},
305 {'name': 'successCallback', 'type': types_.FUNCTION, optional: true, nullable: true},
306 {'name': 'errorCallback', 'type': types_.FUNCTION, optional: true, nullable: true}
310 'providerId': this.providerId,
311 'dataId': this.dataId,
314 'updateData': args.updateData
318 native_.call('SQLDataControlConsumer_update', nativeParam, function(result) {
319 if (result.status == 'success') {
320 if (args.successCallback) {
321 args.successCallback(result['requestId']);
324 if (result.status == 'error') {
325 if (args.errorCallback) {
326 var err = result['result'];
327 var e = new WebAPIException(err.name, err.message);
328 args.errorCallback(result['requestId'], e);
333 if (native_.isFailure(syncResult)) {
334 throw native_.getErrorObject(syncResult);
338 SQLDataControlConsumer.prototype.remove = function() {
339 var args = validator_.validateArgs(arguments, [
340 {'name': 'reqId', 'type': types_.LONG},
341 {'name': 'where', 'type': types_.STRING},
342 {'name': 'successCallback', 'type': types_.FUNCTION, optional: true, nullable: true},
343 {'name': 'errorCallback', 'type': types_.FUNCTION, optional: true, nullable: true}
347 'providerId': this.providerId,
348 'dataId': this.dataId,
354 native_.call('SQLDataControlConsumer_remove', nativeParam, function(result) {
355 if (result.status == 'success') {
356 if (args.successCallback) {
357 args.successCallback(result['requestId']);
360 if (result.status == 'error') {
361 if (args.errorCallback) {
362 var err = result['result'];
363 var e = new WebAPIException(err.name, err.message);
364 args.errorCallback(result['requestId'], e);
369 if (native_.isFailure(syncResult)) {
370 throw native_.getErrorObject(syncResult);
375 SQLDataControlConsumer.prototype.select = function() {
376 var args = validator_.validateArgs(arguments, [
377 {'name': 'reqId', 'type': types_.LONG},
378 {'name': 'columns', 'type': types_.ARRAY},
379 {'name': 'where', 'type': types_.STRING},
380 {'name': 'successCallback', 'type': types_.FUNCTION},
381 {'name': 'errorCallback', 'type': types_.FUNCTION, optional: true, nullable: true},
382 {'name': 'page', 'type': types_.LONG, optional: true, nullable: true},
383 {'name': 'maxNumberPerPage', 'type': types_.LONG, optional: true, nullable: true},
384 {'name': 'order', 'type': types_.STRING, optional: true, nullable: true}
388 'providerId': this.providerId,
389 'dataId': this.dataId,
391 'columns': args.columns,
395 nativeParam['page'] = args.page;
397 if (args['maxNumberPerPage']) {
398 nativeParam['maxNumberPerPage'] = args.maxNumberPerPage;
401 nativeParam['order'] = args.order;
405 native_.call('SQLDataControlConsumer_select', nativeParam, function(result) {
406 if (result.status == 'success') {
407 args.successCallback(result['result'], result['requestId']);
409 if (result.status == 'error') {
410 if (args.errorCallback) {
411 var err = result['result'];
412 var e = new WebAPIException(err.name, err.message);
413 args.errorCallback(result['requestId'], e);
418 if (native_.isFailure(syncResult)) {
419 throw native_.getErrorObject(syncResult);
424 function MappedDataControlConsumer() {
425 // constructor of MappedDataControlConsumer
428 MappedDataControlConsumer.prototype = new DataControlConsumerObject();
429 MappedDataControlConsumer.prototype.constructor = MappedDataControlConsumer;
431 MappedDataControlConsumer.prototype.addValue = function() {
432 var args = validator_.validateArgs(arguments, [
433 {'name': 'reqId', 'type': types_.LONG},
434 {'name': 'key', 'type': types_.STRING},
435 {'name': 'value', 'type': types_.STRING},
436 {'name': 'successCallback', 'type': types_.FUNCTION, optional: true, nullable: true},
437 {'name': 'errorCallback', 'type': types_.FUNCTION, optional: true, nullable: true}
441 'providerId': this.providerId,
442 'dataId': this.dataId,
449 native_.call('MappedDataControlConsumer_addValue', nativeParam, function(result) {
450 if (result.status == 'success') {
451 if (args.successCallback) {
452 args.successCallback(result['requestId']);
455 if (result.status == 'error') {
456 if (args.errorCallback) {
457 var err = result['result'];
458 var e = new WebAPIException(err.name, err.message);
459 args.errorCallback(result['requestId'], e);
464 if (native_.isFailure(syncResult)) {
465 throw native_.getErrorObject(syncResult);
470 MappedDataControlConsumer.prototype.removeValue = function() {
471 var args = validator_.validateArgs(arguments, [
472 {'name': 'reqId', 'type': types_.LONG},
473 {'name': 'key', 'type': types_.STRING},
474 {'name': 'value', 'type': types_.STRING},
475 {'name': 'successCallback', 'type': types_.FUNCTION},
476 {'name': 'errorCallback', 'type': types_.FUNCTION, optional: true, nullable: true}
480 'providerId': this.providerId,
481 'dataId': this.dataId,
488 native_.call('MappedDataControlConsumer_removeValue', nativeParam, function(result) {
489 if (result.status == 'success') {
490 args.successCallback(result['requestId']);
492 if (result.status == 'error') {
493 if (args.errorCallback) {
494 var err = result['result'];
495 var e = new WebAPIException(err.name, err.message);
496 args.errorCallback(result['requestId'], e);
501 if (native_.isFailure(syncResult)) {
502 throw native_.getErrorObject(syncResult);
507 MappedDataControlConsumer.prototype.getValue = function() {
508 var args = validator_.validateArgs(arguments, [
509 {'name': 'reqId', 'type': types_.LONG},
510 {'name': 'key', 'type': types_.STRING},
511 {'name': 'successCallback', 'type': types_.FUNCTION},
512 {'name': 'errorCallback', 'type': types_.FUNCTION, optional: true, nullable: true}
516 'providerId': this.providerId,
517 'dataId': this.dataId,
523 native_.call('MappedDataControlConsumer_getValue', nativeParam, function(result) {
524 if (result.status == 'success') {
525 args.successCallback(result['result'], result['requestId']);
527 if (result.status == 'error') {
528 if (args.errorCallback) {
529 var err = result['result'];
530 var e = new WebAPIException(err.name, err.message);
531 args.errorCallback(result['requestId'], e);
536 if (native_.isFailure(syncResult)) {
537 throw native_.getErrorObject(syncResult);
542 MappedDataControlConsumer.prototype.updateValue = function() {
543 var args = validator_.validateArgs(arguments, [
544 {'name': 'reqId', 'type': types_.LONG},
545 {'name': 'key', 'type': types_.STRING},
546 {'name': 'oldValue', 'type': types_.STRING},
547 {'name': 'newValue', 'type': types_.STRING},
548 {'name': 'successCallback', 'type': types_.FUNCTION},
549 {'name': 'errorCallback', 'type': types_.FUNCTION, optional: true, nullable: true}
553 'providerId': this.providerId,
554 'dataId': this.dataId,
557 'oldValue': args.oldValue,
558 'newValue': args.newValue
562 native_.call('MappedDataControlConsumer_updateValue', nativeParam, function(result) {
563 if (result.status == 'success') {
564 args.successCallback(result['requestId']);
566 if (result.status == 'error') {
567 if (args.errorCallback) {
568 var err = result['result'];
569 var e = new WebAPIException(err.name, err.message);
570 args.errorCallback(result['requestId'], e);
575 if (native_.isFailure(syncResult)) {
576 throw native_.getErrorObject(syncResult);
581 exports = new DataControlManager();