Check store connection on folder exception

pull/50/head
M66B 6 years ago
parent 3f0fb8389d
commit 62f74ef95b

@ -318,6 +318,12 @@ public class ServiceSynchronize extends LifecycleService {
} }
private void reportError(String account, String folder, Throwable ex) { private void reportError(String account, String folder, Throwable ex) {
// FolderClosedException: can happen when no connectivity
// IllegalStateException:
// - "This operation is not allowed on a closed folder"
// - can happen when syncing message
if (!(ex instanceof FolderClosedException) && !(ex instanceof IllegalStateException)) { if (!(ex instanceof FolderClosedException) && !(ex instanceof IllegalStateException)) {
String action = account + "/" + folder; String action = account + "/" + folder;
NotificationManager nm = getSystemService(NotificationManager.class); NotificationManager nm = getSystemService(NotificationManager.class);
@ -397,7 +403,6 @@ public class ServiceSynchronize extends LifecycleService {
Thread t = new Thread(new Runnable() { Thread t = new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
boolean connected = false;
IMAPFolder ifolder = null; IMAPFolder ifolder = null;
try { try {
Log.i(Helper.TAG, folder.name + " start"); Log.i(Helper.TAG, folder.name + " start");
@ -407,7 +412,6 @@ public class ServiceSynchronize extends LifecycleService {
ifolder = (IMAPFolder) fstore.getFolder(folder.name); ifolder = (IMAPFolder) fstore.getFolder(folder.name);
ifolder.open(Folder.READ_WRITE); ifolder.open(Folder.READ_WRITE);
connected = true;
db.folder().setFolderState(folder.id, "connected"); db.folder().setFolderState(folder.id, "connected");
db.folder().setFolderError(folder.id, null); db.folder().setFolderError(folder.id, null);
@ -428,20 +432,10 @@ public class ServiceSynchronize extends LifecycleService {
db.folder().setFolderError(folder.id, Helper.formatThrowable(ex)); db.folder().setFolderError(folder.id, Helper.formatThrowable(ex));
// FolderClosedException: can happen when no connectivity // Check connection
synchronized (state) {
// IllegalStateException: state.notifyAll();
// - "This operation is not allowed on a closed folder" }
// - can happen when syncing message
// Cascade up
if (!(ex instanceof FolderClosedException) && !(ex instanceof IllegalStateException))
if (connected)
try {
fstore.close();
} catch (MessagingException e1) {
Log.w(Helper.TAG, account.name + " " + e1 + "\n" + Log.getStackTraceString(e1));
}
} finally { } finally {
if (ifolder != null && ifolder.isOpen()) { if (ifolder != null && ifolder.isOpen()) {
try { try {
@ -481,11 +475,9 @@ public class ServiceSynchronize extends LifecycleService {
db.account().setAccountError(account.id, Helper.formatThrowable(ex)); db.account().setAccountError(account.id, Helper.formatThrowable(ex));
// Cascade up // Check connection
try { synchronized (state) {
fstore.close(); state.notifyAll();
} catch (MessagingException e1) {
Log.w(Helper.TAG, account.name + " " + e1 + "\n" + Log.getStackTraceString(e1));
} }
} }
} }
@ -657,7 +649,10 @@ public class ServiceSynchronize extends LifecycleService {
private void monitorFolder( private void monitorFolder(
final EntityAccount account, final EntityFolder folder, final EntityAccount account, final EntityFolder folder,
final IMAPStore istore, final IMAPFolder ifolder, final IMAPStore istore, final IMAPFolder ifolder,
ServiceState state) throws MessagingException, JSONException, IOException { final ServiceState state) throws MessagingException, JSONException, IOException {
final DB db = DB.getInstance(ServiceSynchronize.this);
// Listen for new and deleted messages // Listen for new and deleted messages
ifolder.addMessageCountListener(new MessageCountAdapter() { ifolder.addMessageCountListener(new MessageCountAdapter() {
@Override @Override
@ -666,18 +661,21 @@ public class ServiceSynchronize extends LifecycleService {
try { try {
Log.i(Helper.TAG, folder.name + " messages added"); Log.i(Helper.TAG, folder.name + " messages added");
for (Message imessage : e.getMessages()) for (Message imessage : e.getMessages())
synchronizeMessage(folder, ifolder, (IMAPMessage) imessage); try {
} catch (MessageRemovedException ex) { synchronizeMessage(folder, ifolder, (IMAPMessage) imessage);
Log.w(Helper.TAG, folder.name + " " + ex + "\n" + Log.getStackTraceString(ex)); } catch (MessageRemovedException ex) {
Log.w(Helper.TAG, folder.name + " " + ex + "\n" + Log.getStackTraceString(ex));
}
} catch (Throwable ex) { } catch (Throwable ex) {
Log.e(Helper.TAG, folder.name + " " + ex + "\n" + Log.getStackTraceString(ex)); Log.e(Helper.TAG, folder.name + " " + ex + "\n" + Log.getStackTraceString(ex));
reportError(account.name, folder.name, ex); reportError(account.name, folder.name, ex);
// Cascade up db.folder().setFolderError(folder.id, Helper.formatThrowable(ex));
try {
istore.close(); // Check connection
} catch (MessagingException e1) { synchronized (state) {
Log.w(Helper.TAG, folder.name + " " + e1 + "\n" + Log.getStackTraceString(e1)); state.notifyAll();
} }
} }
} }
@ -703,11 +701,11 @@ public class ServiceSynchronize extends LifecycleService {
Log.e(Helper.TAG, folder.name + " " + ex + "\n" + Log.getStackTraceString(ex)); Log.e(Helper.TAG, folder.name + " " + ex + "\n" + Log.getStackTraceString(ex));
reportError(account.name, folder.name, ex); reportError(account.name, folder.name, ex);
// Cascade up db.folder().setFolderError(folder.id, Helper.formatThrowable(ex));
try {
istore.close(); // Check connection
} catch (MessagingException e1) { synchronized (state) {
Log.w(Helper.TAG, folder.name + " " + e1 + "\n" + Log.getStackTraceString(e1)); state.notifyAll();
} }
} }
} }
@ -725,21 +723,21 @@ public class ServiceSynchronize extends LifecycleService {
public void messageChanged(MessageChangedEvent e) { public void messageChanged(MessageChangedEvent e) {
synchronized (lock) { synchronized (lock) {
try { try {
Log.i(Helper.TAG, folder.name + " message changed"); try {
synchronizeMessage(folder, ifolder, (IMAPMessage) e.getMessage()); Log.i(Helper.TAG, folder.name + " message changed");
} catch (MessageRemovedException ex) { synchronizeMessage(folder, ifolder, (IMAPMessage) e.getMessage());
Log.w(Helper.TAG, folder.name + " " + ex + "\n" + Log.getStackTraceString(ex)); } catch (MessageRemovedException ex) {
Log.w(Helper.TAG, folder.name + " " + ex + "\n" + Log.getStackTraceString(ex));
}
} catch (Throwable ex) { } catch (Throwable ex) {
Log.e(Helper.TAG, folder.name + " " + ex + "\n" + Log.getStackTraceString(ex)); Log.e(Helper.TAG, folder.name + " " + ex + "\n" + Log.getStackTraceString(ex));
reportError(account.name, folder.name, ex); reportError(account.name, folder.name, ex);
DB.getInstance(ServiceSynchronize.this).folder().setFolderError(folder.id, Helper.formatThrowable(ex)); db.folder().setFolderError(folder.id, Helper.formatThrowable(ex));
// Cascade up // Check connection
try { synchronized (state) {
istore.close(); state.notifyAll();
} catch (MessagingException e1) {
Log.w(Helper.TAG, folder.name + " " + e1 + "\n" + Log.getStackTraceString(e1));
} }
} }
} }
@ -768,13 +766,11 @@ public class ServiceSynchronize extends LifecycleService {
Log.e(Helper.TAG, folder.name + " " + ex + "\n" + Log.getStackTraceString(ex)); Log.e(Helper.TAG, folder.name + " " + ex + "\n" + Log.getStackTraceString(ex));
reportError(account.name, folder.name, ex); reportError(account.name, folder.name, ex);
DB.getInstance(ServiceSynchronize.this).folder().setFolderError(folder.id, Helper.formatThrowable(ex)); db.folder().setFolderError(folder.id, Helper.formatThrowable(ex));
} finally {
// Cascade up // Check connection
try { synchronized (state) {
istore.close(); state.notifyAll();
} catch (MessagingException e1) {
Log.w(Helper.TAG, folder.name + " " + e1 + "\n" + Log.getStackTraceString(e1));
} }
} }
} }

Loading…
Cancel
Save