1200af35d1532b7cb6ef09bef80f4ce19238fbd7
[platform/framework/web/crosswalk.git] / src / native_client_sdk / src / examples / demo / nacl_io / example.js
1 // Copyright (c) 2012 The Chromium Authors. 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 function moduleDidLoad() {
6   common.hideModule();
7 }
8
9 // Called by the common.js module.
10 function domContentLoaded(name, tc, config, width, height) {
11   navigator.webkitPersistentStorage.requestQuota(1024 * 1024,
12       function(bytes) {
13         common.updateStatus(
14             'Allocated ' + bytes + ' bytes of persistant storage.');
15         common.attachDefaultListeners();
16         common.createNaClModule(name, tc, config, width, height);
17       },
18       function(e) { alert('Failed to allocate space') });
19 }
20
21 // Called by the common.js module.
22 function attachListeners() {
23   var radioEls = document.querySelectorAll('input[type="radio"]');
24   for (var i = 0; i < radioEls.length; ++i) {
25     radioEls[i].addEventListener('click', onRadioClicked);
26   }
27
28   // Wire up the 'click' event for each function's button.
29   var functionEls = document.querySelectorAll('.function');
30   for (var i = 0; i < functionEls.length; ++i) {
31     var functionEl = functionEls[i];
32     var id = functionEl.getAttribute('id');
33     var buttonEl = functionEl.querySelector('button');
34
35     // The function name matches the element id.
36     var func = window[id];
37     buttonEl.addEventListener('click', func);
38   }
39 }
40
41 function onRadioClicked(e) {
42   var divId = this.id.slice(5);  // skip "radio"
43   var functionEls = document.querySelectorAll('.function');
44   for (var i = 0; i < functionEls.length; ++i) {
45     var visible = functionEls[i].id === divId;
46     if (functionEls[i].id === divId)
47       functionEls[i].removeAttribute('hidden');
48     else
49       functionEls[i].setAttribute('hidden', '');
50   }
51 }
52
53 function addNameToSelectElements(cssClass, handle, name) {
54   var text = '[' + handle + '] ' + name;
55   var selectEls = document.querySelectorAll(cssClass);
56   for (var i = 0; i < selectEls.length; ++i) {
57     var optionEl = document.createElement('option');
58     optionEl.setAttribute('value', handle);
59     optionEl.appendChild(document.createTextNode(text));
60     selectEls[i].appendChild(optionEl);
61   }
62 }
63
64 function removeNameFromSelectElements(cssClass, handle) {
65   var optionEls = document.querySelectorAll(cssClass + ' > option');
66   for (var i = 0; i < optionEls.length; ++i) {
67     var optionEl = optionEls[i];
68     if (optionEl.value == handle) {
69       var selectEl = optionEl.parentNode;
70       selectEl.removeChild(optionEl);
71     }
72   }
73 }
74
75 var filehandle_map = {};
76 var dirhandle_map = {};
77
78 function fopen(e) {
79   var filename = document.getElementById('fopenFilename').value;
80   var access = document.getElementById('fopenMode').value;
81   nacl_module.postMessage(makeCall('fopen', filename, access));
82 }
83
84 function fopenResult(filename, filehandle) {
85   filehandle_map[filehandle] = filename;
86
87   addNameToSelectElements('.file-handle', filehandle, filename);
88   common.logMessage('File ' + filename + ' opened successfully.');
89 }
90
91 function fclose(e) {
92   var filehandle = document.getElementById('fcloseHandle').value;
93   nacl_module.postMessage(makeCall('fclose', filehandle));
94 }
95
96 function fcloseResult(filehandle) {
97   var filename = filehandle_map[filehandle];
98   removeNameFromSelectElements('.file-handle', filehandle, filename);
99   common.logMessage('File ' + filename + ' closed successfully.');
100 }
101
102 function fread(e) {
103   var filehandle = document.getElementById('freadHandle').value;
104   var numBytes = document.getElementById('freadBytes').value;
105   nacl_module.postMessage(makeCall('fread', filehandle, numBytes));
106 }
107
108 function freadResult(filehandle, data) {
109   var filename = filehandle_map[filehandle];
110   common.logMessage('Read "' + data + '" from file ' + filename + '.');
111 }
112
113 function fwrite(e) {
114   var filehandle = document.getElementById('fwriteHandle').value;
115   var data = document.getElementById('fwriteData').value;
116   nacl_module.postMessage(makeCall('fwrite', filehandle, data));
117 }
118
119 function fwriteResult(filehandle, bytes_written) {
120   var filename = filehandle_map[filehandle];
121   common.logMessage('Wrote ' + bytes_written + ' bytes to file ' + filename +
122       '.');
123 }
124
125 function fseek(e) {
126   var filehandle = document.getElementById('fseekHandle').value;
127   var offset = document.getElementById('fseekOffset').value;
128   var whence = document.getElementById('fseekWhence').value;
129   nacl_module.postMessage(makeCall('fseek', filehandle, offset, whence));
130 }
131
132 function fseekResult(filehandle, filepos) {
133   var filename = filehandle_map[filehandle];
134   common.logMessage('Seeked to location ' + filepos + ' in file ' + filename +
135       '.');
136 }
137
138 function fflush(e) {
139   var filehandle = document.getElementById('fflushHandle').value;
140   nacl_module.postMessage(makeCall('fflush', filehandle));
141 }
142
143 function fflushResult(filehandle, filepos) {
144   var filename = filehandle_map[filehandle];
145   common.logMessage('flushed ' + filename + '.');
146 }
147
148 function stat(e) {
149   var filename = document.getElementById('statFilename').value;
150   nacl_module.postMessage(makeCall('stat', filename));
151 }
152
153 function statResult(filename, size) {
154   common.logMessage('File ' + filename + ' has size ' + size + '.');
155 }
156
157 function opendir(e) {
158   var dirname = document.getElementById('opendirDirname').value;
159   nacl_module.postMessage(makeCall('opendir', dirname));
160 }
161
162 function opendirResult(dirname, dirhandle) {
163   dirhandle_map[dirhandle] = dirname;
164
165   addNameToSelectElements('.dir-handle', dirhandle, dirname);
166   common.logMessage('Directory ' + dirname + ' opened successfully.');
167 }
168
169 function readdir(e) {
170   var dirhandle = document.getElementById('readdirHandle').value;
171   nacl_module.postMessage(makeCall('readdir', dirhandle));
172 }
173
174 function readdirResult(dirhandle, ino, name) {
175   var dirname = dirhandle_map[dirhandle];
176   if (ino === '') {
177     common.logMessage('End of directory.');
178   } else {
179     common.logMessage('Read entry ("' + name + '", ino = ' + ino +
180                       ') from directory ' + dirname + '.');
181   }
182 }
183
184 function closedir(e) {
185   var dirhandle = document.getElementById('closedirHandle').value;
186   nacl_module.postMessage(makeCall('closedir', dirhandle));
187 }
188
189 function closedirResult(dirhandle) {
190   var dirname = dirhandle_map[dirhandle];
191   delete dirhandle_map[dirhandle];
192
193   removeNameFromSelectElements('.dir-handle', dirhandle, dirname);
194   common.logMessage('Directory ' + dirname + ' closed successfully.');
195 }
196
197 function mkdir(e) {
198   var dirname = document.getElementById('mkdirDirname').value;
199   var mode = document.getElementById('mkdirMode').value;
200   nacl_module.postMessage(makeCall('mkdir', dirname, mode));
201 }
202
203 function mkdirResult(dirname) {
204   common.logMessage('Directory ' + dirname + ' created successfully.');
205 }
206
207 function rmdir(e) {
208   var dirname = document.getElementById('rmdirDirname').value;
209   nacl_module.postMessage(makeCall('rmdir', dirname));
210 }
211
212 function rmdirResult(dirname) {
213   common.logMessage('Directory ' + dirname + ' removed successfully.');
214 }
215
216 function chdir(e) {
217   var dirname = document.getElementById('chdirDirname').value;
218   nacl_module.postMessage(makeCall('chdir', dirname));
219 }
220
221 function chdirResult(dirname) {
222   common.logMessage('Changed directory to: ' + dirname + '.');
223 }
224
225 function getcwd(e) {
226   nacl_module.postMessage(makeCall('getcwd'));
227 }
228
229 function getcwdResult(dirname) {
230   common.logMessage('getcwd: ' + dirname + '.');
231 }
232
233 function gethostbyname(e) {
234   var name = document.getElementById('gethostbynameName').value;
235   nacl_module.postMessage(makeCall('gethostbyname', name));
236 }
237
238 function gethostbynameResult(name, addr_type) {
239   common.logMessage('gethostbyname returned successfully');
240   common.logMessage('h_name = ' + name + '.');
241   common.logMessage('h_addr_type = ' + addr_type + '.');
242   for (var i = 2; i < arguments.length; i++) {
243     common.logMessage('Address number ' + (i-1) + ' = ' + arguments[i] + '.');
244   }
245 }
246
247 function connect(e) {
248   var host = document.getElementById('connectHost').value;
249   var port = document.getElementById('connectPort').value;
250   nacl_module.postMessage(makeCall('connect', host, port));
251 }
252
253 function connectResult(sockhandle) {
254   common.logMessage('connected');
255   addNameToSelectElements('.sock-handle', sockhandle, '[socket]');
256 }
257
258 function recv(e) {
259   var handle = document.getElementById('recvHandle').value;
260   var bufferSize = document.getElementById('recvBufferSize').value;
261   nacl_module.postMessage(makeCall('recv', handle, bufferSize));
262 }
263
264 function recvResult(messageLen, message) {
265   common.logMessage("received " + messageLen + ' bytes: ' + message);
266 }
267
268 function send(e) {
269   var handle = document.getElementById('sendHandle').value;
270   var message = document.getElementById('sendMessage').value;
271   nacl_module.postMessage(makeCall('send', handle, message));
272 }
273
274 function sendResult(sentBytes) {
275   common.logMessage("sent bytes: " + sentBytes);
276 }
277
278 function close(e) {
279   var handle = document.getElementById('closeHandle').value;
280   nacl_module.postMessage(makeCall('close', handle));
281 }
282
283 function closeResult(sock) {
284   removeNameFromSelectElements('.sock-handle', sock, "[socket]");
285   common.logMessage("closed socket: " + sock);
286 }
287
288 /**
289  * Return true when |s| starts with the string |prefix|.
290  *
291  * @param {string} s The string to search.
292  * @param {string} prefix The prefix to search for in |s|.
293  * @return {boolean} Whether |s| starts with |prefix|.
294  */
295 function startsWith(s, prefix) {
296   // indexOf would search the entire string, lastIndexOf(p, 0) only checks at
297   // the first index. See: http://stackoverflow.com/a/4579228
298   return s.lastIndexOf(prefix, 0) === 0;
299 }
300
301 function makeCall(func) {
302   var message = func;
303   for (var i = 1; i < arguments.length; ++i) {
304     message += '\1' + arguments[i];
305   }
306
307   return message;
308 }
309
310 // Called by the common.js module.
311 function handleMessage(message_event) {
312   var msg = message_event.data;
313   if (startsWith(msg, 'Error:')) {
314     common.logMessage(msg);
315   } else {
316     // Result from a function call.
317     var params = msg.split('\1');
318     var funcName = params[0];
319     var funcResultName = funcName + 'Result';
320     var resultFunc = window[funcResultName];
321
322     if (!resultFunc) {
323       common.logMessage('Error: Bad message ' + funcName +
324                         ' received from NaCl module.');
325       return;
326     }
327
328     resultFunc.apply(null, params.slice(1));
329   }
330 }