diff options
Diffstat (limited to 'b2g/components/DirectoryProvider.js')
-rw-r--r-- | b2g/components/DirectoryProvider.js | 295 |
1 files changed, 0 insertions, 295 deletions
diff --git a/b2g/components/DirectoryProvider.js b/b2g/components/DirectoryProvider.js deleted file mode 100644 index a7dccd0c9..000000000 --- a/b2g/components/DirectoryProvider.js +++ /dev/null @@ -1,295 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; -const Cr = Components.results; - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/AppConstants.jsm"); - -const XRE_OS_UPDATE_APPLY_TO_DIR = "OSUpdApplyToD" -const UPDATE_ARCHIVE_DIR = "UpdArchD" -const LOCAL_DIR = "/data/local"; -const UPDATES_DIR = "updates/0"; -const FOTA_DIR = "updates/fota"; -const COREAPPSDIR_PREF = "b2g.coreappsdir" - -XPCOMUtils.defineLazyServiceGetter(Services, "env", - "@mozilla.org/process/environment;1", - "nsIEnvironment"); - -XPCOMUtils.defineLazyServiceGetter(Services, "um", - "@mozilla.org/updates/update-manager;1", - "nsIUpdateManager"); - -XPCOMUtils.defineLazyServiceGetter(Services, "volumeService", - "@mozilla.org/telephony/volume-service;1", - "nsIVolumeService"); - -XPCOMUtils.defineLazyServiceGetter(this, "cpmm", - "@mozilla.org/childprocessmessagemanager;1", - "nsISyncMessageSender"); - -XPCOMUtils.defineLazyGetter(this, "gExtStorage", function dp_gExtStorage() { - return Services.env.get("EXTERNAL_STORAGE"); -}); - -// This exists to mark the affected code for bug 828858. -const gUseSDCard = true; - -const VERBOSE = 1; -var log = - VERBOSE ? - function log_dump(msg) { dump("DirectoryProvider: " + msg + "\n"); } : - function log_noop(msg) { }; - -function DirectoryProvider() { -} - -DirectoryProvider.prototype = { - classID: Components.ID("{9181eb7c-6f87-11e1-90b1-4f59d80dd2e5}"), - - QueryInterface: XPCOMUtils.generateQI([Ci.nsIDirectoryServiceProvider]), - _xpcom_factory: XPCOMUtils.generateSingletonFactory(DirectoryProvider), - - _profD: null, - - getFile: function(prop, persistent) { - if (AppConstants.platform === "gonk") { - return this.getFileOnGonk(prop, persistent); - } - return this.getFileNotGonk(prop, persistent); - }, - - getFileOnGonk: function(prop, persistent) { - let localProps = ["cachePDir", "webappsDir", "PrefD", "indexedDBPDir", - "permissionDBPDir", "UpdRootD"]; - if (localProps.indexOf(prop) != -1) { - let file = Cc["@mozilla.org/file/local;1"] - .createInstance(Ci.nsILocalFile) - file.initWithPath(LOCAL_DIR); - persistent.value = true; - return file; - } - if (prop == "ProfD") { - let dir = Cc["@mozilla.org/file/local;1"] - .createInstance(Ci.nsILocalFile); - dir.initWithPath(LOCAL_DIR+"/tests/profile"); - if (dir.exists()) { - persistent.value = true; - return dir; - } - } - if (prop == "coreAppsDir") { - let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile) - file.initWithPath("/system/b2g"); - persistent.value = true; - return file; - } - if (prop == UPDATE_ARCHIVE_DIR) { - // getUpdateDir will set persistent to false since it may toggle between - // /data/local/ and /mnt/sdcard based on free space and/or availability - // of the sdcard. - // before download, check if free space is 2.1 times of update.mar - return this.getUpdateDir(persistent, UPDATES_DIR, 2.1); - } - if (prop == XRE_OS_UPDATE_APPLY_TO_DIR) { - // getUpdateDir will set persistent to false since it may toggle between - // /data/local/ and /mnt/sdcard based on free space and/or availability - // of the sdcard. - // before apply, check if free space is 1.1 times of update.mar - return this.getUpdateDir(persistent, FOTA_DIR, 1.1); - } - return null; - }, - - getFileNotGonk: function(prop, persistent) { - // In desktop builds, coreAppsDir is the same as the profile - // directory unless otherwise specified. We just need to get the - // path from the parent, and it is then used to build - // jar:remoteopenfile:// uris. - if (prop == "coreAppsDir") { - let coreAppsDirPref; - try { - coreAppsDirPref = Services.prefs.getCharPref(COREAPPSDIR_PREF); - } catch (e) { - // coreAppsDirPref may not exist if we're on an older version - // of gaia, so just fail silently. - } - let appsDir; - // If pref doesn't exist or isn't set, default to old value - if (!coreAppsDirPref || coreAppsDirPref == "") { - appsDir = Services.dirsvc.get("ProfD", Ci.nsIFile); - appsDir.append("webapps"); - } else { - appsDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile) - appsDir.initWithPath(coreAppsDirPref); - } - persistent.value = true; - return appsDir; - } else if (prop == "ProfD") { - let inParent = Cc["@mozilla.org/xre/app-info;1"] - .getService(Ci.nsIXULRuntime) - .processType == Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT; - if (inParent) { - // Just bail out to use the default from toolkit. - return null; - } - if (!this._profD) { - this._profD = cpmm.sendSyncMessage("getProfD", {})[0]; - } - let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); - file.initWithPath(this._profD); - persistent.value = true; - return file; - } - return null; - }, - - // The VolumeService only exists on the device, and not on desktop - volumeHasFreeSpace: function dp_volumeHasFreeSpace(volumePath, requiredSpace) { - if (!volumePath) { - return false; - } - if (!Services.volumeService) { - return false; - } - let volume = Services.volumeService.createOrGetVolumeByPath(volumePath); - if (!volume || volume.state !== Ci.nsIVolume.STATE_MOUNTED) { - return false; - } - let stat = volume.getStats(); - if (!stat) { - return false; - } - return requiredSpace <= stat.freeBytes; - }, - - findUpdateDirWithFreeSpace: function dp_findUpdateDirWithFreeSpace(requiredSpace, subdir) { - if (!Services.volumeService) { - return this.createUpdatesDir(LOCAL_DIR, subdir); - } - - let activeUpdate = Services.um.activeUpdate; - if (gUseSDCard) { - if (this.volumeHasFreeSpace(gExtStorage, requiredSpace)) { - let extUpdateDir = this.createUpdatesDir(gExtStorage, subdir); - if (extUpdateDir !== null) { - return extUpdateDir; - } - log("Warning: " + gExtStorage + " has enough free space for update " + - activeUpdate.name + ", but is not writable"); - } - } - - if (this.volumeHasFreeSpace(LOCAL_DIR, requiredSpace)) { - let localUpdateDir = this.createUpdatesDir(LOCAL_DIR, subdir); - if (localUpdateDir !== null) { - return localUpdateDir; - } - log("Warning: " + LOCAL_DIR + " has enough free space for update " + - activeUpdate.name + ", but is not writable"); - } - - return null; - }, - - getUpdateDir: function dp_getUpdateDir(persistent, subdir, multiple) { - let defaultUpdateDir = this.getDefaultUpdateDir(); - persistent.value = false; - - let activeUpdate = Services.um.activeUpdate; - if (!activeUpdate) { - log("Warning: No active update found, using default update dir: " + - defaultUpdateDir); - return defaultUpdateDir; - } - - let selectedPatch = activeUpdate.selectedPatch; - if (!selectedPatch) { - log("Warning: No selected patch, using default update dir: " + - defaultUpdateDir); - return defaultUpdateDir; - } - - let requiredSpace = selectedPatch.size * multiple; - let updateDir = this.findUpdateDirWithFreeSpace(requiredSpace, subdir); - if (updateDir) { - return updateDir; - } - - // If we've gotten this far, there isn't enough free space to download the patch - // on either external storage or /data/local. All we can do is report the - // error and let upstream code handle it more gracefully. - log("Error: No volume found with " + requiredSpace + " bytes for downloading"+ - " update " + activeUpdate.name); - activeUpdate.errorCode = Cr.NS_ERROR_FILE_TOO_BIG; - return null; - }, - - createUpdatesDir: function dp_createUpdatesDir(root, subdir) { - let dir = Cc["@mozilla.org/file/local;1"] - .createInstance(Ci.nsILocalFile); - dir.initWithPath(root); - if (!dir.isWritable()) { - log("Error: " + dir.path + " isn't writable"); - return null; - } - dir.appendRelativePath(subdir); - if (dir.exists()) { - if (dir.isDirectory() && dir.isWritable()) { - return dir; - } - // subdir is either a file or isn't writable. In either case we - // can't use it. - log("Error: " + dir.path + " is a file or isn't writable"); - return null; - } - // subdir doesn't exist, and the parent is writable, so try to - // create it. This can fail if a file named updates exists. - try { - dir.create(Ci.nsIFile.DIRECTORY_TYPE, parseInt('0770', 8)); - } catch (e) { - // The create failed for some reason. We can't use it. - log("Error: " + dir.path + " unable to create directory"); - return null; - } - return dir; - }, - - getDefaultUpdateDir: function dp_getDefaultUpdateDir() { - let path = gExtStorage; - if (!path) { - path = LOCAL_DIR; - } - - if (Services.volumeService) { - let extVolume = Services.volumeService.createOrGetVolumeByPath(path); - if (!extVolume) { - path = LOCAL_DIR; - } - } - - let dir = Cc["@mozilla.org/file/local;1"] - .createInstance(Ci.nsILocalFile) - dir.initWithPath(path); - - if (!dir.exists() && path != LOCAL_DIR) { - // Fallback to LOCAL_DIR if we didn't fallback earlier - dir.initWithPath(LOCAL_DIR); - - if (!dir.exists()) { - throw Cr.NS_ERROR_FILE_NOT_FOUND; - } - } - - dir.appendRelativePath("updates"); - return dir; - } -}; - -this.NSGetFactory = XPCOMUtils.generateNSGetFactory([DirectoryProvider]); |