| 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" | |
| if (data.length != Constants.ENDHDR || data.readUInt32LE(0) != Constants.ENDSIG) | |
| throw Utils.Errors.INVALID_END; | |
| // 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); | |
| }, | |
| toBinary : function() { | |
| var b = new Buffer(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; | |
| }, | |
| toString : function() { | |
| return '{\n' + | |
| '\t"diskEntries" : ' + _volumeEntries + ",\n" + | |
| '\t"totalEntries" : ' + _totalEntries + ",\n" + | |
| '\t"size" : ' + _size + " bytes,\n" + | |
| '\t"offset" : 0x' + _offset.toString(16).toUpperCase() + ",\n" + | |
| '\t"commentLength" : 0x' + _commentLength + "\n" + | |
| '}'; | |
| } | |
| } | |
| }; |