123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- var Utils = require("../util"),
- Constants = Utils.Constants;
- module.exports = function () {
- var _verMade = 20,
- _version = 10,
- _flags = 0,
- _method = 0,
- _time = 0,
- _crc = 0,
- _compressedSize = 0,
- _size = 0,
- _fnameLen = 0,
- _extraLen = 0,
- _comLen = 0,
- _diskStart = 0,
- _inattr = 0,
- _attr = 0,
- _offset = 0;
- _verMade |= Utils.isWin ? 0x0a00 : 0x0300;
-
-
- _flags |= Constants.FLG_EFS;
- var _dataHeader = {};
- function setTime(val) {
- val = new Date(val);
- _time =
- (((val.getFullYear() - 1980) & 0x7f) << 25) |
- ((val.getMonth() + 1) << 21) |
- (val.getDate() << 16) |
-
- (val.getHours() << 11) |
- (val.getMinutes() << 5) |
- (val.getSeconds() >> 1);
- }
- setTime(+new Date());
- return {
- get made() {
- return _verMade;
- },
- set made(val) {
- _verMade = val;
- },
- get version() {
- return _version;
- },
- set version(val) {
- _version = val;
- },
- get flags() {
- return _flags;
- },
- set flags(val) {
- _flags = val;
- },
- get method() {
- return _method;
- },
- set method(val) {
- switch (val) {
- case Constants.STORED:
- this.version = 10;
- case Constants.DEFLATED:
- default:
- this.version = 20;
- }
- _method = val;
- },
- get time() {
- return new Date(((_time >> 25) & 0x7f) + 1980, ((_time >> 21) & 0x0f) - 1, (_time >> 16) & 0x1f, (_time >> 11) & 0x1f, (_time >> 5) & 0x3f, (_time & 0x1f) << 1);
- },
- set time(val) {
- setTime(val);
- },
- get crc() {
- return _crc;
- },
- set crc(val) {
- _crc = Math.max(0, val) >>> 0;
- },
- get compressedSize() {
- return _compressedSize;
- },
- set compressedSize(val) {
- _compressedSize = Math.max(0, val) >>> 0;
- },
- get size() {
- return _size;
- },
- set size(val) {
- _size = Math.max(0, val) >>> 0;
- },
- get fileNameLength() {
- return _fnameLen;
- },
- set fileNameLength(val) {
- _fnameLen = val;
- },
- get extraLength() {
- return _extraLen;
- },
- set extraLength(val) {
- _extraLen = val;
- },
- get commentLength() {
- return _comLen;
- },
- set commentLength(val) {
- _comLen = val;
- },
- get diskNumStart() {
- return _diskStart;
- },
- set diskNumStart(val) {
- _diskStart = Math.max(0, val) >>> 0;
- },
- get inAttr() {
- return _inattr;
- },
- set inAttr(val) {
- _inattr = Math.max(0, val) >>> 0;
- },
- get attr() {
- return _attr;
- },
- set attr(val) {
- _attr = Math.max(0, val) >>> 0;
- },
-
- get fileAttr() {
- return _attr ? (((_attr >>> 0) | 0) >> 16) & 0xfff : 0;
- },
- get offset() {
- return _offset;
- },
- set offset(val) {
- _offset = Math.max(0, val) >>> 0;
- },
- get encripted() {
- return (_flags & 1) === 1;
- },
- get entryHeaderSize() {
- return Constants.CENHDR + _fnameLen + _extraLen + _comLen;
- },
- get realDataOffset() {
- return _offset + Constants.LOCHDR + _dataHeader.fnameLen + _dataHeader.extraLen;
- },
- get dataHeader() {
- return _dataHeader;
- },
- loadDataHeaderFromBinary: function ( input) {
- var data = input.slice(_offset, _offset + Constants.LOCHDR);
-
- if (data.readUInt32LE(0) !== Constants.LOCSIG) {
- throw new Error(Utils.Errors.INVALID_LOC);
- }
- _dataHeader = {
-
- version: data.readUInt16LE(Constants.LOCVER),
-
- flags: data.readUInt16LE(Constants.LOCFLG),
-
- method: data.readUInt16LE(Constants.LOCHOW),
-
- time: data.readUInt32LE(Constants.LOCTIM),
-
- crc: data.readUInt32LE(Constants.LOCCRC),
-
- compressedSize: data.readUInt32LE(Constants.LOCSIZ),
-
- size: data.readUInt32LE(Constants.LOCLEN),
-
- fnameLen: data.readUInt16LE(Constants.LOCNAM),
-
- extraLen: data.readUInt16LE(Constants.LOCEXT)
- };
- },
- loadFromBinary: function ( data) {
-
- if (data.length !== Constants.CENHDR || data.readUInt32LE(0) !== Constants.CENSIG) {
- throw new Error(Utils.Errors.INVALID_CEN);
- }
-
- _verMade = data.readUInt16LE(Constants.CENVEM);
-
- _version = data.readUInt16LE(Constants.CENVER);
-
- _flags = data.readUInt16LE(Constants.CENFLG);
-
- _method = data.readUInt16LE(Constants.CENHOW);
-
- _time = data.readUInt32LE(Constants.CENTIM);
-
- _crc = data.readUInt32LE(Constants.CENCRC);
-
- _compressedSize = data.readUInt32LE(Constants.CENSIZ);
-
- _size = data.readUInt32LE(Constants.CENLEN);
-
- _fnameLen = data.readUInt16LE(Constants.CENNAM);
-
- _extraLen = data.readUInt16LE(Constants.CENEXT);
-
- _comLen = data.readUInt16LE(Constants.CENCOM);
-
- _diskStart = data.readUInt16LE(Constants.CENDSK);
-
- _inattr = data.readUInt16LE(Constants.CENATT);
-
- _attr = data.readUInt32LE(Constants.CENATX);
-
- _offset = data.readUInt32LE(Constants.CENOFF);
- },
- dataHeaderToBinary: function () {
-
- var data = Buffer.alloc(Constants.LOCHDR);
-
- data.writeUInt32LE(Constants.LOCSIG, 0);
-
- data.writeUInt16LE(_version, Constants.LOCVER);
-
- data.writeUInt16LE(_flags, Constants.LOCFLG);
-
- data.writeUInt16LE(_method, Constants.LOCHOW);
-
- data.writeUInt32LE(_time, Constants.LOCTIM);
-
- data.writeUInt32LE(_crc, Constants.LOCCRC);
-
- data.writeUInt32LE(_compressedSize, Constants.LOCSIZ);
-
- data.writeUInt32LE(_size, Constants.LOCLEN);
-
- data.writeUInt16LE(_fnameLen, Constants.LOCNAM);
-
- data.writeUInt16LE(_extraLen, Constants.LOCEXT);
- return data;
- },
- entryHeaderToBinary: function () {
-
- var data = Buffer.alloc(Constants.CENHDR + _fnameLen + _extraLen + _comLen);
-
- data.writeUInt32LE(Constants.CENSIG, 0);
-
- data.writeUInt16LE(_verMade, Constants.CENVEM);
-
- data.writeUInt16LE(_version, Constants.CENVER);
-
- data.writeUInt16LE(_flags, Constants.CENFLG);
-
- data.writeUInt16LE(_method, Constants.CENHOW);
-
- data.writeUInt32LE(_time, Constants.CENTIM);
-
- data.writeUInt32LE(_crc, Constants.CENCRC);
-
- data.writeUInt32LE(_compressedSize, Constants.CENSIZ);
-
- data.writeUInt32LE(_size, Constants.CENLEN);
-
- data.writeUInt16LE(_fnameLen, Constants.CENNAM);
-
- data.writeUInt16LE(_extraLen, Constants.CENEXT);
-
- data.writeUInt16LE(_comLen, Constants.CENCOM);
-
- data.writeUInt16LE(_diskStart, Constants.CENDSK);
-
- data.writeUInt16LE(_inattr, Constants.CENATT);
-
- data.writeUInt32LE(_attr, Constants.CENATX);
-
- data.writeUInt32LE(_offset, Constants.CENOFF);
-
- data.fill(0x00, Constants.CENHDR);
- return data;
- },
- toJSON: function () {
- const bytes = function (nr) {
- return nr + " bytes";
- };
- return {
- made: _verMade,
- version: _version,
- flags: _flags,
- method: Utils.methodToString(_method),
- time: this.time,
- crc: "0x" + _crc.toString(16).toUpperCase(),
- compressedSize: bytes(_compressedSize),
- size: bytes(_size),
- fileNameLength: bytes(_fnameLen),
- extraLength: bytes(_extraLen),
- commentLength: bytes(_comLen),
- diskNumStart: _diskStart,
- inAttr: _inattr,
- attr: _attr,
- offset: _offset,
- entryHeaderSize: bytes(Constants.CENHDR + _fnameLen + _extraLen + _comLen)
- };
- },
- toString: function () {
- return JSON.stringify(this.toJSON(), null, "\t");
- }
- };
- };
|