Skip to content

Instantly share code, notes, and snippets.

@maxmalakhov
Last active December 19, 2015 09:29
Show Gist options
  • Save maxmalakhov/5932954 to your computer and use it in GitHub Desktop.
Save maxmalakhov/5932954 to your computer and use it in GitHub Desktop.
Viewer.MessageProcessor = function () {
var self = this;
this.findHandlerByMessage = function (message) {
for (var i = 0; i < this.Handlers.length; i++) {
if (this.Handlers[i].message == message) {
return this.Handlers[i].handler;
}
}
return undefined;
};
this.findHandlerByCode = function (code) {
for (var i = 0; i < this.Handlers.length; i++) {
if (this.Handlers[i].code == code) {
return this.Handlers[i].handler;
}
}
};
this.processMessage = function (paramsMessage) {
// console.dir(paramsMessage);
if ((paramsMessage.event.type != 'open') && (paramsMessage.event.type != 'close')) {
var fileReader = new FileReader();
fileReader.onload = function (evt) {
var arrayBuffer = evt.target.result;
var parser = new Viewer.ViewerParser({ arrayBuffer: arrayBuffer });
var cmdCode = parser.getCommandCode();
handler = self.findHandlerByCode(cmdCode);
if (handler != undefined) {
var cmdLength = parser.getCommandLength();
handler({ cmdCode: cmdCode, cmdLength: cmdLength, parserObject: parser });
}
// console.dir(parser);
};
fileReader.onerror = function(evt) {
console.error("File could not be read! Code " + evt.target.error.code);
if (evt.target.error.code === 2) {
console.error("Disable local file restrictions in your Browser");
}
};
fileReader.readAsArrayBuffer(paramsMessage.event.data);
} else {
var handler = self.findHandlerByMessage(paramsMessage.message);
if (handler != undefined) {
handler();
}
}
};
this.Handlers = [];
this.addHandler = function (paramsHandler) {
this.Handlers.push({ message: paramsHandler.message, handler: paramsHandler.handler, code: paramsHandler.code });
};
this.SendIntMessage = function (command, message) {
var buffer = new ArrayBuffer((2 + message.length) * 4); // create buffer with length equal length of message + 2 4 bytes integers
var longs = new Uint32Array(buffer, 0, message.length + 2); // reserve in buffer places for Int32 from message and 2 Int32 for message and message length
longs[0] = command; // first object is command
longs[1] = message.length * 4; // second object is length of command
for (var i = 0; i < message.length; i++) {
longs[i + 2] = message[i];
}
this.WebSocket.sendMessage(buffer);
};
this.SendCommand = function(command) {
var buffer = new ArrayBuffer(8); // create buffer with length equal 8 (2 4-bytes integers)
var longs = new Uint32Array(buffer, 0, 2); // reserve in buffer two places for Int32 objects
longs[0] = command; // first object is command
longs[1] = 0; // second object is length of empty command that should be 0
// on this state buffer should be filled
this.WebSocket.sendMessage(buffer);
};
this.SendMessage = function (command, message) {
var buffer = new ArrayBuffer(8 + message.length); // create buffer with length equal length of message + 2 4 bytes integers
var longs = new Uint32Array(buffer, 0, 2); // reserve in buffer two places for Int32 objects
longs[0] = command; // first object is command
longs[1] = message.length; // second object is length of command
if (message.length != 0) {
// let's write command
var bytes = new Uint8Array(buffer, 8, message.length); // reserve rest of places for one byte (string is array of bytes)
for (var i = 0; i < message.length; i++) {
bytes[i] = message.charCodeAt(i); // and fill buffer by chars from message
}
}
// on this state buffer should be filled
this.WebSocket.sendMessage(buffer);
};
this.SendEndTransactionReceived = function (bytesReceived) {
var buffer = new ArrayBuffer(8 + bytesReceived.length);
var longs = new Uint32Array(buffer, 0, 2);
longs[0] = Viewer.messages.RFB_END_SCREEN_TRANSACTION_RECEIVED;
longs[1] = bytesReceived.length;
//console.log("SendEndTransactionReceived:");
//console.log("longs[0] = " + longs[0]);
//console.log("longs[1] = " + longs[1]);
var bytes = new Uint8Array(buffer, 8, bytesReceived.length);
for (var i = 0; i < bytesReceived.length; i++) {
bytes[i] = bytesReceived[i];
//console.log("bytes[" + i + "] = " + bytes[i]);
}
this.WebSocket.sendMessage(buffer);
};
this.SetInternalConnect = function (paramsSession) {
var strToConnect = paramsSession.clientId + '@' + paramsSession.sessionId + '|';
this.SendMessage(Viewer.messages.RFB_VIEWER_TO_REPEATER, strToConnect);
console.debug('Send RFB_VIEWER_TO_REPEATER',strToConnect);
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment