Upstream version 5.34.92.0
[platform/framework/web/crosswalk.git] / src / xwalk / runtime / android / java / src / org / xwalk / runtime / extension / api / device_capabilities / device_capabilities_api.js
1 // Copyright (c) 2013 Intel Corporation. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 var _promises = {};
6 var _next_promise_id = 0;
7 var _listeners = {};
8 // Preserve 4 spaces to hold onattach, ondetach, onconnect and ondisconnect's
9 // callback functions.
10 var _next_listener_id = 4;
11
12 var Promise = requireNative('sysapps_promise').Promise;
13
14 var postMessage = function(msg) {
15   var p = new Promise();
16
17   _promises[_next_promise_id] = p;
18   msg._promise_id = _next_promise_id.toString();
19   _next_promise_id += 1;
20
21   extension.postMessage(JSON.stringify(msg));
22   return p;
23 };
24
25 exports.getCPUInfo = function() {
26   var msg = {
27     'cmd': 'getCPUInfo'
28   };
29   return postMessage(msg);
30 };
31
32 exports.getAVCodecs = function() {
33   var msg = {
34     'cmd': 'getCodecsInfo'
35   };
36   return postMessage(msg);
37 };
38
39 exports.getDisplayInfo = function() {
40   var msg = {
41     'cmd': 'getDisplayInfo'
42   };
43   return postMessage(msg);
44 };
45
46 exports.getMemoryInfo = function() {
47   var msg = {
48     'cmd': 'getMemoryInfo'
49   };
50   return postMessage(msg);
51 };
52
53 exports.getStorageInfo = function() {
54   var msg = {
55     'cmd': 'getStorageInfo'
56   };
57   return postMessage(msg);
58 };
59
60 function _addConstProperty(obj, propertyKey, propertyValue) {
61   Object.defineProperty(obj, propertyKey, {
62     configurable: false,
63     writable: false,
64     value: propertyValue
65   });
66 }
67
68 function _createConstClone(obj) {
69   var const_obj = {};
70   for (var key in obj) {
71     if (Array.isArray(obj[key])) {
72       var obj_array = obj[key];
73       var const_obj_array = [];
74       for (var i = 0; i < obj_array.length; ++i) {
75         var const_sub_obj = {};
76         for (var sub_key in obj_array[i]) {
77           _addConstProperty(const_sub_obj, sub_key, obj_array[i][sub_key]);
78         }
79         const_obj_array.push(const_sub_obj);
80       }
81       _addConstProperty(const_obj, key, const_obj_array);
82     } else {
83       _addConstProperty(const_obj, key, obj[key]);
84     }
85   }
86   return const_obj;
87 }
88
89 extension.setMessageListener(function(json) {
90   var msg = JSON.parse(json);
91
92   if (msg.reply == 'attachStorage' ||
93       msg.reply == 'detachStorage' ||
94       msg.reply == 'connectDisplay' ||
95       msg.reply == 'disconnectDisplay') {
96     for (var id in _listeners) {
97       if (_listeners[id]['eventName'] === msg.eventName) {
98         _listeners[id]['callback'](_createConstClone(msg.data));
99       }
100     }
101     return;
102   }
103
104   if (msg.data.error) {
105     _promises[msg._promise_id].reject(msg.data.error);
106   } else {
107     _promises[msg._promise_id].fulfill(_createConstClone(msg.data)); 
108   }
109
110   delete _promises[msg._promise_id];
111 });
112
113 function _addEventListener(isOn, eventName, callback) {
114   if (typeof eventName !== 'string') {
115     console.log("Invalid parameters of eventName!");
116     return -1;
117   }
118
119   if (!isOn && (typeof callback !== 'function')) {
120     console.log("Invalid parameters of callback!");
121     return -1;
122   }
123
124   if (isOn && (typeof callback !== null) && (typeof callback !== 'function')) {
125     console.log("Invalid parameters of callback!");
126     return -1;
127   }
128
129   var listener = {
130     'eventName': eventName,
131     'callback': callback
132   };
133
134   var listener_id;
135
136   if (isOn) {
137     switch(listener.eventName) {
138       case 'storageattach':
139         _listeners[0] = listener;
140         listener_id = 0;
141         break;
142
143       case 'storagedetach':
144         _listeners[1] = listener;
145         listener_id = 1;
146         break;
147
148       case 'displayconnect':
149         _listeners[2] = listener;
150         listener_id = 2;
151         break;
152
153       case 'displaydisconnect':
154         _listeners[3] = listener;
155         listener_id = 3;
156         break;
157
158       default:
159         console.log("Invalid event name!");
160         break;
161     }
162   } else {
163       listener_id = _next_listener_id;
164       _next_listener_id += 1;
165       _listeners[listener_id] = listener;
166   }
167
168   if (_listeners[listener_id] != null) {
169     var msg = {
170       'cmd': 'addEventListener',
171       'eventName': listener.eventName
172     };
173     extension.postMessage(JSON.stringify(msg));
174   }
175
176   return listener_id;
177 }
178
179 Object.defineProperty(exports, 'onstorageattach', {
180   set: function(callback) {
181     _addEventListener(true, 'storageattach', callback);
182   }
183 });
184
185 Object.defineProperty(exports, 'onstoragedetach', {
186   set: function(callback) {
187     _addEventListener(true, 'storagedetach', callback);
188   }
189 });
190
191 Object.defineProperty(exports, 'ondisplayconnect', {
192   set: function(callback) {
193     _addEventListener(true, 'displayconnect', callback);
194   }
195 });
196
197 Object.defineProperty(exports, 'ondisplaydisconnect', {
198   set: function(callback) {
199     _addEventListener(true, 'displaydisconnect', callback);
200   }
201 });
202
203 exports.addEventListener = function(eventName, callback) {
204   return _addEventListener(false, eventName, callback);
205 }
206
207 var _sendSyncMessage = function(msg) {
208   return extension.internal.sendSyncMessage(JSON.stringify(msg));
209 };