watch-xdelta
Version:
smart-watch xdelta script
121 lines (97 loc) • 3.19 kB
JavaScript
/**
* header头信息有关的操作
*/
;
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
Object.defineProperty(exports, '__esModule', {
value: true
});
var _co = require('co');
var _co2 = _interopRequireDefault(_co);
var _babelFs = require('babel-fs');
var _babelFs2 = _interopRequireDefault(_babelFs);
var DIFF_INDEX = 20;exports.DIFF_INDEX = DIFF_INDEX;
// diff文件在头信息中的起始位置
/**
* 初始化差分文件的头信息, 具体结构可以看doc/header.docx
* @param {Number} diffLen diff块的总大小
* @param {Number} blk 分块的数量
* @param {Number} blksize 分块的大小
* @param {Number} oldFromLenB 老固件有多少个字节
* @param {Number} newFromLenB 新固件有多少个字节
* @return{Promise.<Buffer>} 头信息
*
*/
var generatorHeader = _co2['default'].wrap(_regeneratorRuntime.mark(function callee$0$0(_ref) {
var blk = _ref.blk;
var blksize = _ref.blksize;
var oldFromLenB = _ref.oldFromLenB;
var newFromLenB = _ref.newFromLenB;
var xdeltaFiles = _ref.xdeltaFiles;
var buf;
return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
buf = new Buffer(DIFF_INDEX + xdeltaFiles.length * 4);
//wth1
buf.writeUInt8(0x77, 0);
buf.writeUInt8(0x74, 1);
buf.writeUInt8(0x68, 2);
buf.writeUInt8(0x31, 3);
//block-size
buf.writeUInt32LE(blksize, 4);
//diffNum
buf.writeUInt32LE(blk, 8);
//oldFromLenB
buf.writeUInt32LE(oldFromLenB, 12);
//newFromLenB
buf.writeUInt32LE(newFromLenB, 16);
//diffLen1...diffLenN
context$1$0.next = 11;
return fillInDiff(buf, DIFF_INDEX, xdeltaFiles);
case 11:
return context$1$0.abrupt('return', buf);
case 12:
case 'end':
return context$1$0.stop();
}
}, callee$0$0, this);
}));
exports.generatorHeader = generatorHeader;
/**
* 填充每个diff文件的大小
* @param {Buffer} buf 头信息
* @param {Number} xdeltaIndex 第一个diff文件的位置
* @param {Array} xdeltaFiles diff文件数组
*
*/
var fillInDiff = _co2['default'].wrap(_regeneratorRuntime.mark(function callee$0$0(buf, xdeltaIndex, xdeltaFiles) {
var i, len, file, dStat, dSize;
return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
i = 0, len = xdeltaFiles.length;
case 1:
if (!(i < len)) {
context$1$0.next = 12;
break;
}
file = xdeltaFiles[i];
context$1$0.next = 5;
return _babelFs2['default'].stat(file);
case 5:
dStat = context$1$0.sent;
dSize = dStat.size;
buf.writeUInt32LE(dSize, xdeltaIndex);
xdeltaIndex += 4;
case 9:
i++;
context$1$0.next = 1;
break;
case 12:
case 'end':
return context$1$0.stop();
}
}, callee$0$0, this);
}));