OSDN Git Service

API to tell the transport to cancel a full backup in progress
authorChristopher Tate <ctate@google.com>
Thu, 7 Aug 2014 21:19:50 +0000 (14:19 -0700)
committerChristopher Tate <ctate@android.com>
Thu, 7 Aug 2014 23:16:19 +0000 (23:16 +0000)
Bug 16524520

Change-Id: If2cbffd3c8a03bf4eb7b11ff1ae784c437e27e7f

core/java/android/app/backup/BackupTransport.java
core/java/com/android/internal/backup/LocalTransport.java

index dc3bbc0..6adc2e0 100644 (file)
@@ -405,6 +405,25 @@ public class BackupTransport {
         return BackupTransport.TRANSPORT_ERROR;
     }
 
+    /**
+     * Tells the transport to cancel the currently-ongoing full backup operation.  This
+     * will happen between {@link #performFullBackup()} and {@link #finishBackup()}
+     * if the OS needs to abort the backup operation for any reason, such as a crash in
+     * the application undergoing backup.
+     *
+     * <p>When it receives this call, the transport should discard any partial archive
+     * that it has stored so far.  If possible it should also roll back to the previous
+     * known-good archive in its datastore.
+     *
+     * <p>If the transport receives this callback, it will <em>not</em> receive a
+     * call to {@link #finishBackup()}.  It needs to tear down any ongoing backup state
+     * here.
+     */
+    public void cancelFullBackup() {
+        throw new UnsupportedOperationException(
+                "Transport cancelFullBackup() not implemented");
+    }
+
     // ------------------------------------------------------------------------------------
     // Full restore interfaces
 
index 97e1102..d8dffe0 100644 (file)
@@ -273,11 +273,15 @@ public class LocalTransport extends BackupTransport {
 
     @Override
     public int finishBackup() {
-        if (DEBUG) Log.v(TAG, "finishBackup()");
+        if (DEBUG) Log.v(TAG, "finishBackup() of " + mFullTargetPackage);
+        return tearDownFullBackup();
+    }
+
+    // ------------------------------------------------------------------------------------
+    // Full backup handling
+
+    private int tearDownFullBackup() {
         if (mSocket != null) {
-            if (DEBUG) {
-                Log.v(TAG, "Concluding full backup of " + mFullTargetPackage);
-            }
             try {
                 mFullBackupOutputStream.flush();
                 mFullBackupOutputStream.close();
@@ -286,7 +290,7 @@ public class LocalTransport extends BackupTransport {
                 mSocket.close();
             } catch (IOException e) {
                 if (DEBUG) {
-                    Log.w(TAG, "Exception caught in finishBackup()", e);
+                    Log.w(TAG, "Exception caught in tearDownFullBackup()", e);
                 }
                 return TRANSPORT_ERROR;
             } finally {
@@ -296,8 +300,9 @@ public class LocalTransport extends BackupTransport {
         return TRANSPORT_OK;
     }
 
-    // ------------------------------------------------------------------------------------
-    // Full backup handling
+    private File tarballFile(String pkgName) {
+        return new File(mCurrentSetFullDir, pkgName);
+    }
 
     @Override
     public long requestFullBackupTime() {
@@ -329,7 +334,7 @@ public class LocalTransport extends BackupTransport {
         mFullTargetPackage = targetPackage.packageName;
         FileOutputStream tarstream;
         try {
-            File tarball = new File(mCurrentSetFullDir, mFullTargetPackage);
+            File tarball = tarballFile(mFullTargetPackage);
             tarstream = new FileOutputStream(tarball);
         } catch (FileNotFoundException e) {
             return TRANSPORT_ERROR;
@@ -368,6 +373,19 @@ public class LocalTransport extends BackupTransport {
         return TRANSPORT_OK;
     }
 
+    // For now we can't roll back, so just tear everything down.
+    @Override
+    public void cancelFullBackup() {
+        if (DEBUG) {
+            Log.i(TAG, "Canceling full backup of " + mFullTargetPackage);
+        }
+        File archive = tarballFile(mFullTargetPackage);
+        tearDownFullBackup();
+        if (archive.exists()) {
+            archive.delete();
+        }
+    }
+
     // ------------------------------------------------------------------------------------
     // Restore handling
     static final long[] POSSIBLE_SETS = { 2, 3, 4, 5, 6, 7, 8, 9 };