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() {
31 function changeEvent(event) {
34 if (DataType.SQL === event.type.substr(0, 3)) {
35 if (type_.isEmptyObject(this._SQLDataControlCbMap)) {
38 for (var listenerId in this._SQLDataControlCbMap) {
39 if (this._SQLDataControlCbMap.hasOwnProperty(listenerId)) {
41 this._SQLDataControlCbMap[listenerId].providerId ===
43 this._SQLDataControlCbMap[listenerId].dataId === event.dataId
45 successCallback = this._SQLDataControlCbMap[listenerId]
47 if (type_.isFunction(successCallback)) {
48 successCallback(event.type, {
49 columns: event.columns,
57 if (type_.isEmptyObject(this._MAPDataControlCbMap)) {
60 for (var listenerId in this._MAPDataControlCbMap) {
61 if (this._MAPDataControlCbMap.hasOwnProperty(listenerId)) {
63 this._MAPDataControlCbMap[listenerId].providerId ===
65 this._MAPDataControlCbMap[listenerId].dataId === event.dataId
67 successCallback = this._MAPDataControlCbMap[listenerId]
69 if (type_.isFunction(successCallback)) {
70 successCallback(event.type, {
71 columns: event.columns,
81 function _DataControlListenerManager() {
82 this._SQLDataControlCbMap = {};
83 this._MAPDataControlCbMap = {};
84 this.lastListenerId = 0;
85 this.changeEvent = changeEvent.bind(this);
88 _DataControlListenerManager.prototype.addChangeListener = function(
96 if (DataType.SQL === type) {
97 for (var i in this._SQLDataControlCbMap) {
99 this._SQLDataControlCbMap.hasOwnProperty(i) &&
100 this._SQLDataControlCbMap[i].providerId === providerId &&
101 this._SQLDataControlCbMap[i].dataId === dataId
103 _realWatchId = this._SQLDataControlCbMap[i].realWatchId;
107 for (var i in this._MAPDataControlCbMap) {
109 this._MAPDataControlCbMap.hasOwnProperty(i) &&
110 this._MAPDataControlCbMap[i].providerId === providerId &&
111 this._MAPDataControlCbMap[i].dataId === dataId
113 _realWatchId = this._MAPDataControlCbMap[i].realWatchId;
119 var callback = function(result) {
120 if (native_.isFailure(result)) {
121 native_.callIfPossible(errorCallback, native_.getErrorObject(result));
125 var result = native_.call(
126 'DataControlConsumerObject_addChangeListener',
128 providerId: providerId,
135 if (native_.isFailure(result)) {
136 throw native_.getErrorObject(result);
138 result = native_.getResultObject(result);
139 _realWatchId = converter_.toLong(result.watchId, true);
142 type_.isEmptyObject(this._SQLDataControlCbMap) &&
143 type_.isEmptyObject(this._MAPDataControlCbMap)
145 native_.addListener(DATA_CONTROL_MANAGER_LISTENER_ID, this.changeEvent);
149 if (DataType.SQL === type) {
150 this._SQLDataControlCbMap[++this.lastListenerId] = {
151 providerId: providerId,
153 changeCallback: changeCallback,
154 realWatchId: _realWatchId
157 this._MAPDataControlCbMap[++this.lastListenerId] = {
158 providerId: providerId,
160 changeCallback: changeCallback,
161 realWatchId: _realWatchId
165 return this.lastListenerId;
168 _DataControlListenerManager.prototype.removeChangeListener = function(
174 var _realWatchId = 0;
176 DataType.SQL === type &&
177 !type_.isUndefined(this._SQLDataControlCbMap[listenerId])
179 _realWatchId = this._SQLDataControlCbMap[listenerId].realWatchId;
180 delete this._SQLDataControlCbMap[listenerId];
181 for (var i in this._SQLDataControlCbMap) {
183 this._SQLDataControlCbMap.hasOwnProperty(i) &&
184 this._SQLDataControlCbMap[i].realWatchId === _realWatchId
190 DataType.MAP === type &&
191 !type_.isUndefined(this._MAPDataControlCbMap[listenerId])
193 _realWatchId = this._MAPDataControlCbMap[listenerId].realWatchId;
194 delete this._MAPDataControlCbMap[listenerId];
195 for (var i in this._MAPDataControlCbMap) {
197 this._MAPDataControlCbMap.hasOwnProperty(i) &&
198 this._MAPDataControlCbMap[i].realWatchId === _realWatchId
204 console.log('Type invalid or listener was not added');
208 if (0 != _realWatchId) {
209 native_.call('DataControlConsumerObject_removeChangeListener', {
210 watchId: _realWatchId
214 type_.isEmptyObject(this._SQLDataControlCbMap) &&
215 type_.isEmptyObject(this._MAPDataControlCbMap)
217 native_.removeListener(DATA_CONTROL_MANAGER_LISTENER_ID);
222 return _DataControlListenerManager;
225 var listenersManager = new DataControlListenersManager();
227 function SetReadOnlyProperty(obj, n, v) {
228 Object.defineProperty(obj, n, { value: v, writable: false });
231 function DataControlManager() {
232 // constructor of DataControlManager
235 var privUtils_ = xwalk.utils;
237 var getDataControlConsumer = function(providerId, dataId, type) {
238 privUtils_.checkPrivilegeAccess(privUtils_.privilege.DATACONTROL_CONSUMER);
239 var args = validator_.validateArgs(arguments, [
240 { name: 'providerId', type: types_.STRING },
241 { name: 'dataId', type: types_.STRING },
242 { name: 'type', type: types_.ENUM, values: [DataType.SQL, DataType.MAP] }
245 var returnObject = null;
246 if (DataType.SQL === type) {
247 returnObject = new SQLDataControlConsumer();
248 } else if (DataType.MAP == type) {
249 returnObject = new MappedDataControlConsumer();
252 SetReadOnlyProperty(returnObject, 'type', args.type); // read only property
253 SetReadOnlyProperty(returnObject, 'providerId', args.providerId); // read only
255 SetReadOnlyProperty(returnObject, 'dataId', args.dataId); // read only property
260 DataControlManager.prototype.getDataControlConsumer = function(providerId, dataId, type) {
261 return getDataControlConsumer.apply(null, arguments);
264 function DataControlConsumerObject() {
265 // constructor of DataControlConsumerObject
268 DataControlConsumerObject.prototype.addChangeListener = function() {
269 var args = validator_.validateArgs(arguments, [
271 name: 'dataChangeCallback',
272 type: types_.FUNCTION,
276 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
279 var type = DataType.SQL;
280 if (this instanceof MappedDataControlConsumer) {
284 return listenersManager.addChangeListener(
288 args.dataChangeCallback,
293 DataControlConsumerObject.prototype.removeChangeListener = function() {
294 var args = validator_.validateArgs(arguments, [
295 { name: 'watchId', type: types_.LONG }
298 var type = DataType.SQL;
299 if (this instanceof MappedDataControlConsumer) {
303 listenersManager.removeChangeListener(
311 function SQLDataControlConsumer() {
312 // constructor of SQLDataControlConsumer
315 SQLDataControlConsumer.prototype = new DataControlConsumerObject();
316 SQLDataControlConsumer.prototype.constructor = SQLDataControlConsumer;
318 SQLDataControlConsumer.prototype.insert = function() {
319 var args = validator_.validateArgs(arguments, [
320 { name: 'reqId', type: types_.LONG },
321 { name: 'insertionData', type: types_.DICTIONARY },
323 name: 'successCallback',
324 type: types_.FUNCTION,
328 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
331 // doing conversion of all elements to string
332 var ins = validator_.validateArgs(
333 [args.insertionData.columns, args.insertionData.values],
335 { name: 'columns', type: types_.ARRAY, values: types_.STRING },
336 { name: 'values', type: types_.ARRAY, values: types_.STRING }
341 providerId: this.providerId,
344 insertionData: args.insertionData
347 var syncResult = native_.call('SQLDataControlConsumer_insert', nativeParam, function(
350 if (result.status == 'success') {
351 if (args.successCallback) {
352 args.successCallback(result['requestId'], result['result']);
355 if (result.status == 'error') {
356 if (args.errorCallback) {
357 var err = result['result'];
358 var e = new WebAPIException(err.name, err.message);
359 args.errorCallback(result['requestId'], e);
364 if (native_.isFailure(syncResult)) {
365 throw native_.getErrorObject(syncResult);
369 SQLDataControlConsumer.prototype.update = function() {
370 var args = validator_.validateArgs(arguments, [
371 { name: 'reqId', type: types_.LONG },
372 { name: 'updateData', type: types_.DICTIONARY },
373 { name: 'where', type: types_.STRING },
375 name: 'successCallback',
376 type: types_.FUNCTION,
380 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
384 providerId: this.providerId,
388 updateData: args.updateData
391 var syncResult = native_.call('SQLDataControlConsumer_update', nativeParam, function(
394 if (result.status == 'success') {
395 if (args.successCallback) {
396 args.successCallback(result['requestId']);
399 if (result.status == 'error') {
400 if (args.errorCallback) {
401 var err = result['result'];
402 var e = new WebAPIException(err.name, err.message);
403 args.errorCallback(result['requestId'], e);
408 if (native_.isFailure(syncResult)) {
409 throw native_.getErrorObject(syncResult);
413 SQLDataControlConsumer.prototype.remove = function() {
414 var args = validator_.validateArgs(arguments, [
415 { name: 'reqId', type: types_.LONG },
416 { name: 'where', type: types_.STRING },
418 name: 'successCallback',
419 type: types_.FUNCTION,
423 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
427 providerId: this.providerId,
433 var syncResult = native_.call('SQLDataControlConsumer_remove', nativeParam, function(
436 if (result.status == 'success') {
437 if (args.successCallback) {
438 args.successCallback(result['requestId']);
441 if (result.status == 'error') {
442 if (args.errorCallback) {
443 var err = result['result'];
444 var e = new WebAPIException(err.name, err.message);
445 args.errorCallback(result['requestId'], e);
450 if (native_.isFailure(syncResult)) {
451 throw native_.getErrorObject(syncResult);
455 SQLDataControlConsumer.prototype.select = function() {
456 var args = validator_.validateArgs(arguments, [
457 { name: 'reqId', type: types_.LONG },
458 { name: 'columns', type: types_.ARRAY },
459 { name: 'where', type: types_.STRING },
460 { name: 'successCallback', type: types_.FUNCTION },
461 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
462 { name: 'page', type: types_.LONG, optional: true, nullable: true },
463 { name: 'maxNumberPerPage', type: types_.LONG, optional: true, nullable: true },
464 { name: 'order', type: types_.STRING, optional: true, nullable: true }
468 providerId: this.providerId,
471 columns: args.columns,
475 nativeParam['page'] = args.page;
477 if (args['maxNumberPerPage']) {
478 nativeParam['maxNumberPerPage'] = args.maxNumberPerPage;
481 nativeParam['order'] = args.order;
484 var syncResult = native_.call('SQLDataControlConsumer_select', nativeParam, function(
487 if (result.status == 'success') {
488 args.successCallback(result['result'], result['requestId']);
490 if (result.status == 'error') {
491 if (args.errorCallback) {
492 var err = result['result'];
493 var e = new WebAPIException(err.name, err.message);
494 args.errorCallback(result['requestId'], e);
499 if (native_.isFailure(syncResult)) {
500 throw native_.getErrorObject(syncResult);
504 function MappedDataControlConsumer() {
505 // constructor of MappedDataControlConsumer
508 MappedDataControlConsumer.prototype = new DataControlConsumerObject();
509 MappedDataControlConsumer.prototype.constructor = MappedDataControlConsumer;
511 MappedDataControlConsumer.prototype.addValue = function() {
512 var args = validator_.validateArgs(arguments, [
513 { name: 'reqId', type: types_.LONG },
514 { name: 'key', type: types_.STRING },
515 { name: 'value', type: types_.STRING },
517 name: 'successCallback',
518 type: types_.FUNCTION,
522 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
526 providerId: this.providerId,
533 var syncResult = native_.call(
534 'MappedDataControlConsumer_addValue',
537 if (result.status == 'success') {
538 if (args.successCallback) {
539 args.successCallback(result['requestId']);
542 if (result.status == 'error') {
543 if (args.errorCallback) {
544 var err = result['result'];
545 var e = new WebAPIException(err.name, err.message);
546 args.errorCallback(result['requestId'], e);
552 if (native_.isFailure(syncResult)) {
553 throw native_.getErrorObject(syncResult);
557 MappedDataControlConsumer.prototype.removeValue = function() {
558 var args = validator_.validateArgs(arguments, [
559 { name: 'reqId', type: types_.LONG },
560 { name: 'key', type: types_.STRING },
561 { name: 'value', type: types_.STRING },
562 { name: 'successCallback', type: types_.FUNCTION },
563 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
567 providerId: this.providerId,
574 var syncResult = native_.call(
575 'MappedDataControlConsumer_removeValue',
578 if (result.status == 'success') {
579 args.successCallback(result['requestId']);
581 if (result.status == 'error') {
582 if (args.errorCallback) {
583 var err = result['result'];
584 var e = new WebAPIException(err.name, err.message);
585 args.errorCallback(result['requestId'], e);
591 if (native_.isFailure(syncResult)) {
592 throw native_.getErrorObject(syncResult);
596 MappedDataControlConsumer.prototype.getValue = function() {
597 var args = validator_.validateArgs(arguments, [
598 { name: 'reqId', type: types_.LONG },
599 { name: 'key', type: types_.STRING },
600 { name: 'successCallback', type: types_.FUNCTION },
601 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
605 providerId: this.providerId,
611 var syncResult = native_.call(
612 'MappedDataControlConsumer_getValue',
615 if (result.status == 'success') {
616 args.successCallback(result['result'], result['requestId']);
618 if (result.status == 'error') {
619 if (args.errorCallback) {
620 var err = result['result'];
621 var e = new WebAPIException(err.name, err.message);
622 args.errorCallback(result['requestId'], e);
628 if (native_.isFailure(syncResult)) {
629 throw native_.getErrorObject(syncResult);
633 MappedDataControlConsumer.prototype.updateValue = function() {
634 var args = validator_.validateArgs(arguments, [
635 { name: 'reqId', type: types_.LONG },
636 { name: 'key', type: types_.STRING },
637 { name: 'oldValue', type: types_.STRING },
638 { name: 'newValue', type: types_.STRING },
639 { name: 'successCallback', type: types_.FUNCTION },
640 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
644 providerId: this.providerId,
648 oldValue: args.oldValue,
649 newValue: args.newValue
652 var syncResult = native_.call(
653 'MappedDataControlConsumer_updateValue',
656 if (result.status == 'success') {
657 args.successCallback(result['requestId']);
659 if (result.status == 'error') {
660 if (args.errorCallback) {
661 var err = result['result'];
662 var e = new WebAPIException(err.name, err.message);
663 args.errorCallback(result['requestId'], e);
669 if (native_.isFailure(syncResult)) {
670 throw native_.getErrorObject(syncResult);
674 exports = new DataControlManager();