From f417247fa68524f2f34960f7389168eed7eb4a88 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Tue, 5 May 2009 15:50:03 -0700 Subject: [PATCH] Further development of backup file handling Put backup data in flight into /cache Close the files and delete the intermediates after backup pass --- .../android/server/BackupManagerService.java | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index f5f35612679f7..04cd53f9278e9 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -62,6 +62,7 @@ class BackupManagerService extends IBackupManager.Stub { private final Object mQueueLock = new Object(); private File mStateDir; + private File mDataDir; // ----- Handler that runs the actual backup process asynchronously ----- @@ -106,28 +107,41 @@ class BackupManagerService extends IBackupManager.Stub { Log.d(TAG, "invoking doBackup() on " + backupIntent); 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"); ParcelFileDescriptor savedState = ParcelFileDescriptor.open(savedStateName, ParcelFileDescriptor.MODE_READ_ONLY | ParcelFileDescriptor.MODE_CREATE); + + backupDataName.delete(); ParcelFileDescriptor backupData = ParcelFileDescriptor.open(backupDataName, ParcelFileDescriptor.MODE_READ_WRITE | ParcelFileDescriptor.MODE_CREATE); + + newStateName.delete(); ParcelFileDescriptor newState = ParcelFileDescriptor.open(newStateName, ParcelFileDescriptor.MODE_READ_WRITE | 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: After successful transport, juggle the files so that - // next time the new state is used as the old state + // !!! TODO: After successful transport, delete the now-stale data + // and juggle the files so that next time the new state is passed + backupDataName.delete(); + newStateName.renameTo(savedStateName); } catch (FileNotFoundException fnf) { Log.d(TAG, "File not found on backup: "); @@ -173,9 +187,9 @@ class BackupManagerService extends IBackupManager.Stub { mPackageManager = context.getPackageManager(); // Set up our bookkeeping - File dataDir = Environment.getDataDirectory(); - mStateDir = new File(dataDir, "backup"); + mStateDir = new File(Environment.getDataDirectory(), "backup"); mStateDir.mkdirs(); + mDataDir = Environment.getDownloadCacheDirectory(); // Identify the backup participants // !!! TODO: also watch package-install to keep this up to date