monocle-rails 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. data/lib/monocle/rails/version.rb +1 -1
  2. data/vendor/assets/.DS_Store +0 -0
  3. data/vendor/assets/javascripts/deflate.js +2088 -0
  4. data/vendor/assets/javascripts/inflate.js +2163 -0
  5. data/vendor/assets/javascripts/mime-types.js +1001 -0
  6. data/vendor/assets/javascripts/tests/arraybuffer.js +760 -0
  7. data/vendor/assets/javascripts/tests/base64.js +58 -0
  8. data/vendor/assets/javascripts/tests/dataview.js +212 -0
  9. data/vendor/assets/javascripts/tests/lorem.txt +1 -0
  10. data/vendor/assets/javascripts/tests/lorem.zip +0 -0
  11. data/vendor/assets/javascripts/tests/lorem2.zip +0 -0
  12. data/vendor/assets/javascripts/tests/lorem_store.zip +0 -0
  13. data/vendor/assets/javascripts/tests/test1.html +13 -0
  14. data/vendor/assets/javascripts/tests/test1.js +46 -0
  15. data/vendor/assets/javascripts/tests/test10.html +14 -0
  16. data/vendor/assets/javascripts/tests/test10.js +34 -0
  17. data/vendor/assets/javascripts/tests/test11.html +14 -0
  18. data/vendor/assets/javascripts/tests/test11.js +67 -0
  19. data/vendor/assets/javascripts/tests/test12.html +14 -0
  20. data/vendor/assets/javascripts/tests/test12.js +66 -0
  21. data/vendor/assets/javascripts/tests/test13.html +13 -0
  22. data/vendor/assets/javascripts/tests/test13.js +74 -0
  23. data/vendor/assets/javascripts/tests/test14.html +13 -0
  24. data/vendor/assets/javascripts/tests/test14.js +80 -0
  25. data/vendor/assets/javascripts/tests/test15.html +12 -0
  26. data/vendor/assets/javascripts/tests/test15.js +60 -0
  27. data/vendor/assets/javascripts/tests/test16.html +14 -0
  28. data/vendor/assets/javascripts/tests/test16.js +46 -0
  29. data/vendor/assets/javascripts/tests/test17.html +15 -0
  30. data/vendor/assets/javascripts/tests/test17.js +41 -0
  31. data/vendor/assets/javascripts/tests/test18.html +16 -0
  32. data/vendor/assets/javascripts/tests/test18.js +46 -0
  33. data/vendor/assets/javascripts/tests/test2.html +14 -0
  34. data/vendor/assets/javascripts/tests/test2.js +49 -0
  35. data/vendor/assets/javascripts/tests/test3.html +14 -0
  36. data/vendor/assets/javascripts/tests/test3.js +40 -0
  37. data/vendor/assets/javascripts/tests/test4.html +12 -0
  38. data/vendor/assets/javascripts/tests/test4.js +40 -0
  39. data/vendor/assets/javascripts/tests/test5.html +13 -0
  40. data/vendor/assets/javascripts/tests/test5.js +33 -0
  41. data/vendor/assets/javascripts/tests/test6.html +13 -0
  42. data/vendor/assets/javascripts/tests/test6.js +33 -0
  43. data/vendor/assets/javascripts/tests/test7.html +14 -0
  44. data/vendor/assets/javascripts/tests/test7.js +18 -0
  45. data/vendor/assets/javascripts/tests/test8.html +14 -0
  46. data/vendor/assets/javascripts/tests/test8.js +31 -0
  47. data/vendor/assets/javascripts/tests/test9.html +14 -0
  48. data/vendor/assets/javascripts/tests/test9.js +34 -0
  49. data/vendor/assets/javascripts/tests/util.js +16 -0
  50. data/vendor/assets/javascripts/zip-ext.js +241 -0
  51. data/vendor/assets/javascripts/zip-fs.js +538 -0
  52. data/vendor/assets/javascripts/zip.js +801 -0
  53. metadata +51 -1
