watch-xdelta
Version:
smart-watch xdelta script
63 lines (52 loc) • 1.61 kB
JavaScript
/**
* header头信息有关的操作
*/
;
import co from 'co';
import bfs from 'babel-fs';
export const DIFF_INDEX = 20; // diff文件在头信息中的起始位置
/**
* 初始化差分文件的头信息, 具体结构可以看doc/header.docx
* @param {Number} diffLen diff块的总大小
* @param {Number} blk 分块的数量
* @param {Number} blksize 分块的大小
* @param {Number} oldFromLenB 老固件有多少个字节
* @param {Number} newFromLenB 新固件有多少个字节
* @return{Promise.<Buffer>} 头信息
*
*/
export const generatorHeader = co.wrap(function *({blk, blksize, oldFromLenB, newFromLenB, xdeltaFiles}) {
let 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
yield fillInDiff(buf, DIFF_INDEX, xdeltaFiles);
return buf;
});
/**
* 填充每个diff文件的大小
* @param {Buffer} buf 头信息
* @param {Number} xdeltaIndex 第一个diff文件的位置
* @param {Array} xdeltaFiles diff文件数组
*
*/
const fillInDiff = co.wrap(function *(buf, xdeltaIndex, xdeltaFiles) {
for(let i=0, len=xdeltaFiles.length; i<len; i++) {
let file = xdeltaFiles[i];
let dStat = yield bfs.stat(file);
let dSize = dStat.size;
buf.writeUInt32LE(dSize, xdeltaIndex);
xdeltaIndex += 4;
}
});