parseExtraField.js 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. var binary = require('binary');
  2. module.exports = function(extraField, vars) {
  3. var extra;
  4. // Find the ZIP64 header, if present.
  5. while(!extra && extraField && extraField.length) {
  6. var candidateExtra = binary.parse(extraField)
  7. .word16lu('signature')
  8. .word16lu('partsize')
  9. .word64lu('uncompressedSize')
  10. .word64lu('compressedSize')
  11. .word64lu('offset')
  12. .word64lu('disknum')
  13. .vars;
  14. if(candidateExtra.signature === 0x0001) {
  15. extra = candidateExtra;
  16. } else {
  17. // Advance the buffer to the next part.
  18. // The total size of this part is the 4 byte header + partsize.
  19. extraField = extraField.slice(candidateExtra.partsize + 4);
  20. }
  21. }
  22. extra = extra || {};
  23. if (vars.compressedSize === 0xffffffff)
  24. vars.compressedSize = extra.compressedSize;
  25. if (vars.uncompressedSize === 0xffffffff)
  26. vars.uncompressedSize= extra.uncompressedSize;
  27. if (vars.offsetToLocalFileHeader === 0xffffffff)
  28. vars.offsetToLocalFileHeader= extra.offset;
  29. return extra;
  30. };