Home | History | Annotate | Download | only in socket
      1 // Copyright (c) 2013 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 // Called by the common.js module.
      6 function attachListeners() {
      7   document.getElementById('connectForm').addEventListener('submit', doConnect);
      8   document.getElementById('sendForm').addEventListener('submit', doSend);
      9   document.getElementById('listenForm').addEventListener('submit', doListen);
     10   document.getElementById('closeButton').addEventListener('click', doClose);
     11   if (typeof chrome.socket === 'undefined') {
     12     document.getElementById('createServer').style.display = 'none';
     13   }
     14 }
     15 
     16 // Called by the common.js module.
     17 function moduleDidLoad() {
     18   // The module is not hidden by default so we can easily see if the plugin
     19   // failed to load.
     20   common.hideModule();
     21 }
     22 
     23 var msgTcpCreate = 't;'
     24 var msgUdpCreate = 'u;'
     25 var msgSend = 's;'
     26 var msgClose = 'c;'
     27 
     28 function doConnect(event) {
     29   // Send a request message. See also socket.cc for the request format.
     30   event.preventDefault();
     31   var hostname = document.getElementById('hostname').value;
     32   var type = document.getElementById('connect_type').value;
     33   common.logMessage(type);
     34   if (type == 'tcp')
     35 
     36 {
     37     common.logMessage(type);
     38     common.naclModule.postMessage(msgTcpCreate + hostname);
     39 }
     40   else
     41     common.naclModule.postMessage(msgUdpCreate + hostname);
     42 }
     43 
     44 function doSend(event) {
     45   // Send a request message. See also socket.cc for the request format.
     46   event.preventDefault();
     47   var message = document.getElementById('message').value;
     48   while (message.indexOf('\\n') > -1)
     49     message = message.replace('\\n', '\n');
     50   common.naclModule.postMessage(msgSend + message);
     51 }
     52 
     53 var listeningSocket = -1;
     54 var creatingServer = false;
     55 
     56 function runUDPEchoServer(port) {
     57   common.logMessage("Listening on UDP port: " + port);
     58   chrome.socket.create("udp", {}, function(createInfo) {
     59     listeningSocket = createInfo.socketId;
     60     creatingServer = false;
     61     chrome.socket.bind(listeningSocket,
     62                        '127.0.0.1',
     63                        port,
     64                        function(result) {
     65       if (result !== 0) {
     66         common.logMessage("Bind failed: " + result);
     67         return;
     68       }
     69 
     70       var recvCallback = function(recvFromInfo) {
     71         if (recvFromInfo.resultCode <= 0) {
     72           common.logMessage("recvFrom failed: " + recvFromInfo.resultCode);
     73           return;
     74         }
     75 
     76         chrome.socket.sendTo(listeningSocket,
     77                              recvFromInfo.data,
     78                              recvFromInfo.address,
     79                              recvFromInfo.port,
     80                              function(sendToInfo) {
     81           if (readInfo.resultCode < 0) {
     82             common.logMessage("SentTo failed: " + sendToInfo.bytesWritten);
     83             return;
     84           }
     85         })
     86 
     87         chrome.socket.recvFrom(listeningSocket, recvCallback);
     88       }
     89 
     90       chrome.socket.recvFrom(listeningSocket, recvCallback);
     91     })
     92   })
     93 }
     94 
     95 function runTCPEchoServer(port) {
     96   common.logMessage("Listening on TCP port: " + port);
     97   chrome.socket.create("tcp", {}, function(createInfo) {
     98     listeningSocket = createInfo.socketId;
     99     creatingServer = false;
    100     chrome.socket.listen(listeningSocket,
    101                          '0.0.0.0',
    102                          port,
    103                          10,
    104                          function(result) {
    105       if (result !== 0) {
    106         common.logMessage("Listen failed: " + result);
    107         return;
    108       }
    109 
    110       chrome.socket.accept(listeningSocket, function(acceptInfo) {
    111         if (result !== 0) {
    112           common.logMessage("Accept failed: " + result);
    113           return;
    114         }
    115 
    116         var newSock = acceptInfo.socketId;
    117 
    118         var readCallback = function(readInfo) {
    119           if (readInfo.resultCode < 0) {
    120             common.logMessage("Read failed: " + readInfo.resultCode);
    121             chrome.socket.destroy(newSock);
    122             return;
    123           }
    124 
    125           chrome.socket.write(newSock, readInfo.data, function(writeInfo) {})
    126           chrome.socket.read(newSock, readCallback);
    127         }
    128 
    129         chrome.socket.read(newSock, readCallback);
    130       })
    131     })
    132   })
    133 }
    134 
    135 function doListen(event) {
    136   // Listen a the given port.
    137   event.preventDefault();
    138   if (typeof chrome.socket === 'undefined') {
    139     common.logMessage("Local JavaScript echo server is only available in " +
    140                       "the packaged version of the this example.");
    141     return;
    142   }
    143 
    144   var port = document.getElementById('port').value;
    145   var type = document.getElementById('listen_type').value;
    146   port = parseInt(port);
    147 
    148   if (listeningSocket !== -1) {
    149      chrome.socket.destroy(listeningSocket);
    150      listeningSocket = -1;
    151   }
    152 
    153   if (creatingServer)
    154     return;
    155   creatingServer = true;
    156 
    157   if (type == 'tcp')
    158     runTCPEchoServer(port)
    159   else
    160     runUDPEchoServer(port)
    161 }
    162 
    163 function doClose() {
    164   // Send a request message. See also socket.cc for the request format.
    165   common.naclModule.postMessage(msgClose);
    166 }
    167 
    168 function handleMessage(message) {
    169   common.logMessage(message.data);
    170 }
    171