| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | var Utils = require("../util"),    Constants = Utils.Constants;/* The entries in the end of central directory */module.exports = function () {    var _volumeEntries = 0,        _totalEntries = 0,        _size = 0,        _offset = 0,        _commentLength = 0;    return {        get diskEntries() {            return _volumeEntries;        },        set diskEntries(/*Number*/ val) {            _volumeEntries = _totalEntries = val;        },        get totalEntries() {            return _totalEntries;        },        set totalEntries(/*Number*/ val) {            _totalEntries = _volumeEntries = val;        },        get size() {            return _size;        },        set size(/*Number*/ val) {            _size = val;        },        get offset() {            return _offset;        },        set offset(/*Number*/ val) {            _offset = val;        },        get commentLength() {            return _commentLength;        },        set commentLength(/*Number*/ val) {            _commentLength = val;        },        get mainHeaderSize() {            return Constants.ENDHDR + _commentLength;        },        loadFromBinary: function (/*Buffer*/ data) {            // data should be 22 bytes and start with "PK 05 06"            // or be 56+ bytes and start with "PK 06 06" for Zip64            if (                (data.length !== Constants.ENDHDR || data.readUInt32LE(0) !== Constants.ENDSIG) &&                (data.length < Constants.ZIP64HDR || data.readUInt32LE(0) !== Constants.ZIP64SIG)            ) {                throw Utils.Errors.INVALID_END();            }            if (data.readUInt32LE(0) === Constants.ENDSIG) {                // number of entries on this volume                _volumeEntries = data.readUInt16LE(Constants.ENDSUB);                // total number of entries                _totalEntries = data.readUInt16LE(Constants.ENDTOT);                // central directory size in bytes                _size = data.readUInt32LE(Constants.ENDSIZ);                // offset of first CEN header                _offset = data.readUInt32LE(Constants.ENDOFF);                // zip file comment length                _commentLength = data.readUInt16LE(Constants.ENDCOM);            } else {                // number of entries on this volume                _volumeEntries = Utils.readBigUInt64LE(data, Constants.ZIP64SUB);                // total number of entries                _totalEntries = Utils.readBigUInt64LE(data, Constants.ZIP64TOT);                // central directory size in bytes                _size = Utils.readBigUInt64LE(data, Constants.ZIP64SIZE);                // offset of first CEN header                _offset = Utils.readBigUInt64LE(data, Constants.ZIP64OFF);                _commentLength = 0;            }        },        toBinary: function () {            var b = Buffer.alloc(Constants.ENDHDR + _commentLength);            // "PK 05 06" signature            b.writeUInt32LE(Constants.ENDSIG, 0);            b.writeUInt32LE(0, 4);            // number of entries on this volume            b.writeUInt16LE(_volumeEntries, Constants.ENDSUB);            // total number of entries            b.writeUInt16LE(_totalEntries, Constants.ENDTOT);            // central directory size in bytes            b.writeUInt32LE(_size, Constants.ENDSIZ);            // offset of first CEN header            b.writeUInt32LE(_offset, Constants.ENDOFF);            // zip file comment length            b.writeUInt16LE(_commentLength, Constants.ENDCOM);            // fill comment memory with spaces so no garbage is left there            b.fill(" ", Constants.ENDHDR);            return b;        },        toJSON: function () {            // creates 0x0000 style output            const offset = function (nr, len) {                let offs = nr.toString(16).toUpperCase();                while (offs.length < len) offs = "0" + offs;                return "0x" + offs;            };            return {                diskEntries: _volumeEntries,                totalEntries: _totalEntries,                size: _size + " bytes",                offset: offset(_offset, 4),                commentLength: _commentLength            };        },        toString: function () {            return JSON.stringify(this.toJSON(), null, "\t");        }    };};// Misspelled
 |