1 | var ByteBuffer = require('bytebuffer');
|
2 |
|
3 |
|
4 | var Type = {
|
5 | None: 0,
|
6 | String: 1,
|
7 | Int32: 2,
|
8 | Float32: 3,
|
9 | Pointer: 4,
|
10 | WideString: 5,
|
11 | Color: 6,
|
12 | UInt64: 7,
|
13 | End: 8,
|
14 | };
|
15 |
|
16 | exports.decode = function(buffer) {
|
17 | var object = {};
|
18 | if(typeof(buffer.readUint8) != "function"){
|
19 | buffer = ByteBuffer.wrap(buffer);
|
20 | }
|
21 | if(buffer.offset != buffer.limit) {
|
22 | while (true) {
|
23 | var type = buffer.readUint8();
|
24 |
|
25 | if (type == Type.End)
|
26 | break;
|
27 |
|
28 | var name = buffer.readCString();
|
29 |
|
30 | switch (type) {
|
31 | case Type.None:
|
32 | object[name] = exports.decode(buffer);
|
33 | break;
|
34 |
|
35 | case Type.String:
|
36 | object[name] = buffer.readCString();
|
37 | break;
|
38 |
|
39 | case Type.Int32:
|
40 | case Type.Color:
|
41 | case Type.Pointer:
|
42 | object[name] = buffer.readInt32();
|
43 | break;
|
44 |
|
45 | case Type.UInt64:
|
46 | object[name] = buffer.readUint64();
|
47 | break;
|
48 |
|
49 | case Type.Float32:
|
50 | object[name] = buffer.readFloat();
|
51 | break;
|
52 | }
|
53 | }
|
54 | }
|
55 |
|
56 | return object;
|
57 | };
|
58 |
|
59 | function _encode(object, buffer, name){
|
60 | switch (typeof object) {
|
61 | case 'object':
|
62 | buffer.writeByte(Type.None);
|
63 | buffer.writeCString(name);
|
64 | for (var index in object) {
|
65 | _encode(object[index], buffer, index);
|
66 | }
|
67 | buffer.writeByte(Type.End);
|
68 | break;
|
69 | case 'string':
|
70 | buffer.writeByte(Type.String);
|
71 | buffer.writeCString(name);
|
72 | buffer.writeCString(object ? object : null);
|
73 | break;
|
74 | case 'number':
|
75 | buffer.writeByte(Type.String);
|
76 | buffer.writeCString(name);
|
77 | buffer.writeCString(object.toString());
|
78 | break;
|
79 | }
|
80 | }
|
81 | exports.encode = function(object){
|
82 | if(!buffer){
|
83 | var buffer = new ByteBuffer();
|
84 | }
|
85 | for(var item in object){
|
86 | if(object.hasOwnProperty(item)) {
|
87 | _encode(object[item], buffer, item);
|
88 | }
|
89 | }
|
90 | buffer.writeByte(Type.End);
|
91 | buffer.flip();
|
92 | return buffer;
|
93 | }; |
\ | No newline at end of file |