weechat-protocol.js: implement hash table parsing

This commit is contained in:
Philippe Proulx 2013-10-05 16:42:44 -04:00
parent de163d6bc9
commit 74192c3df4
1 changed files with 46 additions and 5 deletions

View File

@ -9,7 +9,15 @@ var WeeChatProtocol = function() {
'lon': this._getStrNumber,
'tim': this._getTime,
'buf': this._getString,
'arr': this._getArray
'arr': this._getArray,
'htb': this._getHashTable
};
this._typesStr = {
'chr': this._strDirect,
'str': this._strDirect,
'int': this._strToString,
'tim': this._strToString,
'ptr': this._strDirect
};
};
WeeChatProtocol._uia2s = function(uia) {
@ -34,11 +42,23 @@ WeeChatProtocol.prototype = {
return boundCb();
},
_getStrNumber: function() {
var len = new Uint8Array(this._getSlice(1))[0];
var len = this._getByte();
var str = this._getSlice(len);
return WeeChatProtocol._uia2s(new Uint8Array(str));
},
_strDirect: function(obj) {
return obj;
},
_strToString: function(obj) {
return obj.toString();
},
_objToString: function(obj, type) {
var cb = this._typesStr[type];
var boundCb = cb.bind(this);
return boundCb(obj);
},
_getInfo: function() {
var info = {};
info.key = this._getString();
@ -80,7 +100,7 @@ WeeChatProtocol.prototype = {
},
_getTime: function() {
var str = this._getStrNumber();
return new Date(parseInt(str));
},
_getInt: function() {
@ -91,11 +111,14 @@ WeeChatProtocol.prototype = {
((parsedData[2] & 0xff) << 8) |
(parsedData[3] & 0xff);
},
_getChar: function() {
_getByte: function() {
var parsedData = new Uint8Array(this._getSlice(1));
return parsedData[0];
},
_getChar: function() {
return String.fromCharCode(this._getByte());
},
_getString: function() {
var l = this._getInt();
@ -110,7 +133,7 @@ WeeChatProtocol.prototype = {
},
_getHeader: function() {
var len = this._getInt();
var comp = this._getChar();
var comp = this._getByte();
return {
length: len,
@ -131,6 +154,24 @@ WeeChatProtocol.prototype = {
};
}
},
_getHashTable: function() {
var self = this;
var typeKeys, typeValues, count;
var dict = {};
typeKeys = this._getType();
typeValues = this._getType();
count = this._getInt();
for (var i = 0; i < count; ++i) {
var key = self._runType(typeKeys);
var keyStr = self._objToString(key, typeKeys);
var value = self.runType(typeValues);
dict[keyStr] = value;
}
return dict;
},
_getArray: function() {
var self = this;
var type;