gboolean busy;
gboolean cancelled;
gboolean sens_update_block;
+ gboolean do_destroy;
};
struct _IMAPNameSpace
SESSION(session)->sock = NULL;
}
+static void imap_safe_destroy(IMAPSession *session)
+{
+ if (!session->busy)
+ session_destroy(SESSION(session));
+ else
+ session->do_destroy = TRUE;
+}
+
static gboolean is_fatal(int libetpan_errcode)
{
switch(libetpan_errcode) {
while (imap_folder_get_refcnt(folder) > 0)
gtk_main_iteration();
+ g_free(IMAP_FOLDER(folder)->search_charset);
+
folder_remote_folder_destroy(REMOTE_FOLDER(folder));
imap_done(folder);
}
log_warning(LOG_PROTOCOL, _("Connecting to %s failed"),
folder->account->recv_server);
SESSION(session)->sock = NULL;
- session_destroy(SESSION(session));
+ imap_safe_destroy(session);
session = NULL;
} else {
rfolder->session = NULL;
folder->account->recv_server);
SESSION(session)->state = SESSION_DISCONNECTED;
SESSION(session)->sock = NULL;
- session_destroy(SESSION(session));
+ imap_safe_destroy(session);
/* Clear folders session to make imap_session_get create
a new session, because of rfolder->session == NULL
it will not try to reconnect again and so avoid an
return NULL;
}
+ /* check for deferred destroy */
+ if (rfolder->session != NULL) {
+ session = IMAP_SESSION(rfolder->session);
+ if (!session->busy && session->do_destroy) {
+ rfolder->session = NULL;
+ imap_safe_destroy(session);
+ session = NULL;
+ }
+ }
+
/* Make sure we have a session */
if (rfolder->session != NULL && rfolder->session->state != SESSION_DISCONNECTED) {
session = IMAP_SESSION(rfolder->session);
} else if (rfolder->session != NULL && rfolder->session->state == SESSION_DISCONNECTED) {
- session_destroy(SESSION(rfolder->session));
+ imap_safe_destroy(IMAP_SESSION(rfolder->session));
rfolder->session = NULL;
goto new_conn;
} else if (rfolder->connecting) {
imap_threaded_disconnect(session->folder);
SESSION(session)->state = SESSION_DISCONNECTED;
SESSION(session)->sock = NULL;
- session_destroy(SESSION(session));
+ imap_safe_destroy(session);
}
rfolder->last_failure = time(NULL);
rfolder->connecting = FALSE;
log_warning(LOG_PROTOCOL, _("Can't start TLS session.\n"));
if (!is_fatal(ok)) {
SESSION(session)->sock = NULL;
- session_destroy(SESSION(session));
+ imap_safe_destroy(session);
}
return NULL;
}
if (!cached || !MSG_IS_FULLY_CACHED(cached->flags)) {
have_size = get_file_size_with_crs(filename);
if (cached && (cached->size <= have_size || !body)) {
- procmsg_msginfo_free(cached);
ok = file_strip_crs(filename);
if (ok == 0 && cached && cached->size <= have_size) {
/* we have it all and stripped */
- debug_print("...fully cached in fact; setting flag.\n");
+ debug_print("...fully cached in fact (%d/%d); setting flag.\n",
+ have_size, cached->size);
procmsg_msginfo_set_flags(cached, MSG_FULLY_CACHED, 0);
}
+ procmsg_msginfo_free(cached);
return filename;
} else if (!cached && time(NULL) - get_file_mtime(filename) < 60) {
debug_print("message not cached and file recent, considering file complete\n");
return TRUE;
}
path = folder_item_get_path(item);
- if (!is_dir_exist(path))
+ if (!is_dir_exist(path)) {
+ g_free(path);
return FALSE;
+ }
filename = g_strconcat(path, G_DIR_SEPARATOR_S, itos(uid), NULL);
g_free(path);
size = get_file_size_with_crs(filename);
g_free(filename);
}
+ debug_print("msg %d cached, has size %d, full should be %d.\n", uid, size, cached->size);
if (cached && size >= cached->size) {
cached->total_size = cached->size;
procmsg_msginfo_set_flags(cached, MSG_FULLY_CACHED, 0);
*msgs = g_slist_prepend(*msgs, GUINT_TO_POINTER(((MsgInfo*) cur->data)->msgnum));
count++;
}
+ procmsg_msg_list_free(list);
+
*msgs = g_slist_reverse(*msgs);
+
return count;
}
main_window_reflect_tags_changes(mainwindow_get_mainwindow());
}
- for (cur = seq_list; cur != NULL; cur = g_slist_next(cur)) {
- struct mailimap_set * imapset;
-
- imapset = cur->data;
- mailimap_set_free(imapset);
- }
+ imap_lep_set_free(seq_list);
session_set_access_time(SESSION(session));
stuff->done = TRUE;
guint32 uid = 0;
goffset size = 0;
MsgFlags flags = {0, 0};
-
+
if (info->headers == NULL)
return NULL;
MSG_SET_TMP_FLAGS(flags, MSG_DRAFT);
}
flags.perm_flags = info->flags;
-
+
uid = info->uid;
size = (goffset) info->size;
msginfo = procheader_parse_str(info->headers, flags, FALSE, FALSE);
-
+
if (msginfo) {
msginfo->msgnum = uid;
msginfo->size = size;
if (account->protocol == A_IMAP4) {
RemoteFolder *folder = (RemoteFolder *)account->folder;
if (folder && folder->session) {
+ if (imap_is_busy(FOLDER(folder)))
+ imap_threaded_cancel(FOLDER(folder));
+
IMAPSession *session = (IMAPSession *)folder->session;
if (have_connectivity)
imap_threaded_disconnect(FOLDER(folder));
SESSION(session)->state = SESSION_DISCONNECTED;
SESSION(session)->sock = NULL;
- session_destroy(SESSION(session));
+ imap_safe_destroy(session);
folder->session = NULL;
}
}