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 new Error(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
|