if (typeof(JS_LIB_LOADED)=='boolean') { include(jslib_file); const JS_ZIP_LOADED = true; const JS_ZIP_FILE = "zip.js"; const JS_ZIP_CID = "@mozilla.org/libjar/zip-reader;1"; const JS_ZIP_I_ZIP_READER = "nsIZipReader"; // DEPRECATED! MARKED FOR REMOVAL const JS_ZIP_FILE_CID = "@mozilla.org/file/local;1"; const JS_ZIP_I_LOCAL_FILE = "nsILocalFile"; const JS_ZIP_FILE_INIT = "initWithPath"; function Zip (aZipFile) { if (!aZipFile) return jslibErrorMsg("NS_ERROR_XPC_NOT_ENOUGH_ARGS"); // sanity check for nsIFile obj, File obj, or string path arg if (jslibTypeIsObj(aZipFile)) { if (!jslibTypeIsUndef(aZipFile.nsIFile)) this.mZipFile = aZipFile.nsIFile; else this.mZipFile = aZipFile; } else if (jslibTypeIsStr(aZipFile)) { this.mZipFile = new this.ZipPath(aZipFile); } if (!this.mZipFile.exists()) return jslibErrorMsg("NS_ERROR_FILE_NOT_FOUND", this.mZipFile.path); this.init(); this.mFile = new File(this.mZipFile); return JS_LIB_OK; } Zip.prototype = { ZipReader : jslibConstructor(JS_ZIP_CID, JS_ZIP_I_ZIP_READER), ZipPath : jslibConstructor("@mozilla.org/file/local;1", "nsILocalFile", "initWithPath"), DIRECTORY : 0x01, // 1 mPerm : 0755, FINISHED : "*** FINISHED . . . .", mInit : false, mZipFile : null, mFile : null, mZip : null, mIsOpen : false, libName : "Zip", // initialize the zip reader init : function () { try { this.mZip = new this.ZipReader; this.mZip.init(this.mZipFile); this.mInit = true; this.open(); } catch (e) { jslibError(e); } }, // open zip file open : function () { if (!this.mInit) this.init(); var rv = JS_LIB_OK; if (this.mIsOpen) return rv; try { this.mZip.open(); this.mIsOpen = true; } catch (e) { rv = jslibError(e); } return rv; }, // close zip file close : function () { if (!this.mInit || !this.mIsOpen) return jslibErrorMsg("NS_ERROR_NOT_INITIALIZED"); var rv = JS_LIB_OK; try { this.mZip.close(); this.mInit = false; this.mIsOpen = false; } catch (e) { rv = jslibError(e); } return rv; }, // extract zip archive extract : function (aDest, aDomEl) { if (!this.mInit) return jslibErrorMsg("NS_ERROR_NOT_INITIALIZED"); if (arguments.length < 1) return jslibErrorMsg("NS_ERROR_INVALID_ARG"); else if (!aDest) return jslibErrorMsg("NS_ERROR_FILE_TARGET_DOES_NOT_EXIST"); var rv = JS_LIB_OK; var dest; // sanity check for nsIFile objects string path args if (jslibTypeIsObj(aDest)) dest = aDest; else if (jslibTypeIsStr(aDest)) dest = new this.ZipPath(aDest); var entry; var newDir; try { if (!dest.exists() || !dest.isDirectory()) dest.create( this.DIRECTORY, this.mPerm); jslibDebug("\nExtracting:\t"+this.mZipFile.path+"\nTo:\t\t"+dest.path+" . . . \n\n"); var entries = this.findEntries("*"); var destbase = new this.ZipPath(dest.path); while (entries.hasMoreElements()) { entry = jslibQI(entries.getNext(), "nsIZipEntry"); dest = new this.ZipPath(dest.path); dest.setRelativeDescriptor(destbase, entry.name); // create if entry is a dir if (!dest.exists() && entry.name.length - 1 == entry.name.lastIndexOf("/")) { dest.create(this.DIRECTORY, this.mPerm); continue; } else if (!dest.parent.exists()) { dest.parent.create(this.DIRECTORY, this.mPerm); } else if (dest.exists()) { continue; } if (aDomEl) aDomEl.value = "extracting: "+dest.leafName; jslibDebug("extracting: ["+entry.name+"] To: ["+dest.path+"]"); this.mZip.extract(entry.name, dest); } } catch (e) { rv = jslibError(e); } jslibDebug("\n\n"+this.FINISHED+"\n\n"); if (aDomEl) aDomEl.value = this.FINISHED; return rv; }, extractEntry : function (aEntryName, aDest) { if (!aDest || !this.ensureEntry(aEntryName)) return jslibErrorMsg("NS_ERROR_INVALID_ARG"); var dest = aDest; if (jslibTypeIsString(aDest)) dest = new File(aDest).nsIFile; var rv = JS_LIB_OK; try { this.mZip.extract(aEntryName, dest); } catch (e) { rv = jslibError(e); } return rv; }, // returns simple enumerator whose elements are of type nsIZipEntry findEntries : function (aPattern) { if (!this.ensureEntry(aPattern)) return jslibErrorMsg("NS_ERROR_INVALID_ARG"); if (!this.mInit) return jslibErrorMsg("NS_ERROR_NOT_INITIALIZED"); var rv = null; try { rv = this.mZip.findEntries(aPattern); } catch (e) { rv = jslibError(e); } return rv; }, // returns array of all entries getAllEntries : function () { if (!this.mInit) return jslibErrorMsg("NS_ERROR_NOT_INITIALIZED"); var rv = new Array; try { var entries = this.findEntries("*"); while (entries.hasMoreElements()) { var entry = jslibQI(entries.getNext(), "nsIZipEntry"); rv.push(entry.name); } } catch (e) { jslibError(e); } return rv; }, // returns array of entries found w/ aPattern getEntries : function (aPattern) { if (!this.ensureEntry(aPattern)) return jslibErrorMsg("NS_ERROR_INVALID_ARG"); if (!this.mInit) return jslibErrorMsg("NS_ERROR_NOT_INITIALIZED"); var rv = new Array; try { var entries = this.findEntries(aPattern); while (entries.hasMoreElements()) { var entry = jslibQI(entries.getNext(), "nsIZipEntry"); rv.push(entry.name); } } catch (e) { jslibError(e); } return rv; }, getEntryName : function (aZipEntry) { if (!this.ensureEntry(aZipEntry)) return jslibErrorMsg("NS_ERROR_INVALID_ARG"); var rv = null; try { rv = this.mZip.getEntry(aZipEntry).name; } catch (e) { jslibError(e); } return rv; }, // return nsIZipEntry getEntry : function (aZipEntry) { if (!this.ensureEntry(aZipEntry)) return jslibErrorMsg("NS_ERROR_INVALID_ARG"); var rv = null; try { rv = this.mZip.getEntry(aZipEntry); } catch (e) { jslibError(e); } return rv; }, getEntryRealSize : function (aZipEntry) { if (!this.ensureEntry(aZipEntry)) return jslibErrorMsg("NS_ERROR_INVALID_ARG"); var rv = 0; try { var entry = this.getEntry(aZipEntry) rv = entry.realSize; } catch (e) { jslibError(e); } return rv; }, getEntrySize : function (aZipEntry) { if (!this.ensureEntry(aZipEntry)) return jslibErrorMsg("NS_ERROR_INVALID_ARG"); var rv = 0; try { var entry = this.getEntry(aZipEntry) rv = entry.size; } catch (e) { jslibError(e); } return rv; }, getEntryCompression : function (aZipEntry) { if (!this.ensureEntry(aZipEntry)) return jslibErrorMsg("NS_ERROR_INVALID_ARG"); var rv = 0; try { var entry = this.getEntry(aZipEntry) rv = entry.compression; } catch (e) { jslibError(e); } return rv; }, getEntryCRC32 : function (aZipEntry) { if (!this.ensureEntry(aZipEntry)) return jslibErrorMsg("NS_ERROR_INVALID_ARG"); var rv = 0; try { var entry = this.getEntry(aZipEntry) rv = entry.CRC32; } catch (e) { jslibError(e); } return rv; }, // returns nsIFile object of initialized zip file get file () { if (!this.mInit) return jslibErrorMsg("NS_ERROR_NOT_INITIALIZED"); return this.mZip.file; }, // returns File object of initialized zip file get File () { if (!this.mInit) return jslibErrorMsg("NS_ERROR_NOT_INITIALIZED"); return this.mFile; }, // returns nsIFile object of initialized zip file get nsIFile () { if (!this.mInit) return jslibErrorMsg("NS_ERROR_NOT_INITIALIZED"); return this.mZipFile; }, // returns nsIFile object of initialized zip file get file () { if (!this.mInit) return jslibErrorMsg("NS_ERROR_NOT_INITIALIZED"); return this.mZipFile; }, // returns nsIZipReader object get nsIZipReader () { if (!this.mInit) return jslibErrorMsg("NS_ERROR_NOT_INITIALIZED"); return this.mZip; }, // reads a zip entry readEntry : function (aZipEntry) { if (!this.ensureEntry(aZipEntry)) return jslibErrorMsg("NS_ERROR_INVALID_ARG"); if (!this.mInit) return jslibErrorMsg("NS_ERROR_NOT_INITIALIZED"); var rv; try { var sis = jslibCreateInstance("@mozilla.org/scriptableinputstream;1", "nsIScriptableInputStream"); sis.init(this.getInputStream(aZipEntry)); rv = sis.read(sis.available()); sis.close(); } catch (e) { rv = jslibError(e); } return rv; }, // returns input stream containing contents of specified zip entry getInputStream : function (aZipEntry) { if (!this.ensureEntry(aZipEntry)) return jslibErrorMsg("NS_ERROR_INVALID_ARG"); if (!this.mInit) return jslibErrorMsg("NS_ERROR_NOT_INITIALIZED"); var rv; try { rv = this.mZip.getInputStream(aZipEntry); } catch (e) { rv = jslibError(e); } return rv; }, // ensure an entry arg is valid ensureEntry : function (aZipEntry) { return (aZipEntry && jslibTypeIsString(aZipEntry)); } } jslibLoadMsg(JS_ZIP_FILE); } else { dump("Load Failure: zip.js\n"); }