Merge change 4389 into donut
* changes: More bmgr work; fix clear-data signalling
This commit is contained in:
@@ -36,7 +36,12 @@ 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) {
|
||||||
@@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user