2015-07-01 16:18:25 +08:00
|
|
|
|
define(function (require, exports, module) {
|
|
|
|
|
var keystr = "iFishMessagePack";
|
2015-07-03 21:04:37 +08:00
|
|
|
|
var step = Math.pow(2, 32);
|
2015-07-01 16:18:25 +08:00
|
|
|
|
|
2015-07-03 21:04:37 +08:00
|
|
|
|
exports.encode = function (item) {
|
|
|
|
|
var buffer = [];
|
|
|
|
|
var keyidx = Math.floor(Math.random() * keystr.length);
|
|
|
|
|
var key = keystr.charCodeAt(keyidx);
|
|
|
|
|
|
|
|
|
|
//helper
|
|
|
|
|
var putInt16 = function (value) {
|
|
|
|
|
value = value || 0;
|
|
|
|
|
for (var i = 0; i < 2; i++) {
|
|
|
|
|
buffer.push(value - (value >> 8 << 8));
|
|
|
|
|
value >>= 8;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var putInt32 = function (value) {
|
|
|
|
|
value = value || 0;
|
|
|
|
|
for (var i = 0; i < 4; i++) {
|
|
|
|
|
buffer.push(value - (value >> 8 << 8));
|
|
|
|
|
value >>= 8;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var putInt64 = function (value) {
|
|
|
|
|
value = value || 0;
|
|
|
|
|
var int1 = value % step;
|
|
|
|
|
var int2 = Math.floor((value - int1) / step);
|
|
|
|
|
putInt32(int1);
|
|
|
|
|
putInt32(int2);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var putBool = function (value) {
|
|
|
|
|
value = value || false;
|
|
|
|
|
buffer.push(value ? 1 : 0);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var putString = function (str, unicode, writeFlag, writeLengthPrefix) {
|
|
|
|
|
str = str || "";
|
|
|
|
|
|
|
|
|
|
if (typeof writeFlag === 'undefined')
|
|
|
|
|
writeFlag = true;
|
|
|
|
|
if (typeof writeLengthPrefix === 'undefined')
|
|
|
|
|
writeLengthPrefix = true;
|
|
|
|
|
unicode &= writeFlag;
|
2015-07-01 16:18:25 +08:00
|
|
|
|
|
2015-07-03 21:04:37 +08:00
|
|
|
|
if (writeFlag) {
|
|
|
|
|
buffer.push(unicode ? 1 : 0);
|
|
|
|
|
}
|
|
|
|
|
if (writeLengthPrefix) {
|
|
|
|
|
putInt32((unicode ? 2 : 1) * str.length);
|
|
|
|
|
}
|
|
|
|
|
for (var i = 0; i < str.length; i++) {
|
|
|
|
|
var code = str.charCodeAt(i);
|
|
|
|
|
if (unicode)
|
|
|
|
|
putInt16(code);
|
|
|
|
|
else buffer.push(code);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//1.
|
|
|
|
|
buffer.push(keyidx);
|
|
|
|
|
//2. keystr
|
|
|
|
|
putString(keystr, false, false, false);
|
|
|
|
|
//3.action
|
|
|
|
|
putString(item.action, false, false);
|
|
|
|
|
//4.success
|
|
|
|
|
putBool(item.success);
|
|
|
|
|
//5.time
|
|
|
|
|
putInt64(item.time.getTime());
|
|
|
|
|
//6.system message
|
|
|
|
|
putBool(item.systemMessage);
|
|
|
|
|
//7.8.
|
|
|
|
|
putInt32(item.sysMsgType);
|
|
|
|
|
putInt32(item.userMsgType);
|
|
|
|
|
//9.content
|
|
|
|
|
putString(item.content);
|
|
|
|
|
//10.color
|
|
|
|
|
putString(item.color, false, false);
|
|
|
|
|
//11.images
|
|
|
|
|
putInt32(item.images ? item.images.length || 0 : 0);
|
|
|
|
|
if (item.images) {
|
|
|
|
|
item.images.forEach(function (image) {
|
|
|
|
|
putString(image, false, false);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
//12.from user
|
|
|
|
|
putString(item.fromUser, false, false);
|
|
|
|
|
//13.images
|
|
|
|
|
putInt32(item.toUsers ? item.toUsers.length || 0 : 0);
|
|
|
|
|
if (item.toUsers) {
|
|
|
|
|
item.toUsers.forEach(function (user) {
|
|
|
|
|
putString(user, false, false);
|
|
|
|
|
});
|
2015-07-01 16:18:25 +08:00
|
|
|
|
}
|
2015-07-03 21:04:37 +08:00
|
|
|
|
|
|
|
|
|
//encrypt
|
|
|
|
|
//for (var j = 1; j < buffer.length; j++) {
|
|
|
|
|
// key = buffer[j] ^= key;
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
console.log(buffer);
|
|
|
|
|
|
|
|
|
|
return buffer;
|
2015-07-01 16:18:25 +08:00
|
|
|
|
};
|
|
|
|
|
|
2015-07-03 21:04:37 +08:00
|
|
|
|
exports.decode = function (data) {
|
|
|
|
|
var dv = new DataView(data, 0);
|
|
|
|
|
var keyIndex = dv.getUint8(0);
|
|
|
|
|
var key = keystr.charCodeAt(keyIndex);
|
2015-07-01 16:18:25 +08:00
|
|
|
|
|
2015-07-03 21:04:37 +08:00
|
|
|
|
//decrypt
|
|
|
|
|
//for (var i = 1; i < dv.byteLength; i++) {
|
|
|
|
|
// var bit = dv.getUint8(i);
|
|
|
|
|
// dv.setUint8(i, bit ^ key);
|
|
|
|
|
// key = bit;
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
var pos = 1;
|
|
|
|
|
|
|
|
|
|
//helper
|
|
|
|
|
var readInt64 = function () {
|
|
|
|
|
var int1 = dv.getInt32(pos, true);
|
|
|
|
|
var int2 = dv.getInt32(pos + 4, true);
|
|
|
|
|
|
|
|
|
|
pos += 8;
|
|
|
|
|
return int2 * step + int1;
|
|
|
|
|
};
|
|
|
|
|
var readString = function (unicode, length) {
|
|
|
|
|
if (typeof (unicode) === 'undefined') {
|
|
|
|
|
unicode = dv.getUint8(pos++) === 1;
|
|
|
|
|
}
|
|
|
|
|
if (typeof (length) === 'undefined') {
|
|
|
|
|
length = dv.getInt32(pos, true);
|
|
|
|
|
pos += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var buffer = [];
|
|
|
|
|
for (var j = 0; j < length; j++) {
|
|
|
|
|
if (unicode) {
|
|
|
|
|
buffer.push(String.fromCharCode(dv.getUint16(pos, true)));
|
|
|
|
|
pos += 2;
|
|
|
|
|
} else {
|
|
|
|
|
buffer.push(String.fromCharCode(dv.getUint8(pos++, true)));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return buffer.join("");
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//check package header
|
|
|
|
|
if (readString(false, keystr.length) !== keystr)
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
var item = {};
|
|
|
|
|
item.action = readString(false);
|
|
|
|
|
item.success = dv.getUint8(pos++) === 1;
|
|
|
|
|
item.time = new Date(readInt64());
|
|
|
|
|
item.systemMessage = dv.getUint8(pos++) === 1;
|
|
|
|
|
item.sysMsgType = dv.getInt32(pos, true);
|
|
|
|
|
pos += 4;
|
|
|
|
|
item.userMsgType = dv.getInt32(pos, true);
|
|
|
|
|
pos += 4;
|
|
|
|
|
item.content = readString();
|
|
|
|
|
item.Color = readString(false);
|
|
|
|
|
var imgCount = dv.getInt32(pos, true);
|
|
|
|
|
pos += 4;
|
|
|
|
|
if (imgCount > 0) {
|
|
|
|
|
item.images = [];
|
|
|
|
|
for (var j = 0; j < imgCount; j++) {
|
|
|
|
|
item.images.push(readString(false));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
item.fromUser = readString(false);
|
|
|
|
|
var toUserCount = dv.getInt32(pos, true);
|
|
|
|
|
pos += 4;
|
|
|
|
|
if (toUserCount > 0) {
|
|
|
|
|
item.toUsers = [];
|
|
|
|
|
for (var j = 0; j < toUserCount; j++) {
|
|
|
|
|
item.images.push(readString(false));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return item;
|
|
|
|
|
};
|
2015-07-01 16:18:25 +08:00
|
|
|
|
});
|