Fix bugs re: sending via EAS
* Make sure each call to sendMessage returns a proper result code
* Exit outbox sync on irrecoverable errors
diff --git a/src/com/android/exchange/EasOutboxService.java b/src/com/android/exchange/EasOutboxService.java
index ddbadf6..8f6903f 100644
--- a/src/com/android/exchange/EasOutboxService.java
+++ b/src/com/android/exchange/EasOutboxService.java
@@ -67,7 +67,8 @@
* @param msgId the _id of the message to send
* @throws IOException
*/
- void sendMessage(File cacheDir, long msgId) throws IOException, MessagingException {
+ int sendMessage(File cacheDir, long msgId) throws IOException, MessagingException {
+ int result;
sendCallback(msgId, null, EmailServiceStatus.IN_PROGRESS);
File tmpFile = File.createTempFile("eas_", "tmp", cacheDir);
// Write the output to a temporary file
@@ -93,17 +94,19 @@
Message msg = Message.restoreMessageWithId(mContext, msgId);
mContext.getContentResolver().delete(ContentUris.withAppendedId(
Message.CONTENT_URI, msgId), null, null);
+ result = EmailServiceStatus.SUCCESS;
sendCallback(-1, msg.mSubject, EmailServiceStatus.SUCCESS);
} else {
ContentValues cv = new ContentValues();
cv.put(SyncColumns.SERVER_ID, SEND_FAILED);
Message.update(mContext, Message.CONTENT_URI, msgId, cv);
// TODO REMOTE_EXCEPTION is temporary; add better error codes
- int result = EmailServiceStatus.REMOTE_EXCEPTION;
+ result = EmailServiceStatus.REMOTE_EXCEPTION;
if (isAuthError(code)) {
result = EmailServiceStatus.LOGIN_FAILED;
}
sendCallback(msgId, null, result);
+
}
} catch (IOException e) {
// We catch this just to send the callback
@@ -115,6 +118,7 @@
tmpFile.delete();
}
}
+ return result;
}
@Override
@@ -130,16 +134,27 @@
while (c.moveToNext()) {
long msgId = c.getLong(0);
if (msgId != 0) {
- sendMessage(cacheDir, msgId);
+ int result = sendMessage(cacheDir, msgId);
+ // If there's an error, it should stop the service; we will distinguish
+ // at least between login failures and everything else
+ if (result == EmailServiceStatus.LOGIN_FAILED) {
+ mExitStatus = EXIT_LOGIN_FAILURE;
+ return;
+ } else if (result == EmailServiceStatus.REMOTE_EXCEPTION) {
+ mExitStatus = EXIT_EXCEPTION;
+ return;
+ }
}
}
} finally {
c.close();
}
+ mExitStatus = EXIT_DONE;
} catch (Exception e) {
mExitStatus = EXIT_EXCEPTION;
} finally {
userLog(mMailbox.mDisplayName, ": sync finished");
+ userLog("Outbox exited with status ", mExitStatus);
SyncManager.done(this);
}
}
diff --git a/src/com/android/exchange/SyncManager.java b/src/com/android/exchange/SyncManager.java
index dcd6d20..c36d914 100644
--- a/src/com/android/exchange/SyncManager.java
+++ b/src/com/android/exchange/SyncManager.java
@@ -1047,7 +1047,7 @@
// We also observe synced messages to trigger upsyncs at the appropriate time
mResolver.registerContentObserver(Mailbox.CONTENT_URI, false, mMailboxObserver);
mResolver.registerContentObserver(Message.SYNCED_CONTENT_URI, true, mSyncedMessageObserver);
- mResolver.registerContentObserver(Message.CONTENT_URI, false, mMessageObserver);
+ mResolver.registerContentObserver(Message.CONTENT_URI, true, mMessageObserver);
mConnectivityReceiver = new ConnectivityReceiver();
registerReceiver(mConnectivityReceiver,