Merge change 4389 into donut

* changes:
  More bmgr work; fix clear-data signalling
This commit is contained in:
Android (Google) Code Review
2009-06-16 14:34:23 -07:00
4 changed files with 83 additions and 15 deletions

View File

@@ -36,9 +36,14 @@ public final class Bmgr {
private String mCurArgData;
public static void main(String[] args) {
new Bmgr().run(args);
try {
new Bmgr().run(args);
} catch (Exception e) {
System.err.println("Exception caught:");
e.printStackTrace();
}
}
public void run(String[] args) {
boolean validCommand = false;
if (args.length < 1) {
@@ -70,6 +75,11 @@ public final class Bmgr {
doList();
return;
}
if ("restore".equals(op)) {
doRestore();
return;
}
}
private void doRun() {
@@ -114,6 +124,10 @@ public final class Bmgr {
try {
int curTransport = mBmgr.getCurrentTransport();
mRestore = mBmgr.beginRestoreSession(curTransport);
if (mRestore == null) {
System.err.println(BMGR_NOT_RUNNING_ERR);
return;
}
if ("sets".equals(arg)) {
doListRestoreSets();
@@ -127,13 +141,12 @@ public final class Bmgr {
}
private void doListTransports() {
}
private void doListRestoreSets() {
try {
RestoreSet[] sets = mRestore.getAvailableRestoreSets();
if (sets.length == 0) {
if (sets == null || sets.length == 0) {
System.out.println("No restore sets available");
} else {
for (RestoreSet s : sets) {
@@ -146,6 +159,37 @@ public final class Bmgr {
}
}
private void doRestore() {
int token;
try {
token = Integer.parseInt(nextArg());
} catch (NumberFormatException e) {
showUsage();
return;
}
try {
int curTransport = mBmgr.getCurrentTransport();
mRestore = mBmgr.beginRestoreSession(curTransport);
if (mRestore == null) {
System.err.println(BMGR_NOT_RUNNING_ERR);
return;
}
RestoreSet[] sets = mRestore.getAvailableRestoreSets();
for (RestoreSet s : sets) {
if (s.token == token) {
System.out.println("Scheduling restore: " + s.name);
mRestore.performRestore(token);
break;
}
}
mRestore.endRestoreSession();
} catch (RemoteException e) {
System.err.println(e.toString());
System.err.println(BMGR_NOT_RUNNING_ERR);
}
}
private String nextArg() {
if (mNextArg >= mArgs.length) {
return null;
@@ -161,7 +205,7 @@ public final class Bmgr {
System.err.println(" bmgr list sets");
System.err.println(" #bmgr list transports");
System.err.println(" #bmgr transport which#");
System.err.println(" #bmgr restore set#");
System.err.println(" bmgr restore token#");
System.err.println(" bmgr run");
}
}

View File

@@ -46,11 +46,11 @@ public class RestoreSet implements Parcelable {
public int token;
RestoreSet() {
public RestoreSet() {
// Leave everything zero / null
}
RestoreSet(String _name, String _dev, int _token) {
public RestoreSet(String _name, String _dev, int _token) {
name = _name;
device = _dev;
token = _token;

View File

@@ -112,11 +112,9 @@ public class LocalTransport extends IBackupTransport.Stub {
// Restore handling
public RestoreSet[] getAvailableRestoreSets() throws android.os.RemoteException {
// one hardcoded restore set
RestoreSet[] set = new RestoreSet[1];
set[0].device = "flash";
set[0].name = "Local disk image";
set[0].token = 0;
return set;
RestoreSet set = new RestoreSet("Local disk image", "flash", 0);
RestoreSet[] array = { set };
return array;
}
public PackageInfo[] getAppSet(int token) throws android.os.RemoteException {

View File

@@ -121,6 +121,7 @@ class BackupManagerService extends IBackupManager.Stub {
private volatile boolean mClearingData;
private int mTransportId;
private RestoreSession mActiveRestoreSession;
private File mStateDir;
private File mDataDir;
@@ -427,7 +428,7 @@ class BackupManagerService extends IBackupManager.Stub {
break;
default:
Log.e(TAG, "creating unknown transport " + transportID);
Log.e(TAG, "Asked for unknown transport " + transportID);
}
return transport;
}
@@ -495,7 +496,7 @@ class BackupManagerService extends IBackupManager.Stub {
throws android.os.RemoteException {
synchronized(mClearDataLock) {
mClearingData = false;
notifyAll();
mClearDataLock.notifyAll();
}
}
}
@@ -962,12 +963,22 @@ class BackupManagerService extends IBackupManager.Stub {
// Hand off a restore session
public IRestoreSession beginRestoreSession(int transportID) {
mContext.enforceCallingPermission("android.permission.BACKUP", "beginRestoreSession");
return null;
synchronized(this) {
if (mActiveRestoreSession != null) {
Log.d(TAG, "Restore session requested but one already active");
return null;
}
mActiveRestoreSession = new RestoreSession(transportID);
}
return mActiveRestoreSession;
}
// ----- Restore session -----
class RestoreSession extends IRestoreSession.Stub {
private static final String TAG = "RestoreSession";
private IBackupTransport mRestoreTransport = null;
RestoreSet[] mRestoreSets = null;
@@ -980,12 +991,18 @@ class BackupManagerService extends IBackupManager.Stub {
mContext.enforceCallingPermission("android.permission.BACKUP",
"getAvailableRestoreSets");
try {
synchronized(this) {
if (mRestoreSets == null) {
mRestoreSets = mRestoreTransport.getAvailableRestoreSets();
}
return mRestoreSets;
}
} catch (RuntimeException e) {
Log.d(TAG, "getAvailableRestoreSets exception");
e.printStackTrace();
throw e;
}
}
public int performRestore(int token) throws android.os.RemoteException {
@@ -1001,6 +1018,8 @@ class BackupManagerService extends IBackupManager.Stub {
return 0;
}
}
} else {
if (DEBUG) Log.v(TAG, "No current restore set, not doing restore");
}
return -1;
}
@@ -1011,6 +1030,13 @@ class BackupManagerService extends IBackupManager.Stub {
mRestoreTransport.endSession();
mRestoreTransport = null;
synchronized(BackupManagerService.this) {
if (BackupManagerService.this.mActiveRestoreSession == this) {
BackupManagerService.this.mActiveRestoreSession = null;
} else {
Log.e(TAG, "ending non-current restore session");
}
}
}
}