Further development of backup file handling

Put backup data in flight into /cache
    Close the files and delete the intermediates after backup pass
This commit is contained in:
Christopher Tate
2009-05-05 15:50:03 -07:00
parent 06d96020c3
commit f417247fa6

View File

@@ -62,6 +62,7 @@ class BackupManagerService extends IBackupManager.Stub {
private final Object mQueueLock = new Object(); private final Object mQueueLock = new Object();
private File mStateDir; private File mStateDir;
private File mDataDir;
// ----- Handler that runs the actual backup process asynchronously ----- // ----- Handler that runs the actual backup process asynchronously -----
@@ -106,28 +107,41 @@ class BackupManagerService extends IBackupManager.Stub {
Log.d(TAG, "invoking doBackup() on " + backupIntent); Log.d(TAG, "invoking doBackup() on " + backupIntent);
File savedStateName = new File(mStateDir, service.packageName); File savedStateName = new File(mStateDir, service.packageName);
File backupDataName = new File(mStateDir, service.packageName + ".data"); File backupDataName = new File(mDataDir, service.packageName + ".data");
File newStateName = new File(mStateDir, service.packageName + ".new"); File newStateName = new File(mStateDir, service.packageName + ".new");
ParcelFileDescriptor savedState = ParcelFileDescriptor savedState =
ParcelFileDescriptor.open(savedStateName, ParcelFileDescriptor.open(savedStateName,
ParcelFileDescriptor.MODE_READ_ONLY | ParcelFileDescriptor.MODE_READ_ONLY |
ParcelFileDescriptor.MODE_CREATE); ParcelFileDescriptor.MODE_CREATE);
backupDataName.delete();
ParcelFileDescriptor backupData = ParcelFileDescriptor backupData =
ParcelFileDescriptor.open(backupDataName, ParcelFileDescriptor.open(backupDataName,
ParcelFileDescriptor.MODE_READ_WRITE | ParcelFileDescriptor.MODE_READ_WRITE |
ParcelFileDescriptor.MODE_CREATE); ParcelFileDescriptor.MODE_CREATE);
newStateName.delete();
ParcelFileDescriptor newState = ParcelFileDescriptor newState =
ParcelFileDescriptor.open(newStateName, ParcelFileDescriptor.open(newStateName,
ParcelFileDescriptor.MODE_READ_WRITE | ParcelFileDescriptor.MODE_READ_WRITE |
ParcelFileDescriptor.MODE_CREATE); ParcelFileDescriptor.MODE_CREATE);
mTargetService.doBackup(savedState, backupData, newState); // Run the target's backup pass
try {
mTargetService.doBackup(savedState, backupData, newState);
} finally {
savedState.close();
backupData.close();
newState.close();
}
// !!! TODO: Now propagate the newly-backed-up data to the transport // !!! TODO: Now propagate the newly-backed-up data to the transport
// !!! TODO: After successful transport, juggle the files so that // !!! TODO: After successful transport, delete the now-stale data
// next time the new state is used as the old state // and juggle the files so that next time the new state is passed
backupDataName.delete();
newStateName.renameTo(savedStateName);
} catch (FileNotFoundException fnf) { } catch (FileNotFoundException fnf) {
Log.d(TAG, "File not found on backup: "); Log.d(TAG, "File not found on backup: ");
@@ -173,9 +187,9 @@ class BackupManagerService extends IBackupManager.Stub {
mPackageManager = context.getPackageManager(); mPackageManager = context.getPackageManager();
// Set up our bookkeeping // Set up our bookkeeping
File dataDir = Environment.getDataDirectory(); mStateDir = new File(Environment.getDataDirectory(), "backup");
mStateDir = new File(dataDir, "backup");
mStateDir.mkdirs(); mStateDir.mkdirs();
mDataDir = Environment.getDownloadCacheDirectory();
// Identify the backup participants // Identify the backup participants
// !!! TODO: also watch package-install to keep this up to date // !!! TODO: also watch package-install to keep this up to date