return ok;
}
+static IMAPSession *imap_reconnect_if_possible(Folder *folder, IMAPSession *session)
+{
+ RemoteFolder *rfolder = REMOTE_FOLDER(folder);
+ /* Check if this is the first try to establish a
+ connection, if yes we don't try to reconnect */
+ debug_print("reconnecting\n");
+ if (rfolder->session == NULL) {
+ log_warning(_("Connecting to %s failed"),
+ folder->account->recv_server);
+ session_destroy(SESSION(session));
+ session = NULL;
+ } else {
+ log_warning(_("IMAP4 connection to %s has been"
+ " disconnected. Reconnecting...\n"),
+ folder->account->recv_server);
+ statusbar_print_all(_("IMAP4 connection to %s has been"
+ " disconnected. Reconnecting...\n"),
+ folder->account->recv_server);
+ SESSION(session)->state = SESSION_DISCONNECTED;
+ session_destroy(SESSION(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
+ endless loop */
+ rfolder->session = NULL;
+ session = imap_session_get(folder);
+ rfolder->session = SESSION(session);
+ statusbar_pop_all();
+ }
+ return session;
+}
+
static IMAPSession *imap_session_get(Folder *folder)
{
RemoteFolder *rfolder = REMOTE_FOLDER(folder);
if (time(NULL) - SESSION(session)->last_access_time > SESSION_TIMEOUT_INTERVAL) {
/* verify that the session is still alive */
if (imap_cmd_noop(session) != IMAP_SUCCESS) {
- /* Check if this is the first try to establish a
- connection, if yes we don't try to reconnect */
- if (rfolder->session == NULL) {
- log_warning(_("Connecting to %s failed"),
- folder->account->recv_server);
- session_destroy(SESSION(session));
- session = NULL;
- } else {
- log_warning(_("IMAP4 connection to %s has been"
- " disconnected. Reconnecting...\n"),
- folder->account->recv_server);
- statusbar_print_all(_("IMAP4 connection to %s has been"
- " disconnected. Reconnecting...\n"),
- folder->account->recv_server);
- session_destroy(SESSION(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
- endless loop */
- rfolder->session = NULL;
- session = imap_session_get(folder);
- statusbar_pop_all();
- }
+ debug_print("disconnected!\n");
+ session = imap_reconnect_if_possible(folder, session);
}
}
if(!prefs_common.no_recv_err_panel) {
alertpanel_error(_("Can't connect to IMAP4 server: %s:%d"),
account->recv_server, port);
- }
+ } else {
+ log_error(_("Can't connect to IMAP4 server: %s:%d"),
+ account->recv_server, port);
+ }
return NULL;
}
static void imap_session_destroy(Session *session)
{
- imap_threaded_disconnect(IMAP_SESSION(session)->folder);
+ if (session->state != SESSION_DISCONNECTED)
+ imap_threaded_disconnect(IMAP_SESSION(session)->folder);
imap_free_capabilities(IMAP_SESSION(session));
g_free(IMAP_SESSION(session)->mbox);
return imap_fetch_msg_full(folder, item, uid, TRUE, TRUE);
}
-static guint get_size_with_lfs(MsgInfo *info)
+static guint get_size_with_crs(MsgInfo *info)
{
FILE *fp = NULL;
guint cnt = 0;
return cnt;
}
-static void strip_crs(const gchar *file)
-{
- FILE *fp = NULL, *outfp = NULL;
- gchar buf[4096];
- gchar *out = get_tmp_file();
- if (file == NULL)
- return;
-
- fp = fopen(file, "rb");
- if (!fp)
- return;
-
- outfp = fopen(out, "wb");
- if (!outfp)
- return;
-
- while (fgets(buf, sizeof (buf), fp) != NULL) {
- while (strstr(buf, "\r")) {
- gchar *cr = strstr(buf, "\r") ;
- *cr = '\n';
- cr++;
- *cr = '\0';
- }
- fputs(buf, outfp);
- }
-
- fclose(fp);
- fclose(outfp);
- rename_force(out, file);
-}
-
static gchar *imap_fetch_msg_full(Folder *folder, FolderItem *item, gint uid,
gboolean headers, gboolean body)
{
* we have to update the local file (UNIX \n only) size */
MsgInfo *msginfo = imap_parse_msg(filename, item);
MsgInfo *cached = msgcache_get_msg(item->cache,uid);
- guint have_size = get_size_with_lfs(msginfo);
+ guint have_size = get_size_with_crs(msginfo);
if (cached)
debug_print("message %d has been already %scached (%d/%d).\n", uid,
if (cached && (cached->size == have_size || !body)) {
procmsg_msginfo_free(cached);
procmsg_msginfo_free(msginfo);
- strip_crs(filename);
+ file_strip_crs(filename);
return filename;
} else {
procmsg_msginfo_free(cached);
return NULL;
}
- strip_crs(filename);
+ file_strip_crs(filename);
return filename;
}
g_free(data);
return -1;
}
-
+ statusbar_print_all(_("Fetching message..."));
result = GPOINTER_TO_INT(imap_cmd_fetch_thread(data));
+ statusbar_pop_all();
g_free(data);
return result;
}
g_return_val_if_fail(file != NULL, IMAP_ERROR);
flag_list = imap_flag_to_lep(flags);
+ statusbar_print_all(_("Adding messages..."));
r = imap_threaded_append(session->folder, destfolder,
file, flag_list);
-
+ statusbar_pop_all();
if (new_uid != NULL)
*new_uid = 0;
g_return_val_if_fail(set != NULL, IMAP_ERROR);
g_return_val_if_fail(destfolder != NULL, IMAP_ERROR);
+ statusbar_print_all(_("Copying messages..."));
r = imap_threaded_copy(session->folder, set, destfolder);
+ statusbar_pop_all();
if (r != MAILIMAP_NO_ERROR) {
return IMAP_ERROR;
struct mailimap_set * set;
clist * lep_uidlist;
int r;
-
+
session = imap_session_get(folder);
if (session == NULL) {
stuff->done = TRUE;
gboolean selected_folder;
debug_print("get_num_list\n");
+ statusbar_print_all("Scanning %s...\n", FOLDER_ITEM(item)->path
+ ? FOLDER_ITEM(item)->path:"");
g_return_val_if_fail(folder != NULL, -1);
g_return_val_if_fail(item != NULL, -1);
if (selected_folder) {
ok = imap_cmd_noop(session);
if (ok != IMAP_SUCCESS) {
-
- return -1;
+ debug_print("disconnected!\n");
+ session = imap_reconnect_if_possible(folder, session);
+ if (session == NULL) {
+ statusbar_pop_all();
+ return -1;
+ }
}
exists = session->exists;
ok = imap_status(session, IMAP_FOLDER(folder), item->item.path,
&exists, &recent, &uid_next, &uid_val, &unseen, FALSE);
if (ok != IMAP_SUCCESS) {
-
+ statusbar_pop_all();
return -1;
}
if(item->item.mtime == uid_val)
out which numbers have been removed */
if (exists == nummsgs) {
*msgnum_list = g_slist_copy(item->uid_list);
+ statusbar_pop_all();
return nummsgs;
} else if (exists < nummsgs) {
debug_print("Freeing imap uid cache");
if (exists == 0) {
*msgnum_list = NULL;
+ statusbar_pop_all();
return 0;
}
nummsgs = get_list_of_uids(folder, item, &uidlist);
if (nummsgs < 0) {
-
+ statusbar_pop_all();
return -1;
}
g_free(dir);
debug_print("get_num_list - ok - %i\n", nummsgs);
-
+ statusbar_pop_all();
return nummsgs;
}
(!strcmp(session->mbox, item->item.path));
if (selected_folder) {
ok = imap_cmd_noop(session);
- if (ok != IMAP_SUCCESS)
- return FALSE;
+ if (ok != IMAP_SUCCESS) {
+ debug_print("disconnected!\n");
+ session = imap_reconnect_if_possible(folder, session);
+ if (session == NULL)
+ return FALSE;
+ }
if (session->folder_content_changed
|| session->exists != item->item.total_msgs)