Home | History | Annotate | Download | only in nacl_io
      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.createNaClModule(name, tc, config, width, height);
     16         common.attachDefaultListeners();
     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 stat(e) {
    139   var filename = document.getElementById('statFilename').value;
    140   nacl_module.postMessage(makeCall('stat', filename));
    141 }
    142 
    143 function statResult(filename, size) {
    144   common.logMessage('File ' + filename + ' has size ' + size + '.');
    145 }
    146 
    147 function opendir(e) {
    148   var dirname = document.getElementById('opendirDirname').value;
    149   nacl_module.postMessage(makeCall('opendir', dirname));
    150 }
    151 
    152 function opendirResult(dirname, dirhandle) {
    153   dirhandle_map[dirhandle] = dirname;
    154 
    155   addNameToSelectElements('.dir-handle', dirhandle, dirname);
    156   common.logMessage('Directory ' + dirname + ' opened successfully.');
    157 }
    158 
    159 function readdir(e) {
    160   var dirhandle = document.getElementById('readdirHandle').value;
    161   nacl_module.postMessage(makeCall('readdir', dirhandle));
    162 }
    163 
    164 function readdirResult(dirhandle, ino, name) {
    165   var dirname = dirhandle_map[dirhandle];
    166   if (ino === '') {
    167     common.logMessage('End of directory.');
    168   } else {
    169     common.logMessage('Read entry ("' + name + '", ino = ' + ino +
    170                       ') from directory ' + dirname + '.');
    171   }
    172 }
    173 
    174 function closedir(e) {
    175   var dirhandle = document.getElementById('closedirHandle').value;
    176   nacl_module.postMessage(makeCall('closedir', dirhandle));
    177 }
    178 
    179 function closedirResult(dirhandle) {
    180   var dirname = dirhandle_map[dirhandle];
    181   delete dirhandle_map[dirhandle];
    182 
    183   removeNameFromSelectElements('.dir-handle', dirhandle, dirname);
    184   common.logMessage('Directory ' + dirname + ' closed successfully.');
    185 }
    186 
    187 function mkdir(e) {
    188   var dirname = document.getElementById('mkdirDirname').value;
    189   var mode = document.getElementById('mkdirMode').value;
    190   nacl_module.postMessage(makeCall('mkdir', dirname, mode));
    191 }
    192 
    193 function mkdirResult(dirname) {
    194   common.logMessage('Directory ' + dirname + ' created successfully.');
    195 }
    196 
    197 function gethostbyname(e) {
    198   var name = document.getElementById('gethostbynameName').value;
    199   nacl_module.postMessage(makeCall('gethostbyname', name));
    200 }
    201 
    202 
    203 function gethostbynameResult(name, addr_type) {
    204   common.logMessage('gethostbyname returned successfully\n');
    205   common.logMessage('h_name = ' + name + '.\n');
    206   common.logMessage('h_addr_type = ' + addr_type + '.\n');
    207   for (var i = 2; i < arguments.length; i++) {
    208     common.logMessage('Address number ' + (i-1) + ' = ' + arguments[i] + '.\n');
    209   }
    210   common.logMessage('\n');
    211 }
    212 
    213 /**
    214  * Return true when |s| starts with the string |prefix|.
    215  *
    216  * @param {string} s The string to search.
    217  * @param {string} prefix The prefix to search for in |s|.
    218  * @return {boolean} Whether |s| starts with |prefix|.
    219  */
    220 function startsWith(s, prefix) {
    221   // indexOf would search the entire string, lastIndexOf(p, 0) only checks at
    222   // the first index. See: http://stackoverflow.com/a/4579228
    223   return s.lastIndexOf(prefix, 0) === 0;
    224 }
    225 
    226 function makeCall(func) {
    227   var message = func;
    228   for (var i = 1; i < arguments.length; ++i) {
    229     message += '\1' + arguments[i];
    230   }
    231 
    232   return message;
    233 }
    234 
    235 // Called by the common.js module.
    236 function handleMessage(message_event) {
    237   var msg = message_event.data;
    238   if (startsWith(msg, 'Error:')) {
    239     common.logMessage(msg);
    240   } else {
    241     // Result from a function call.
    242     var params = msg.split('\1');
    243     var funcName = params[0];
    244     var funcResultName = funcName + 'Result';
    245     var resultFunc = window[funcResultName];
    246 
    247     if (!resultFunc) {
    248       common.logMessage('Error: Bad message ' + funcName +
    249                         ' received from NaCl module.');
    250       return;
    251     }
    252 
    253     resultFunc.apply(null, params.slice(1));
    254   }
    255 }
    256