@@ -0,0 +1,801 @@
1
+ /*
2
+ Copyright (c) 2013 Gildas Lormeau. All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+
10
+ 2. Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in
12
+ the documentation and/or other materials provided with the distribution.
13
+
14
+ 3. The names of the authors may not be used to endorse or promote products
15
+ derived from this software without specific prior written permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
18
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
19
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
20
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
21
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
23
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+ */
28
+
29
+ (function(obj) {
30
+
31
+ var ERR_BAD_FORMAT = "File format is not recognized.";
32
+ var ERR_ENCRYPTED = "File contains encrypted entry.";
33
+ var ERR_ZIP64 = "File is using Zip64 (4gb+ file size).";
34
+ var ERR_READ = "Error while reading zip file.";
35
+ var ERR_WRITE = "Error while writing zip file.";
36
+ var ERR_WRITE_DATA = "Error while writing file data.";
37
+ var ERR_READ_DATA = "Error while reading file data.";
38
+ var ERR_DUPLICATED_NAME = "File already exists.";
39
+ var CHUNK_SIZE = 512 * 1024;
40
+
41
+ var INFLATE_JS = "inflate.js";
42
+ var DEFLATE_JS = "deflate.js";
43
+
44
+ var TEXT_PLAIN = "text/plain";
45
+
46
+ var MESSAGE_EVENT = "message";
47
+
48
+ var appendABViewSupported;
49
+ try {
50
+ appendABViewSupported = new Blob([ new DataView(new ArrayBuffer(0)) ]).size === 0;
51
+ } catch (e) {
52
+ }
53
+
54
+ function Crc32() {
55
+ var crc = -1, that = this;
56
+ that.append = function(data) {
57
+ var offset, table = that.table;
58
+ for (offset = 0; offset < data.length; offset++)
59
+ crc = (crc >>> 8) ^ table[(crc ^ data[offset]) & 0xFF];
60
+ };
61
+ that.get = function() {
62
+ return ~crc;
63
+ };
64
+ }
65
+ Crc32.prototype.table = (function() {
66
+ var i, j, t, table = [];
67
+ for (i = 0; i < 256; i++) {
68
+ t = i;
69
+ for (j = 0; j < 8; j++)
70
+ if (t & 1)
71
+ t = (t >>> 1) ^ 0xEDB88320;
72
+ else
73
+ t = t >>> 1;
74
+ table[i] = t;
75
+ }
76
+ return table;
77
+ })();
78
+
79
+ function blobSlice(blob, index, length) {
80
+ if (blob.slice)
81
+ return blob.slice(index, index + length);
82
+ else if (blob.webkitSlice)
83
+ return blob.webkitSlice(index, index + length);
84
+ else if (blob.mozSlice)
85
+ return blob.mozSlice(index, index + length);
86
+ else if (blob.msSlice)
87
+ return blob.msSlice(index, index + length);
88
+ }
89
+
90
+ function getDataHelper(byteLength, bytes) {
91
+ var dataBuffer, dataArray;
92
+ dataBuffer = new ArrayBuffer(byteLength);
93
+ dataArray = new Uint8Array(dataBuffer);
94
+ if (bytes)
95
+ dataArray.set(bytes, 0);
96
+ return {
97
+ buffer : dataBuffer,
98
+ array : dataArray,
99
+ view : new DataView(dataBuffer)
100
+ };
101
+ }
102
+
103
+ // Readers
104
+ function Reader() {
105
+ }
106
+
107
+ function TextReader(text) {
108
+ var that = this, blobReader;
109
+
110
+ function init(callback, onerror) {
111
+ var blob = new Blob([ text ], {
112
+ type : TEXT_PLAIN
113
+ });
114
+ blobReader = new BlobReader(blob);
115
+ blobReader.init(function() {
116
+ that.size = blobReader.size;
117
+ callback();
118
+ }, onerror);
119
+ }
120
+
121
+ function readUint8Array(index, length, callback, onerror) {
122
+ blobReader.readUint8Array(index, length, callback, onerror);
123
+ }
124
+
125
+ that.size = 0;
126
+ that.init = init;
127
+ that.readUint8Array = readUint8Array;
128
+ }
129
+ TextReader.prototype = new Reader();
130
+ TextReader.prototype.constructor = TextReader;
131
+
132
+ function Data64URIReader(dataURI) {
133
+ var that = this, dataStart;
134
+
135
+ function init(callback) {
136
+ var dataEnd = dataURI.length;
137
+ while (dataURI.charAt(dataEnd - 1) == "=")
138
+ dataEnd--;
139
+ dataStart = dataURI.indexOf(",") + 1;
140
+ that.size = Math.floor((dataEnd - dataStart) * 0.75);
141
+ callback();
142
+ }
143
+
144
+ function readUint8Array(index, length, callback) {
145
+ var i, data = getDataHelper(length);
146
+ var start = Math.floor(index / 3) * 4;
147
+ var end = Math.ceil((index + length) / 3) * 4;
148
+ var bytes = obj.atob(dataURI.substring(start + dataStart, end + dataStart));
149
+ var delta = index - Math.floor(start / 4) * 3;
150
+ for (i = delta; i < delta + length; i++)
151
+ data.array[i - delta] = bytes.charCodeAt(i);
152
+ callback(data.array);
153
+ }
154
+
155
+ that.size = 0;
156
+ that.init = init;
157
+ that.readUint8Array = readUint8Array;
158
+ }
159
+ Data64URIReader.prototype = new Reader();
160
+ Data64URIReader.prototype.constructor = Data64URIReader;
161
+
162
+ function BlobReader(blob) {
163
+ var that = this;
164
+
165
+ function init(callback) {
166
+ this.size = blob.size;
167
+ callback();
168
+ }
169
+
170
+ function readUint8Array(index, length, callback, onerror) {
171
+ var reader = new FileReader();
172
+ reader.onload = function(e) {
173
+ callback(new Uint8Array(e.target.result));
174
+ };
175
+ reader.onerror = onerror;
176
+ reader.readAsArrayBuffer(blobSlice(blob, index, length));
177
+ }
178
+
179
+ that.size = 0;
180
+ that.init = init;
181
+ that.readUint8Array = readUint8Array;
182
+ }
183
+ BlobReader.prototype = new Reader();
184
+ BlobReader.prototype.constructor = BlobReader;
185
+
186
+ // Writers
187
+
188
+ function Writer() {
189
+ }
190
+ Writer.prototype.getData = function(callback) {
191
+ callback(this.data);
192
+ };
193
+
194
+ function TextWriter(encoding) {
195
+ var that = this, blob;
196
+
197
+ function init(callback) {
198
+ blob = new Blob([], {
199
+ type : TEXT_PLAIN
200
+ });
201
+ callback();
202
+ }
203
+
204
+ function writeUint8Array(array, callback) {
205
+ blob = new Blob([ blob, appendABViewSupported ? array : array.buffer ], {
206
+ type : TEXT_PLAIN
207
+ });
208
+ callback();
209
+ }
210
+
211
+ function getData(callback, onerror) {
212
+ var reader = new FileReader();
213
+ reader.onload = function(e) {
214
+ callback(e.target.result);
215
+ };
216
+ reader.onerror = onerror;
217
+ reader.readAsText(blob, encoding);
218
+ }
219
+
220
+ that.init = init;
221
+ that.writeUint8Array = writeUint8Array;
222
+ that.getData = getData;
223
+ }
224
+ TextWriter.prototype = new Writer();
225
+ TextWriter.prototype.constructor = TextWriter;
226
+
227
+ function Data64URIWriter(contentType) {
228
+ var that = this, data = "", pending = "";
229
+
230
+ function init(callback) {
231
+ data += "data:" + (contentType || "") + ";base64,";
232
+ callback();
233
+ }
234
+
235
+ function writeUint8Array(array, callback) {
236
+ var i, delta = pending.length, dataString = pending;
237
+ pending = "";
238
+ for (i = 0; i < (Math.floor((delta + array.length) / 3) * 3) - delta; i++)
239
+ dataString += String.fromCharCode(array[i]);
240
+ for (; i < array.length; i++)
241
+ pending += String.fromCharCode(array[i]);
242
+ if (dataString.length > 2)
243
+ data += obj.btoa(dataString);
244
+ else
245
+ pending = dataString;
246
+ callback();
247
+ }
248
+
249
+ function getData(callback) {
250
+ callback(data + obj.btoa(pending));
251
+ }
252
+
253
+ that.init = init;
254
+ that.writeUint8Array = writeUint8Array;
255
+ that.getData = getData;
256
+ }
257
+ Data64URIWriter.prototype = new Writer();
258
+ Data64URIWriter.prototype.constructor = Data64URIWriter;
259
+
260
+ function BlobWriter(contentType) {
261
+ var blob, that = this;
262
+
263
+ function init(callback) {
264
+ blob = new Blob([], {
265
+ type : contentType
266
+ });
267
+ callback();
268
+ }
269
+
270
+ function writeUint8Array(array, callback) {
271
+ blob = new Blob([ blob, appendABViewSupported ? array : array.buffer ], {
272
+ type : contentType
273
+ });
274
+ callback();
275
+ }
276
+
277
+ function getData(callback) {
278
+ callback(blob);
279
+ }
280
+
281
+ that.init = init;
282
+ that.writeUint8Array = writeUint8Array;
283
+ that.getData = getData;
284
+ }
285
+ BlobWriter.prototype = new Writer();
286
+ BlobWriter.prototype.constructor = BlobWriter;
287
+
288
+ // inflate/deflate core functions
289
+
290
+ function launchWorkerProcess(worker, reader, writer, offset, size, onappend, onprogress, onend, onreaderror, onwriteerror) {
291
+ var chunkIndex = 0, index, outputSize;
292
+
293
+ function onflush() {
294
+ worker.removeEventListener(MESSAGE_EVENT, onmessage, false);
295
+ onend(outputSize);
296
+ }
297
+
298
+ function onmessage(event) {
299
+ var message = event.data, data = message.data;
300
+
301
+ if (message.onappend) {
302
+ outputSize += data.length;
303
+ writer.writeUint8Array(data, function() {
304
+ onappend(false, data);
305
+ step();
306
+ }, onwriteerror);
307
+ }
308
+ if (message.onflush)
309
+ if (data) {
310
+ outputSize += data.length;
311
+ writer.writeUint8Array(data, function() {
312
+ onappend(false, data);
313
+ onflush();
314
+ }, onwriteerror);
315
+ } else
316
+ onflush();
317
+ if (message.progress && onprogress)
318
+ onprogress(index + message.current, size);
319
+ }
320
+
321
+ function step() {
322
+ index = chunkIndex * CHUNK_SIZE;
323
+ if (index < size)
324
+ reader.readUint8Array(offset + index, Math.min(CHUNK_SIZE, size - index), function(array) {
325
+ worker.postMessage({
326
+ append : true,
327
+ data : array
328
+ });
329
+ chunkIndex++;
330
+ if (onprogress)
331
+ onprogress(index, size);
332
+ onappend(true, array);
333
+ }, onreaderror);
334
+ else
335
+ worker.postMessage({
336
+ flush : true
337
+ });
338
+ }
339
+
340
+ outputSize = 0;
341
+ worker.addEventListener(MESSAGE_EVENT, onmessage, false);
342
+ step();
343
+ }
344
+
345
+ function launchProcess(process, reader, writer, offset, size, onappend, onprogress, onend, onreaderror, onwriteerror) {
346
+ var chunkIndex = 0, index, outputSize = 0;
347
+
348
+ function step() {
349
+ var outputData;
350
+ index = chunkIndex * CHUNK_SIZE;
351
+ if (index < size)
352
+ reader.readUint8Array(offset + index, Math.min(CHUNK_SIZE, size - index), function(inputData) {
353
+ var outputData = process.append(inputData, function() {
354
+ if (onprogress)
355
+ onprogress(offset + index, size);
356
+ });
357
+ outputSize += outputData.length;
358
+ onappend(true, inputData);
359
+ writer.writeUint8Array(outputData, function() {
360
+ onappend(false, outputData);
361
+ chunkIndex++;
362
+ setTimeout(step, 1);
363
+ }, onwriteerror);
364
+ if (onprogress)
365
+ onprogress(index, size);
366
+ }, onreaderror);
367
+ else {
368
+ outputData = process.flush();
369
+ if (outputData) {
370
+ outputSize += outputData.length;
371
+ writer.writeUint8Array(outputData, function() {
372
+ onappend(false, outputData);
373
+ onend(outputSize);
374
+ }, onwriteerror);
375
+ } else
376
+ onend(outputSize);
377
+ }
378
+ }
379
+
380
+ step();
381
+ }
382
+
383
+ function inflate(reader, writer, offset, size, computeCrc32, onend, onprogress, onreaderror, onwriteerror) {
384
+ var worker, crc32 = new Crc32();
385
+
386
+ function oninflateappend(sending, array) {
387
+ if (computeCrc32 && !sending)
388
+ crc32.append(array);
389
+ }
390
+
391
+ function oninflateend(outputSize) {
392
+ onend(outputSize, crc32.get());
393
+ }
394
+
395
+ if (obj.zip.useWebWorkers) {
396
+ worker = new Worker(obj.zip.workerScriptsPath + INFLATE_JS);
397
+ launchWorkerProcess(worker, reader, writer, offset, size, oninflateappend, onprogress, oninflateend, onreaderror, onwriteerror);
398
+ } else
399
+ launchProcess(new obj.zip.Inflater(), reader, writer, offset, size, oninflateappend, onprogress, oninflateend, onreaderror, onwriteerror);
400
+ return worker;
401
+ }
402
+
403
+ function deflate(reader, writer, level, onend, onprogress, onreaderror, onwriteerror) {
404
+ var worker, crc32 = new Crc32();
405
+
406
+ function ondeflateappend(sending, array) {
407
+ if (sending)
408
+ crc32.append(array);
409
+ }
410
+
411
+ function ondeflateend(outputSize) {
412
+ onend(outputSize, crc32.get());
413
+ }
414
+
415
+ function onmessage() {
416
+ worker.removeEventListener(MESSAGE_EVENT, onmessage, false);
417
+ launchWorkerProcess(worker, reader, writer, 0, reader.size, ondeflateappend, onprogress, ondeflateend, onreaderror, onwriteerror);
418
+ }
419
+
420
+ if (obj.zip.useWebWorkers) {
421
+ worker = new Worker(obj.zip.workerScriptsPath + DEFLATE_JS);
422
+ worker.addEventListener(MESSAGE_EVENT, onmessage, false);
423
+ worker.postMessage({
424
+ init : true,
425
+ level : level
426
+ });
427
+ } else
428
+ launchProcess(new obj.zip.Deflater(), reader, writer, 0, reader.size, ondeflateappend, onprogress, ondeflateend, onreaderror, onwriteerror);
429
+ return worker;
430
+ }
431
+
432
+ function copy(reader, writer, offset, size, computeCrc32, onend, onprogress, onreaderror, onwriteerror) {
433
+ var chunkIndex = 0, crc32 = new Crc32();
434
+
435
+ function step() {
436
+ var index = chunkIndex * CHUNK_SIZE;
437
+ if (index < size)
438
+ reader.readUint8Array(offset + index, Math.min(CHUNK_SIZE, size - index), function(array) {
439
+ if (computeCrc32)
440
+ crc32.append(array);
441
+ if (onprogress)
442
+ onprogress(index, size, array);
443
+ writer.writeUint8Array(array, function() {
444
+ chunkIndex++;
445
+ step();
446
+ }, onwriteerror);
447
+ }, onreaderror);
448
+ else
449
+ onend(size, crc32.get());
450
+ }
451
+
452
+ step();
453
+ }
454
+
455
+ // ZipReader
456
+
457
+ function decodeASCII(str) {
458
+ var i, out = "", charCode, extendedASCII = [ '\u00C7', '\u00FC', '\u00E9', '\u00E2', '\u00E4', '\u00E0', '\u00E5', '\u00E7', '\u00EA', '\u00EB',
459
+ '\u00E8', '\u00EF', '\u00EE', '\u00EC', '\u00C4', '\u00C5', '\u00C9', '\u00E6', '\u00C6', '\u00F4', '\u00F6', '\u00F2', '\u00FB', '\u00F9',
460
+ '\u00FF', '\u00D6', '\u00DC', '\u00F8', '\u00A3', '\u00D8', '\u00D7', '\u0192', '\u00E1', '\u00ED', '\u00F3', '\u00FA', '\u00F1', '\u00D1',
461
+ '\u00AA', '\u00BA', '\u00BF', '\u00AE', '\u00AC', '\u00BD', '\u00BC', '\u00A1', '\u00AB', '\u00BB', '_', '_', '_', '\u00A6', '\u00A6',
462
+ '\u00C1', '\u00C2', '\u00C0', '\u00A9', '\u00A6', '\u00A6', '+', '+', '\u00A2', '\u00A5', '+', '+', '-', '-', '+', '-', '+', '\u00E3',
463
+ '\u00C3', '+', '+', '-', '-', '\u00A6', '-', '+', '\u00A4', '\u00F0', '\u00D0', '\u00CA', '\u00CB', '\u00C8', 'i', '\u00CD', '\u00CE',
464
+ '\u00CF', '+', '+', '_', '_', '\u00A6', '\u00CC', '_', '\u00D3', '\u00DF', '\u00D4', '\u00D2', '\u00F5', '\u00D5', '\u00B5', '\u00FE',
465
+ '\u00DE', '\u00DA', '\u00DB', '\u00D9', '\u00FD', '\u00DD', '\u00AF', '\u00B4', '\u00AD', '\u00B1', '_', '\u00BE', '\u00B6', '\u00A7',
466
+ '\u00F7', '\u00B8', '\u00B0', '\u00A8', '\u00B7', '\u00B9', '\u00B3', '\u00B2', '_', ' ' ];
467
+ for (i = 0; i < str.length; i++) {
468
+ charCode = str.charCodeAt(i) & 0xFF;
469
+ if (charCode > 127)
470
+ out += extendedASCII[charCode - 128];
471
+ else
472
+ out += String.fromCharCode(charCode);
473
+ }
474
+ return out;
475
+ }
476
+
477
+ function decodeUTF8(string) {
478
+ return decodeURIComponent(escape(string));
479
+ }
480
+
481
+ function getString(bytes) {
482
+ var i, str = "";
483
+ for (i = 0; i < bytes.length; i++)
484
+ str += String.fromCharCode(bytes[i]);
485
+ return str;
486
+ }
487
+
488
+ function getDate(timeRaw) {
489
+ var date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & 0x0000ffff;
490
+ try {
491
+ return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5,
492
+ (time & 0x001F) * 2, 0);
493
+ } catch (e) {
494
+ }
495
+ }
496
+
497
+ function readCommonHeader(entry, data, index, centralDirectory, onerror) {
498
+ entry.version = data.view.getUint16(index, true);
499
+ entry.bitFlag = data.view.getUint16(index + 2, true);
500
+ entry.compressionMethod = data.view.getUint16(index + 4, true);
501
+ entry.lastModDateRaw = data.view.getUint32(index + 6, true);
502
+ entry.lastModDate = getDate(entry.lastModDateRaw);
503
+ if ((entry.bitFlag & 0x01) === 0x01) {
504
+ onerror(ERR_ENCRYPTED);
505
+ return;
506
+ }
507
+ if (centralDirectory || (entry.bitFlag & 0x0008) != 0x0008) {
508
+ entry.crc32 = data.view.getUint32(index + 10, true);
509
+ entry.compressedSize = data.view.getUint32(index + 14, true);
510
+ entry.uncompressedSize = data.view.getUint32(index + 18, true);
511
+ }
512
+ if (entry.compressedSize === 0xFFFFFFFF || entry.uncompressedSize === 0xFFFFFFFF) {
513
+ onerror(ERR_ZIP64);
514
+ return;
515
+ }
516
+ entry.filenameLength = data.view.getUint16(index + 22, true);
517
+ entry.extraFieldLength = data.view.getUint16(index + 24, true);
518
+ }
519
+
520
+ function createZipReader(reader, onerror) {
521
+ function Entry() {
522
+ }
523
+
524
+ Entry.prototype.getData = function(writer, onend, onprogress, checkCrc32) {
525
+ var that = this, worker;
526
+
527
+ function terminate(callback, param) {
528
+ if (worker)
529
+ worker.terminate();
530
+ worker = null;
531
+ if (callback)
532
+ callback(param);
533
+ }
534
+
535
+ function testCrc32(crc32) {
536
+ var dataCrc32 = getDataHelper(4);
537
+ dataCrc32.view.setUint32(0, crc32);
538
+ return that.crc32 == dataCrc32.view.getUint32(0);
539
+ }
540
+
541
+ function getWriterData(uncompressedSize, crc32) {
542
+ if (checkCrc32 && !testCrc32(crc32))
543
+ onreaderror();
544
+ else
545
+ writer.getData(function(data) {
546
+ terminate(onend, data);
547
+ });
548
+ }
549
+
550
+ function onreaderror() {
551
+ terminate(onerror, ERR_READ_DATA);
552
+ }
553
+
554
+ function onwriteerror() {
555
+ terminate(onerror, ERR_WRITE_DATA);
556
+ }
557
+
558
+ reader.readUint8Array(that.offset, 30, function(bytes) {
559
+ var data = getDataHelper(bytes.length, bytes), dataOffset;
560
+ if (data.view.getUint32(0) != 0x504b0304) {
561
+ onerror(ERR_BAD_FORMAT);
562
+ return;
563
+ }
564
+ readCommonHeader(that, data, 4, false, onerror);
565
+ dataOffset = that.offset + 30 + that.filenameLength + that.extraFieldLength;
566
+ writer.init(function() {
567
+ if (that.compressionMethod === 0)
568
+ copy(reader, writer, dataOffset, that.compressedSize, checkCrc32, getWriterData, onprogress, onreaderror, onwriteerror);
569
+ else
570
+ worker = inflate(reader, writer, dataOffset, that.compressedSize, checkCrc32, getWriterData, onprogress, onreaderror, onwriteerror);
571
+ }, onwriteerror);
572
+ }, onreaderror);
573
+ };
574
+
575
+ function seekEOCDR(offset, entriesCallback) {
576
+ reader.readUint8Array(reader.size - offset, offset, function(bytes) {
577
+ var dataView = getDataHelper(bytes.length, bytes).view;
578
+ if (dataView.getUint32(0) != 0x504b0506) {
579
+ seekEOCDR(offset + 1, entriesCallback);
580
+ } else {
581
+ entriesCallback(dataView);
582
+ }
583
+ }, function() {
584
+ onerror(ERR_READ);
585
+ });
586
+ }
587
+
588
+ return {
589
+ getEntries : function(callback) {
590
+ if (reader.size < 22) {
591
+ onerror(ERR_BAD_FORMAT);
592
+ return;
593
+ }
594
+ // look for End of central directory record
595
+ seekEOCDR(22, function(dataView) {
596
+ var datalength, fileslength;
597
+ datalength = dataView.getUint32(16, true);
598
+ fileslength = dataView.getUint16(8, true);
599
+ reader.readUint8Array(datalength, reader.size - datalength, function(bytes) {
600
+ var i, index = 0, entries = [], entry, filename, comment, data = getDataHelper(bytes.length, bytes);
601
+ for (i = 0; i < fileslength; i++) {
602
+ entry = new Entry();
603
+ if (data.view.getUint32(index) != 0x504b0102) {
604
+ onerror(ERR_BAD_FORMAT);
605
+ return;
606
+ }
607
+ readCommonHeader(entry, data, index + 6, true, onerror);
608
+ entry.commentLength = data.view.getUint16(index + 32, true);
609
+ entry.directory = ((data.view.getUint8(index + 38) & 0x10) == 0x10);
610
+ entry.offset = data.view.getUint32(index + 42, true);
611
+ filename = getString(data.array.subarray(index + 46, index + 46 + entry.filenameLength));
612
+ entry.filename = ((entry.bitFlag & 0x0800) === 0x0800) ? decodeUTF8(filename) : decodeASCII(filename);
613
+ if (!entry.directory && entry.filename.charAt(entry.filename.length - 1) == "/")
614
+ entry.directory = true;
615
+ comment = getString(data.array.subarray(index + 46 + entry.filenameLength + entry.extraFieldLength, index + 46
616
+ + entry.filenameLength + entry.extraFieldLength + entry.commentLength));
617
+ entry.comment = ((entry.bitFlag & 0x0800) === 0x0800) ? decodeUTF8(comment) : decodeASCII(comment);
618
+ entries.push(entry);
619
+ index += 46 + entry.filenameLength + entry.extraFieldLength + entry.commentLength;
620
+ }
621
+ callback(entries);
622
+ }, function() {
623
+ onerror(ERR_READ);
624
+ });
625
+ });
626
+ },
627
+ close : function(callback) {
628
+ if (callback)
629
+ callback();
630
+ }
631
+ };
632
+ }
633
+
634
+ // ZipWriter
635
+
636
+ function encodeUTF8(string) {
637
+ return unescape(encodeURIComponent(string));
638
+ }
639
+
640
+ function getBytes(str) {
641
+ var i, array = [];
642
+ for (i = 0; i < str.length; i++)
643
+ array.push(str.charCodeAt(i));
644
+ return array;
645
+ }
646
+
647
+ function createZipWriter(writer, onerror, dontDeflate) {
648
+ var worker, files = {}, filenames = [], datalength = 0;
649
+
650
+ function terminate(callback, message) {
651
+ if (worker)
652
+ worker.terminate();
653
+ worker = null;
654
+ if (callback)
655
+ callback(message);
656
+ }
657
+
658
+ function onwriteerror() {
659
+ terminate(onerror, ERR_WRITE);
660
+ }
661
+
662
+ function onreaderror() {
663
+ terminate(onerror, ERR_READ_DATA);
664
+ }
665
+
666
+ return {
667
+ add : function(name, reader, onend, onprogress, options) {
668
+ var header, filename, date;
669
+
670
+ function writeHeader(callback) {
671
+ var data;
672
+ date = options.lastModDate || new Date();
673
+ header = getDataHelper(26);
674
+ files[name] = {
675
+ headerArray : header.array,
676
+ directory : options.directory,
677
+ filename : filename,
678
+ offset : datalength,
679
+ comment : getBytes(encodeUTF8(options.comment || ""))
680
+ };
681
+ header.view.setUint32(0, 0x14000808);
682
+ if (options.version)
683
+ header.view.setUint8(0, options.version);
684
+ if (!dontDeflate && options.level !== 0 && !options.directory)
685
+ header.view.setUint16(4, 0x0800);
686
+ header.view.setUint16(6, (((date.getHours() << 6) | date.getMinutes()) << 5) | date.getSeconds() / 2, true);
687
+ header.view.setUint16(8, ((((date.getFullYear() - 1980) << 4) | (date.getMonth() + 1)) << 5) | date.getDate(), true);
688
+ header.view.setUint16(22, filename.length, true);
689
+ data = getDataHelper(30 + filename.length);
690
+ data.view.setUint32(0, 0x504b0304);
691
+ data.array.set(header.array, 4);
692
+ data.array.set(filename, 30);
693
+ datalength += data.array.length;
694
+ writer.writeUint8Array(data.array, callback, onwriteerror);
695
+ }
696
+
697
+ function writeFooter(compressedLength, crc32) {
698
+ var footer = getDataHelper(16);
699
+ datalength += compressedLength || 0;
700
+ footer.view.setUint32(0, 0x504b0708);
701
+ if (typeof crc32 != "undefined") {
702
+ header.view.setUint32(10, crc32, true);
703
+ footer.view.setUint32(4, crc32, true);
704
+ }
705
+ if (reader) {
706
+ footer.view.setUint32(8, compressedLength, true);
707
+ header.view.setUint32(14, compressedLength, true);
708
+ footer.view.setUint32(12, reader.size, true);
709
+ header.view.setUint32(18, reader.size, true);
710
+ }
711
+ writer.writeUint8Array(footer.array, function() {
712
+ datalength += 16;
713
+ terminate(onend);
714
+ }, onwriteerror);
715
+ }
716
+
717
+ function writeFile() {
718
+ options = options || {};
719
+ name = name.trim();
720
+ if (options.directory && name.charAt(name.length - 1) != "/")
721
+ name += "/";
722
+ if (files.hasOwnProperty(name)) {
723
+ onerror(ERR_DUPLICATED_NAME);
724
+ return;
725
+ }
726
+ filename = getBytes(encodeUTF8(name));
727
+ filenames.push(name);
728
+ writeHeader(function() {
729
+ if (reader)
730
+ if (dontDeflate || options.level === 0)
731
+ copy(reader, writer, 0, reader.size, true, writeFooter, onprogress, onreaderror, onwriteerror);
732
+ else
733
+ worker = deflate(reader, writer, options.level, writeFooter, onprogress, onreaderror, onwriteerror);
734
+ else
735
+ writeFooter();
736
+ }, onwriteerror);
737
+ }
738
+
739
+ if (reader)
740
+ reader.init(writeFile, onreaderror);
741
+ else
742
+ writeFile();
743
+ },
744
+ close : function(callback) {
745
+ var data, length = 0, index = 0, indexFilename, file;
746
+ for (indexFilename = 0; indexFilename < filenames.length; indexFilename++) {
747
+ file = files[filenames[indexFilename]];
748
+ length += 46 + file.filename.length + file.comment.length;
749
+ }
750
+ data = getDataHelper(length + 22);
751
+ for (indexFilename = 0; indexFilename < filenames.length; indexFilename++) {
752
+ file = files[filenames[indexFilename]];
753
+ data.view.setUint32(index, 0x504b0102);
754
+ data.view.setUint16(index + 4, 0x1400);
755
+ data.array.set(file.headerArray, index + 6);
756
+ data.view.setUint16(index + 32, file.comment.length, true);
757
+ if (file.directory)
758
+ data.view.setUint8(index + 38, 0x10);
759
+ data.view.setUint32(index + 42, file.offset, true);
760
+ data.array.set(file.filename, index + 46);
761
+ data.array.set(file.comment, index + 46 + file.filename.length);
762
+ index += 46 + file.filename.length + file.comment.length;
763
+ }
764
+ data.view.setUint32(index, 0x504b0506);
765
+ data.view.setUint16(index + 8, filenames.length, true);
766
+ data.view.setUint16(index + 10, filenames.length, true);
767
+ data.view.setUint32(index + 12, length, true);
768
+ data.view.setUint32(index + 16, datalength, true);
769
+ writer.writeUint8Array(data.array, function() {
770
+ terminate(function() {
771
+ writer.getData(callback);
772
+ });
773
+ }, onwriteerror);
774
+ }
775
+ };
776
+ }
777
+
778
+ obj.zip = {
779
+ Reader : Reader,
780
+ Writer : Writer,
781
+ BlobReader : BlobReader,
782
+ Data64URIReader : Data64URIReader,
783
+ TextReader : TextReader,
784
+ BlobWriter : BlobWriter,
785
+ Data64URIWriter : Data64URIWriter,
786
+ TextWriter : TextWriter,
787
+ createReader : function(reader, callback, onerror) {
788
+ reader.init(function() {
789
+ callback(createZipReader(reader, onerror));
790
+ }, onerror);
791
+ },
792
+ createWriter : function(writer, callback, onerror, dontDeflate) {
793
+ writer.init(function() {
794
+ callback(createZipWriter(writer, onerror, dontDeflate));
795
+ }, onerror);
796
+ },
797
+ workerScriptsPath : "",
798
+ useWebWorkers : true
799
+ };
800
+
801
+ })(this);