/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Sylpheed-Claws team
+ * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include "log.h"
#include "remotefolder.h"
#include "alertpanel.h"
-#include "sylpheed.h"
+#include "claws.h"
#include "statusbar.h"
#include "msgcache.h"
#include "imap-thread.h"
+#include "account.h"
typedef struct _IMAPFolder IMAPFolder;
typedef struct _IMAPSession IMAPSession;
const gchar *user,
const gchar *pass,
const gchar *type);
-static gint imap_cmd_logout (IMAPSession *session);
static gint imap_cmd_noop (IMAPSession *session);
#if USE_OPENSSL
static gint imap_cmd_starttls (IMAPSession *session);
static gint imap_cmd_copy (IMAPSession *session,
struct mailimap_set * set,
const gchar *destfolder,
- GRelation *uid_mapping);
+ GRelation *uid_mapping,
+ struct mailimap_set ** source,
+ struct mailimap_set ** dest);
static gint imap_cmd_store (IMAPSession *session,
struct mailimap_set * set,
IMAPFlags flags,
static MsgInfo *imap_parse_msg(const gchar *file, FolderItem *item);
-/* data types conversion libetpan <-> sylpheed */
+/* data types conversion libetpan <-> claws */
static GSList * imap_list_from_lep(IMAPFolder * folder,
clist * list, const gchar * real_path, gboolean all);
static GSList * imap_get_lep_set_from_numlist(MsgNumberList *numlist);
static void imap_folder_destroy(Folder *folder)
{
- gchar *dir;
-
while (imap_folder_get_refcnt(folder) > 0)
gtk_main_iteration();
g_node_traverse(folder->node, G_IN_ORDER, G_TRAVERSE_ALL, -1, imap_reset_uid_lists_func, NULL);
}
-void imap_get_capabilities(IMAPSession *session)
+int imap_get_capabilities(IMAPSession *session)
{
struct mailimap_capability_data *capabilities = NULL;
clistiter *cur;
+ int result = -1;
if (session->capability != NULL)
- return;
+ return MAILIMAP_NO_ERROR;
- capabilities = imap_threaded_capability(session->folder);
+ capabilities = imap_threaded_capability(session->folder, &result);
- if (capabilities == NULL)
- return;
+ if (result != MAILIMAP_NO_ERROR) {
+ return MAILIMAP_ERROR_CAPABILITY;
+ }
+
+ if (capabilities == NULL) {
+ return MAILIMAP_NO_ERROR;
+ }
for(cur = clist_begin(capabilities->cap_list) ; cur != NULL ;
cur = clist_next(cur)) {
debug_print("got capa %s\n", cap->cap_data.cap_name);
}
mailimap_capability_data_free(capabilities);
+ return MAILIMAP_NO_ERROR;
}
gboolean imap_has_capability(IMAPSession *session, const gchar *cap)
{
gint ok = IMAP_ERROR;
static time_t last_login_err = 0;
+ gchar *ext_info = "";
- imap_get_capabilities(session);
+ if (imap_get_capabilities(session) != MAILIMAP_NO_ERROR)
+ return IMAP_ERROR;
switch(type) {
case IMAP_AUTH_ANON:
case IMAP_AUTH_LOGIN:
ok = imap_cmd_login(session, user, pass, "LOGIN");
break;
+ case IMAP_AUTH_GSSAPI:
+ ok = imap_cmd_login(session, user, pass, "GSSAPI");
+ break;
default:
debug_print("capabilities:\n"
"\t ANONYMOUS %d\n"
"\t CRAM-MD5 %d\n"
- "\t LOGIN %d\n",
+ "\t LOGIN %d\n"
+ "\t GSSAPI %d\n",
imap_has_capability(session, "ANONYMOUS"),
imap_has_capability(session, "CRAM-MD5"),
- imap_has_capability(session, "LOGIN"));
+ imap_has_capability(session, "LOGIN"),
+ imap_has_capability(session, "GSSAPI"));
if (imap_has_capability(session, "CRAM-MD5"))
ok = imap_cmd_login(session, user, pass, "CRAM-MD5");
+ if (ok == IMAP_ERROR && imap_has_capability(session, "GSSAPI"))
+ ok = imap_cmd_login(session, user, pass, "GSSAPI");
if (ok == IMAP_ERROR) /* we always try LOGIN before giving up */
ok = imap_cmd_login(session, user, pass, "LOGIN");
}
+
if (ok == IMAP_SUCCESS)
session->authenticated = TRUE;
else {
- gchar *ext_info = NULL;
-
if (type == IMAP_AUTH_CRAM_MD5) {
ext_info = _("\n\nCRAM-MD5 logins only work if libetpan has been "
"compiled with SASL support and the "
"CRAM-MD5 SASL plugin is installed.");
- } else {
- ext_info = "";
- }
-
+ }
+
if (time(NULL) - last_login_err > 10) {
if (!prefs_common.no_recv_err_panel) {
alertpanel_error(_("Connection to %s failed: "
{
RemoteFolder *rfolder = REMOTE_FOLDER(folder);
IMAPSession *session = NULL;
- static time_t last_failure = 0;
g_return_val_if_fail(folder != NULL, NULL);
g_return_val_if_fail(FOLDER_CLASS(folder) == &imap_class, NULL);
if (prefs_common.work_offline &&
!inc_offline_should_override(
- _("Sylpheed-Claws needs network access in order "
+ _("Claws Mail needs network access in order "
"to access the IMAP server."))) {
return NULL;
}
} */
} else {
imap_reset_uid_lists(folder);
- if (time(NULL) - last_failure <= 2)
+ if (time(NULL) - rfolder->last_failure <= 2)
return NULL;
session = imap_session_new(folder, folder->account);
}
if(session == NULL) {
- last_failure = time(NULL);
+ rfolder->last_failure = time(NULL);
return NULL;
}
imap_session_authenticate(IMAP_SESSION(session), folder->account);
if (!IMAP_SESSION(session)->authenticated) {
+ imap_threaded_disconnect(session->folder);
+ SESSION(session)->state = SESSION_DISCONNECTED;
session_destroy(SESSION(session));
rfolder->session = NULL;
- last_failure = time(NULL);
+ rfolder->last_failure = time(NULL);
return NULL;
}
IMAPSession *session;
gushort port;
int r;
- int authenticated;
+ int authenticated = FALSE;
#ifdef USE_OPENSSL
/* FIXME: IMAP over SSL only... */
if (alertpanel_full(_("Insecure connection"),
_("This connection is configured to be secured "
"using SSL, but SSL is not available in this "
- "build of Sylpheed-Claws. \n\n"
+ "build of Claws Mail. \n\n"
"Do you want to continue connecting to this "
"server? The communication would not be "
"secure."),
authenticated = FALSE;
}
else {
+#if (LIBETPAN_VERSION_MAJOR > 0 || LIBETPAN_VERSION_MINOR > 48)
+#ifdef USE_OPENSSL
+ if (r == MAILIMAP_ERROR_SSL)
+ log_error(_("SSL handshake failed\n"));
+#endif
+#endif
if(!prefs_common.no_recv_err_panel) {
- alertpanel_error(_("Can't connect to IMAP4 server: %s:%d"),
+ alertpanel_error_log(_("Can't connect to IMAP4 server: %s:%d"),
account->recv_server, port);
} else {
log_error(_("Can't connect to IMAP4 server: %s:%d\n"),
static void imap_session_authenticate(IMAPSession *session,
const PrefsAccount *account)
{
- gchar *pass;
+ gchar *pass, *acc_pass;
+ gboolean failed = FALSE;
g_return_if_fail(account->userid != NULL);
-
- pass = account->passwd;
+ acc_pass = account->passwd;
+try_again:
+ pass = acc_pass;
if (!pass && account->imap_auth_type != IMAP_AUTH_ANON) {
gchar *tmp_pass;
tmp_pass = input_dialog_query_password(account->recv_server, account->userid);
statusbar_print_all(_("Connecting to IMAP4 server %s...\n"),
account->recv_server);
if (imap_auth(session, account->userid, pass, account->imap_auth_type) != IMAP_SUCCESS) {
- imap_threaded_disconnect(session->folder);
- imap_cmd_logout(session);
statusbar_pop_all();
+ if (!failed) {
+ acc_pass = NULL;
+ failed = TRUE;
+ goto try_again;
+ } else {
+ if (prefs_common.no_recv_err_panel) {
+ log_error(_("Couldn't login to IMAP server %s."), account->recv_server);
+ mainwindow_show_error();
+ } else
+ alertpanel_error_log(_("Couldn't login to IMAP server %s."), account->recv_server);
+ }
+
return;
- }
+ }
+
statusbar_pop_all();
session->authenticated = TRUE;
+ return;
}
static void imap_session_destroy(Session *session)
if (cached)
debug_print("message %d has been already %scached (%d/%d).\n", uid,
- have_size == cached->size ? "fully ":"",
+ have_size >= cached->size ? "fully ":"",
have_size, (int)cached->size);
- if (cached && (cached->size == have_size || !body)) {
+ if (cached && (cached->size <= have_size || !body)) {
procmsg_msginfo_free(cached);
procmsg_msginfo_free(msginfo);
file_strip_crs(filename);
return filename;
- } else if (!cached) {
- debug_print("message not cached, considering file complete\n");
+ } else if (!cached && time(NULL) - get_file_mtime(filename) < 60) {
+ debug_print("message not cached and file recent, considering file complete\n");
procmsg_msginfo_free(msginfo);
file_strip_crs(filename);
return filename;
IMAPFlags iflags = 0;
guint32 new_uid = 0;
gchar *real_file = NULL;
- gboolean file_is_tmp = FALSE;
fileinfo = (MsgFileInfo *)cur->data;
statusbar_progress_all(curnum, total, 1);
iflags |= IMAP_FLAG_SEEN;
}
- if (fileinfo->flags) {
- if ((MSG_IS_QUEUED(*fileinfo->flags)
- || MSG_IS_DRAFT(*fileinfo->flags))
- && !folder_has_parent_of_type(dest, F_QUEUE)
- && !folder_has_parent_of_type(dest, F_DRAFT)) {
- real_file = get_tmp_file();
- file_is_tmp = TRUE;
- if (procmsg_remove_special_headers(
- fileinfo->file,
- real_file) !=0) {
- g_free(real_file);
- g_free(destdir);
- unlock_session();
- return -1;
- }
- } else if (!(MSG_IS_QUEUED(*fileinfo->flags)
- || MSG_IS_DRAFT(*fileinfo->flags))
- && (folder_has_parent_of_type(dest, F_QUEUE)
- || folder_has_parent_of_type(dest, F_DRAFT))) {
- return -1;
- }
- }
if (real_file == NULL)
real_file = g_strdup(fileinfo->file);
if (ok != IMAP_SUCCESS) {
g_warning("can't append message %s\n", real_file);
- if (file_is_tmp)
- g_unlink(real_file);
g_free(real_file);
g_free(destdir);
unlock_session();
if (new_uid == 0) {
new_uid = dest->last_num+1;
}
- if (last_uid < new_uid)
+ if (last_uid < new_uid) {
last_uid = new_uid;
- if (file_is_tmp)
- g_unlink(real_file);
+ }
g_free(real_file);
}
gint ok = IMAP_SUCCESS;
GRelation *uid_mapping;
gint last_num = 0;
+ gboolean single = FALSE;
g_return_val_if_fail(folder != NULL, -1);
g_return_val_if_fail(dest != NULL, -1);
}
lock_session();
msginfo = (MsgInfo *)msglist->data;
-
+ if (msglist->next == NULL)
+ single = TRUE;
src = msginfo->folder;
if (src == dest) {
g_warning("the src folder is identical to the dest.\n");
return -1;
}
+ if (src->folder != dest->folder) {
+ GSList *infolist = NULL, *cur;
+ int res = -1;
+ for (cur = msglist; cur; cur = cur->next) {
+ msginfo = (MsgInfo *)cur->data;
+ MsgFileInfo *fileinfo = g_new0(MsgFileInfo, 1);
+ fileinfo->file = procmsg_get_message_file(msginfo);
+ fileinfo->flags = &(msginfo->flags);
+ infolist = g_slist_prepend(infolist, fileinfo);
+ }
+ infolist = g_slist_reverse(infolist);
+ res = folder_item_add_msgs(dest, infolist, FALSE);
+ for (cur = infolist; cur; cur = cur->next) {
+ MsgFileInfo *info = (MsgFileInfo *)cur->data;
+ g_free(info->file);
+ g_free(info);
+ }
+ g_slist_free(infolist);
+ return res;
+ }
+
ok = imap_select(session, IMAP_FOLDER(folder), msginfo->folder->path,
NULL, NULL, NULL, NULL, FALSE);
if (ok != IMAP_SUCCESS) {
statusbar_print_all(_("Copying messages..."));
for (cur = seq_list; cur != NULL; cur = g_slist_next(cur)) {
struct mailimap_set * seq_set;
+ struct mailimap_set * source = NULL;
+ struct mailimap_set * dest = NULL;
seq_set = cur->data;
debug_print("Copying messages from %s to %s ...\n",
src->path, destdir);
- ok = imap_cmd_copy(session, seq_set, destdir, uid_mapping);
+ ok = imap_cmd_copy(session, seq_set, destdir, uid_mapping,
+ &source, &dest);
+
+ if (ok == IMAP_SUCCESS) {
+ if (single && relation && source && dest) {
+ clistiter *l = clist_begin(source->set_list);
+ struct mailimap_set_item *i = (struct mailimap_set_item *)clist_content(l);
+ int snum = i->set_first;
+ int dnum = 0;
+ l = clist_begin(dest->set_list);
+ i = (struct mailimap_set_item *)clist_content(l);
+ dnum = i->set_first;
+ g_relation_insert(uid_mapping, GINT_TO_POINTER(snum),
+ GINT_TO_POINTER(dnum));
+ }
+ }
+
+
+ if (source)
+ mailimap_set_free(source);
+ if (dest)
+ mailimap_set_free(dest);
+
if (ok != IMAP_SUCCESS) {
g_relation_destroy(uid_mapping);
imap_lep_set_free(seq_list);
if (tuples->len > 0) {
gint num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
g_relation_insert(relation, msginfo,
- GPOINTER_TO_INT(num));
+ GINT_TO_POINTER(num));
if (num > last_num)
last_num = num;
+ debug_print("copied new message as %d\n", num);
+ /* put the local file in the imapcache, so that we don't
+ * have to fetch it back later. */
+ if (num > 0) {
+ gchar *cache_path = folder_item_get_path(msginfo->folder);
+ gchar *real_file = g_strconcat(
+ cache_path, G_DIR_SEPARATOR_S,
+ itos(msginfo->msgnum), NULL);
+ gchar *cache_file = NULL;
+ g_free(cache_path);
+ cache_path = folder_item_get_path(dest);
+ cache_file = g_strconcat(
+ cache_path, G_DIR_SEPARATOR_S,
+ itos(num), NULL);
+ if (!is_dir_exist(cache_path))
+ make_dir_hier(cache_path);
+ if (is_file_exist(real_file) && is_dir_exist(cache_path)) {
+ copy_file(real_file, cache_file, TRUE);
+ debug_print("copied to cache: %s\n", cache_file);
+ }
+ g_free(real_file);
+ g_free(cache_file);
+ g_free(cache_path);
+ }
} else
g_relation_insert(relation, msginfo,
- GPOINTER_TO_INT(0));
+ GINT_TO_POINTER(0));
g_tuples_destroy(tuples);
}
statusbar_pop_all();
MsgInfoList *msglist, GRelation *relation)
{
MsgInfo *msginfo;
- GSList *file_list;
gint ret;
g_return_val_if_fail(folder != NULL, -1);
msginfo = (MsgInfo *)msglist->data;
g_return_val_if_fail(msginfo->folder != NULL, -1);
- /* if from/to are the same "type" (with or without extra headers),
- * copy them via imap */
- if (folder == msginfo->folder->folder &&
- !folder_has_parent_of_type(msginfo->folder, F_DRAFT) &&
- !folder_has_parent_of_type(msginfo->folder, F_QUEUE) &&
- !folder_has_parent_of_type(dest, F_DRAFT) &&
- !folder_has_parent_of_type(dest, F_QUEUE)) {
- ret = imap_do_copy_msgs(folder, dest, msglist, relation);
- return ret;
- } else if (folder == msginfo->folder->folder &&
- (folder_has_parent_of_type(msginfo->folder, F_DRAFT) ||
- folder_has_parent_of_type(msginfo->folder, F_QUEUE)) &&
- (folder_has_parent_of_type(dest, F_DRAFT) ||
- folder_has_parent_of_type(dest, F_QUEUE))) {
- ret = imap_do_copy_msgs(folder, dest, msglist, relation);
- return ret;
- }
- /* else reupload them */
- file_list = procmsg_get_message_file_list(msglist);
- g_return_val_if_fail(file_list != NULL, -1);
-
- ret = imap_add_msgs(folder, dest, file_list, relation);
- procmsg_message_file_list_free(file_list);
-
+ ret = imap_do_copy_msgs(folder, dest, msglist, relation);
return ret;
}
if (prefs_common.work_offline &&
!inc_offline_should_override(
- _("Sylpheed-Claws needs network access in order "
+ _("Claws Mail needs network access in order "
"to access the IMAP server."))) {
g_free(data);
return NULL;
return imap_get_path_separator(imap_folder, item->path);
}
+static gchar imap_refresh_path_separator(IMAPFolder *folder, const gchar *subfolder)
+{
+ IMAPSession *session = imap_session_get(FOLDER(folder));
+ clist * lep_list;
+ int r;
+ gchar separator = '\0';
+
+ g_return_val_if_fail(session != NULL, '/');
+ r = imap_threaded_list((Folder *)folder, "", subfolder, &lep_list);
+
+ if (r != MAILIMAP_NO_ERROR) {
+ log_warning(_("LIST failed\n"));
+ return '\0';
+ }
+
+ if (clist_count(lep_list) > 0) {
+ clistiter * iter = clist_begin(lep_list);
+ struct mailimap_mailbox_list * mb;
+ mb = clist_content(iter);
+
+ separator = mb->mb_delimiter;
+ debug_print("got separator: %c\n", folder->last_seen_separator);
+ }
+ mailimap_list_result_free(lep_list);
+ return separator;
+}
+
static gchar imap_get_path_separator(IMAPFolder *folder, const gchar *path)
{
IMAPNameSpace *namespace;
g_return_val_if_fail(session != NULL, '/');
if (folder->last_seen_separator == 0) {
- clist * lep_list;
- int r = imap_threaded_list((Folder *)folder, "", "", &lep_list);
- if (r != MAILIMAP_NO_ERROR) {
- log_warning(_("LIST failed\n"));
- return '/';
- }
-
- if (clist_count(lep_list) > 0) {
- clistiter * iter = clist_begin(lep_list);
- struct mailimap_mailbox_list * mb;
- mb = clist_content(iter);
-
- folder->last_seen_separator = mb->mb_delimiter;
- debug_print("got separator: %c\n", folder->last_seen_separator);
- }
- mailimap_list_result_free(lep_list);
+ folder->last_seen_separator = imap_refresh_path_separator(folder, "");
+ }
+
+ if (folder->last_seen_separator == 0) {
+ folder->last_seen_separator = imap_refresh_path_separator(folder, "INBOX");
}
if (folder->last_seen_separator != 0) {
return folder->last_seen_separator;
}
- namespace = imap_find_namespace(folder, path);
- if (namespace && namespace->separator)
- separator = namespace->separator;
-
return separator;
}
int r;
gint ok;
+ if (!strcmp(type, "LOGIN") && imap_has_capability(session, "LOGINDISABLED")) {
+ gint ok = IMAP_ERROR;
+ if (imap_has_capability(session, "STARTTLS")) {
+#if USE_OPENSSL
+ log_warning(_("Server requires TLS to log in.\n"));
+ ok = imap_cmd_starttls(session);
+ if (ok != IMAP_SUCCESS) {
+ log_warning(_("Can't start TLS session.\n"));
+ return IMAP_ERROR;
+ } else {
+ /* refresh capas */
+ imap_free_capabilities(session);
+ if (imap_get_capabilities(session) != MAILIMAP_NO_ERROR) {
+ log_warning(_("Can't refresh capabilities.\n"));
+ return IMAP_ERROR;
+ }
+ }
+#else
+ log_error(_("Connection to %s failed: "
+ "server requires TLS, but Claws Mail "
+ "has been compiled without OpenSSL "
+ "support.\n"),
+ SESSION(session)->server);
+ return IMAP_ERROR;
+#endif
+ } else {
+ log_error(_("Server logins are disabled.\n"));
+ return IMAP_ERROR;
+ }
+ }
+
log_print("IMAP4> Logging %s to %s using %s\n",
user,
SESSION(session)->server,
return ok;
}
-static gint imap_cmd_logout(IMAPSession *session)
-{
- imap_threaded_disconnect(session->folder);
-
- return IMAP_SUCCESS;
-}
-
static gint imap_cmd_noop(IMAPSession *session)
{
int r;
if (prefs_common.work_offline &&
!inc_offline_should_override(
- _("Sylpheed-Claws needs network access in order "
+ _("Claws Mail needs network access in order "
"to access the IMAP server."))) {
g_free(data);
return -1;
flag_list = imap_flag_to_lep(flags);
r = imap_threaded_append(session->folder, destfolder,
- file, flag_list, new_uid);
+ file, flag_list, (int *)new_uid);
mailimap_flag_list_free(flag_list);
if (r != MAILIMAP_NO_ERROR) {
}
static gint imap_cmd_copy(IMAPSession *session, struct mailimap_set * set,
- const gchar *destfolder, GRelation *uid_mapping)
+ const gchar *destfolder, GRelation *uid_mapping,
+ struct mailimap_set **source, struct mailimap_set **dest)
{
int r;
g_return_val_if_fail(set != NULL, IMAP_ERROR);
g_return_val_if_fail(destfolder != NULL, IMAP_ERROR);
- r = imap_threaded_copy(session->folder, set, destfolder);
+ r = imap_threaded_copy(session->folder, set, destfolder, source, dest);
if (r != MAILIMAP_NO_ERROR) {
return IMAP_ERROR;
if (prefs_common.work_offline &&
!inc_offline_should_override(
- _("Sylpheed-Claws needs network access in order "
+ _("Claws Mail needs network access in order "
"to access the IMAP server."))) {
return -1;
}
gint ok, nummsgs = 0, lastuid_old;
IMAPSession *session;
GSList *uidlist, *elem;
- struct mailimap_set * set;
clist * lep_uidlist;
int r;
uidlist = NULL;
- set = mailimap_set_new_interval(item->lastuid + 1, 0);
-
- r = imap_threaded_search(folder, IMAP_SEARCH_TYPE_SIMPLE, set,
+ r = imap_threaded_search(folder, IMAP_SEARCH_TYPE_SIMPLE, NULL,
&lep_uidlist);
- mailimap_set_free(set);
if (r == MAILIMAP_NO_ERROR) {
GSList * fetchuid_list;
data->session = session;
if (prefs_common.work_offline &&
!inc_offline_should_override(
- _("Sylpheed-Claws needs network access in order "
+ _("Claws Mail needs network access in order "
"to access the IMAP server."))) {
g_free(data);
return -1;
{
IMAPFolderItem *item = (IMAPFolderItem *)_item;
IMAPSession *session;
- gint ok, nummsgs = 0, exists, uid_val, uid_next = 0;
+ gint ok, nummsgs = 0, exists;
+ guint32 uid_next = 0, uid_val = 0;
GSList *uidlist = NULL;
gchar *dir;
gboolean selected_folder;
-
debug_print("get_num_list\n");
g_return_val_if_fail(folder != NULL, -1);
else {
*old_uids_valid = FALSE;
- debug_print("Freeing imap uid cache\n");
+ debug_print("Freeing imap uid cache (%d != %d)\n",
+ (int)item->item.mtime, uid_val);
item->lastuid = 0;
g_slist_free(item->uid_list);
item->uid_list = NULL;
IMAPSession *session;
IMAPFolderItem *item = (IMAPFolderItem *)_item;
gint ok, exists = 0, unseen = 0;
- guint32 uid_next, uid_val;
+ guint32 uid_next = 0, uid_val = 0;
gboolean selected_folder;
g_return_val_if_fail(folder != NULL, FALSE);
imapset = cur->data;
if (reverse_seen) {
r = imap_threaded_search(folder, IMAP_SEARCH_TYPE_SEEN,
- imapset, &lep_uidlist);
+ full_search ? NULL:imapset, &lep_uidlist);
}
else {
r = imap_threaded_search(folder,
IMAP_SEARCH_TYPE_UNSEEN,
- imapset, &lep_uidlist);
+ full_search ? NULL:imapset, &lep_uidlist);
}
if (r == MAILIMAP_NO_ERROR) {
GSList * uidlist;
}
r = imap_threaded_search(folder, IMAP_SEARCH_TYPE_FLAGGED,
- imapset, &lep_uidlist);
+ full_search ? NULL:imapset, &lep_uidlist);
if (r == MAILIMAP_NO_ERROR) {
GSList * uidlist;
if (item->opened || item->processing_pending || item == folder->inbox) {
r = imap_threaded_search(folder, IMAP_SEARCH_TYPE_ANSWERED,
- imapset, &lep_uidlist);
+ full_search ? NULL:imapset, &lep_uidlist);
if (r == MAILIMAP_NO_ERROR) {
GSList * uidlist;
}
r = imap_threaded_search(folder, IMAP_SEARCH_TYPE_DELETED,
- imapset, &lep_uidlist);
+ full_search ? NULL:imapset, &lep_uidlist);
if (r == MAILIMAP_NO_ERROR) {
GSList * uidlist;
if (prefs_common.work_offline &&
!inc_offline_should_override(
- _("Sylpheed-Claws needs network access in order "
+ _("Claws Mail needs network access in order "
"to access the IMAP server."))) {
g_free(data);
return -1;
-/* data types conversion libetpan <-> sylpheed */
+/* data types conversion libetpan <-> claws */
((IMAPFolder *)folder)->refcnt++;
}
+void imap_disconnect_all(void)
+{
+ GList *list;
+ for (list = account_get_list(); list != NULL; list = list->next) {
+ PrefsAccount *account = list->data;
+ if (account->protocol == A_IMAP4) {
+ RemoteFolder *folder = (RemoteFolder *)account->folder;
+ if (folder && folder->session) {
+ IMAPSession *session = (IMAPSession *)folder->session;
+ imap_threaded_disconnect(FOLDER(folder));
+ SESSION(session)->state = SESSION_DISCONNECTED;
+ session_destroy(SESSION(session));
+ folder->session = NULL;
+ }
+ }
+ }
+}
+
void imap_folder_unref(Folder *folder)
{
if (((IMAPFolder *)folder)->refcnt > 0)
static Folder *imap_folder_new (const gchar *name,
const gchar *path)
{
+ static gboolean missing_imap_warning = TRUE;
+ if (missing_imap_warning) {
+ missing_imap_warning = FALSE;
+ alertpanel_error(
+ _("You have one or more IMAP accounts "
+ "defined. However this version of "
+ "Claws Mail has been built without "
+ "IMAP support; your IMAP account(s) are "
+ "disabled.\n\n"
+ "You probably need to "
+ "install libetpan and recompile "
+ "Claws Mail."));
+ }
return NULL;
}
static gint imap_create_tree (Folder *folder)
return &imap_class;
}
+
+void imap_disconnect_all(void)
+{
+}
+
#endif
void imap_synchronise(FolderItem *item)