Merge change 9011

* changes:
  Allow zero-length lists in EventLog entries.   (I'm verifying that the consumers of EventLog -- logcat, checkin -- are OK with this.) Improve the error handling in RestoreSession.
This commit is contained in:
Android (Google) Code Review
2009-07-29 13:23:24 -07:00
2 changed files with 38 additions and 34 deletions

View File

@ -124,10 +124,6 @@ public class EventLog {
"A List must have fewer than "
+ Byte.MAX_VALUE + " items in it.");
}
if (items.length < 1) {
throw new IllegalArgumentException(
"A List must have at least one item in it.");
}
for (int i = 0; i < items.length; i++) {
final Object item = items[i];
if (item == null) {
@ -223,7 +219,7 @@ public class EventLog {
case LIST:
if (mBuffer.remaining() < 1) return null;
int length = mBuffer.get();
if (length <= 0) return null;
if (length < 0) return null;
Object[] array = new Object[length];
for (int i = 0; i < length; ++i) {
array[i] = decodeObject();

View File

@ -803,7 +803,7 @@ class BackupManagerService extends IBackupManager.Stub {
class ClearDataObserver extends IPackageDataObserver.Stub {
public void onRemoveCompleted(String packageName, boolean succeeded)
throws android.os.RemoteException {
throws RemoteException {
synchronized(mClearDataLock) {
mClearingData = false;
mClearDataLock.notifyAll();
@ -1666,58 +1666,66 @@ class BackupManagerService extends IBackupManager.Stub {
}
// --- Binder interface ---
public RestoreSet[] getAvailableRestoreSets() throws android.os.RemoteException {
public synchronized RestoreSet[] getAvailableRestoreSets() {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
"getAvailableRestoreSets");
try {
synchronized(this) {
if (mRestoreTransport == null) {
Log.w(TAG, "Null transport getting restore sets");
} else if (mRestoreSets == null) { // valid transport; do the one-time fetch
return null;
}
if (mRestoreSets == null) { // valid transport; do the one-time fetch
mRestoreSets = mRestoreTransport.getAvailableRestoreSets();
if (mRestoreSets == null) EventLog.writeEvent(RESTORE_TRANSPORT_FAILURE_EVENT);
}
return mRestoreSets;
}
} catch (RuntimeException e) {
Log.d(TAG, "getAvailableRestoreSets exception");
e.printStackTrace();
throw e;
} catch (Exception e) {
Log.e(TAG, "Error in getAvailableRestoreSets", e);
return null;
}
}
public int performRestore(long token, IRestoreObserver observer)
throws android.os.RemoteException {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "performRestore");
public synchronized int performRestore(long token, IRestoreObserver observer) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
"performRestore");
Log.d(TAG, "performRestore token=" + token + " observer=" + observer);
if (DEBUG) Log.d(TAG, "performRestore token=" + token + " observer=" + observer);
if (mRestoreSets != null) {
for (int i = 0; i < mRestoreSets.length; i++) {
if (token == mRestoreSets[i].token) {
mWakelock.acquire();
Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE);
msg.obj = new RestoreParams(mRestoreTransport, observer, token);
mBackupHandler.sendMessage(msg);
return 0;
}
if (mRestoreTransport == null || mRestoreSets == null) {
Log.e(TAG, "Ignoring performRestore() with no restore set");
return -1;
}
for (int i = 0; i < mRestoreSets.length; i++) {
if (token == mRestoreSets[i].token) {
mWakelock.acquire();
Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE);
msg.obj = new RestoreParams(mRestoreTransport, observer, token);
mBackupHandler.sendMessage(msg);
return 0;
}
} else {
if (DEBUG) Log.v(TAG, "No current restore set, not doing restore");
}
return -1;
}
public void endRestoreSession() throws android.os.RemoteException {
public synchronized void endRestoreSession() {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
"endRestoreSession");
Log.d(TAG, "endRestoreSession");
if (DEBUG) Log.d(TAG, "endRestoreSession");
mRestoreTransport.finishRestore();
mRestoreTransport = null;
synchronized(BackupManagerService.this) {
synchronized (this) {
try {
if (mRestoreTransport != null) mRestoreTransport.finishRestore();
} catch (Exception e) {
Log.e(TAG, "Error in finishRestore", e);
} finally {
mRestoreTransport = null;
}
}
synchronized (BackupManagerService.this) {
if (BackupManagerService.this.mActiveRestoreSession == this) {
BackupManagerService.this.mActiveRestoreSession = null;
} else {