@sswroom/sswr 1.6.13 → 1.6.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Changelog +14 -0
- package/certutil.d.ts +1 -1
- package/certutil.js +645 -23
- package/data.d.ts +30 -2
- package/data.js +673 -72
- package/exporter/GPXExporter.d.ts +12 -0
- package/exporter/GPXExporter.js +89 -0
- package/exporter/XLSXExporter.d.ts +40 -0
- package/exporter/XLSXExporter.js +1976 -0
- package/hash.d.ts +25 -0
- package/hash.js +257 -2
- package/map.d.ts +14 -10
- package/map.js +57 -10
- package/osm.js +41 -2
- package/package.json +4 -1
- package/parser.js +46 -0
- package/spreadsheet.d.ts +786 -0
- package/spreadsheet.js +3294 -0
- package/text.d.ts +19 -0
- package/text.js +17 -0
- package/web.d.ts +2 -0
- package/web.js +28 -0
- package/zip.d.ts +57 -0
- package/zip.js +474 -0
package/text.d.ts
CHANGED
|
@@ -12,6 +12,25 @@ export enum LineBreakType
|
|
|
12
12
|
CRLF
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
export enum HAlignment
|
|
16
|
+
{
|
|
17
|
+
Unknown,
|
|
18
|
+
Left,
|
|
19
|
+
Center,
|
|
20
|
+
Right,
|
|
21
|
+
Justify,
|
|
22
|
+
Fill
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export enum VAlignment
|
|
26
|
+
{
|
|
27
|
+
Unknown,
|
|
28
|
+
Top,
|
|
29
|
+
Center,
|
|
30
|
+
Bottom,
|
|
31
|
+
Justify
|
|
32
|
+
}
|
|
33
|
+
|
|
15
34
|
export function zeroPad(val: string | number, ndigits: number): string;
|
|
16
35
|
export function isInteger(s: string): boolean;
|
|
17
36
|
export function isUInteger(s: string): boolean;
|
package/text.js
CHANGED
|
@@ -13,6 +13,23 @@ export const LineBreakType = {
|
|
|
13
13
|
CRLF: "\r\n"
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
+
export const HAlignment = {
|
|
17
|
+
Unknown: 0,
|
|
18
|
+
Left: 1,
|
|
19
|
+
Center: 2,
|
|
20
|
+
Right: 3,
|
|
21
|
+
Justify: 4,
|
|
22
|
+
Fill: 5
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const VAlignment = {
|
|
26
|
+
Unknown: 0,
|
|
27
|
+
Top: 1,
|
|
28
|
+
Center: 2,
|
|
29
|
+
Bottom: 3,
|
|
30
|
+
Justify: 4
|
|
31
|
+
}
|
|
32
|
+
|
|
16
33
|
export function zeroPad(val, ndigits)
|
|
17
34
|
{
|
|
18
35
|
let s = "" + val;
|
package/web.d.ts
CHANGED
|
@@ -115,6 +115,8 @@ export function getSelectElement(id: string): HTMLSelectElement;
|
|
|
115
115
|
export function getButtonElement(id: string): HTMLButtonElement;
|
|
116
116
|
export function getDivElement(id: string): HTMLDivElement;
|
|
117
117
|
export function getSpanElement(id: string): HTMLSpanElement;
|
|
118
|
+
export function getCanvasElement(id: string): HTMLCanvasElement;
|
|
119
|
+
export function getImgElement(id: string): HTMLImageElement;
|
|
118
120
|
export function getBrowserInfo(): Promise<BrowserInfo>;
|
|
119
121
|
export function parseUserAgent(userAgent: string): BrowserInfo;
|
|
120
122
|
|
package/web.js
CHANGED
|
@@ -1006,6 +1006,34 @@ export function getSpanElement(id)
|
|
|
1006
1006
|
throw new Error("Element with id \""+id+"\" is not a span");
|
|
1007
1007
|
}
|
|
1008
1008
|
|
|
1009
|
+
/**
|
|
1010
|
+
* @param {string} id
|
|
1011
|
+
* @returns {HTMLCanvasElement}
|
|
1012
|
+
*/
|
|
1013
|
+
export function getCanvasElement(id)
|
|
1014
|
+
{
|
|
1015
|
+
let ele = document.getElementById(id);
|
|
1016
|
+
if (ele == null)
|
|
1017
|
+
throw new Error("Element with id \""+id+"\" not found");
|
|
1018
|
+
if (ele instanceof HTMLCanvasElement)
|
|
1019
|
+
return ele;
|
|
1020
|
+
throw new Error("Element with id \""+id+"\" is not a canvas");
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
/**
|
|
1024
|
+
* @param {string} id
|
|
1025
|
+
* @returns {HTMLImageElement}
|
|
1026
|
+
*/
|
|
1027
|
+
export function getImgElement(id)
|
|
1028
|
+
{
|
|
1029
|
+
let ele = document.getElementById(id);
|
|
1030
|
+
if (ele == null)
|
|
1031
|
+
throw new Error("Element with id \""+id+"\" not found");
|
|
1032
|
+
if (ele instanceof HTMLImageElement)
|
|
1033
|
+
return ele;
|
|
1034
|
+
throw new Error("Element with id \""+id+"\" is not an img");
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1009
1037
|
/**
|
|
1010
1038
|
* @returns {Promise<{os: String,osVer?:string,browser: String,browserVer?: string,devName?:string}>}
|
|
1011
1039
|
*/
|
package/zip.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as data from "./data";
|
|
2
|
+
import * as hash from "./hash";
|
|
3
|
+
|
|
4
|
+
export enum ZIPOS
|
|
5
|
+
{
|
|
6
|
+
MSDOS,
|
|
7
|
+
Amiga,
|
|
8
|
+
OpenVMS,
|
|
9
|
+
UNIX,
|
|
10
|
+
VM_CMS,
|
|
11
|
+
Atari_ST,
|
|
12
|
+
OS2_HPFS,
|
|
13
|
+
Macintosh,
|
|
14
|
+
ZSystem,
|
|
15
|
+
CP_M,
|
|
16
|
+
NTFS,
|
|
17
|
+
MVS,
|
|
18
|
+
VSE,
|
|
19
|
+
AcornRisc,
|
|
20
|
+
VFAT,
|
|
21
|
+
AlternateMVS,
|
|
22
|
+
BeOS,
|
|
23
|
+
Tandem,
|
|
24
|
+
OS400,
|
|
25
|
+
OSX
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
declare class FileInfo
|
|
29
|
+
{
|
|
30
|
+
fileName: string;
|
|
31
|
+
fileOfst: number;
|
|
32
|
+
fileModTime: data.Timestamp;
|
|
33
|
+
fileCreateTime: data.Timestamp;
|
|
34
|
+
fileAccessTime: data.Timestamp;
|
|
35
|
+
crcVal: number;
|
|
36
|
+
uncompSize: number;
|
|
37
|
+
compSize: number;
|
|
38
|
+
compMeth: number;
|
|
39
|
+
fileAttr: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export class ZIPBuilder
|
|
43
|
+
{
|
|
44
|
+
crc: hash.CRC32RIEEE;
|
|
45
|
+
builder: data.ByteBuilder;
|
|
46
|
+
baseOfst: number;
|
|
47
|
+
currOfst: number;
|
|
48
|
+
files: FileInfo[];
|
|
49
|
+
osType: ZIPOS;
|
|
50
|
+
|
|
51
|
+
constructor(os: ZIPOS);
|
|
52
|
+
|
|
53
|
+
addFile(fileName: string, fileContent: Uint8Array, lastModTime: data.Timestamp, lastAccessTime: data.Timestamp, createTime: data.Timestamp, unixAttr: number): boolean;
|
|
54
|
+
addDir(dirName: string, lastModTime: data.Timestamp, lastAccessTime: data.Timestamp, createTime: data.Timestamp, unixAttr: number): boolean;
|
|
55
|
+
addDeflate(fileName: string, buff: Uint8Array, decSize: number, crcVal: number, lastModTime: data.Timestamp, lastAccessTime: data.Timestamp, createTime: data.Timestamp, unixAttr: number): boolean;
|
|
56
|
+
finalize(): Uint8Array;
|
|
57
|
+
};
|
package/zip.js
ADDED
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
import * as data from "./data.js";
|
|
2
|
+
import * as hash from "./hash.js"
|
|
3
|
+
import pako from "../../pako/dist/pako.esm.mjs";
|
|
4
|
+
|
|
5
|
+
const VERBOSE = true;
|
|
6
|
+
const ZIPVER = 63;
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
export const ZIPOS = {
|
|
10
|
+
MSDOS: 0,
|
|
11
|
+
Amiga: 1,
|
|
12
|
+
OpenVMS: 2,
|
|
13
|
+
UNIX: 3,
|
|
14
|
+
VM_CMS: 4,
|
|
15
|
+
Atari_ST: 5,
|
|
16
|
+
OS2_HPFS: 6,
|
|
17
|
+
Macintosh: 7,
|
|
18
|
+
ZSystem: 8,
|
|
19
|
+
CP_M: 9,
|
|
20
|
+
NTFS: 10,
|
|
21
|
+
MVS: 11,
|
|
22
|
+
VSE: 12,
|
|
23
|
+
AcornRisc: 13,
|
|
24
|
+
VFAT: 14,
|
|
25
|
+
AlternateMVS: 15,
|
|
26
|
+
BeOS: 16,
|
|
27
|
+
Tandem: 17,
|
|
28
|
+
OS400: 18,
|
|
29
|
+
OSX: 19
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
class FileInfo
|
|
33
|
+
{
|
|
34
|
+
/**
|
|
35
|
+
* @param {string} fileName
|
|
36
|
+
* @param {data.Timestamp} fileModTime
|
|
37
|
+
*/
|
|
38
|
+
constructor(fileName, fileModTime)
|
|
39
|
+
{
|
|
40
|
+
this.fileName = fileName;
|
|
41
|
+
this.fileOfst = 0;
|
|
42
|
+
this.fileModTime = fileModTime;
|
|
43
|
+
/** @type {data.Timestamp|null} */
|
|
44
|
+
this.fileCreateTime = null;
|
|
45
|
+
/** @type {data.Timestamp|null} */
|
|
46
|
+
this.fileAccessTime = null;
|
|
47
|
+
this.crcVal = 0;
|
|
48
|
+
this.uncompSize = 0;
|
|
49
|
+
this.compSize = 0;
|
|
50
|
+
this.compMeth = 0;
|
|
51
|
+
this.fileAttr = 0;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export class ZIPBuilder
|
|
56
|
+
{
|
|
57
|
+
/**
|
|
58
|
+
* @param {number} os
|
|
59
|
+
*/
|
|
60
|
+
constructor(os)
|
|
61
|
+
{
|
|
62
|
+
this.builder = new data.ByteBuilder();
|
|
63
|
+
this.currOfst = 0;
|
|
64
|
+
this.osType = os;
|
|
65
|
+
/** @type {FileInfo[]} */
|
|
66
|
+
this.files = [];
|
|
67
|
+
this.finalized = false;
|
|
68
|
+
this.crc = new hash.CRC32R(null);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @param {string} fileName
|
|
73
|
+
* @param {Uint8Array} fileContent
|
|
74
|
+
* @param {data.Timestamp} lastModTime
|
|
75
|
+
* @param {data.Timestamp} lastAccessTime
|
|
76
|
+
* @param {data.Timestamp} createTime
|
|
77
|
+
* @param {number} unixAttr
|
|
78
|
+
*/
|
|
79
|
+
addFile(fileName, fileContent, lastModTime, lastAccessTime, createTime, unixAttr)
|
|
80
|
+
{
|
|
81
|
+
if (this.finalized)
|
|
82
|
+
return false;
|
|
83
|
+
let hdrLen;
|
|
84
|
+
let compSize;
|
|
85
|
+
let compData = pako.deflateRaw(fileContent);
|
|
86
|
+
let compress;
|
|
87
|
+
if (compData == null || compData.length >= fileContent.length)
|
|
88
|
+
{
|
|
89
|
+
compSize = fileContent.length;
|
|
90
|
+
compress = false;
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
else
|
|
94
|
+
{
|
|
95
|
+
compSize = compData.length;
|
|
96
|
+
compress = true;
|
|
97
|
+
}
|
|
98
|
+
let crcVal = this.crc.calcDirect(fileContent.buffer);
|
|
99
|
+
//Data::DateTime dt(lastModTime.inst, lastModTime.tzQhr);
|
|
100
|
+
let fileNameLen = this.builder.writeUTF8(this.currOfst + 30, fileName);
|
|
101
|
+
this.builder.writeInt32(this.currOfst + 0, 0x04034b50, true);
|
|
102
|
+
this.builder.writeInt8(this.currOfst + 4, 20); //Verison (2.0)
|
|
103
|
+
this.builder.writeInt8(this.currOfst + 5, this.osType);
|
|
104
|
+
this.builder.writeInt16(this.currOfst + 6, 0, true);
|
|
105
|
+
this.builder.writeInt16(this.currOfst + 8, 0x8, true);
|
|
106
|
+
this.builder.writeInt16(this.currOfst + 10, lastModTime.toMSDOSTime(), true);
|
|
107
|
+
this.builder.writeInt16(this.currOfst + 12, lastModTime.toMSDOSDate(), true);
|
|
108
|
+
this.builder.writeInt32(this.currOfst + 14, crcVal, true);
|
|
109
|
+
this.builder.writeInt32(this.currOfst + 18, compSize, true);
|
|
110
|
+
this.builder.writeInt32(this.currOfst + 22, fileContent.length, true);
|
|
111
|
+
this.builder.writeInt16(this.currOfst + 26, fileNameLen, true);
|
|
112
|
+
this.builder.writeInt16(this.currOfst + 28, 0, true);
|
|
113
|
+
hdrLen = 30 + fileNameLen;
|
|
114
|
+
if (compSize >= 0xFFFFFFFF || fileContent.length >= 0xFFFFFFFF)
|
|
115
|
+
{
|
|
116
|
+
let len = 4;
|
|
117
|
+
this.builder.writeInt16(this.currOfst + hdrLen, 1, true);
|
|
118
|
+
if (fileContent.length >= 0xffffffff)
|
|
119
|
+
{
|
|
120
|
+
this.builder.writeInt64(this.currOfst + hdrLen + len, BigInt(fileContent.length), true);
|
|
121
|
+
this.builder.writeInt32(this.currOfst + 22, 0xffffffff, true);
|
|
122
|
+
len += 8;
|
|
123
|
+
}
|
|
124
|
+
if (compSize >= 0xffffffff)
|
|
125
|
+
{
|
|
126
|
+
if (compSize >= fileContent.length)
|
|
127
|
+
{
|
|
128
|
+
this.builder.writeInt64(this.currOfst + hdrLen + len, BigInt(fileContent.length), true);
|
|
129
|
+
}
|
|
130
|
+
else
|
|
131
|
+
{
|
|
132
|
+
this.builder.writeInt64(this.currOfst + hdrLen + len, BigInt(compSize), true);
|
|
133
|
+
}
|
|
134
|
+
this.builder.writeInt32(this.currOfst + 18, 0xffffffff, true);
|
|
135
|
+
len += 8;
|
|
136
|
+
}
|
|
137
|
+
this.builder.writeInt16(this.currOfst + 28, len, true);
|
|
138
|
+
this.builder.writeInt16(this.currOfst + hdrLen + 2, len - 4, true);
|
|
139
|
+
hdrLen += len;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
let file = new FileInfo(fileName, lastModTime);
|
|
143
|
+
file.fileCreateTime = createTime;
|
|
144
|
+
file.fileAccessTime = lastAccessTime;
|
|
145
|
+
file.crcVal = crcVal;
|
|
146
|
+
file.uncompSize = fileContent.length;
|
|
147
|
+
file.compMeth = 8;
|
|
148
|
+
file.compSize = compSize;
|
|
149
|
+
if (this.osType == ZIPOS.UNIX)
|
|
150
|
+
{
|
|
151
|
+
file.fileAttr = unixAttr << 16;
|
|
152
|
+
}
|
|
153
|
+
else if (unixAttr == 0)
|
|
154
|
+
{
|
|
155
|
+
file.fileAttr = 0;
|
|
156
|
+
}
|
|
157
|
+
else
|
|
158
|
+
{
|
|
159
|
+
if (unixAttr & 0x200)
|
|
160
|
+
{
|
|
161
|
+
file.fileAttr = 0;
|
|
162
|
+
}
|
|
163
|
+
else
|
|
164
|
+
{
|
|
165
|
+
file.fileAttr = 1;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
file.fileOfst = this.currOfst;
|
|
169
|
+
this.files.push(file);
|
|
170
|
+
if (compress == false || compData == null || !(compData instanceof Uint8Array))
|
|
171
|
+
{
|
|
172
|
+
this.builder.writeInt16(this.currOfst + 8, 0x0, true);
|
|
173
|
+
this.builder.writeInt32(this.currOfst + 18, fileContent.length, true);
|
|
174
|
+
file.compMeth = 0;
|
|
175
|
+
file.compSize = fileContent.length;
|
|
176
|
+
this.currOfst += hdrLen;
|
|
177
|
+
this.builder.writeUInt8Array(this.currOfst, fileContent);
|
|
178
|
+
this.currOfst += fileContent.length;
|
|
179
|
+
}
|
|
180
|
+
else
|
|
181
|
+
{
|
|
182
|
+
this.currOfst += hdrLen;
|
|
183
|
+
this.builder.writeUInt8Array(this.currOfst, compData);
|
|
184
|
+
this.currOfst += compData.length;
|
|
185
|
+
}
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* @param {string} dirName
|
|
191
|
+
* @param {data.Timestamp} lastModTime
|
|
192
|
+
* @param {data.Timestamp} lastAccessTime
|
|
193
|
+
* @param {data.Timestamp} createTime
|
|
194
|
+
* @param {number} unixAttr
|
|
195
|
+
*/
|
|
196
|
+
addDir(dirName, lastModTime, lastAccessTime, createTime, unixAttr)
|
|
197
|
+
{
|
|
198
|
+
if (this.finalized)
|
|
199
|
+
return false;
|
|
200
|
+
if (!dirName.endsWith('/'))
|
|
201
|
+
return false;
|
|
202
|
+
|
|
203
|
+
let hdrLen;
|
|
204
|
+
let dirNameLen = this.builder.writeUTF8(this.currOfst + 30, dirName);
|
|
205
|
+
this.builder.writeInt32(this.currOfst + 0, 0x04034b50, true);
|
|
206
|
+
this.builder.writeInt8(this.currOfst + 4, 45);
|
|
207
|
+
this.builder.writeInt8(this.currOfst + 5, this.osType);
|
|
208
|
+
this.builder.writeInt16(this.currOfst + 6, 0, true);
|
|
209
|
+
this.builder.writeInt16(this.currOfst + 8, 0, true);
|
|
210
|
+
this.builder.writeInt16(this.currOfst + 10, lastModTime.toMSDOSTime(), true);
|
|
211
|
+
this.builder.writeInt16(this.currOfst + 12, lastModTime.toMSDOSDate(), true);
|
|
212
|
+
this.builder.writeInt32(this.currOfst + 14, 0, true);
|
|
213
|
+
this.builder.writeInt32(this.currOfst + 18, 0, true);
|
|
214
|
+
this.builder.writeInt32(this.currOfst + 22, 0, true);
|
|
215
|
+
this.builder.writeInt16(this.currOfst + 26, dirNameLen, true);
|
|
216
|
+
this.builder.writeInt16(this.currOfst + 28, 0, true);
|
|
217
|
+
hdrLen = 30 + dirNameLen;
|
|
218
|
+
|
|
219
|
+
let file = new FileInfo(dirName, lastModTime);
|
|
220
|
+
file.fileCreateTime = createTime;
|
|
221
|
+
file.fileAccessTime = lastAccessTime;
|
|
222
|
+
file.crcVal = 0;
|
|
223
|
+
file.uncompSize = 0;
|
|
224
|
+
file.compMeth = 0;
|
|
225
|
+
file.compSize = 0;
|
|
226
|
+
if (this.osType == ZIPOS.UNIX)
|
|
227
|
+
{
|
|
228
|
+
file.fileAttr = (unixAttr << 16) | 0x10;
|
|
229
|
+
}
|
|
230
|
+
else if (unixAttr == 0)
|
|
231
|
+
{
|
|
232
|
+
file.fileAttr = 0x10;
|
|
233
|
+
}
|
|
234
|
+
else
|
|
235
|
+
{
|
|
236
|
+
if (unixAttr & 0x200)
|
|
237
|
+
{
|
|
238
|
+
file.fileAttr = 0x10;
|
|
239
|
+
}
|
|
240
|
+
else
|
|
241
|
+
{
|
|
242
|
+
file.fileAttr = 0x11;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
file.fileOfst = this.currOfst;
|
|
246
|
+
this.files.push(file);
|
|
247
|
+
this.currOfst += hdrLen;
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* @param {string} fileName
|
|
253
|
+
* @param {Uint8Array} buff
|
|
254
|
+
* @param {number} decSize
|
|
255
|
+
* @param {number} crcVal
|
|
256
|
+
* @param {data.Timestamp} lastModTime
|
|
257
|
+
* @param {data.Timestamp} lastAccessTime
|
|
258
|
+
* @param {data.Timestamp} createTime
|
|
259
|
+
* @param {number} unixAttr
|
|
260
|
+
*/
|
|
261
|
+
addDeflate(fileName, buff, decSize, crcVal, lastModTime, lastAccessTime, createTime, unixAttr)
|
|
262
|
+
{
|
|
263
|
+
if (this.finalized)
|
|
264
|
+
return false;
|
|
265
|
+
let hdrLen;
|
|
266
|
+
//Data::DateTime dt(lastModTime.inst, lastModTime.tzQhr);
|
|
267
|
+
let fileNameLen = this.builder.writeUTF8(this.currOfst + 30, fileName);
|
|
268
|
+
this.builder.writeInt32(this.currOfst + 0, 0x04034b50, true);
|
|
269
|
+
this.builder.writeInt8(this.currOfst + 4, 20); //Verison (2.0)
|
|
270
|
+
this.builder.writeInt8(this.currOfst + 5, this.osType);
|
|
271
|
+
this.builder.writeInt16(this.currOfst + 6, 0, true);
|
|
272
|
+
this.builder.writeInt16(this.currOfst + 8, 0x8, true);
|
|
273
|
+
this.builder.writeInt16(this.currOfst + 10, lastModTime.toMSDOSTime(), true);
|
|
274
|
+
this.builder.writeInt16(this.currOfst + 12, lastModTime.toMSDOSDate(), true);
|
|
275
|
+
this.builder.writeInt32(this.currOfst + 14, crcVal, true);
|
|
276
|
+
this.builder.writeInt32(this.currOfst + 18, buff.length, true);
|
|
277
|
+
this.builder.writeInt32(this.currOfst + 22, decSize, true);
|
|
278
|
+
this.builder.writeInt16(this.currOfst + 26, fileNameLen, true);
|
|
279
|
+
this.builder.writeInt16(this.currOfst + 28, 0, true);
|
|
280
|
+
hdrLen = 30 + fileNameLen;
|
|
281
|
+
if (buff.length >= 0xFFFFFFFF || decSize >= 0xFFFFFFFF)
|
|
282
|
+
{
|
|
283
|
+
let len = 4;
|
|
284
|
+
this.builder.writeInt16(this.currOfst + hdrLen, 1, true);
|
|
285
|
+
if (decSize >= 0xffffffff)
|
|
286
|
+
{
|
|
287
|
+
this.builder.writeInt64(this.currOfst + hdrLen + len, BigInt(decSize), true);
|
|
288
|
+
this.builder.writeInt32(this.currOfst + 22, 0xffffffff, true);
|
|
289
|
+
len += 8;
|
|
290
|
+
}
|
|
291
|
+
if (buff.length >= 0xffffffff)
|
|
292
|
+
{
|
|
293
|
+
this.builder.writeInt64(this.currOfst + hdrLen + len, BigInt(buff.length), true);
|
|
294
|
+
this.builder.writeInt32(this.currOfst + 18, 0xffffffff, true);
|
|
295
|
+
len += 8;
|
|
296
|
+
}
|
|
297
|
+
this.builder.writeInt16(this.currOfst + 28, len, true);
|
|
298
|
+
this.builder.writeInt16(this.currOfst + hdrLen + 2, len - 4, true);
|
|
299
|
+
hdrLen += len;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
let file = new FileInfo(fileName, lastModTime);
|
|
303
|
+
file.fileCreateTime = createTime;
|
|
304
|
+
file.fileAccessTime = lastAccessTime;
|
|
305
|
+
file.crcVal = crcVal;
|
|
306
|
+
file.uncompSize = decSize;
|
|
307
|
+
file.compMeth = 8;
|
|
308
|
+
file.compSize = buff.length;
|
|
309
|
+
if (this.osType == ZIPOS.UNIX)
|
|
310
|
+
{
|
|
311
|
+
file.fileAttr = unixAttr << 16;
|
|
312
|
+
}
|
|
313
|
+
else if (unixAttr == 0)
|
|
314
|
+
{
|
|
315
|
+
file.fileAttr = 0;
|
|
316
|
+
}
|
|
317
|
+
else
|
|
318
|
+
{
|
|
319
|
+
if (unixAttr & 0x200)
|
|
320
|
+
{
|
|
321
|
+
file.fileAttr = 0;
|
|
322
|
+
}
|
|
323
|
+
else
|
|
324
|
+
{
|
|
325
|
+
file.fileAttr = 1;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
file.fileOfst = this.currOfst;
|
|
329
|
+
this.files.push(file);
|
|
330
|
+
this.currOfst += hdrLen;
|
|
331
|
+
this.builder.writeUInt8Array(this.currOfst, buff);
|
|
332
|
+
this.currOfst += buff.length;
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
finalize()
|
|
337
|
+
{
|
|
338
|
+
if (!this.finalized)
|
|
339
|
+
{
|
|
340
|
+
this.finalized = true;
|
|
341
|
+
|
|
342
|
+
let cdStart = this.currOfst;
|
|
343
|
+
let file;
|
|
344
|
+
let hdrLen;
|
|
345
|
+
let cdLen = 0;
|
|
346
|
+
let i = 0;
|
|
347
|
+
let j = this.files.length;
|
|
348
|
+
let minVer;
|
|
349
|
+
while (i < j)
|
|
350
|
+
{
|
|
351
|
+
file = this.files[i];
|
|
352
|
+
minVer = 20;
|
|
353
|
+
let fileNameLen = this.builder.writeUTF8(this.currOfst + 46, file.fileName);
|
|
354
|
+
this.builder.writeInt32(this.currOfst + 0, 0x02014b50, true);
|
|
355
|
+
this.builder.writeInt8(this.currOfst + 4, ZIPVER);
|
|
356
|
+
this.builder.writeInt8(this.currOfst + 5, this.osType);
|
|
357
|
+
this.builder.writeInt8(this.currOfst + 7, this.osType);
|
|
358
|
+
this.builder.writeInt16(this.currOfst + 8, 0, true); //General purpose flag
|
|
359
|
+
this.builder.writeInt16(this.currOfst + 10, file.compMeth, true);
|
|
360
|
+
this.builder.writeInt16(this.currOfst + 12, file.fileModTime.toMSDOSTime(), true);
|
|
361
|
+
this.builder.writeInt16(this.currOfst + 14, file.fileModTime.toMSDOSDate(), true);
|
|
362
|
+
this.builder.writeInt32(this.currOfst + 16, file.crcVal, true);
|
|
363
|
+
this.builder.writeInt32(this.currOfst + 20, file.compSize, true);
|
|
364
|
+
this.builder.writeInt32(this.currOfst + 24, file.uncompSize, true);
|
|
365
|
+
this.builder.writeInt16(this.currOfst + 28, fileNameLen, true);
|
|
366
|
+
this.builder.writeInt16(this.currOfst + 30, 0, true); //extra field length
|
|
367
|
+
this.builder.writeInt16(this.currOfst + 32, 0, true); //File comment length
|
|
368
|
+
this.builder.writeInt16(this.currOfst + 34, 0, true); //Disk number where file starts
|
|
369
|
+
this.builder.writeInt16(this.currOfst + 36, 0, true); //Internal file attributes
|
|
370
|
+
this.builder.writeInt32(this.currOfst + 38, file.fileAttr, true); //External file attributes
|
|
371
|
+
this.builder.writeInt32(this.currOfst + 42, file.fileOfst, true);
|
|
372
|
+
hdrLen = 46 + fileNameLen;
|
|
373
|
+
if (file.compSize >= 0xFFFFFFFF || file.fileOfst >= 0xFFFFFFFF || file.uncompSize >= 0xFFFFFFFF)
|
|
374
|
+
{
|
|
375
|
+
let len = 0;
|
|
376
|
+
this.builder.writeInt16(this.currOfst + hdrLen, 1, true);
|
|
377
|
+
if (file.uncompSize >= 0xFFFFFFFFn)
|
|
378
|
+
{
|
|
379
|
+
this.builder.writeInt64(this.currOfst + hdrLen + 4 + len, BigInt(file.uncompSize), true);
|
|
380
|
+
this.builder.writeInt32(this.currOfst + 24, 0xffffffff, true);
|
|
381
|
+
len += 8;
|
|
382
|
+
}
|
|
383
|
+
if (file.compSize >= 0xFFFFFFFFn)
|
|
384
|
+
{
|
|
385
|
+
this.builder.writeInt64(this.currOfst + hdrLen + 4 + len, BigInt(file.compSize), true);
|
|
386
|
+
this.builder.writeInt32(this.currOfst + 20, 0xffffffff, true);
|
|
387
|
+
len += 8;
|
|
388
|
+
}
|
|
389
|
+
if (file.fileOfst >= 0xFFFFFFFFn)
|
|
390
|
+
{
|
|
391
|
+
this.builder.writeInt64(this.currOfst + hdrLen + 4 + len, BigInt(file.fileOfst), true);
|
|
392
|
+
this.builder.writeInt32(this.currOfst + 42, 0xffffffff, true);
|
|
393
|
+
len += 8;
|
|
394
|
+
}
|
|
395
|
+
this.builder.writeInt16(this.currOfst + hdrLen + 2, len, true);
|
|
396
|
+
hdrLen += 4 + len;
|
|
397
|
+
}
|
|
398
|
+
if (file.fileModTime != null && file.fileAccessTime != null && file.fileCreateTime != null)
|
|
399
|
+
{
|
|
400
|
+
if (minVer < 45)
|
|
401
|
+
minVer = 45;
|
|
402
|
+
this.builder.writeInt16(this.currOfst + hdrLen, 10, true);
|
|
403
|
+
this.builder.writeInt16(this.currOfst + hdrLen + 2, 32, true);
|
|
404
|
+
this.builder.writeInt32(this.currOfst + hdrLen + 4, 0, true);
|
|
405
|
+
this.builder.writeInt16(this.currOfst + hdrLen + 8, 1, true);
|
|
406
|
+
this.builder.writeInt16(this.currOfst + hdrLen + 10, 24, true);
|
|
407
|
+
this.builder.writeInt64(this.currOfst + hdrLen + 12, file.fileModTime.toFILETIME(), true);
|
|
408
|
+
this.builder.writeInt64(this.currOfst + hdrLen + 20, file.fileAccessTime.toFILETIME(), true);
|
|
409
|
+
this.builder.writeInt64(this.currOfst + hdrLen + 28, file.fileCreateTime.toFILETIME(), true);
|
|
410
|
+
hdrLen += 36;
|
|
411
|
+
}
|
|
412
|
+
this.builder.writeInt16(this.currOfst + 30, hdrLen - 46 - fileNameLen, true);
|
|
413
|
+
this.builder.writeInt8(this.currOfst + 6, minVer);
|
|
414
|
+
|
|
415
|
+
this.currOfst += hdrLen;
|
|
416
|
+
cdLen += hdrLen;
|
|
417
|
+
|
|
418
|
+
i++;
|
|
419
|
+
}
|
|
420
|
+
if (this.currOfst >= 0xffffffff || j >= 0xffff)
|
|
421
|
+
{
|
|
422
|
+
let cdOfst = this.currOfst;
|
|
423
|
+
this.builder.writeInt32(this.currOfst + 0, 0x06064b50, true); //Record Type (Zip64 End of central directory record)
|
|
424
|
+
this.builder.writeInt64(this.currOfst + 4, 44n, true); //Size of zip64 end of central directory record
|
|
425
|
+
this.builder.writeInt16(this.currOfst + 12, ZIPVER, true); //Version made by
|
|
426
|
+
this.builder.writeInt16(this.currOfst + 14, 45, true); //Version needed to extract
|
|
427
|
+
this.builder.writeInt32(this.currOfst + 16, 0, true); //Number of this disk
|
|
428
|
+
this.builder.writeInt32(this.currOfst + 20, 0, true); //Number of the disk with the start of the central directory
|
|
429
|
+
this.builder.writeInt64(this.currOfst + 24, BigInt(j), true); //Total number of entries in the central directory on this disk
|
|
430
|
+
this.builder.writeInt64(this.currOfst + 32, BigInt(j), true); //Total number of entries in the central directory
|
|
431
|
+
this.builder.writeInt64(this.currOfst + 40, BigInt(cdLen), true); //Size of central directory
|
|
432
|
+
this.builder.writeInt64(this.currOfst + 48, BigInt(cdStart), true); //Offset of start of central directory with respect to the starting disk number
|
|
433
|
+
this.currOfst += 56;
|
|
434
|
+
|
|
435
|
+
this.builder.writeInt32(this.currOfst + 0, 0x07064b50, true); //Record Type (Zip64 end of central directory locator)
|
|
436
|
+
this.builder.writeInt32(this.currOfst + 4, 0, true); //Number of the disk with the start of the zip64 end of central directory
|
|
437
|
+
this.builder.writeInt64(this.currOfst + 8, BigInt(cdOfst), true); //Relative offset of the zip64 end of central directory record
|
|
438
|
+
this.builder.writeInt32(this.currOfst + 16, 1, true); //Total number of disks
|
|
439
|
+
this.currOfst += 20;
|
|
440
|
+
|
|
441
|
+
this.builder.writeInt32(this.currOfst + 0, 0x06054b50, true); //Record Type (End of central directory record)
|
|
442
|
+
this.builder.writeInt16(this.currOfst + 4, 0, true); //Number of this disk
|
|
443
|
+
this.builder.writeInt16(this.currOfst + 6, 0, true); //Disk where central directory starts
|
|
444
|
+
if (j >= 0xffff)
|
|
445
|
+
{
|
|
446
|
+
this.builder.writeInt16(this.currOfst + 8, 0xffff, true); //Number of central directory of this disk
|
|
447
|
+
this.builder.writeInt16(this.currOfst + 10, 0xffff, true); //Total number of central directory records
|
|
448
|
+
}
|
|
449
|
+
else
|
|
450
|
+
{
|
|
451
|
+
this.builder.writeInt16(this.currOfst + 8, j, true); //Number of central directory of this disk
|
|
452
|
+
this.builder.writeInt16(this.currOfst + 10, j, true); //Total number of central directory records
|
|
453
|
+
}
|
|
454
|
+
this.builder.writeInt32(this.currOfst + 12, cdLen, true); //Size of central directory
|
|
455
|
+
this.builder.writeInt32(this.currOfst + 16, 0xffffffff, true); //Offset of start of central directory
|
|
456
|
+
this.builder.writeInt16(this.currOfst + 20, 0, true); //Comment Length
|
|
457
|
+
this.currOfst += 22;
|
|
458
|
+
}
|
|
459
|
+
else
|
|
460
|
+
{
|
|
461
|
+
this.builder.writeInt32(this.currOfst + 0, 0x06054b50, true); //Record Type (End of central directory record)
|
|
462
|
+
this.builder.writeInt16(this.currOfst + 4, 0, true); //Number of this disk
|
|
463
|
+
this.builder.writeInt16(this.currOfst + 6, 0, true); //Disk where central directory starts
|
|
464
|
+
this.builder.writeInt16(this.currOfst + 8, j, true); //Number of central directory of this disk
|
|
465
|
+
this.builder.writeInt16(this.currOfst + 10, j, true); //Total number of central directory records
|
|
466
|
+
this.builder.writeInt32(this.currOfst + 12, cdLen, true); //Size of central directory
|
|
467
|
+
this.builder.writeInt32(this.currOfst + 16, cdStart, true); //Offset of start of central directory
|
|
468
|
+
this.builder.writeInt16(this.currOfst + 20, 0, true); //Comment Length
|
|
469
|
+
this.currOfst += 22;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
return this.builder.build();
|
|
473
|
+
}
|
|
474
|
+
}
|