home *** CD-ROM | disk | FTP | other *** search
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- //@line 41 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
-
- const nsIFile = Components.interfaces.nsIFile;
- const nsIINIParser = Components.interfaces.nsIINIParser;
- const nsIINIParserFactory = Components.interfaces.nsIINIParserFactory;
- const nsILocalFile = Components.interfaces.nsILocalFile;
- const nsISupports = Components.interfaces.nsISupports;
- const nsIXULAppInstall = Components.interfaces.nsIXULAppInstall;
- const nsIZipEntry = Components.interfaces.nsIZipEntry;
- const nsIZipReader = Components.interfaces.nsIZipReader;
-
- function getDirectoryKey(aKey) {
- try {
- return Components.classes["@mozilla.org/file/directory_service;1"].
- getService(Components.interfaces.nsIProperties).
- get(aKey, nsIFile);
- }
- catch (e) {
- throw "Couln't get directory service key: " + aKey;
- }
- }
-
- function createINIParser(aFile) {
- return Components.manager.
- getClassObjectByContractID("@mozilla.org/xpcom/ini-parser-factory;1",
- nsIINIParserFactory).
- createINIParser(aFile);
- }
-
- function copy_recurse(aSource, aDest) {
- var e = aSource.directoryEntries;
-
- while (e.hasMoreElements()) {
- var f = e.getNext().QueryInterface(nsIFile);
- var leaf = f.leafName;
-
- var ddest = aDest.clone();
- ddest.append(leaf);
-
- if (f.isDirectory()) {
- copy_recurse(f, ddest);
- }
- else {
- if (ddest.exists())
- ddest.remove(false);
-
- f.copyTo(aDest, leaf);
- }
- }
- }
-
- const PR_WRONLY = 0x02;
- const PR_CREATE_FILE = 0x08;
- const PR_TRUNCATE = 0x20;
-
- function openFileOutputStream(aFile) {
- var s = Components.classes["@mozilla.org/network/file-output-stream;1"].
- createInstance(Components.interfaces.nsIFileOutputStream);
- s.init(aFile, PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE, 0644, 0);
- return s;
- }
-
- /**
- * An extractor implements the following prototype:
- * readonly attribute nsIINIPaser iniParser;
- * void copyTo(in nsILocalFile root);
- */
-
- function directoryExtractor(aFile) {
- this.mDirectory = aFile;
- }
-
- directoryExtractor.prototype = {
- mINIParser : null,
-
- get iniParser() {
- if (!this.mINIParser) {
- var iniFile = this.mDirectory.clone();
- iniFile.append("application.ini");
-
- this.mINIParser = createINIParser(iniFile);
- }
- return this.mINIParser;
- },
-
- copyTo : function de_copyTo(aDest) {
- // Assume the root already exists
- copy_recurse(this.mDirectory, aDest);
- }
- };
-
- function zipExtractor(aFile) {
- this.mZipReader = Components.classes["@mozilla.org/libjar/zip-reader;1"].
- createInstance(nsIZipReader);
- this.mZipReader.init(aFile);
- this.mZipReader.open();
- this.mZipReader.test(null);
- }
-
- zipExtractor.prototype = {
- mINIParser : null,
-
- get iniParser() {
- if (!this.mINIParser) {
- // XXXbsmedberg: this is not very unique, guessing could be a problem
- var f = getDirectoryKey("TmpD");
- f.append("application.ini");
- f.createUnique(nsIFile.NORMAL_FILE_TYPE, 0600);
-
- try {
- this.mZipReader.extract("application.ini", f);
- this.mINIParser = createINIParser(f);
- }
- catch (e) {
- try {
- f.remove();
- }
- catch (ee) { }
-
- throw e;
- }
- try {
- f.remove();
- }
- catch (e) { }
- }
- return this.mINIParser;
- },
-
- copyTo : function ze_CopyTo(aDest) {
- var entries = this.mZipReader.findEntries("*");
- while (entries.hasMoreElements()) {
- var entry = entries.getNext().QueryInterface(nsIZipEntry);
-
- this._installZipEntry(this.mZipReader, entry, aDest);
- }
- },
-
- _installZipEntry : function ze_installZipEntry(aZipReader, aZipEntry,
- aDestination) {
- var file = aDestination.clone();
-
- var path = aZipEntry.name;
- var dirs = path.split(/\//);
- var isDirectory = path.match(/\/$/) != null;
-
- var end = dirs.length;
- if (!isDirectory)
- --end;
-
- for (var i = 0; i < end; ++i) {
- file.append(dirs[i]);
- if (!file.exists()) {
- file.create(nsIFile.DIRECTORY_TYPE, 0755);
- }
- }
-
- if (!isDirectory) {
- file.append(dirs[end]);
- aZipReader.extract(path, file);
- }
- }
- };
-
- function createExtractor(aFile) {
- if (aFile.isDirectory())
- return new directoryExtractor(aFile);
-
- return new zipExtractor(aFile);
- }
-
- const AppInstall = {
-
- /* nsISupports */
- QueryInterface : function ai_QI(iid) {
- if (iid.equals(nsIXULAppInstall) ||
- iid.equals(nsISupports))
- return this;
-
- throw Components.result.NS_ERROR_NO_INTERFACE;
- },
-
- /* nsIXULAppInstall */
- installApplication : function ai_IA(aAppFile, aDirectory, aLeafName) {
- var extractor = createExtractor(aAppFile);
- var iniParser = extractor.iniParser;
-
- var appName = iniParser.getString("App", "Name");
-
- // vendor is optional
- var vendor;
- try {
- vendor = iniParser.getString("App", "Vendor");
- }
- catch (e) { }
-
- if (aDirectory == null) {
- //@line 238 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
- aDirectory = getDirectoryKey("ProgF");
- if (vendor)
- aDirectory.append(vendor);
- //@line 254 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
- }
- else {
- aDirectory = aDirectory.clone();
- }
-
- if (!aDirectory.exists()) {
- aDirectory.create(nsIFile.DIRECTORY_TYPE, 0755);
- }
-
- if (aLeafName == "") {
- //@line 268 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
- aLeafName = appName;
- //@line 273 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
- }
-
- aDirectory.append(aLeafName);
- if (!aDirectory.exists()) {
- aDirectory.create(nsIFile.DIRECTORY_TYPE, 0755);
- }
-
- //@line 344 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
- extractor.copyTo(aDirectory);
-
- var xulrunnerBinary = getDirectoryKey("XCurProcD");
- xulrunnerBinary.append("xulrunner-stub.exe");
-
- xulrunnerBinary.copyTo(aDirectory, appName.toLowerCase() + ".exe");
- //@line 351 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
- }
- };
-
- const AppInstallFactory = {
- /* nsISupports */
- QueryInterface : function aif_QI(iid) {
- if (iid.equals(Components.interfaces.nsIFactory) ||
- iid.equals(nsISupports))
- return this;
-
- throw Components.results.NS_ERROR_NO_INTERFACE;
- },
-
- /* nsIFactory */
- createInstance : function aif_CI(aOuter, aIID) {
- if (aOuter)
- throw Components.results.NS_ERROR_NO_AGGREGATION;
-
- return AppInstall.QueryInterface(aIID);
- },
-
- lockFactory : function aif_lock(aLock) { }
- };
-
- const AppInstallContractID = "@mozilla.org/xulrunner/app-install-service;1";
- const AppInstallCID = Components.ID("{00790a19-27e2-4d9a-bef0-244080feabfd}");
-
- const AppInstallModule = {
- /* nsISupports */
- QueryInterface : function mod_QI(iid) {
- if (iid.equals(Components.interfaces.nsIModule) ||
- iid.equals(nsISupports))
- return this;
-
- throw Components.results.NS_ERROR_NO_INTERFACE;
- },
-
- /* nsIModule */
- getClassObject : function mod_gco(aCompMgr, aClass, aIID) {
- if (aClass.equals(AppInstallCID))
- return AppInstallFactory.QueryInterface(aIID);
-
- return Components.results.NS_ERROR_FACTORY_NOT_REGISTERED;
- },
-
- registerSelf : function mod_regself(aCompMgr, aLocation,
- aLoaderStr, aType) {
- var reg = aCompMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
- reg.registerFactoryLocation(AppInstallCID,
- "nsXULAppInstall",
- AppInstallContractID,
- aLocation,
- aLoaderStr,
- aType);
- },
-
- unregisterSelf : function mod_unreg(aCompMgr, aLocation, aLoaderStr) {
- var reg = aCompMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
- reg.unregisterFactoryLocation(AppInstallCID,
- aLocation);
- },
-
- canUnload : function mod_unload(aCompMgr) {
- return true;
- }
- };
-
- function NSGetModule(compMgr, fileSpec) {
- return AppInstallModule;
- }
-