sockets-for-cordova/socket.js

198 lines
6.2 KiB
JavaScript
Raw Normal View History

var exec = require('cordova/exec');
var SOCKET_EVENT = "SOCKET_EVENT";
var CORDOVA_SERVICE_NAME = "SocketsForCordova";
function Socket() {
this.onData = null;
this.onClose = null;
this.onError = null;
this.socketKey = guid();
}
//Socket.create = function(/*callback*/) {
//
// var socket = new Socket();
//
// function socketEventHandler(event) {
//
// var payload = event.payload;
//
// if (payload.socketKey !== socket.socketKey) {
// return;
// }
//
// switch(payload.type) {
// case "Close":
// console.debug("SocketsForCordova: Close event, socket key: " + payload.socketKey);
// window.document.removeEventListener(SOCKET_EVENT, socketEventHandler);
// socket.onClose();
// break;
// case "DataReceived":
// console.debug("SocketsForCordova: DataReceived event, socket key: " + payload.socketKey);
// socket.onData(new Int8Array(payload.data));
// break;
// case "Error":
// console.debug("SocketsForCordova: Error event, socket key: " + payload.socketKey);
// socket.onError(payload.errorMessage);
// break;
// default:
// console.error("SocketsForCordova: Unknown event type " + payload.type + ", socket key: " + payload.socketKey);
// break;
// }
// }
//
// window.document.addEventListener(SOCKET_EVENT, socketEventHandler);
//
// exec(
// function() {
// console.debug("SocketsForCordova: Socket object successfully constructed.");
// callback(socket);
// },
// function(error) {
// console.error("SocketsForCordova: Unexpected error during constructing Socket object. Error: " + error);
// },
// CORDOVA_SERVICE_NAME,
// "create",
// [ socket.socketKey ]);
//};
Socket.prototype.open = function (host, port, success, error) {
function socketEventHandler(event) {
var payload = event.payload;
if (payload.socketKey !== socket.socketKey) {
return;
}
switch(payload.type) {
case "Close":
console.debug("SocketsForCordova: Close event, socket key: " + payload.socketKey);
window.document.removeEventListener(SOCKET_EVENT, socketEventHandler);
socket.onClose();
break;
case "DataReceived":
console.debug("SocketsForCordova: DataReceived event, socket key: " + payload.socketKey);
socket.onData(new Int8Array(payload.data));
break;
case "Error":
console.debug("SocketsForCordova: Error event, socket key: " + payload.socketKey);
socket.onError(payload.errorMessage);
break;
default:
console.error("SocketsForCordova: Unknown event type " + payload.type + ", socket key: " + payload.socketKey);
break;
}
}
exec(
function() {
console.debug("SocketsForCordova: Socket successfully opened.");
window.document.addEventListener(SOCKET_EVENT, socketEventHandler);
if (success)
success();
},
function(errorMessage) {
console.error("SocketsForCordova: Error during opening socket. Error: " + errorMessage);
if (error)
error(errorMessage);
},
CORDOVA_SERVICE_NAME,
"open",
[ this.socketKey, host, port ]);
};
Socket.prototype.write = function (data, success, error) {
var dataToWrite = data instanceof Int8Array
? Socket._copyToArray(data)
: data;
exec(
function() {
console.debug("SocketsForCordova: Data successfully written to socket. Number of bytes: " + data.length);
if (success)
success();
},
function(errorMessage) {
console.error("SocketsForCordova: Error during writing data to socket. Error: " + errorMessage);
if (error)
error(errorMessage);
},
CORDOVA_SERVICE_NAME,
"write",
[ this.socketKey, dataToWrite ]);
};
Socket._copyToArray = function(array) {
var outputArray = new Array(array.length);
for (var i = 0; i < array.length; i++) {
outputArray[i] = array[i];
}
return outputArray;
};
Socket.prototype.shutdownWrite = function () {
exec(
function() {
console.debug("SocketsForCordova: Shutdown write successfully called.");
},
function(errorMessage) {
console.error("SocketsForCordova: Error when call shutdownWrite on socket. Error: " + errorMessage);
},
CORDOVA_SERVICE_NAME,
"shutdownWrite",
[ this.socketKey ]);
};
Socket.prototype.close = function () {
exec(
function() {
console.debug("SocketsForCordova: Close successfully called.");
},
function(errorMessage) {
console.error("SocketsForCordova: Error when call close on socket. Error: " + errorMessage);
},
CORDOVA_SERVICE_NAME,
"close",
[ this.socketKey ]);
};
Socket.dispatchEvent = function(event) {
var eventReceive = document.createEvent('Events');
eventReceive.initEvent(SOCKET_EVENT, true, true);
eventReceive.payload = event;
document.dispatchEvent(eventReceive);
};
var guid = (function() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return function() {
return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
s4() + '-' + s4() + s4() + s4();
};
})();
// Register event dispatcher for Windows Phone
if (navigator.userAgent.match(/iemobile/i)) {
window.document.addEventListener("deviceready", function() {
exec(
Socket.dispatchEvent,
function(errorMessage) {
console.error("SocketsForCordova: Cannot register WP event dispatcher, Error: " + errorMessage);
},
CORDOVA_SERVICE_NAME,
"registerWPEventDispatcher",
[ ]);
});
}
module.exports = Socket;