UNPKG

4.95 kBJavaScriptView Raw
1var Utils = require("../util"),
2 Constants = Utils.Constants;
3
4/* The local file header */
5module.exports = function () {
6 var _version = 0x0A,
7 _flags = 0,
8 _method = 0,
9 _time = 0,
10 _crc = 0,
11 _compressedSize = 0,
12 _size = 0,
13 _fnameLen = 0,
14 _extraLen = 0;
15
16 return {
17 get version () { return _version; },
18 set version (val) { _version = 0x0A },
19
20 get flags () { return _flags },
21 set flags (val) { _flags = val; },
22
23 get method () { return _method; },
24 set method (val) { _method = val; },
25
26 get time () {
27 return new Date(
28 ((_time >> 25) & 0x7f) + 1980,
29 ((_time >> 21) & 0x0f) - 1,
30 (_time >> 16) & 0x1f,
31 (_time >> 11) & 0x1f,
32 (_time >> 5) & 0x3f,
33 (_time & 0x1f) << 1
34 );
35 },
36 set time (val) {
37 val = new Date(val);
38 _time = (val.getFullYear() - 1980 & 0x7f) << 25
39 | (val.getMonth() + 1) << 21
40 | val.getDay() << 16
41 | val.getHours() << 11
42 | val.getMinutes() << 5
43 | val.getSeconds() >> 1;
44 },
45
46 get crc () { return _crc; },
47 set crc (val) { _crc = val; },
48
49 get compressedSize () { return _compressedSize; },
50 set compressedSize (val) { _compressedSize = val; },
51
52 get size () { return _size; },
53 set size (val) { _size = val; },
54
55 get fileNameLength () { return _fnameLen; },
56 set fileNameLenght (val) { _fnameLen = val; },
57
58 get extraLength () { return _extraLen },
59 set extraLength (val) { _extraLen = val; },
60
61 get encripted () { return (_flags & 1) == 1 },
62
63 get fileHeaderSize () {
64 return Constants.LOCHDR + _fnameLen + _extraLen;
65 },
66
67 loadFromBinary : function(/*Buffer*/data) {
68 // 30 bytes and should start with "PK\003\004"
69 if (data.length != Constants.LOCHDR || data.readUInt32LE(0) != Constants.LOCSIG) {
70 throw Utils.Errors.INVALID_LOC;
71 }
72 // version needed to extract
73 _version = data.readUInt16LE(Constants.LOCVER);
74 // general purpose bit flag
75 _flags = data.readUInt16LE(Constants.LOCFLG);
76 // compression method
77 _method = data.readUInt16LE(Constants.LOCHOW);
78 // modification time (2 bytes time, 2 bytes date)
79 _time = data.readUInt32LE(Constants.LOCTIM);
80 // uncompressed file crc-32 value
81 _crc = data.readUInt32LE(Constants.LOCCRC);
82 // compressed size
83 _compressedSize = data.readUInt32LE(Constants.LOCSIZ);
84 // uncompressed size
85 _size = data.readUInt32LE(Constants.LOCLEN);
86 // filename length
87 _fnameLen = data.readUInt16LE(Constants.LOCNAM);
88 // extra field length
89 _extraLen = data.readUInt16LE(Constants.LOCEXT);
90 },
91
92 toBinary : function() {
93 // LOC header size (30 bytes)
94 var data = new Buffer(Constants.LOCHDR);
95 // "PK\003\004"
96 data.writeUInt32LE(Constants.LOCSIG, 0);
97 // version needed to extract
98 data.writeUInt16LE(_version, Constants.LOCVER);
99 // general purpose bit flag
100 data.writeUInt16LE(_flags, Constants.LOCFLG);
101 // compression method
102 data.writeUInt16LE(_method, Constants.LOCHOW);
103 // modification time (2 bytes time, 2 bytes date)
104 data.writeUInt32LE(_time, Constants.LOCTIM);
105 // uncompressed file crc-32 value
106 data.writeUInt32LE(_crc, Constants.LOCCRC);
107 // compressed size
108 data.writeUInt32LE(_compressedSize, Constants.LOCSIZ);
109 // uncompressed size
110 data.writeUInt32LE(_size, Constants.LOCLEN);
111 // filename length
112 data.writeUInt16LE(_fnameLen, Constants.LOCNAM);
113 // extra field length
114 data.writeUInt16LE(_extraLen, Constants.LOCEXT);
115 return data;
116 },
117
118 toString : function() {
119 return '{\n' +
120 '\t"version" : ' + _version + ",\n" +
121 '\t"flags" : ' + _flags + ",\n" +
122 '\t"method" : ' + Utils.methodToString(_method) + ",\n" +
123 '\t"time" : ' + _time + ",\n" +
124 '\t"crc" : 0x' + _crc.toString(16).toUpperCase() + ",\n" +
125 '\t"compressedSize" : ' + _compressedSize + " bytes,\n" +
126 '\t"size" : ' + _size + " bytes,\n" +
127 '\t"fnameLen" : ' + _fnameLen + ",\n" +
128 '\t"extraLen" : ' + _extraLen + " bytes,\n" +
129 '\t"fileHeaderSize" : ' + (Constants.LOCHDR + _fnameLen + _extraLen) + " bytes\n" +
130 '}';
131 }
132 }
133};
\No newline at end of file