* src/imap.c
Notice disconnections faster
+2007-09-29 [colin] 3.0.1cvs46
+
+ * src/imap.c
+ Notice disconnections faster
+
2007-09-28 [colin] 3.0.1cvs45
* src/addressbook.c
2007-09-28 [colin] 3.0.1cvs45
* src/addressbook.c
( cvs diff -u -r 1.61.2.69 -r 1.61.2.70 src/account.c; ) > 3.0.1cvs43.patchset
( cvs diff -u -r 1.83.2.116 -r 1.83.2.117 src/mimeview.c; ) > 3.0.1cvs44.patchset
( cvs diff -u -r 1.60.2.97 -r 1.60.2.98 src/addressbook.c; cvs diff -u -r 1.28.2.30 -r 1.28.2.31 src/addrindex.c; ) > 3.0.1cvs45.patchset
( cvs diff -u -r 1.61.2.69 -r 1.61.2.70 src/account.c; ) > 3.0.1cvs43.patchset
( cvs diff -u -r 1.83.2.116 -r 1.83.2.117 src/mimeview.c; ) > 3.0.1cvs44.patchset
( cvs diff -u -r 1.60.2.97 -r 1.60.2.98 src/addressbook.c; cvs diff -u -r 1.28.2.30 -r 1.28.2.31 src/addrindex.c; ) > 3.0.1cvs45.patchset
+( cvs diff -u -r 1.179.2.188 -r 1.179.2.189 src/imap.c; ) > 3.0.1cvs46.patchset
MICRO_VERSION=1
INTERFACE_AGE=0
BINARY_AGE=0
MICRO_VERSION=1
INTERFACE_AGE=0
BINARY_AGE=0
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=
static void unlock_session(IMAPSession *session)
{
if (session) {
static void unlock_session(IMAPSession *session)
{
if (session) {
debug_print("unlocking session %p\n", session);
session->busy = FALSE;
imap_refresh_sensitivity(session);
debug_print("unlocking session %p\n", session);
session->busy = FALSE;
imap_refresh_sensitivity(session);
+static void imap_disc_session_destroy(Folder *folder)
+{
+ RemoteFolder *rfolder = REMOTE_FOLDER(folder);
+ IMAPSession *session = NULL;
+
+ if (!rfolder)
+ return;
+ session = IMAP_SESSION(rfolder->session);
+ if (!session)
+ return;
+
+ log_warning(LOG_PROTOCOL, _("IMAP4 connection broken\n"));
+ SESSION(session)->state = SESSION_DISCONNECTED;
+ session_destroy(SESSION(session));
+ rfolder->session = NULL;
+}
+
static IMAPSession *imap_session_get(Folder *folder)
{
RemoteFolder *rfolder = REMOTE_FOLDER(folder);
static IMAPSession *imap_session_get(Folder *folder)
{
RemoteFolder *rfolder = REMOTE_FOLDER(folder);
g_warning("can't select mailbox %s\n", item->path);
g_free(filename);
unlock_session(session);
g_warning("can't select mailbox %s\n", item->path);
g_free(filename);
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
g_warning("can't fetch message %d\n", uid);
g_free(filename);
unlock_session(session);
g_warning("can't fetch message %d\n", uid);
g_free(filename);
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
unlock_session(session);
statusbar_progress_all(0,0,0);
statusbar_pop_all();
unlock_session(session);
statusbar_progress_all(0,0,0);
statusbar_pop_all();
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
return -1;
} else {
debug_print("appended new message as %d\n", new_uid);
return -1;
} else {
debug_print("appended new message as %d\n", new_uid);
gint a;
ok = imap_select(session, IMAP_FOLDER(folder), dest->path,
&a, NULL, NULL, NULL, FALSE);
gint a;
ok = imap_select(session, IMAP_FOLDER(folder), dest->path,
&a, NULL, NULL, NULL, FALSE);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
NULL, NULL, NULL, NULL, FALSE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
NULL, NULL, NULL, NULL, FALSE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
ok = imap_cmd_copy(session, seq_set, destdir, uid_mapping,
&source, &dest);
ok = imap_cmd_copy(session, seq_set, destdir, uid_mapping,
&source, &dest);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
if (ok == IMAP_SUCCESS) {
if (relation && source && dest) {
GSList *s_list = flatten_mailimap_set(source);
if (ok == IMAP_SUCCESS) {
if (relation && source && dest) {
GSList *s_list = flatten_mailimap_set(source);
NULL, NULL, NULL, NULL, FALSE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
NULL, NULL, NULL, NULL, FALSE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
if (ok != IMAP_SUCCESS) {
log_warning(LOG_PROTOCOL, _("can't set deleted flags\n"));
unlock_session(session);
if (ok != IMAP_SUCCESS) {
log_warning(LOG_PROTOCOL, _("can't set deleted flags\n"));
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
return ok;
}
ok = imap_cmd_expunge(session);
if (ok != IMAP_SUCCESS) {
log_warning(LOG_PROTOCOL, _("can't expunge\n"));
unlock_session(session);
return ok;
}
ok = imap_cmd_expunge(session);
if (ok != IMAP_SUCCESS) {
log_warning(LOG_PROTOCOL, _("can't expunge\n"));
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
g_free(imap_path);
g_free(dirpath);
unlock_session(session);
g_free(imap_path);
g_free(dirpath);
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
return NULL;
}
r = imap_threaded_list(folder, "", imap_path, &lep_list);
return NULL;
}
r = imap_threaded_list(folder, "", imap_path, &lep_list);
if (ok != IMAP_SUCCESS) {
g_free(real_oldpath);
unlock_session(session);
if (ok != IMAP_SUCCESS) {
g_free(real_oldpath);
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
g_free(newpath);
g_free(real_newpath);
unlock_session(session);
g_free(newpath);
g_free(real_newpath);
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
return -1;
}
g_free(item->name);
return -1;
}
g_free(item->name);
ok = imap_cmd_close(session);
if (ok != MAILIMAP_NO_ERROR) {
debug_print("close err %d\n", ok);
ok = imap_cmd_close(session);
if (ok != MAILIMAP_NO_ERROR) {
debug_print("close err %d\n", ok);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
log_warning(LOG_PROTOCOL, _("can't delete mailbox\n"));
g_free(path);
unlock_session(session);
log_warning(LOG_PROTOCOL, _("can't delete mailbox\n"));
g_free(path);
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
ok = imap_cmd_select(session, real_path,
exists, recent, unseen, uid_validity, block);
ok = imap_cmd_select(session, real_path,
exists, recent, unseen, uid_validity, block);
- if (ok != IMAP_SUCCESS)
+ if (ok != IMAP_SUCCESS) {
log_warning(LOG_PROTOCOL, _("can't select folder: %s\n"), real_path);
log_warning(LOG_PROTOCOL, _("can't select folder: %s\n"), real_path);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(FOLDER(folder));
+ session = NULL;
+ }
+ } else {
session->mbox = g_strdup(path);
session->folder_content_changed = FALSE;
session->exists = *exists;
session->mbox = g_strdup(path);
session->folder_content_changed = FALSE;
session->exists = *exists;
g_free(real_path);
if (r != MAILIMAP_NO_ERROR) {
debug_print("status err %d\n", r);
g_free(real_path);
if (r != MAILIMAP_NO_ERROR) {
debug_print("status err %d\n", r);
}
if (data_status->st_info_list == NULL) {
}
if (data_status->st_info_list == NULL) {
exists, recent, unseen, uid_validity);
if (r != MAILIMAP_NO_ERROR) {
debug_print("select err %d\n", r);
exists, recent, unseen, uid_validity);
if (r != MAILIMAP_NO_ERROR) {
debug_print("select err %d\n", r);
NULL, NULL, NULL, NULL, TRUE);
if (ok != IMAP_SUCCESS) {
stuff->done = TRUE;
NULL, NULL, NULL, NULL, TRUE);
if (ok != IMAP_SUCCESS) {
stuff->done = TRUE;
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
return GINT_TO_POINTER(-1);
}
return GINT_TO_POINTER(-1);
}
NULL, NULL, NULL, NULL, FALSE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
NULL, NULL, NULL, NULL, FALSE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
return NULL;
}
if (!(folder_has_parent_of_type(item, F_DRAFT) ||
return NULL;
}
if (!(folder_has_parent_of_type(item, F_DRAFT) ||
&exists, &uid_next, &uid_val, &unseen, FALSE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
&exists, &uid_next, &uid_val, &unseen, FALSE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
if ((ok = imap_select(session, IMAP_FOLDER(folder), msginfo->folder->path,
NULL, NULL, NULL, NULL, FALSE)) != IMAP_SUCCESS) {
unlock_session(session);
if ((ok = imap_select(session, IMAP_FOLDER(folder), msginfo->folder->path,
NULL, NULL, NULL, NULL, FALSE)) != IMAP_SUCCESS) {
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
return;
}
numlist.next = NULL;
return;
}
numlist.next = NULL;
ok = imap_set_message_flags(session, &numlist, flags_set, TRUE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
ok = imap_set_message_flags(session, &numlist, flags_set, TRUE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
ok = imap_set_message_flags(session, &numlist, flags_unset, FALSE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
ok = imap_set_message_flags(session, &numlist, flags_unset, FALSE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
NULL, NULL, NULL, NULL, FALSE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
NULL, NULL, NULL, NULL, FALSE);
if (ok != IMAP_SUCCESS) {
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
return ok;
}
numlist.next = NULL;
return ok;
}
numlist.next = NULL;
if (ok != IMAP_SUCCESS) {
log_warning(LOG_PROTOCOL, _("can't set deleted flags: %d\n"), uid);
unlock_session(session);
if (ok != IMAP_SUCCESS) {
log_warning(LOG_PROTOCOL, _("can't set deleted flags: %d\n"), uid);
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
if (ok != IMAP_SUCCESS) {
log_warning(LOG_PROTOCOL, _("can't expunge\n"));
unlock_session(session);
if (ok != IMAP_SUCCESS) {
log_warning(LOG_PROTOCOL, _("can't expunge\n"));
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
if (ok != IMAP_SUCCESS) {
stuff->done = TRUE;
unlock_session(session);
if (ok != IMAP_SUCCESS) {
stuff->done = TRUE;
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(folder);
+ session = NULL;
+ }
return GINT_TO_POINTER(-1);
}
return GINT_TO_POINTER(-1);
}
}
unlock_session(session);
}
unlock_session(session);
+ if (ok == MAILIMAP_ERROR_STREAM) {
+ imap_disc_session_destroy(item->folder);
+ session = NULL;
+ }
g_slist_free(data->msglist);
g_free(data);
return TRUE;
g_slist_free(data->msglist);
g_free(data);
return TRUE;