weechat-protocol.js: implement hash table parsing
This commit is contained in:
parent
de163d6bc9
commit
74192c3df4
1 changed files with 46 additions and 5 deletions
|
@ -9,7 +9,15 @@ var WeeChatProtocol = function() {
|
||||||
'lon': this._getStrNumber,
|
'lon': this._getStrNumber,
|
||||||
'tim': this._getTime,
|
'tim': this._getTime,
|
||||||
'buf': this._getString,
|
'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) {
|
WeeChatProtocol._uia2s = function(uia) {
|
||||||
|
@ -34,11 +42,23 @@ WeeChatProtocol.prototype = {
|
||||||
return boundCb();
|
return boundCb();
|
||||||
},
|
},
|
||||||
_getStrNumber: function() {
|
_getStrNumber: function() {
|
||||||
var len = new Uint8Array(this._getSlice(1))[0];
|
var len = this._getByte();
|
||||||
var str = this._getSlice(len);
|
var str = this._getSlice(len);
|
||||||
|
|
||||||
return WeeChatProtocol._uia2s(new Uint8Array(str));
|
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() {
|
_getInfo: function() {
|
||||||
var info = {};
|
var info = {};
|
||||||
info.key = this._getString();
|
info.key = this._getString();
|
||||||
|
@ -91,11 +111,14 @@ WeeChatProtocol.prototype = {
|
||||||
((parsedData[2] & 0xff) << 8) |
|
((parsedData[2] & 0xff) << 8) |
|
||||||
(parsedData[3] & 0xff);
|
(parsedData[3] & 0xff);
|
||||||
},
|
},
|
||||||
_getChar: function() {
|
_getByte: function() {
|
||||||
var parsedData = new Uint8Array(this._getSlice(1));
|
var parsedData = new Uint8Array(this._getSlice(1));
|
||||||
|
|
||||||
return parsedData[0];
|
return parsedData[0];
|
||||||
},
|
},
|
||||||
|
_getChar: function() {
|
||||||
|
return String.fromCharCode(this._getByte());
|
||||||
|
},
|
||||||
_getString: function() {
|
_getString: function() {
|
||||||
var l = this._getInt();
|
var l = this._getInt();
|
||||||
|
|
||||||
|
@ -110,7 +133,7 @@ WeeChatProtocol.prototype = {
|
||||||
},
|
},
|
||||||
_getHeader: function() {
|
_getHeader: function() {
|
||||||
var len = this._getInt();
|
var len = this._getInt();
|
||||||
var comp = this._getChar();
|
var comp = this._getByte();
|
||||||
|
|
||||||
return {
|
return {
|
||||||
length: len,
|
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() {
|
_getArray: function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
var type;
|
var type;
|
||||||
|
|
Loading…
Reference in a new issue