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; private String mCurArgData;
public static void main(String[] args) { 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) { public void run(String[] args) {
boolean validCommand = false; boolean validCommand = false;
if (args.length < 1) { if (args.length < 1) {
@@ -70,6 +75,11 @@ public final class Bmgr {
doList(); doList();
return; return;
} }
if ("restore".equals(op)) {
doRestore();
return;
}
} }
private void doRun() { private void doRun() {
@@ -114,6 +124,10 @@ public final class Bmgr {
try { try {
int curTransport = mBmgr.getCurrentTransport(); int curTransport = mBmgr.getCurrentTransport();
mRestore = mBmgr.beginRestoreSession(curTransport); mRestore = mBmgr.beginRestoreSession(curTransport);
if (mRestore == null) {
System.err.println(BMGR_NOT_RUNNING_ERR);
return;
}
if ("sets".equals(arg)) { if ("sets".equals(arg)) {
doListRestoreSets(); doListRestoreSets();
@@ -127,13 +141,12 @@ public final class Bmgr {
} }
private void doListTransports() { private void doListTransports() {
} }
private void doListRestoreSets() { private void doListRestoreSets() {
try { try {
RestoreSet[] sets = mRestore.getAvailableRestoreSets(); RestoreSet[] sets = mRestore.getAvailableRestoreSets();
if (sets.length == 0) { if (sets == null || sets.length == 0) {
System.out.println("No restore sets available"); System.out.println("No restore sets available");
} else { } else {
for (RestoreSet s : sets) { 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() { private String nextArg() {
if (mNextArg >= mArgs.length) { if (mNextArg >= mArgs.length) {
return null; return null;
@@ -161,7 +205,7 @@ public final class Bmgr {
System.err.println(" bmgr list sets"); System.err.println(" bmgr list sets");
System.err.println(" #bmgr list transports"); System.err.println(" #bmgr list transports");
System.err.println(" #bmgr transport which#"); System.err.println(" #bmgr transport which#");
System.err.println(" #bmgr restore set#"); System.err.println(" bmgr restore token#");
System.err.println(" bmgr run"); System.err.println(" bmgr run");
} }
} }

View File

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

View File

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