diff options
author | Kenny Root <kroot@google.com> | 2011-01-12 15:03:43 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-01-12 15:03:43 -0800 |
commit | e8c04db71e347396e9537ead7113ba9f46706e44 (patch) | |
tree | bde21a44fcdbeb43afce3df93dca73990f354436 /services/java | |
parent | c8f42fb69867f171c04013b1b1a8f7e897ae3685 (diff) | |
parent | 6c4d904851772313930f800ac7c323cf90c709bb (diff) | |
download | frameworks_base-e8c04db71e347396e9537ead7113ba9f46706e44.zip frameworks_base-e8c04db71e347396e9537ead7113ba9f46706e44.tar.gz frameworks_base-e8c04db71e347396e9537ead7113ba9f46706e44.tar.bz2 |
Merge "Add the {get,set}PackageObbPaths calls to API" into gingerbread
Diffstat (limited to 'services/java')
-rw-r--r-- | services/java/com/android/server/PackageManagerService.java | 96 |
1 files changed, 83 insertions, 13 deletions
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index 1a933f2..d00c043 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -102,6 +102,7 @@ import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; +import java.lang.reflect.Array; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -4572,16 +4573,52 @@ class PackageManagerService extends IPackageManager.Stub { mHandler.sendMessage(msg); } - public void setPackageObbPath(String packageName, String path) { + public void setPackageObbPaths(String packageName, String[] paths) { if (DEBUG_OBB) - Log.v(TAG, "Setting .obb path for " + packageName + " to: " + path); - PackageSetting pkgSetting; + Log.v(TAG, "Setting .obb paths for " + packageName + " to: " + Arrays.toString(paths)); final int uid = Binder.getCallingUid(); final int permission = mContext.checkCallingPermission( android.Manifest.permission.INSTALL_PACKAGES); final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED); + if (!allowedByPermission) { + throw new SecurityException("Permission denial: attempt to set .obb file from pid=" + + Binder.getCallingPid()); + } synchronized (mPackages) { - pkgSetting = mSettings.mPackages.get(packageName); + final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); + if (pkgSetting == null) { + throw new IllegalArgumentException("Unknown package: " + packageName); + } + + if (paths != null) { + if (paths.length == 0) { + // Don't bother storing an empty array. + paths = null; + } else { + // Don't allow the caller to manipulate our copy of the + // list. + paths = paths.clone(); + } + } + + // Only write settings file if the new and old settings are not the + // same. + if (!Arrays.equals(paths, pkgSetting.obbPathStrings)) { + pkgSetting.obbPathStrings = paths; + mSettings.writeLP(); + } + } + } + + public String[] getPackageObbPaths(String packageName) { + if (DEBUG_OBB) + Log.v(TAG, "Getting .obb paths for " + packageName); + final int uid = Binder.getCallingUid(); + final int permission = mContext.checkCallingPermission( + android.Manifest.permission.INSTALL_PACKAGES); + final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED); + synchronized (mPackages) { + final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); if (pkgSetting == null) { throw new IllegalArgumentException("Unknown package: " + packageName); } @@ -4590,8 +4627,7 @@ class PackageManagerService extends IPackageManager.Stub { + Binder.getCallingPid() + ", uid=" + uid + ", package uid=" + pkgSetting.userId); } - pkgSetting.obbPathString = path; - mSettings.writeLP(); + return pkgSetting.obbPathStrings; } } @@ -7164,7 +7200,7 @@ class PackageManagerService extends IPackageManager.Stub { pw.print(" codePath="); pw.println(ps.codePathString); pw.print(" resourcePath="); pw.println(ps.resourcePathString); pw.print(" nativeLibraryPath="); pw.println(ps.nativeLibraryPathString); - pw.print(" obbPath="); pw.println(ps.obbPathString); + pw.print(" obbPaths="); pw.println(Arrays.toString(ps.obbPathStrings)); pw.print(" versionCode="); pw.println(ps.versionCode); if (ps.pkg != null) { pw.print(" versionName="); pw.println(ps.pkg.mVersionName); @@ -7727,7 +7763,7 @@ class PackageManagerService extends IPackageManager.Stub { File resourcePath; String resourcePathString; String nativeLibraryPathString; - String obbPathString; + String[] obbPathStrings; long timeStamp; long firstInstallTime; long lastUpdateTime; @@ -8793,8 +8829,15 @@ class PackageManagerService extends IPackageManager.Stub { if (pkg.installerPackageName != null) { serializer.attribute(null, "installer", pkg.installerPackageName); } - if (pkg.obbPathString != null) { - serializer.attribute(null, "obbPath", pkg.obbPathString); + if (pkg.obbPathStrings != null && pkg.obbPathStrings.length > 0) { + int N = pkg.obbPathStrings.length; + serializer.startTag(null, "obbs"); + for (int i = 0; i < N; i++) { + serializer.startTag(null, "obb"); + serializer.attribute(null, "path", pkg.obbPathStrings[i]); + serializer.endTag(null, "obb"); + } + serializer.endTag(null, "obbs"); } pkg.signatures.writeXml(serializer, "sigs", mPastSignatures); if ((pkg.pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) { @@ -9198,7 +9241,6 @@ class PackageManagerService extends IPackageManager.Stub { String codePathStr = null; String resourcePathStr = null; String nativeLibraryPathStr = null; - String obbPathStr = null; String systemStr = null; String installerPackageName = null; String uidError = null; @@ -9218,7 +9260,6 @@ class PackageManagerService extends IPackageManager.Stub { codePathStr = parser.getAttributeValue(null, "codePath"); resourcePathStr = parser.getAttributeValue(null, "resourcePath"); nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath"); - obbPathStr = parser.getAttributeValue(null, "obbPath"); version = parser.getAttributeValue(null, "version"); if (version != null) { try { @@ -9343,7 +9384,6 @@ class PackageManagerService extends IPackageManager.Stub { packageSetting.uidError = "true".equals(uidError); packageSetting.installerPackageName = installerPackageName; packageSetting.nativeLibraryPathString = nativeLibraryPathStr; - packageSetting.obbPathString = obbPathStr; final String enabledStr = parser.getAttributeValue(null, "enabled"); if (enabledStr != null) { if (enabledStr.equalsIgnoreCase("true")) { @@ -9391,6 +9431,8 @@ class PackageManagerService extends IPackageManager.Stub { readGrantedPermissionsLP(parser, packageSetting.grantedPermissions); packageSetting.permissionsFixed = true; + } else if (tagName.equals("obbs")) { + readObbPathsLP(packageSetting, parser); } else { reportSettingsProblem(Log.WARN, "Unknown element under <package>: " @@ -9595,6 +9637,34 @@ class PackageManagerService extends IPackageManager.Stub { } } + private void readObbPathsLP(PackageSettingBase packageSetting, XmlPullParser parser) + throws XmlPullParserException, IOException { + final List<String> obbPaths = new ArrayList<String>(); + final int outerDepth = parser.getDepth(); + int type; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { + if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { + continue; + } + + final String tagName = parser.getName(); + if (tagName.equals("obb")) { + final String path = parser.getAttributeValue(null, "path"); + obbPaths.add(path); + } else { + reportSettingsProblem(Log.WARN, "Unknown element under <obbs>: " + + parser.getName()); + } + XmlUtils.skipCurrentTag(parser); + } + if (obbPaths.size() == 0) { + return; + } else { + packageSetting.obbPathStrings = obbPaths.toArray(new String[obbPaths.size()]); + } + } + // Returns -1 if we could not find an available UserId to assign private int newUserIdLP(Object obj) { // Let's be stupidly inefficient for now... |