am 3a66413a: Merge change 25992 into eclair
Merge commit '3a66413af33f2f2a3511f644efe5b4e45198d7df' into eclair-plus-aosp * commit '3a66413af33f2f2a3511f644efe5b4e45198d7df': Add an 'init everything' operation to the first backup pass
This commit is contained in:
@@ -77,10 +77,15 @@ interface IBackupTransport {
|
|||||||
* @param data The data stream that resulted from invoking the application's
|
* @param data The data stream that resulted from invoking the application's
|
||||||
* BackupService.doBackup() method. This may be a pipe rather than a file on
|
* BackupService.doBackup() method. This may be a pipe rather than a file on
|
||||||
* persistent media, so it may not be seekable.
|
* persistent media, so it may not be seekable.
|
||||||
|
* @param wipeAllFirst When true, <i>all</i> backed-up data for the current device/account
|
||||||
|
* will be erased prior to the storage of the data provided here. The purpose of this
|
||||||
|
* is to provide a guarantee that no stale data exists in the restore set when the
|
||||||
|
* device begins providing backups.
|
||||||
* @return false if errors occurred (the backup should be aborted and rescheduled),
|
* @return false if errors occurred (the backup should be aborted and rescheduled),
|
||||||
* true if everything is OK so far (but {@link #finishBackup} must be called).
|
* true if everything is OK so far (but {@link #finishBackup} must be called).
|
||||||
*/
|
*/
|
||||||
boolean performBackup(in PackageInfo packageInfo, in ParcelFileDescriptor inFd);
|
boolean performBackup(in PackageInfo packageInfo, in ParcelFileDescriptor inFd,
|
||||||
|
boolean wipeAllFirst);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Erase the give application's data from the backup destination. This clears
|
* Erase the give application's data from the backup destination. This clears
|
||||||
|
|||||||
@@ -56,12 +56,16 @@ public class LocalTransport extends IBackupTransport.Stub {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean performBackup(PackageInfo packageInfo, ParcelFileDescriptor data)
|
public boolean performBackup(PackageInfo packageInfo, ParcelFileDescriptor data,
|
||||||
throws RemoteException {
|
boolean wipeAllFirst) throws RemoteException {
|
||||||
if (DEBUG) Log.v(TAG, "performBackup() pkg=" + packageInfo.packageName);
|
if (DEBUG) Log.v(TAG, "performBackup() pkg=" + packageInfo.packageName);
|
||||||
|
|
||||||
File packageDir = new File(mDataDir, packageInfo.packageName);
|
File packageDir = new File(mDataDir, packageInfo.packageName);
|
||||||
packageDir.mkdirs();
|
packageDir.mkdirs();
|
||||||
|
if (wipeAllFirst) {
|
||||||
|
if (DEBUG) Log.v(TAG, "wiping all data first");
|
||||||
|
deleteContents(mDataDir);
|
||||||
|
}
|
||||||
|
|
||||||
// Each 'record' in the restore set is kept in its own file, named by
|
// Each 'record' in the restore set is kept in its own file, named by
|
||||||
// the record key. Wind through the data file, extracting individual
|
// the record key. Wind through the data file, extracting individual
|
||||||
@@ -111,6 +115,21 @@ public class LocalTransport extends IBackupTransport.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deletes the contents but not the given directory
|
||||||
|
private void deleteContents(File dirname) {
|
||||||
|
File[] contents = dirname.listFiles();
|
||||||
|
if (contents != null) {
|
||||||
|
for (File f : contents) {
|
||||||
|
if (f.isDirectory()) {
|
||||||
|
// delete the directory's contents then fall through
|
||||||
|
// and delete the directory itself.
|
||||||
|
deleteContents(f);
|
||||||
|
}
|
||||||
|
f.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean clearBackupData(PackageInfo packageInfo) {
|
public boolean clearBackupData(PackageInfo packageInfo) {
|
||||||
if (DEBUG) Log.v(TAG, "clearBackupData() pkg=" + packageInfo.packageName);
|
if (DEBUG) Log.v(TAG, "clearBackupData() pkg=" + packageInfo.packageName);
|
||||||
|
|
||||||
|
|||||||
@@ -949,11 +949,11 @@ class BackupManagerService extends IBackupManager.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void processOneBackup(BackupRequest request, IBackupAgent agent, IBackupTransport transport) {
|
void processOneBackup(BackupRequest request, IBackupAgent agent,
|
||||||
|
IBackupTransport transport) {
|
||||||
final String packageName = request.appInfo.packageName;
|
final String packageName = request.appInfo.packageName;
|
||||||
if (DEBUG) Log.d(TAG, "processOneBackup doBackup() on " + packageName);
|
if (DEBUG) Log.d(TAG, "processOneBackup doBackup() on " + packageName);
|
||||||
|
|
||||||
// !!! TODO: get the state file dir from the transport
|
|
||||||
File savedStateName = new File(mStateDir, packageName);
|
File savedStateName = new File(mStateDir, packageName);
|
||||||
File backupDataName = new File(mDataDir, packageName + ".data");
|
File backupDataName = new File(mDataDir, packageName + ".data");
|
||||||
File newStateName = new File(mStateDir, packageName + ".new");
|
File newStateName = new File(mStateDir, packageName + ".new");
|
||||||
@@ -962,6 +962,12 @@ class BackupManagerService extends IBackupManager.Stub {
|
|||||||
ParcelFileDescriptor backupData = null;
|
ParcelFileDescriptor backupData = null;
|
||||||
ParcelFileDescriptor newState = null;
|
ParcelFileDescriptor newState = null;
|
||||||
|
|
||||||
|
// Usually we won't force a server-side init, except the first time
|
||||||
|
// we ever back up following enable of backup. To keep the bookkeeping
|
||||||
|
// simple, we detect this here rather than maintain state throughout
|
||||||
|
// the backup manager.
|
||||||
|
boolean doInit = false;
|
||||||
|
|
||||||
PackageInfo packInfo;
|
PackageInfo packInfo;
|
||||||
try {
|
try {
|
||||||
// Look up the package info & signatures. This is first so that if it
|
// Look up the package info & signatures. This is first so that if it
|
||||||
@@ -971,6 +977,13 @@ class BackupManagerService extends IBackupManager.Stub {
|
|||||||
// The metadata 'package' is synthetic
|
// The metadata 'package' is synthetic
|
||||||
packInfo = new PackageInfo();
|
packInfo = new PackageInfo();
|
||||||
packInfo.packageName = packageName;
|
packInfo.packageName = packageName;
|
||||||
|
|
||||||
|
// if there's no metadata backup state, this must be the
|
||||||
|
// first time we've done one since enabling it.
|
||||||
|
if (savedStateName.exists() == false) {
|
||||||
|
if (DEBUG) Log.i(TAG, "First backup pass, issuing init");
|
||||||
|
doInit = true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
packInfo = mPackageManager.getPackageInfo(packageName,
|
packInfo = mPackageManager.getPackageInfo(packageName,
|
||||||
PackageManager.GET_SIGNATURES);
|
PackageManager.GET_SIGNATURES);
|
||||||
@@ -1023,7 +1036,7 @@ class BackupManagerService extends IBackupManager.Stub {
|
|||||||
// hold off on finishBackup() until the end, which implies holding off on
|
// hold off on finishBackup() until the end, which implies holding off on
|
||||||
// renaming *all* the output state files (see below) until that happens.
|
// renaming *all* the output state files (see below) until that happens.
|
||||||
|
|
||||||
if (!transport.performBackup(packInfo, backupData) ||
|
if (!transport.performBackup(packInfo, backupData, doInit) ||
|
||||||
!transport.finishBackup()) {
|
!transport.finishBackup()) {
|
||||||
throw new Exception("Backup transport failed");
|
throw new Exception("Backup transport failed");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user