You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by st...@apache.org on 2014/05/14 02:09:56 UTC
[14/24] CB-5816 node_module/adm-zip
http://git-wip-us.apache.org/repos/asf/cordova-firefoxos/blob/196a3a62/node_modules/adm-zip/test/assets/attributes_test/asd/New Text Document.txt
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/assets/attributes_test/asd/New Text Document.txt b/node_modules/adm-zip/test/assets/attributes_test/asd/New Text Document.txt
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/cordova-firefoxos/blob/196a3a62/node_modules/adm-zip/test/assets/attributes_test/blank file.txt
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/assets/attributes_test/blank file.txt b/node_modules/adm-zip/test/assets/attributes_test/blank file.txt
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/cordova-firefoxos/blob/196a3a62/node_modules/adm-zip/test/index.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/index.js b/node_modules/adm-zip/test/index.js
new file mode 100644
index 0000000..c0d7822
--- /dev/null
+++ b/node_modules/adm-zip/test/index.js
@@ -0,0 +1,5 @@
+var Attr = require("../util").FileAttr,
+ Zip = require("../adm-zip"),
+ fs = require("fs");
+
+//zip.addLocalFile("./test/readonly.txt");
http://git-wip-us.apache.org/repos/asf/cordova-firefoxos/blob/196a3a62/node_modules/adm-zip/util/constants.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/util/constants.js b/node_modules/adm-zip/util/constants.js
new file mode 100644
index 0000000..61a96af
--- /dev/null
+++ b/node_modules/adm-zip/util/constants.js
@@ -0,0 +1,84 @@
+module.exports = {
+ /* The local file header */
+ LOCHDR : 30, // LOC header size
+ LOCSIG : 0x04034b50, // "PK\003\004"
+ LOCVER : 4, // version needed to extract
+ LOCFLG : 6, // general purpose bit flag
+ LOCHOW : 8, // compression method
+ LOCTIM : 10, // modification time (2 bytes time, 2 bytes date)
+ LOCCRC : 14, // uncompressed file crc-32 value
+ LOCSIZ : 18, // compressed size
+ LOCLEN : 22, // uncompressed size
+ LOCNAM : 26, // filename length
+ LOCEXT : 28, // extra field length
+
+ /* The Data descriptor */
+ EXTSIG : 0x08074b50, // "PK\007\008"
+ EXTHDR : 16, // EXT header size
+ EXTCRC : 4, // uncompressed file crc-32 value
+ EXTSIZ : 8, // compressed size
+ EXTLEN : 12, // uncompressed size
+
+ /* The central directory file header */
+ CENHDR : 46, // CEN header size
+ CENSIG : 0x02014b50, // "PK\001\002"
+ CENVEM : 4, // version made by
+ CENVER : 6, // version needed to extract
+ CENFLG : 8, // encrypt, decrypt flags
+ CENHOW : 10, // compression method
+ CENTIM : 12, // modification time (2 bytes time, 2 bytes date)
+ CENCRC : 16, // uncompressed file crc-32 value
+ CENSIZ : 20, // compressed size
+ CENLEN : 24, // uncompressed size
+ CENNAM : 28, // filename length
+ CENEXT : 30, // extra field length
+ CENCOM : 32, // file comment length
+ CENDSK : 34, // volume number start
+ CENATT : 36, // internal file attributes
+ CENATX : 38, // external file attributes (host system dependent)
+ CENOFF : 42, // LOC header offset
+
+ /* The entries in the end of central directory */
+ ENDHDR : 22, // END header size
+ ENDSIG : 0x06054b50, // "PK\005\006"
+ ENDSUB : 8, // number of entries on this disk
+ ENDTOT : 10, // total number of entries
+ ENDSIZ : 12, // central directory size in bytes
+ ENDOFF : 16, // offset of first CEN header
+ ENDCOM : 20, // zip file comment length
+
+ /* Compression methods */
+ STORED : 0, // no compression
+ SHRUNK : 1, // shrunk
+ REDUCED1 : 2, // reduced with compression factor 1
+ REDUCED2 : 3, // reduced with compression factor 2
+ REDUCED3 : 4, // reduced with compression factor 3
+ REDUCED4 : 5, // reduced with compression factor 4
+ IMPLODED : 6, // imploded
+ // 7 reserved
+ DEFLATED : 8, // deflated
+ ENHANCED_DEFLATED: 9, // enhanced deflated
+ PKWARE : 10,// PKWare DCL imploded
+ // 11 reserved
+ BZIP2 : 12, // compressed using BZIP2
+ // 13 reserved
+ LZMA : 14, // LZMA
+ // 15-17 reserved
+ IBM_TERSE : 18, // compressed using IBM TERSE
+ IBM_LZ77 : 19, //IBM LZ77 z
+
+ /* General purpose bit flag */
+ FLG_ENC : 0, // encripted file
+ FLG_COMP1 : 1, // compression option
+ FLG_COMP2 : 2, // compression option
+ FLG_DESC : 4, // data descriptor
+ FLG_ENH : 8, // enhanced deflation
+ FLG_STR : 16, // strong encryption
+ FLG_LNG : 1024, // language encoding
+ FLG_MSK : 4096, // mask header values
+
+ /* Load type */
+ FILE : 0,
+ BUFFER : 1,
+ NONE : 2
+};
http://git-wip-us.apache.org/repos/asf/cordova-firefoxos/blob/196a3a62/node_modules/adm-zip/util/errors.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/util/errors.js b/node_modules/adm-zip/util/errors.js
new file mode 100644
index 0000000..50931c3
--- /dev/null
+++ b/node_modules/adm-zip/util/errors.js
@@ -0,0 +1,35 @@
+module.exports = {
+ /* Header error messages */
+ "INVALID_LOC" : "Invalid LOC header (bad signature)",
+ "INVALID_CEN" : "Invalid CEN header (bad signature)",
+ "INVALID_END" : "Invalid END header (bad signature)",
+
+ /* ZipEntry error messages*/
+ "NO_DATA" : "Nothing to decompress",
+ "BAD_CRC" : "CRC32 checksum failed",
+ "FILE_IN_THE_WAY" : "There is a file in the way: %s",
+ "UNKNOWN_METHOD" : "Invalid/unsupported compression method",
+
+ /* Inflater error messages */
+ "AVAIL_DATA" : "inflate::Available inflate data did not terminate",
+ "INVALID_DISTANCE" : "inflate::Invalid literal/length or distance code in fixed or dynamic block",
+ "TO_MANY_CODES" : "inflate::Dynamic block code description: too many length or distance codes",
+ "INVALID_REPEAT_LEN" : "inflate::Dynamic block code description: repeat more than specified lengths",
+ "INVALID_REPEAT_FIRST" : "inflate::Dynamic block code description: repeat lengths with no first length",
+ "INCOMPLETE_CODES" : "inflate::Dynamic block code description: code lengths codes incomplete",
+ "INVALID_DYN_DISTANCE": "inflate::Dynamic block code description: invalid distance code lengths",
+ "INVALID_CODES_LEN": "inflate::Dynamic block code description: invalid literal/length code lengths",
+ "INVALID_STORE_BLOCK" : "inflate::Stored block length did not match one's complement",
+ "INVALID_BLOCK_TYPE" : "inflate::Invalid block type (type == 3)",
+
+ /* ADM-ZIP error messages */
+ "CANT_EXTRACT_FILE" : "Could not extract the file",
+ "CANT_OVERRIDE" : "Target file already exists",
+ "NO_ZIP" : "No zip file was loaded",
+ "NO_ENTRY" : "Entry doesn't exist",
+ "DIRECTORY_CONTENT_ERROR" : "A directory cannot have content",
+ "FILE_NOT_FOUND" : "File not found: %s",
+ "NOT_IMPLEMENTED" : "Not implemented",
+ "INVALID_FILENAME" : "Invalid filename",
+ "INVALID_FORMAT" : "Invalid or unsupported zip format. No END header found"
+};
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cordova-firefoxos/blob/196a3a62/node_modules/adm-zip/util/fattr.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/util/fattr.js b/node_modules/adm-zip/util/fattr.js
new file mode 100644
index 0000000..4f247ea
--- /dev/null
+++ b/node_modules/adm-zip/util/fattr.js
@@ -0,0 +1,84 @@
+var fs = require("fs"),
+ pth = require("path");
+
+fs.existsSync = fs.existsSync || pth.existsSync;
+
+module.exports = function(/*String*/path) {
+
+ var _path = path || "",
+ _permissions = 0,
+ _obj = newAttr(),
+ _stat = null;
+
+ function newAttr() {
+ return {
+ directory : false,
+ readonly : false,
+ hidden : false,
+ executable : false,
+ mtime : 0,
+ atime : 0
+ }
+ }
+
+ if (_path && fs.existsSync(_path)) {
+ _stat = fs.statSync(_path);
+ _obj.directory = _stat.isDirectory();
+ _obj.mtime = _stat.mtime;
+ _obj.atime = _stat.atime;
+ _obj.executable = !!(1 & parseInt ((_stat.mode & parseInt ("777", 8)).toString (8)[0]));
+ _obj.readonly = !!(2 & parseInt ((_stat.mode & parseInt ("777", 8)).toString (8)[0]));
+ _obj.hidden = pth.basename(_path)[0] === ".";
+ } else {
+ console.warn("Invalid path: " + _path)
+ }
+
+ return {
+
+ get directory () {
+ return _obj.directory;
+ },
+
+ get readOnly () {
+ return _obj.readonly;
+ },
+
+ get hidden () {
+ return _obj.hidden;
+ },
+
+ get mtime () {
+ return _obj.mtime;
+ },
+
+ get atime () {
+ return _obj.atime;
+ },
+
+
+ get executable () {
+ return _obj.executable;
+ },
+
+ decodeAttributes : function(val) {
+
+ },
+
+ encodeAttributes : function (val) {
+
+ },
+
+ toString : function() {
+ return '{\n' +
+ '\t"path" : "' + _path + ",\n" +
+ '\t"isDirectory" : ' + _obj.directory + ",\n" +
+ '\t"isReadOnly" : ' + _obj.readonly + ",\n" +
+ '\t"isHidden" : ' + _obj.hidden + ",\n" +
+ '\t"isExecutable" : ' + _obj.executable + ",\n" +
+ '\t"mTime" : ' + _obj.mtime + "\n" +
+ '\t"aTime" : ' + _obj.atime + "\n" +
+ '}';
+ }
+ }
+
+};
http://git-wip-us.apache.org/repos/asf/cordova-firefoxos/blob/196a3a62/node_modules/adm-zip/util/index.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/util/index.js b/node_modules/adm-zip/util/index.js
new file mode 100644
index 0000000..d77b980
--- /dev/null
+++ b/node_modules/adm-zip/util/index.js
@@ -0,0 +1,4 @@
+module.exports = require("./utils");
+module.exports.Constants = require("./constants");
+module.exports.Errors = require("./errors");
+module.exports.FileAttr = require("./fattr");
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cordova-firefoxos/blob/196a3a62/node_modules/adm-zip/util/utils.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/util/utils.js b/node_modules/adm-zip/util/utils.js
new file mode 100644
index 0000000..ef42999
--- /dev/null
+++ b/node_modules/adm-zip/util/utils.js
@@ -0,0 +1,145 @@
+var fs = require("fs"),
+ pth = require('path');
+
+fs.existsSync = fs.existsSync || pth.existsSync;
+
+module.exports = (function() {
+
+ var crcTable = [],
+ Constants = require('./constants'),
+ Errors = require('./errors'),
+
+ PATH_SEPARATOR = pth.normalize("/");
+
+
+ function mkdirSync(/*String*/path) {
+ var resolvedPath = path.split(PATH_SEPARATOR)[0];
+ path.split(PATH_SEPARATOR).forEach(function(name) {
+ if (!name || name.substr(-1,1) == ":") return;
+ resolvedPath += PATH_SEPARATOR + name;
+ var stat;
+ try {
+ stat = fs.statSync(resolvedPath);
+ } catch (e) {
+ fs.mkdirSync(resolvedPath);
+ }
+ if (stat && stat.isFile())
+ throw Errors.FILE_IN_THE_WAY.replace("%s", resolvedPath);
+ });
+ }
+
+ function findSync(/*String*/root, /*RegExp*/pattern, /*Boolean*/recoursive) {
+ if (typeof pattern === 'boolean') {
+ recoursive = pattern;
+ pattern = undefined;
+ }
+ var files = [];
+ fs.readdirSync(root).forEach(function(file) {
+ var path = pth.join(root, file);
+
+ if (fs.statSync(path).isDirectory() && recoursive)
+ files = files.concat(findSync(path, pattern, recoursive));
+
+ if (!pattern || pattern.test(path)) {
+ files.push(pth.normalize(path) + (fs.statSync(path).isDirectory() ? PATH_SEPARATOR : ""));
+ }
+
+ });
+ return files;
+ }
+
+ return {
+ makeDir : function(/*String*/path) {
+ mkdirSync(path);
+ },
+
+ crc32 : function(buf) {
+ var b = new Buffer(4);
+ if (!crcTable.length) {
+ for (var n = 0; n < 256; n++) {
+ var c = n;
+ for (var k = 8; --k >= 0;) //
+ if ((c & 1) != 0) { c = 0xedb88320 ^ (c >>> 1); } else { c = c >>> 1; }
+ if (c < 0) {
+ b.writeInt32LE(c, 0);
+ c = b.readUInt32LE(0);
+ }
+ crcTable[n] = c;
+ }
+ }
+ var crc = 0, off = 0, len = buf.length, c1 = ~crc;
+ while(--len >= 0) c1 = crcTable[(c1 ^ buf[off++]) & 0xff] ^ (c1 >>> 8);
+ crc = ~c1;
+ b.writeInt32LE(crc & 0xffffffff, 0);
+ return b.readUInt32LE(0);
+ },
+
+ methodToString : function(/*Number*/method) {
+ switch (method) {
+ case Constants.STORED:
+ return 'STORED (' + method + ')';
+ case Constants.DEFLATED:
+ return 'DEFLATED (' + method + ')';
+ default:
+ return 'UNSUPPORTED (' + method + ')'
+ }
+
+ },
+
+ writeFileTo : function(/*String*/path, /*Buffer*/content, /*Boolean*/overwrite, /*Number*/attr) {
+ if (fs.existsSync(path)) {
+ if (!overwrite)
+ return false; // cannot overwite
+
+ var stat = fs.statSync(path);
+ if (stat.isDirectory()) {
+ return false;
+ }
+ }
+ var folder = pth.dirname(path);
+ if (!fs.existsSync(folder)) {
+ mkdirSync(folder);
+ }
+
+ var fd;
+ try {
+ fd = fs.openSync(path, 'w', 438); // 0666
+ } catch(e) {
+ fs.chmodSync(path, 438);
+ fd = fs.openSync(path, 'w', 438);
+ }
+ if (fd) {
+ fs.writeSync(fd, content, 0, content.length, 0);
+ fs.closeSync(fd);
+ }
+ fs.chmodSync(path, attr || 438);
+ return true;
+ },
+
+ findFiles : function(/*String*/path) {
+ return findSync(path, true);
+ },
+
+ getAttributes : function(/*String*/path) {
+
+ },
+
+ setAttributes : function(/*String*/path) {
+
+ },
+
+ toBuffer : function(input) {
+ if (Buffer.isBuffer(input)) {
+ return input;
+ } else {
+ if (input.length == 0) {
+ return new Buffer(0)
+ }
+ return new Buffer(input, 'utf8');
+ }
+ },
+
+ Constants : Constants,
+ Errors : Errors
+ }
+})();
http://git-wip-us.apache.org/repos/asf/cordova-firefoxos/blob/196a3a62/node_modules/adm-zip/zipEntry.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/zipEntry.js b/node_modules/adm-zip/zipEntry.js
new file mode 100644
index 0000000..3da38f1
--- /dev/null
+++ b/node_modules/adm-zip/zipEntry.js
@@ -0,0 +1,224 @@
+var Utils = require("./util"),
+ Headers = require("./headers"),
+ Constants = Utils.Constants,
+ Methods = require("./methods");
+
+module.exports = function (/*Buffer*/input) {
+
+ var _entryHeader = new Headers.EntryHeader(),
+ _entryName = new Buffer(0),
+ _comment = new Buffer(0),
+ _isDirectory = false,
+ uncompressedData = null,
+ _extra = new Buffer(0);
+
+ function getCompressedDataFromZip() {
+ if (!input || !Buffer.isBuffer(input)) {
+ return new Buffer(0);
+ }
+ _entryHeader.loadDataHeaderFromBinary(input);
+ return input.slice(_entryHeader.realDataOffset, _entryHeader.realDataOffset + _entryHeader.compressedSize)
+ }
+
+ function crc32OK(data) {
+ // if bit 3 (0x08) of the general-purpose flags field is set, then the CRC-32 and file sizes are not known when the header is written
+ if (_entryHeader.flags & 0x8 != 0x8) {
+ if (Utils.crc32(data) != _entryHeader.crc) {
+ return false;
+ }
+ } else {
+ // @TODO: load and check data descriptor header
+ // The fields in the local header are filled with zero, and the CRC-32 and size are appended in a 12-byte structure
+ // (optionally preceded by a 4-byte signature) immediately after the compressed data:
+ }
+ return true;
+ }
+
+ function decompress(/*Boolean*/async, /*Function*/callback) {
+ if (_isDirectory) {
+ if (async && callback) {
+ callback(new Buffer(0), Utils.Errors.DIRECTORY_CONTENT_ERROR); //si added error.
+ }
+ return new Buffer(0);
+ }
+
+ var compressedData = getCompressedDataFromZip();
+ if (compressedData.length == 0) {
+ if (async && callback) callback(compressedData, Utils.Errors.NO_DATA);//si added error.
+ return compressedData;
+ }
+
+ var data = new Buffer(_entryHeader.size);
+ data.fill(0);
+
+ switch (_entryHeader.method) {
+ case Utils.Constants.STORED:
+ compressedData.copy(data);
+ if (!crc32OK(data)) {
+ if (async && callback) callback(data, Utils.Errors.BAD_CRC);//si added error
+ return Utils.Errors.BAD_CRC;
+ } else {//si added otherwise did not seem to return data.
+ if (async && callback) callback(data);
+ return data;
+ }
+ break;
+ case Utils.Constants.DEFLATED:
+ var inflater = new Methods.Inflater(compressedData);
+ if (!async) {
+ inflater.inflate(data);
+ if (!crc32OK(data)) {
+ console.warn(Utils.Errors.BAD_CRC + " " + _entryName.toString())
+ }
+ return data;
+ } else {
+ inflater.inflateAsync(function(result) {
+ result.copy(data, 0);
+ if (crc32OK(data)) {
+ if (callback) callback(data, Utils.Errors.BAD_CRC); //si added error
+ } else { //si added otherwise did not seem to return data.
+ if (callback) callback(data);
+ }
+ })
+ }
+ break;
+ default:
+ if (async && callback) callback(new Buffer(0), Utils.Errors.UNKNOWN_METHOD);
+ return Utils.Errors.UNKNOWN_METHOD;
+ }
+ }
+
+ function compress(/*Boolean*/async, /*Function*/callback) {
+ if ((!uncompressedData || !uncompressedData.length) && Buffer.isBuffer(input)) {
+ // no data set or the data wasn't changed to require recompression
+ if (async && callback) callback(getCompressedDataFromZip());
+ return getCompressedDataFromZip();
+ }
+
+ if (uncompressedData.length && !_isDirectory) {
+ var compressedData;
+ // Local file header
+ switch (_entryHeader.method) {
+ case Utils.Constants.STORED:
+ _entryHeader.compressedSize = _entryHeader.size;
+
+ compressedData = new Buffer(uncompressedData.length);
+ uncompressedData.copy(compressedData);
+
+ if (async && callback) callback(compressedData);
+ return compressedData;
+
+ break;
+ default:
+ case Utils.Constants.DEFLATED:
+
+ var deflater = new Methods.Deflater(uncompressedData);
+ if (!async) {
+ var deflated = deflater.deflate();
+ _entryHeader.compressedSize = deflated.length;
+ return deflated;
+ } else {
+ deflater.deflateAsync(function(data) {
+ compressedData = new Buffer(data.length);
+ _entryHeader.compressedSize = data.length;
+ data.copy(compressedData);
+ callback && callback(compressedData);
+ })
+ }
+ deflater = null;
+ break;
+ }
+ } else {
+ if (async && callback) {
+ callback(new Buffer(0));
+ } else {
+ return new Buffer(0);
+ }
+ }
+ }
+
+ return {
+ get entryName () { return _entryName.toString(); },
+ get rawEntryName() { return _entryName; },
+ set entryName (val) {
+ _entryName = Utils.toBuffer(val);
+ var lastChar = _entryName[_entryName.length - 1];
+ _isDirectory = (lastChar == 47) || (lastChar == 92);
+ _entryHeader.fileNameLength = _entryName.length;
+ },
+
+ get extra () { return _extra; },
+ set extra (val) {
+ _extra = val;
+ _entryHeader.extraLength = val.length;
+ },
+
+ get comment () { return _comment.toString(); },
+ set comment (val) {
+ _comment = Utils.toBuffer(val);
+ _entryHeader.commentLength = _comment.length;
+ },
+
+ get name () { var n = _entryName.toString(); return _isDirectory ? n.substr(n.length - 1).split("/").pop() : n.split("/").pop(); },
+ get isDirectory () { return _isDirectory },
+
+ getCompressedData : function() {
+ return compress(false, null)
+ },
+
+ getCompressedDataAsync : function(/*Function*/callback) {
+ compress(true, callback)
+ },
+
+ setData : function(value) {
+ uncompressedData = Utils.toBuffer(value);
+ if (!_isDirectory && uncompressedData.length) {
+ _entryHeader.size = uncompressedData.length;
+ _entryHeader.method = Utils.Constants.DEFLATED;
+ _entryHeader.crc = Utils.crc32(value);
+ } else { // folders and blank files should be stored
+ _entryHeader.method = Utils.Constants.STORED;
+ }
+ },
+
+ getData : function() {
+ return decompress(false, null);
+ },
+
+ getDataAsync : function(/*Function*/callback) {
+ decompress(true, callback)
+ },
+
+ set header(/*Buffer*/data) {
+ _entryHeader.loadFromBinary(data);
+ },
+
+ get header() {
+ return _entryHeader;
+ },
+
+ packHeader : function() {
+ var header = _entryHeader.entryHeaderToBinary();
+ // add
+ _entryName.copy(header, Utils.Constants.CENHDR);
+ if (_entryHeader.extraLength) {
+ _extra.copy(header, Utils.Constants.CENHDR + _entryName.length)
+ }
+ if (_entryHeader.commentLength) {
+ _comment.copy(header, Utils.Constants.CENHDR + _entryName.length + _entryHeader.extraLength, _comment.length);
+ }
+ return header;
+ },
+
+ toString : function() {
+ return '{\n' +
+ '\t"entryName" : "' + _entryName.toString() + "\",\n" +
+ '\t"name" : "' + _entryName.toString().split("/").pop() + "\",\n" +
+ '\t"comment" : "' + _comment.toString() + "\",\n" +
+ '\t"isDirectory" : ' + _isDirectory + ",\n" +
+ '\t"header" : ' + _entryHeader.toString().replace(/\t/mg, "\t\t") + ",\n" +
+ '\t"compressedData" : <' + (input && input.length + " bytes buffer" || "null") + ">\n" +
+ '\t"data" : <' + (uncompressedData && uncompressedData.length + " bytes buffer" || "null") + ">\n" +
+ '}';
+ }
+ }
+};
http://git-wip-us.apache.org/repos/asf/cordova-firefoxos/blob/196a3a62/node_modules/adm-zip/zipFile.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/zipFile.js b/node_modules/adm-zip/zipFile.js
new file mode 100644
index 0000000..d7433b0
--- /dev/null
+++ b/node_modules/adm-zip/zipFile.js
@@ -0,0 +1,311 @@
+var ZipEntry = require("./zipEntry"),
+ Headers = require("./headers"),
+ Utils = require("./util");
+
+module.exports = function(/*String|Buffer*/input, /*Number*/inputType) {
+ var entryList = [],
+ entryTable = {},
+ _comment = new Buffer(0),
+ filename = "",
+ fs = require("fs"),
+ inBuffer = null,
+ mainHeader = new Headers.MainHeader();
+
+ if (inputType == Utils.Constants.FILE) {
+ // is a filename
+ filename = input;
+ inBuffer = fs.readFileSync(filename);
+ readMainHeader();
+ } else if (inputType == Utils.Constants.BUFFER) {
+ // is a memory buffer
+ inBuffer = input;
+ readMainHeader();
+ } else {
+ // none. is a new file
+ }
+
+ function readEntries() {
+ entryTable = {};
+ entryList = new Array(mainHeader.diskEntries); // total number of entries
+ var index = mainHeader.offset; // offset of first CEN header
+ for(var i = 0; i < entryList.length; i++) {
+
+ var tmp = index,
+ entry = new ZipEntry(inBuffer);
+ entry.header = inBuffer.slice(tmp, tmp += Utils.Constants.CENHDR);
+
+ entry.entryName = inBuffer.slice(tmp, tmp += entry.header.fileNameLength);
+
+ if (entry.header.extraLength) {
+ entry.extra = inBuffer.slice(tmp, tmp += entry.header.extraLength);
+ }
+
+ if (entry.header.commentLength)
+ entry.comment = inBuffer.slice(tmp, tmp + entry.header.commentLength);
+
+ index += entry.header.entryHeaderSize;
+
+ entryList[i] = entry;
+ entryTable[entry.entryName] = entry;
+ }
+ }
+
+ function readMainHeader() {
+ var i = inBuffer.length - Utils.Constants.ENDHDR, // END header size
+ n = Math.max(0, i - 0xFFFF), // 0xFFFF is the max zip file comment length
+ endOffset = 0; // Start offset of the END header
+
+ for (i; i >= n; i--) {
+ if (inBuffer[i] != 0x50) continue; // quick check that the byte is 'P'
+ if (inBuffer.readUInt32LE(i) == Utils.Constants.ENDSIG) { // "PK\005\006"
+ endOffset = i;
+ break;
+ }
+ }
+ if (!endOffset)
+ throw Utils.Errors.INVALID_FORMAT;
+
+ mainHeader.loadFromBinary(inBuffer.slice(endOffset, endOffset + Utils.Constants.ENDHDR));
+ if (mainHeader.commentLength) {
+ _comment = inBuffer.slice(endOffset + Utils.Constants.ENDHDR);
+ }
+ readEntries();
+ }
+
+ return {
+ /**
+ * Returns an array of ZipEntry objects existent in the current opened archive
+ * @return Array
+ */
+ get entries () {
+ return entryList;
+ },
+
+ /**
+ * Archive comment
+ * @return {String}
+ */
+ get comment () { return _comment.toString(); },
+ set comment(val) {
+ mainHeader.commentLength = val.length;
+ _comment = val;
+ },
+
+ /**
+ * Returns a reference to the entry with the given name or null if entry is inexistent
+ *
+ * @param entryName
+ * @return ZipEntry
+ */
+ getEntry : function(/*String*/entryName) {
+ return entryTable[entryName] || null;
+ },
+
+ /**
+ * Adds the given entry to the entry list
+ *
+ * @param entry
+ */
+ setEntry : function(/*ZipEntry*/entry) {
+ entryList.push(entry);
+ entryTable[entry.entryName] = entry;
+ mainHeader.totalEntries = entryList.length;
+ },
+
+ /**
+ * Removes the entry with the given name from the entry list.
+ *
+ * If the entry is a directory, then all nested files and directories will be removed
+ * @param entryName
+ */
+ deleteEntry : function(/*String*/entryName) {
+ var entry = entryTable[entryName];
+ if (entry && entry.isDirectory) {
+ var _self = this;
+ this.getEntryChildren(entry).forEach(function(child) {
+ if (child.entryName != entryName) {
+ _self.deleteEntry(child.entryName)
+ }
+ })
+ }
+ entryList.splice(entryList.indexOf(entry), 1);
+ delete(entryTable[entryName]);
+ mainHeader.totalEntries = entryList.length;
+ },
+
+ /**
+ * Iterates and returns all nested files and directories of the given entry
+ *
+ * @param entry
+ * @return Array
+ */
+ getEntryChildren : function(/*ZipEntry*/entry) {
+ if (entry.isDirectory) {
+ var list = [],
+ name = entry.entryName,
+ len = name.length;
+
+ entryList.forEach(function(zipEntry) {
+ if (zipEntry.entryName.substr(0, len) == name) {
+ list.push(zipEntry);
+ }
+ });
+ return list;
+ }
+ return []
+ },
+
+ /**
+ * Returns the zip file
+ *
+ * @return Buffer
+ */
+ compressToBuffer : function() {
+ if (entryList.length > 1) {
+ entryList.sort(function(a, b) {
+ var nameA = a.entryName.toLowerCase();
+ var nameB = b.entryName.toLowerCase();
+ if (nameA < nameB) {return -1}
+ if (nameA > nameB) {return 1}
+ return 0;
+ });
+ }
+
+ var totalSize = 0,
+ dataBlock = [],
+ entryHeaders = [],
+ dindex = 0;
+
+ mainHeader.size = 0;
+ mainHeader.offset = 0;
+
+ entryList.forEach(function(entry) {
+ entry.header.offset = dindex;
+
+ // compress data and set local and entry header accordingly. Reason why is called first
+ var compressedData = entry.getCompressedData();
+ // data header
+ var dataHeader = entry.header.dataHeaderToBinary();
+ var postHeader = new Buffer(entry.entryName + entry.extra.toString());
+ var dataLength = dataHeader.length + postHeader.length + compressedData.length;
+
+ dindex += dataLength;
+
+ dataBlock.push(dataHeader);
+ dataBlock.push(postHeader);
+ dataBlock.push(compressedData);
+
+ var entryHeader = entry.packHeader();
+ entryHeaders.push(entryHeader);
+ mainHeader.size += entryHeader.length;
+ totalSize += (dataLength + entryHeader.length);
+ });
+
+ totalSize += mainHeader.mainHeaderSize; // also includes zip file comment length
+ // point to end of data and begining of central directory first record
+ mainHeader.offset = dindex;
+
+ dindex = 0;
+ var outBuffer = new Buffer(totalSize);
+ dataBlock.forEach(function(content) {
+ content.copy(outBuffer, dindex); // write data blocks
+ dindex += content.length;
+ });
+ entryHeaders.forEach(function(content) {
+ content.copy(outBuffer, dindex); // write central directory entries
+ dindex += content.length;
+ });
+
+ var mh = mainHeader.toBinary();
+ if (_comment) {
+ _comment.copy(mh, Utils.Constants.ENDHDR); // add zip file comment
+ }
+
+ mh.copy(outBuffer, dindex); // write main header
+
+ return outBuffer
+ },
+
+ toAsyncBuffer : function(/*Function*/onSuccess,/*Function*/onFail,/*Function*/onItemStart,/*Function*/onItemEnd) {
+ if (entryList.length > 1) {
+ entryList.sort(function(a, b) {
+ var nameA = a.entryName.toLowerCase();
+ var nameB = b.entryName.toLowerCase();
+ if (nameA > nameB) {return -1}
+ if (nameA < nameB) {return 1}
+ return 0;
+ });
+ }
+
+ var totalSize = 0,
+ dataBlock = [],
+ entryHeaders = [],
+ dindex = 0;
+
+ mainHeader.size = 0;
+ mainHeader.offset = 0;
+
+ var compress=function(entryList){
+ var self=arguments.callee;
+ var entry;
+ if(entryList.length){
+ var entry=entryList.pop();
+ var name=entry.entryName + entry.extra.toString();
+ if(onItemStart)onItemStart(name);
+ entry.getCompressedDataAsync(function(compressedData){
+ if(onItemEnd)onItemEnd(name);
+
+ entry.header.offset = dindex;
+ // data header
+ var dataHeader = entry.header.dataHeaderToBinary();
+ var postHeader = new Buffer(name);
+ var dataLength = dataHeader.length + postHeader.length + compressedData.length;
+
+ dindex += dataLength;
+
+ dataBlock.push(dataHeader);
+ dataBlock.push(postHeader);
+ dataBlock.push(compressedData);
+
+ var entryHeader = entry.packHeader();
+ entryHeaders.push(entryHeader);
+ mainHeader.size += entryHeader.length;
+ totalSize += (dataLength + entryHeader.length);
+
+ if(entryList.length){
+ self(entryList);
+ }else{
+
+
+ totalSize += mainHeader.mainHeaderSize; // also includes zip file comment length
+ // point to end of data and begining of central directory first record
+ mainHeader.offset = dindex;
+
+ dindex = 0;
+ var outBuffer = new Buffer(totalSize);
+ dataBlock.forEach(function(content) {
+ content.copy(outBuffer, dindex); // write data blocks
+ dindex += content.length;
+ });
+ entryHeaders.forEach(function(content) {
+ content.copy(outBuffer, dindex); // write central directory entries
+ dindex += content.length;
+ });
+
+ var mh = mainHeader.toBinary();
+ if (_comment) {
+ _comment.copy(mh, Utils.Constants.ENDHDR); // add zip file comment
+ }
+
+ mh.copy(outBuffer, dindex); // write main header
+
+ onSuccess(outBuffer);
+ }
+ });
+ }
+ };
+
+ compress(entryList);
+ }
+ }
+};