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