aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog60
-rw-r--r--mail/em-account-editor.c10
-rw-r--r--mail/em-composer-utils.c7
-rw-r--r--mail/em-folder-tree-model.c8
-rw-r--r--mail/em-folder-tree.c7
-rw-r--r--mail/em-folder-utils.c10
-rw-r--r--mail/em-folder-view.c16
-rw-r--r--mail/mail-folder-cache.c4
-rw-r--r--mail/mail-ops.c43
-rw-r--r--mail/mail-ops.h5
-rw-r--r--mail/mail-send-recv.c113
-rw-r--r--mail/mail-tools.c2
12 files changed, 253 insertions, 32 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index f3d832a9db..b5ef851b80 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,63 @@
+2005-07-21 Not Zed <NotZed@Ximian.com>
+
+ * em-account-editor.c (emae_option_entry): if we get a null
+ default, then set "" on the entry.
+ (emae_option_entry): set the default value on the url if it
+ doesn't exist already.
+
+2005-07-20 Not Zed <NotZed@Ximian.com>
+
+ * mail-send-recv.c (refresh_folders_desc, refresh_folders_get)
+ (refresh_folders_got, refresh_folders_free, get_folders)
+ (receive_update_got_folderinfo, receive_update_got_store): refresh
+ all the folders manually and directly.
+
+ * mail-folder-cache.c (setup_folder): propagate even -1 unread
+ counts, they get ignored later.
+
+ * em-composer-utils.c (emu_handle_receipt_message)
+ (em_utils_handle_receipt): use getmessagex too, so we can always
+ clear any error.
+
+ * em-folder-view.c (emfv_message_selected_timeout)
+ (emfv_list_done_message_selected): use getmessagex and do
+ something meaninful with the error.
+
+ * mail-ops.c (mail_get_messagex): added new get message which
+ returns an exception.
+
+2005-07-19 Not Zed <NotZed@Ximian.com>
+
+ * mail-tools.c (mail_tool_uri_to_folder): dont get the service
+ connected, it will connect if it needs to.
+
+ * mail-ops.c (get_folderinfo_get): * em-folder-utils.c
+ (emft_copy_folders__copy)
+ (emfu_delete_folders): * em-folder-tree.c
+ (emft_get_folder_info__get): Always request subscribed folders, if
+ the backend doesn't implement it it will ignore it.
+
+2005-07-13 Not Zed <NotZed@Ximian.com>
+
+ * mail-send-recv.c (mail_autoreceive_init, auto_online): listen to
+ session online events, and if we are online, trigger an
+ auto-receive of all auto-check accounts.
+
+2005-07-11 Not Zed <NotZed@Ximian.com>
+
+ * mail-send-recv.c (auto_account_commit): force an update
+ immediately if we're setting up the timeout to start with.
+
+ * em-folder-tree-model.c (em_folder_tree_model_set_unread_count):
+ noop if the unread count < 0.
+ (em_folder_tree_model_set_folder_info): only set the unread count
+ if we actually have one.
+
+ * em-folder-tree.c (emft_tree_row_expanded): get the folder list
+ 'fast'.
+
+ * mail-ops.c (get_folderinfo_get): get the folder list 'fast'.
+
2005-07-19 Srinivasa Ragavan <sragavan@novell.com>
* em-folder-tree.c: (emft_popup_move) calling the wrong api to
diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c
index f9b417109f..87c01f5186 100644
--- a/mail/em-account-editor.c
+++ b/mail/em-account-editor.c
@@ -1814,8 +1814,14 @@ emae_option_entry(EMAccountEditorService *service, CamelURL *url, const char *na
GtkWidget *w;
const char *val = camel_url_get_param(url, name);
- if (val == NULL)
- val = def;
+ if (val == NULL) {
+ if (def) {
+ val = def;
+ camel_url_set_param(url, name, val);
+ emae_uri_changed(service, url);
+ } else
+ val = "";
+ }
w = g_object_new(gtk_entry_get_type(),
"text", val,
diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index eb843b2862..f994a79a83 100644
--- a/mail/em-composer-utils.c
+++ b/mail/em-composer-utils.c
@@ -1071,10 +1071,13 @@ em_utils_redirect_message_by_uid (CamelFolder *folder, const char *uid)
}
static void
-emu_handle_receipt_message(CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data)
+emu_handle_receipt_message(CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *ex)
{
if (msg)
em_utils_handle_receipt(folder, uid, msg);
+
+ /* we dont care really if we can't get the message */
+ camel_exception_clear(ex);
}
/* Message disposition notifications, rfc 2298 */
@@ -1095,7 +1098,7 @@ em_utils_handle_receipt (CamelFolder *folder, const char *uid, CamelMimeMessage
}
if (msg == NULL) {
- mail_get_message(folder, uid, emu_handle_receipt_message, NULL, mail_thread_new);
+ mail_get_messagex(folder, uid, emu_handle_receipt_message, NULL, mail_thread_new);
camel_message_info_free(info);
return;
}
diff --git a/mail/em-folder-tree-model.c b/mail/em-folder-tree-model.c
index 266928eb5c..1a622cc9eb 100644
--- a/mail/em-folder-tree-model.c
+++ b/mail/em-folder-tree-model.c
@@ -443,7 +443,7 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model, GtkTreeIter *ite
/* HACK: if we have the folder, and its the outbox folder, we need the total count, not unread */
/* This is duplicated in mail-folder-cache too, should perhaps be functionised */
- unread = fi->unread == -1 ? 0 : fi->unread;
+ unread = fi->unread;
if (mail_note_get_folder_from_uri(fi->uri, &folder) && folder) {
if (folder == mail_component_get_folder(NULL, MAIL_COMPONENT_FOLDER_OUTBOX)) {
int total;
@@ -482,11 +482,13 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model, GtkTreeIter *ite
COL_POINTER_CAMEL_STORE, si->store,
COL_STRING_FULL_NAME, fi->full_name,
COL_STRING_URI, fi->uri,
- COL_UINT_UNREAD, unread,
COL_UINT_FLAGS, flags,
COL_BOOL_IS_STORE, FALSE,
COL_BOOL_LOAD_SUBDIRS, load,
-1);
+
+ if (unread != ~0)
+ gtk_tree_store_set ((GtkTreeStore *) model, iter, COL_UINT_UNREAD, unread, -1);
if (load) {
/* create a placeholder node for our subfolders... */
@@ -1103,7 +1105,7 @@ em_folder_tree_model_set_unread_count (EMFolderTreeModel *model, CamelStore *sto
u(printf("set unread count %p '%s' %d\n", store, full, unread));
if (unread < 0)
- unread = 0;
+ return;
if (!(si = g_hash_table_lookup (model->store_hash, store))) {
u(printf(" can't find store\n"));
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index 969ba2e871..3ee0361e6b 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -1757,10 +1757,7 @@ static void
emft_get_folder_info__get (struct _mail_msg *mm)
{
struct _EMFolderTreeGetFolderInfo *m = (struct _EMFolderTreeGetFolderInfo *) mm;
- guint32 flags = m->flags;
-
- if (camel_store_supports_subscriptions (m->store))
- flags |= CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
+ guint32 flags = m->flags | CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
m->fi = camel_store_get_folder_info (m->store, m->top, flags, &mm->ex);
}
@@ -1937,7 +1934,7 @@ emft_tree_row_expanded (GtkTreeView *treeview, GtkTreeIter *root, GtkTreePath *t
m->emft = emft;
g_object_ref(emft);
m->top = full_name;
- m->flags = CAMEL_STORE_FOLDER_INFO_RECURSIVE;
+ m->flags = CAMEL_STORE_FOLDER_INFO_RECURSIVE|CAMEL_STORE_FOLDER_INFO_FAST;
e_thread_put (mail_thread_new, (EMsg *) m);
}
diff --git a/mail/em-folder-utils.c b/mail/em-folder-utils.c
index 844f4b8bb5..ee3bcd006e 100644
--- a/mail/em-folder-utils.c
+++ b/mail/em-folder-utils.c
@@ -108,16 +108,13 @@ static void
emft_copy_folders__copy (struct _mail_msg *mm)
{
struct _EMCopyFolders *m = (struct _EMCopyFolders *) mm;
- guint32 flags = CAMEL_STORE_FOLDER_INFO_FAST | CAMEL_STORE_FOLDER_INFO_RECURSIVE;
+ guint32 flags = CAMEL_STORE_FOLDER_INFO_FAST | CAMEL_STORE_FOLDER_INFO_RECURSIVE | CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
GList *pending = NULL, *deleting = NULL, *l;
GString *fromname, *toname;
CamelFolderInfo *fi;
const char *tmp;
int fromlen;
- if (camel_store_supports_subscriptions (m->fromstore))
- flags |= CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
-
if (!(fi = camel_store_get_folder_info (m->fromstore, m->frombase, flags, &mm->ex)))
return;
@@ -431,12 +428,9 @@ emfu_delete_rec (CamelStore *store, CamelFolderInfo *fi, CamelException *ex)
static void
emfu_delete_folders (CamelStore *store, const char *full_name, CamelException *ex)
{
- guint32 flags = CAMEL_STORE_FOLDER_INFO_RECURSIVE | CAMEL_STORE_FOLDER_INFO_FAST;
+ guint32 flags = CAMEL_STORE_FOLDER_INFO_RECURSIVE | CAMEL_STORE_FOLDER_INFO_FAST | CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
CamelFolderInfo *fi;
- if (camel_store_supports_subscriptions (store))
- flags |= CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
-
fi = camel_store_get_folder_info (store, full_name, flags, ex);
if (camel_exception_is_set (ex))
return;
diff --git a/mail/em-folder-view.c b/mail/em-folder-view.c
index 0526cc413b..8eb51b198f 100644
--- a/mail/em-folder-view.c
+++ b/mail/em-folder-view.c
@@ -87,6 +87,7 @@
#include "em-event.h"
#include <gtkhtml/gtkhtml.h>
+#include <gtkhtml/gtkhtml-stream.h>
#include "mail-mt.h"
#include "mail-ops.h"
@@ -2166,7 +2167,7 @@ do_mark_seen (gpointer user_data)
}
static void
-emfv_list_done_message_selected(CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data)
+emfv_list_done_message_selected(CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *ex)
{
EMFolderView *emfv = data;
EMEvent *eme;
@@ -2211,6 +2212,17 @@ emfv_list_done_message_selected(CamelFolder *folder, const char *uid, CamelMimeM
} else {
emfv_set_seen (emfv, uid);
}
+ } else if (camel_exception_is_set(ex)) {
+ GtkHTMLStream *hstream = gtk_html_begin(((EMFormatHTML *)emfv->preview)->html);
+
+ /* Display the error inline rather than popping up an annoying box.
+ We also clear the exception, this stops the box popping up */
+
+ gtk_html_stream_printf(hstream, "<h2>%s</h2><p>%s</p>",
+ _("Unable to retrieve message"),
+ ex->desc);
+ gtk_html_stream_close(hstream, GTK_HTML_STREAM_OK);
+ camel_exception_clear(ex);
}
emfv->priv->nomarkseen = FALSE;
@@ -2231,7 +2243,7 @@ emfv_message_selected_timeout(void *data)
g_object_ref (emfv);
/* TODO: we should manage our own thread stuff, would make cancelling outstanding stuff easier */
e_profile_event_emit("goto.load", emfv->displayed_uid, 0);
- mail_get_message(emfv->folder, emfv->displayed_uid, emfv_list_done_message_selected, emfv, mail_thread_queued);
+ mail_get_messagex(emfv->folder, emfv->displayed_uid, emfv_list_done_message_selected, emfv, mail_thread_queued);
} else {
e_profile_event_emit("goto.empty", "", 0);
g_free(emfv->priv->selected_uid);
diff --git a/mail/mail-folder-cache.c b/mail/mail-folder-cache.c
index 689b7c5c76..c7e9bcff06 100644
--- a/mail/mail-folder-cache.c
+++ b/mail/mail-folder-cache.c
@@ -390,7 +390,7 @@ setup_folder(CamelFolderInfo *fi, struct _store_info *si)
if (mfi) {
update_1folder(mfi, 0, fi);
} else {
- /*d(printf("Adding new folder: %s (%s) %d unread\n", fi->path, fi->url, fi->unread_message_count));*/
+ d(printf("Adding new folder: %s (%s) %d unread\n", fi->path, fi->url, fi->unread_message_count));
mfi = g_malloc0(sizeof(*mfi));
mfi->full_name = g_strdup(fi->full_name);
mfi->uri = g_strdup(fi->uri);
@@ -403,7 +403,7 @@ setup_folder(CamelFolderInfo *fi, struct _store_info *si)
up = g_malloc0(sizeof(*up));
up->full_name = g_strdup(mfi->full_name);
up->uri = g_strdup(fi->uri);
- up->unread = (fi->unread==-1)?0:fi->unread;
+ up->unread = fi->unread;
up->store = si->store;
camel_object_ref(up->store);
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index e7770fc017..846c251c41 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -1061,10 +1061,7 @@ static void
get_folderinfo_get (struct _mail_msg *mm)
{
struct _get_folderinfo_msg *m = (struct _get_folderinfo_msg *)mm;
- guint32 flags = CAMEL_STORE_FOLDER_INFO_RECURSIVE;
-
- if (camel_store_supports_subscriptions (m->store))
- flags |= CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
+ guint32 flags = CAMEL_STORE_FOLDER_INFO_RECURSIVE|CAMEL_STORE_FOLDER_INFO_FAST | CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
m->info = camel_store_get_folder_info (m->store, NULL, flags, &mm->ex);
}
@@ -1796,6 +1793,44 @@ mail_get_message(CamelFolder *folder, const char *uid, void (*done) (CamelFolder
e_thread_put(thread, (EMsg *)m);
}
+typedef void (*get_done)(CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *);
+
+static void get_messagex_got(struct _mail_msg *mm)
+{
+ struct _get_message_msg *m = (struct _get_message_msg *)mm;
+
+ if (m->done) {
+ get_done done = (get_done)m->done;
+ done(m->folder, m->uid, m->message, m->data, &mm->ex);
+ }
+}
+
+static struct _mail_msg_op get_messagex_op = {
+ get_message_desc,
+ get_message_get,
+ get_messagex_got,
+ get_message_free,
+};
+
+/* This is temporary, to avoid having to rewrite everything that uses
+ mail_get_message; it adds an exception argument to the callback */
+void
+mail_get_messagex(CamelFolder *folder, const char *uid, void (*done) (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *),
+ void *data, EThread *thread)
+{
+ struct _get_message_msg *m;
+
+ m = mail_msg_new(&get_messagex_op, NULL, sizeof(*m));
+ m->folder = folder;
+ camel_object_ref(folder);
+ m->uid = g_strdup(uid);
+ m->data = data;
+ m->done = done;
+ m->cancel = camel_operation_new(NULL, NULL);
+
+ e_thread_put(thread, (EMsg *)m);
+}
+
/* ********************************************************************** */
struct _get_messages_msg {
diff --git a/mail/mail-ops.h b/mail/mail-ops.h
index 21c0685165..7ae91131b3 100644
--- a/mail/mail-ops.h
+++ b/mail/mail-ops.h
@@ -57,6 +57,11 @@ void mail_get_message (CamelFolder *folder, const char *uid,
void *data,
EThread *thread);
+void
+mail_get_messagex(CamelFolder *folder, const char *uid,
+ void (*done) (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *),
+ void *data, EThread *thread);
+
/* get several messages */
void mail_get_messages (CamelFolder *folder, GPtrArray *uids,
void (*done) (CamelFolder *folder, GPtrArray *uids, GPtrArray *msgs, void *data),
diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c
index 71d8337357..708826226d 100644
--- a/mail/mail-send-recv.c
+++ b/mail/mail-send-recv.c
@@ -683,10 +683,97 @@ receive_get_folder(CamelFilterDriver *d, const char *uri, void *data, CamelExcep
return folder;
}
+/* ********************************************************************** */
+
+struct _refresh_folders_msg {
+ struct _mail_msg msg;
+
+ struct _send_info *info;
+ GPtrArray *folders;
+ CamelStore *store;
+};
+
+static char *
+refresh_folders_desc (struct _mail_msg *mm, int done)
+{
+ return g_strdup_printf(_("Checking for new mail"));
+}
+
+static void
+refresh_folders_get (struct _mail_msg *mm)
+{
+ struct _refresh_folders_msg *m = (struct _refresh_folders_msg *)mm;
+ int i;
+ CamelFolder *folder;
+
+ for (i=0;i<m->folders->len;i++) {
+ folder = mail_tool_uri_to_folder(m->folders->pdata[i], 0, NULL);
+ if (folder) {
+ camel_folder_refresh_info(folder, NULL);
+ camel_object_unref(folder);
+ }
+ if (camel_operation_cancel_check(m->info->cancel))
+ break;
+ }
+}
+
+static void
+refresh_folders_got (struct _mail_msg *mm)
+{
+ struct _refresh_folders_msg *m = (struct _refresh_folders_msg *)mm;
+
+ receive_done("", m->info);
+}
+
+static void
+refresh_folders_free (struct _mail_msg *mm)
+{
+ struct _refresh_folders_msg *m = (struct _refresh_folders_msg *)mm;
+ int i;
+
+ for (i=0;i<m->folders->len;i++)
+ g_free(m->folders->pdata[i]);
+ g_ptr_array_free(m->folders, TRUE);
+ camel_object_unref(m->store);
+}
+
+static struct _mail_msg_op refresh_folders_op = {
+ refresh_folders_desc,
+ refresh_folders_get,
+ refresh_folders_got,
+ refresh_folders_free,
+};
+
+static void
+get_folders(GPtrArray *folders, CamelFolderInfo *info)
+{
+ while (info) {
+ g_ptr_array_add(folders, g_strdup(info->uri));
+ get_folders(folders, info->child);
+ info = info->next;
+ }
+}
+
static void
-receive_update_got_folderinfo (CamelStore *store, CamelFolderInfo *info, void *data)
+receive_update_got_folderinfo(CamelStore *store, CamelFolderInfo *info, void *data)
{
- receive_done ("", data);
+ if (info) {
+ GPtrArray *folders = g_ptr_array_new();
+ struct _refresh_folders_msg *m;
+ struct _send_info *sinfo = data;
+
+ get_folders(folders, info);
+
+ m = mail_msg_new(&refresh_folders_op, NULL, sizeof(*m));
+ m->store = store;
+ camel_object_ref(store);
+ m->folders = folders;
+ m->info = sinfo;
+
+ e_thread_put(mail_thread_new, (EMsg *)m);
+ } else {
+ receive_done ("", data);
+ }
}
static void
@@ -697,7 +784,7 @@ receive_update_got_store (char *uri, CamelStore *store, void *data)
if (store) {
mail_note_store(store, info->cancel, receive_update_got_folderinfo, info);
} else {
- receive_done ("", info);
+ receive_done("", info);
}
}
@@ -849,6 +936,24 @@ auto_account_changed(EAccountList *eal, EAccount *ea, void *dummy)
auto_account_commit(info);
}
+static void
+auto_online(CamelObject *o, void *ed, void *d)
+{
+ EIterator *iter;
+ EAccountList *accounts;
+ struct _auto_data *info;
+
+ if (!GPOINTER_TO_INT(ed))
+ return;
+
+ accounts = mail_config_get_accounts ();
+ for (iter = e_list_get_iterator((EList *)accounts);e_iterator_is_valid(iter);e_iterator_next(iter)) {
+ info = g_object_get_data((GObject *)e_iterator_get(iter), "mail-autoreceive");
+ if (info && info->timeout_id)
+ auto_timeout(info);
+ }
+}
+
/* call to setup initial, and after changes are made to the config */
/* FIXME: Need a cleanup funciton for when object is deactivated */
void
@@ -869,6 +974,8 @@ mail_autoreceive_init(void)
for (iter = e_list_get_iterator((EList *)accounts);e_iterator_is_valid(iter);e_iterator_next(iter))
auto_account_added(accounts, (EAccount *)e_iterator_get(iter), NULL);
+
+ camel_object_hook_event(mail_component_peek_session(NULL), "online", auto_online, NULL);
}
/* we setup the download info's in a hashtable, if we later need to build the gui, we insert
diff --git a/mail/mail-tools.c b/mail/mail-tools.c
index 1b0aad9841..761c425be7 100644
--- a/mail/mail-tools.c
+++ b/mail/mail-tools.c
@@ -293,7 +293,7 @@ mail_tool_uri_to_folder (const char *uri, guint32 flags, CamelException *ex)
return NULL;
}
- store = camel_session_get_store (session, uri + offset, ex);
+ store = camel_session_get_service(session, uri+offset, CAMEL_PROVIDER_STORE, ex);
if (store) {
const char *name;