diff --git a/js/websockets.js b/js/websockets.js index df62a1a..6344fa9 100644 --- a/js/websockets.js +++ b/js/websockets.js @@ -324,7 +324,7 @@ weechat.factory('handlers', ['$rootScope', 'colors', 'pluginManager', function($ }]); weechat.factory('connection', ['$rootScope', '$log', 'handlers', 'colors', function($rootScope, $log, handlers, colors) { - protocol = new Protocol(); + protocol = new WeeChatProtocol(); var websocket = null; diff --git a/js/weechat-protocol.js b/js/weechat-protocol.js index ea6dda8..19c79e5 100644 --- a/js/weechat-protocol.js +++ b/js/weechat-protocol.js @@ -1,180 +1,194 @@ -var Protocol = function() { - var self = this; - - var getInfo = function() { - var info = {}; - info.key = getString(); - info.value = getString(); - return info; +var WeeChatProtocol = function() { + var self = this; + + var getInfo = function() { + var info = {}; + info.key = getString(); + info.value = getString(); + + return info; + }; + + var getHdata = function() { + var paths; + var count; + var objs = []; + var hpath = getString(); + + keys = getString().split(','); + paths = hpath.split('/'); + count = getInt(); + + keys = keys.map(function(key) { + return key.split(':'); + }); + + for (var i = 0; i < count; i++) { + var tmp = {}; + + tmp.pointers = paths.map(function(path) { + return getPointer(); + }); + keys.forEach(function(key) { + tmp[key[0]] = runType(key[1]); + }); + objs.push(tmp); }; - var getHdata = function() { - var paths; - var count; - var objs = []; - var hpath = getString(); - - - - keys = getString().split(','); - paths = hpath.split('/'); - count = getInt(); - - keys = keys.map(function(key) { - return key.split(':'); - }); - var i; - for (i = 0; i < count; i++) { - var tmp = {}; - - tmp.pointers = paths.map(function(path) { - return getPointer(); - }); - - keys.forEach(function(key) { - tmp[key[0]] = runType(key[1]); - }); - objs.push(tmp); - }; - return objs; - }; - - function getPointer() { - var l = getChar(); - - var pointer = getSlice(l) - var parsed_data = new Uint8Array(pointer); + return objs; + }; + + function getPointer() { + var l = getChar(); + var pointer = getSlice(l) + var parsed_data = new Uint8Array(pointer); + + return _uiatos(parsed_data); + }; + + var _uiatos = function(uia) { + var _str = []; + for (var c = 0; c < uia.length; c++) { + _str[c] = String.fromCharCode(uia[c]); + } + + return decodeURIComponent(escape(_str.join(""))); + }; + + var getInt = function() { + var parsed_data = new Uint8Array(getSlice(4)); + var i = ((parsed_data[0] & 0xff) << 24) | ((parsed_data[1] & 0xff) << 16) | ((parsed_data[2] & 0xff) << 8) | (parsed_data[3] & 0xff); + + return i; + }; + + var getChar = function() { + var parsed_data = new Uint8Array(getSlice(1)); + + return parsed_data[0]; + }; + + var getString = function() { + var l = getInt(); + + if (l > 0) { + var s = getSlice(l); + var parsed_data = new Uint8Array(s); + return _uiatos(parsed_data); + } - }; + return ""; + }; - var _uiatos =function(uia) { - var _str = []; - for (var c = 0; c < uia.length; c++) { - _str[c] = String.fromCharCode(uia[c]); - } - return decodeURIComponent(escape(_str.join(""))); - }; + var getSlice = function(length) { + var slice = self.data.slice(0,length); - var getInt = function() { - var parsed_data = new Uint8Array(getSlice(4)); - var i = ((parsed_data[0] & 0xff) << 24) | ((parsed_data[1] & 0xff) << 16) | ((parsed_data[2] & 0xff) << 8) | (parsed_data[3] & 0xff); - return i; - - }; + self.data = self.data.slice(length); - var getChar = function() { - var parsed_data = new Uint8Array(getSlice(1)); - return parsed_data[0]; - }; + return slice; + }; - var getString = function() { - var l = getInt(); - if (l > 0) { - var s = getSlice(l); - var parsed_data = new Uint8Array(s); - return _uiatos(parsed_data); - } - return ""; - }; + var getType = function() { + var t = getSlice(3); - var getSlice = function(length) { - var slice = self.data.slice(0,length); - self.data = self.data.slice(length); - return slice; - }; + return _uiatos(new Uint8Array(t)); + }; - var getType = function() { - var t = getSlice(3); - return _uiatos(new Uint8Array(t)); - }; + var runType = function(type) { + if (type in types) { + return types[type](); + } + }; - var runType = function(type) { - if (type in types) { - return types[type](); - } - 0; - }; + var getHeader = function() { + var len = getInt(); + var comp = getChar(); - var getHeader = function() { - return { - length: getInt(), - compression: getChar(), - } + return { + length: len, + compression: comp, }; + }; - var getId = function() { - return getString(); - } + var getId = function() { + return getString(); + } + + var getObject = function() { + var type = getType(); - var getObject = function() { - var type = getType(); - if (type) { - return object = { - type: type, - content: runType(type), - } + if (type) { + return object = { + type: type, + content: runType(type), } } + } - self.parse = function(data) { - self.setData(data); - var header = getHeader(); - var id = getId(); - var objects = []; - var object = getObject(); - while(object) { - objects.push(object); - object = getObject(); - } - return { - header: header, - id: id, - objects: objects, - } + self.parse = function(data) { + self.setData(data); + + var header = getHeader(); + var id = getId(); + var objects = []; + var object = getObject(); + + while(object) { + objects.push(object); + object = getObject(); } - self.setData = function (data) { - self.data = data; + return { + header: header, + id: id, + objects: objects, }; + } + + self.setData = function (data) { + self.data = data; + }; - function array() { - var type; - var count; - var values; - - type = getType(); - count = getInt(); - values = []; - var i; - for (i = 0; i < count; i++) { - values.push(runType(type)); - }; - return values; - } - - var types = { - chr: getChar, - "int": getInt, - str: getString, - inf: getInfo, - hda: getHdata, - ptr: getPointer, - lon: getPointer, - tim: getPointer, - buf: getString, - arr: array + function array() { + var type; + var count; + var values; + + type = getType(); + count = getInt(); + values = []; + + for (var i = 0; i < count; i++) { + values.push(runType(type)); }; + + return values; + } + + var types = { + chr: getChar, + "int": getInt, + str: getString, + inf: getInfo, + hda: getHdata, + ptr: getPointer, + lon: getPointer, + tim: getPointer, + buf: getString, + arr: array + }; + //TODO: IMPLEMENT THIS STUFF // chr: this.getChar, // 'int': getInt, - // hacks +// hacks - // hacks +// hacks // htb: getHashtable, // inf: Protocol.getInfo, // inl: getInfolist, // }, -} +};