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" + | |
'}'; | |
} | |
} | |
}; |