Merge "Null check for scheme. If scheme is unspecified let package parse continue. We will return errors if parsing fails anyway. If scheme is not null, restrict it to being a file uri."

This commit is contained in:
Suchi Amalapurapu
2010-03-04 11:23:52 -08:00
committed by Android (Google) Code Review

View File

@ -93,11 +93,16 @@ public class DefaultContainerService extends IntentService {
* PackageHelper.RECOMMEND_FAILED_INVALID_APK for parse errors.
*/
public int getRecommendedInstallLocation(final Uri fileUri) {
if (!fileUri.getScheme().equals("file")) {
if (fileUri == null) {
Log.i(TAG, "Invalid package uri " + fileUri);
return PackageHelper.RECOMMEND_FAILED_INVALID_APK;
}
String scheme = fileUri.getScheme();
if (scheme != null && !scheme.equals("file")) {
Log.w(TAG, "Falling back to installing on internal storage only");
return PackageHelper.RECOMMEND_INSTALL_INTERNAL;
}
final String archiveFilePath = fileUri.getPath();
String archiveFilePath = fileUri.getPath();
PackageParser packageParser = new PackageParser(archiveFilePath);
File sourceFile = new File(archiveFilePath);
DisplayMetrics metrics = new DisplayMetrics();
@ -166,41 +171,62 @@ public class DefaultContainerService extends IntentService {
String codePath = packageURI.getPath();
File codeFile = new File(codePath);
String newCachePath = null;
final int CREATE_FAILED = 1;
final int COPY_FAILED = 2;
final int FINALIZE_FAILED = 3;
final int PASS = 4;
int errCode = CREATE_FAILED;
// Create new container
if ((newCachePath = PackageHelper.createSdDir(codeFile,
newCid, key, Process.myUid())) == null) {
Log.e(TAG, "Failed creating container " + newCid);
return null;
newCid, key, Process.myUid())) != null) {
if (localLOGV) Log.i(TAG, "Created container for " + newCid
+ " at path : " + newCachePath);
File resFile = new File(newCachePath, resFileName);
errCode = COPY_FAILED;
// Copy file from codePath
if (FileUtils.copyFile(new File(codePath), resFile)) {
if (localLOGV) Log.i(TAG, "Copied " + codePath + " to " + resFile);
errCode = FINALIZE_FAILED;
if (PackageHelper.finalizeSdDir(newCid)) {
if (localLOGV) Log.i(TAG, "Finalized container " + newCid);
errCode = PASS;
}
}
}
if (localLOGV) Log.i(TAG, "Created container for " + newCid
+ " at path : " + newCachePath);
File resFile = new File(newCachePath, resFileName);
// Copy file from codePath
if (!FileUtils.copyFile(new File(codePath), resFile)) {
Log.e(TAG, "Failed to copy " + codePath + " to " + resFile);
// Clean up created container
PackageHelper.destroySdDir(newCid);
return null;
// Print error based on errCode
String errMsg = "";
switch (errCode) {
case CREATE_FAILED:
errMsg = "CREATE_FAILED";
break;
case COPY_FAILED:
errMsg = "COPY_FAILED";
if (localLOGV) Log.i(TAG, "Destroying " + newCid +
" at path " + newCachePath + " after " + errMsg);
PackageHelper.destroySdDir(newCid);
break;
case FINALIZE_FAILED:
errMsg = "FINALIZE_FAILED";
if (localLOGV) Log.i(TAG, "Destroying " + newCid +
" at path " + newCachePath + " after " + errMsg);
PackageHelper.destroySdDir(newCid);
break;
default:
errMsg = "PASS";
if (PackageHelper.isContainerMounted(newCid)) {
if (localLOGV) Log.i(TAG, "Unmounting " + newCid +
" at path " + newCachePath + " after " + errMsg);
// Force a gc to avoid being killed.
Runtime.getRuntime().gc();
PackageHelper.unMountSdDir(newCid);
} else {
if (localLOGV) Log.i(TAG, "Container " + newCid + " not mounted");
}
break;
}
if (localLOGV) Log.i(TAG, "Copied " + codePath + " to " + resFile);
// Finalize container now
if (!PackageHelper.finalizeSdDir(newCid)) {
Log.e(TAG, "Failed to finalize " + newCid + " at cache path " + newCachePath);
// Clean up created container
PackageHelper.destroySdDir(newCid);
if (errCode != PASS) {
return null;
}
if (localLOGV) Log.i(TAG, "Finalized container " + newCid);
// Force a gc to avoid being killed.
Runtime.getRuntime().gc();
// Unmount container
if (PackageHelper.isContainerMounted(newCid)) {
if (localLOGV) Log.i(TAG, "Unmounting " + newCid +
" at path " + newCachePath);
PackageHelper.unMountSdDir(newCid);
} else {
if (localLOGV) Log.i(TAG, "Container " + newCid + " not mounted");
}
return newCachePath;
}
@ -231,7 +257,8 @@ public class DefaultContainerService extends IntentService {
}
private boolean copyFile(Uri pPackageURI, FileOutputStream outStream) {
if (pPackageURI.getScheme().equals("file")) {
String scheme = pPackageURI.getScheme();
if (scheme == null || scheme.equals("file")) {
final File srcPackageFile = new File(pPackageURI.getPath());
// We copy the source package file to a temp file and then rename it to the
// destination file in order to eliminate a window where the package directory
@ -240,7 +267,7 @@ public class DefaultContainerService extends IntentService {
Log.e(TAG, "Couldn't copy file: " + srcPackageFile);
return false;
}
} else if (pPackageURI.getScheme().equals("content")) {
} else if (scheme.equals("content")) {
ParcelFileDescriptor fd = null;
try {
fd = getContentResolver().openFileDescriptor(pPackageURI, "r");