From 8ad0c51edff9677ca22c46257f4a596dc23d2055 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 5 May 2010 21:47:44 -0400 Subject: Adapt to Camel API changes. This also removes the boxed CamelObject GType, since CamelObject is an honest-to-goodness GObject now. --- calendar/gui/e-cal-component-preview.c | 1 + e-util/e-marshal.list | 8 +- e-util/e-util.c | 30 +- e-util/e-util.h | 6 - mail/e-mail-backend.c | 23 +- mail/em-composer-utils.c | 2 +- mail/em-folder-tree-model.c | 54 +- mail/em-folder-utils.c | 2 +- mail/mail-folder-cache.c | 856 +++++++++++++++----------------- mail/mail-folder-cache.h | 88 ++-- mail/mail-send-recv.c | 4 +- mail/mail-session.c | 2 +- mail/mail-vfolder.c | 47 +- mail/message-list.c | 30 +- plugins/itip-formatter/itip-formatter.c | 2 +- widgets/misc/e-attachment.c | 4 +- 16 files changed, 548 insertions(+), 611 deletions(-) diff --git a/calendar/gui/e-cal-component-preview.c b/calendar/gui/e-cal-component-preview.c index 9caebe9e1c..da7e853863 100644 --- a/calendar/gui/e-cal-component-preview.c +++ b/calendar/gui/e-cal-component-preview.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include diff --git a/e-util/e-marshal.list b/e-util/e-marshal.list index 823005bac8..ab270d2f34 100644 --- a/e-util/e-marshal.list +++ b/e-util/e-marshal.list @@ -20,10 +20,6 @@ INT:INT,INT,BOXED INT:INT,POINTER,INT,BOXED INT:OBJECT,BOXED INT:POINTER -NONE:BOXED,STRING -NONE:BOXED,STRING,INT -NONE:BOXED,STRING,STRING -NONE:BOXED,STRING,STRING,INT,STRING,STRING,STRING NONE:INT,INT NONE:INT,INT,BOXED NONE:INT,INT,OBJECT @@ -41,6 +37,10 @@ NONE:LONG,LONG NONE:OBJECT,BOOLEAN NONE:OBJECT,DOUBLE,DOUBLE,BOOLEAN NONE:OBJECT,OBJECT +NONE:OBJECT,STRING +NONE:OBJECT,STRING,INT +NONE:OBJECT,STRING,STRING +NONE:OBJECT,STRING,STRING,INT,STRING,STRING,STRING NONE:POINTER,INT NONE:POINTER,INT,INT,INT,INT NONE:POINTER,INT,OBJECT diff --git a/e-util/e-util.c b/e-util/e-util.c index e55edfb883..3728489fa4 100644 --- a/e-util/e-util.c +++ b/e-util/e-util.c @@ -48,6 +48,7 @@ #include #endif +#include #include #include #include @@ -1484,32 +1485,3 @@ e_util_set_source_combo_box_list (GtkWidget *source_combo_box, g_object_unref (gconf_client); } -static gpointer -e_camel_object_copy (gpointer camel_object) -{ - if (CAMEL_IS_OBJECT (camel_object)) - g_object_ref (camel_object); - - return camel_object; -} - -static void -e_camel_object_free (gpointer camel_object) -{ - if (CAMEL_IS_OBJECT (camel_object)) - g_object_unref (camel_object); -} - -GType -e_camel_object_get_type (void) -{ - static GType type = 0; - - if (G_UNLIKELY (type == 0)) - type = g_boxed_type_register_static ( - "ECamelObject", - (GBoxedCopyFunc) e_camel_object_copy, - (GBoxedFreeFunc) e_camel_object_free); - - return type; -} diff --git a/e-util/e-util.h b/e-util/e-util.h index c3459195a3..6f7e56b07f 100644 --- a/e-util/e-util.h +++ b/e-util/e-util.h @@ -26,7 +26,6 @@ #include #include #include -#include #include #include @@ -142,11 +141,6 @@ GSList * e_util_get_category_filter_options void e_util_set_source_combo_box_list(GtkWidget *source_combo_box, const gchar *source_gconf_path); -/* Camel uses its own object system, so we have to box - * CamelObjects to safely use them as GObject properties. */ -#define E_TYPE_CAMEL_OBJECT (e_camel_object_get_type ()) -GType e_camel_object_get_type (void); - G_END_DECLS #endif /* E_UTIL_H */ diff --git a/mail/e-mail-backend.c b/mail/e-mail-backend.c index c10a0eb61b..67c732d352 100644 --- a/mail/e-mail-backend.c +++ b/mail/e-mail-backend.c @@ -26,6 +26,7 @@ #include "e-util/e-account-utils.h" #include "e-util/e-alert-dialog.h" +#include "e-util/e-binding.h" #include "misc/e-account-combo-box.h" @@ -79,17 +80,6 @@ mail_backend_store_operation_done_cb (CamelStore *store, g_object_unref (E_ACTIVITY (user_data)); } -static void -mail_backend_notify_online_cb (EShell *shell, - GParamSpec *pspec, - EMailBackend *backend) -{ - gboolean online; - - online = e_shell_get_online (shell); - camel_session_set_online (session, online); -} - /* Helper for mail_backend_prepare_for_offline_cb() */ static void mail_store_prepare_for_offline_cb (CamelService *service, @@ -119,7 +109,7 @@ mail_backend_prepare_for_offline_cb (EShell *shell, if (!synchronize) { mail_cancel_all (); - camel_session_set_network_state (session, FALSE); + camel_session_set_network_available (session, FALSE); } e_mail_store_foreach ( @@ -374,7 +364,6 @@ mail_backend_constructed (GObject *object) EShellBackend *shell_backend; MailFolderCache *folder_cache; const gchar *data_dir; - gboolean online; shell_backend = E_SHELL_BACKEND (object); shell = e_shell_backend_get_shell (shell_backend); @@ -382,17 +371,11 @@ mail_backend_constructed (GObject *object) /* This also initializes Camel, so it needs to happen early. */ mail_session_start (); - online = e_shell_get_online (shell); - camel_session_set_online (CAMEL_SESSION (session), online); + e_binding_new (shell, "online", session, "online"); e_account_combo_box_set_session (session); /* XXX Don't ask... */ folder_cache = mail_folder_cache_get_default (); - g_signal_connect ( - shell, "notify::online", - G_CALLBACK (mail_backend_notify_online_cb), - shell_backend); - g_signal_connect ( shell, "prepare-for-offline", G_CALLBACK (mail_backend_prepare_for_offline_cb), diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c index bf9a09e4f3..d9c8bd2fea 100644 --- a/mail/em-composer-utils.c +++ b/mail/em-composer-utils.c @@ -251,7 +251,7 @@ composer_send_queued_cb (CamelFolder *folder, CamelMimeMessage *msg, CamelMessag gtk_widget_destroy (GTK_WIDGET (send->composer)); - if (send->send && camel_session_is_online (session)) { + if (send->send && camel_session_get_online (session)) { /* queue a message send */ mail_send (); } diff --git a/mail/em-folder-tree-model.c b/mail/em-folder-tree-model.c index 0f6ba84b0f..e7262db9d0 100644 --- a/mail/em-folder-tree-model.c +++ b/mail/em-folder-tree-model.c @@ -97,11 +97,11 @@ static guint signals[LAST_SIGNAL]; static void store_info_free (EMFolderTreeModelStoreInfo *si) { - camel_object_remove_event (si->store, si->created_id); - camel_object_remove_event (si->store, si->deleted_id); - camel_object_remove_event (si->store, si->renamed_id); - camel_object_remove_event (si->store, si->subscribed_id); - camel_object_remove_event (si->store, si->unsubscribed_id); + g_signal_handler_disconnect (si->store, si->created_id); + g_signal_handler_disconnect (si->store, si->deleted_id); + g_signal_handler_disconnect (si->store, si->renamed_id); + g_signal_handler_disconnect (si->store, si->subscribed_id); + g_signal_handler_disconnect (si->store, si->unsubscribed_id); g_free (si->display_name); g_object_unref (si->store); @@ -941,9 +941,14 @@ folder_deleted_cb (CamelStore *store, folder_unsubscribed_cb, store, fi, model); } +typedef struct { + gchar *old_base; + CamelFolderInfo *new; +} RenameInfo; + static void folder_renamed (CamelStore *store, - CamelRenameInfo *info, + RenameInfo *info, EMFolderTreeModel *model) { EMFolderTreeModelStoreInfo *si; @@ -966,7 +971,7 @@ folder_renamed (CamelStore *store, em_folder_tree_model_remove_folders (model, si, &iter); - parent = g_strdup(info->new->full_name); + parent = g_strdup (info->new->full_name); p = strrchr(parent, '/'); if (p) *p = 0; @@ -998,16 +1003,17 @@ done: static void folder_renamed_cb (CamelStore *store, - gpointer event_data, + const gchar *old_name, + CamelFolderInfo *info, EMFolderTreeModel *model) { - CamelRenameInfo *rinfo, *info = event_data; + RenameInfo *rinfo; g_object_ref (store); - rinfo = g_new0 (CamelRenameInfo, 1); - rinfo->old_base = g_strdup (info->old_base); - rinfo->new = camel_folder_info_clone (info->new); + rinfo = g_new0 (RenameInfo, 1); + rinfo->old_base = g_strdup (old_name); + rinfo->new = camel_folder_info_clone (info); mail_async_event_emit ( mail_async_event, MAIL_ASYNC_GUI, (MailAsyncFunc) @@ -1090,21 +1096,21 @@ em_folder_tree_model_add_store (EMFolderTreeModel *model, -1); /* listen to store events */ - si->created_id = camel_object_hook_event ( - store, "folder_created", - (CamelObjectEventHookFunc) folder_created_cb, model); - si->deleted_id = camel_object_hook_event ( - store, "folder_deleted", - (CamelObjectEventHookFunc) folder_deleted_cb, model); - si->renamed_id = camel_object_hook_event ( + si->created_id = g_signal_connect ( + store, "folder-created", + G_CALLBACK (folder_created_cb), model); + si->deleted_id = g_signal_connect ( + store, "folder-deleted", + G_CALLBACK (folder_deleted_cb), model); + si->renamed_id = g_signal_connect ( store, "folder_renamed", - (CamelObjectEventHookFunc) folder_renamed_cb, model); - si->subscribed_id = camel_object_hook_event ( + G_CALLBACK (folder_renamed_cb), model); + si->subscribed_id = g_signal_connect ( store, "folder_subscribed", - (CamelObjectEventHookFunc) folder_subscribed_cb, model); - si->unsubscribed_id = camel_object_hook_event ( + G_CALLBACK (folder_subscribed_cb), model); + si->unsubscribed_id = g_signal_connect ( store, "folder_unsubscribed", - (CamelObjectEventHookFunc) folder_unsubscribed_cb, model); + G_CALLBACK (folder_unsubscribed_cb), model); g_signal_emit (model, signals[LOADED_ROW], 0, path, &root); gtk_tree_path_free (path); diff --git a/mail/em-folder-utils.c b/mail/em-folder-utils.c index ee2d05f5f5..ab810bfa30 100644 --- a/mail/em-folder-utils.c +++ b/mail/em-folder-utils.c @@ -181,7 +181,7 @@ emft_copy_folders__exec (struct _EMCopyFolders *m) /* subscribe to the new folder if appropriate */ if (camel_store_supports_subscriptions (m->tostore) - && !camel_store_folder_subscribed (m->tostore, toname->str)) + && !camel_store_folder_is_subscribed (m->tostore, toname->str)) camel_store_subscribe_folder (m->tostore, toname->str, NULL); info = info->next; diff --git a/mail/mail-folder-cache.c b/mail/mail-folder-cache.c index 2f589529db..5d52a1431d 100644 --- a/mail/mail-folder-cache.c +++ b/mail/mail-folder-cache.c @@ -32,11 +32,6 @@ #include "config.h" #endif -#ifdef G_LOG_DOMAIN -#undef G_LOG_DOMAIN -#endif -#define G_LOG_DOMAIN "folder tree" - #include #include @@ -63,13 +58,11 @@ /* This code is a mess, there is no reason it should be so complicated. */ -G_DEFINE_TYPE (MailFolderCache, mail_folder_cache, G_TYPE_OBJECT) - -#define FOLDER_CACHE_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), MAIL_TYPE_FOLDER_CACHE, MailFolderCachePrivate)) +#define MAIL_FOLDER_CACHE_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), MAIL_TYPE_FOLDER_CACHE, MailFolderCachePrivate)) -struct _MailFolderCachePrivate -{ +struct _MailFolderCachePrivate { /* source id for the ping timeout callback */ guint ping_id; /* Store to storeinfo table, active stores */ @@ -85,8 +78,7 @@ struct _MailFolderCachePrivate gint count_trash; }; -enum -{ +enum { FOLDER_AVAILABLE, FOLDER_UNAVAILABLE, FOLDER_DELETED, @@ -106,7 +98,7 @@ struct _folder_info { guint32 flags; - CamelFolder *folder; /* if known */ + gpointer folder; /* if known (weak pointer) */ }; /* pending list of updates */ @@ -141,11 +133,7 @@ struct _store_info { GQueue folderinfo_updates; }; -static void folder_changed(CamelObject *o, gpointer event_data, gpointer user_data); -static void folder_renamed(CamelObject *o, gpointer event_data, gpointer user_data); -static void folder_finalised(CamelObject *o, gpointer event_data, gpointer user_data); - -static gboolean ping_cb (gpointer user_data); +G_DEFINE_TYPE (MailFolderCache, mail_folder_cache, G_TYPE_OBJECT) static void free_update(struct _folder_update *up) @@ -227,45 +215,6 @@ flush_updates (MailFolderCache *self) self, NULL, NULL); } -static void -unset_folder_info(MailFolderCache *self, struct _folder_info *mfi, gint delete, gint unsub) -{ - struct _folder_update *up; - - d(printf("unset folderinfo '%s'\n", mfi->uri)); - - if (mfi->folder) { - CamelFolder *folder = mfi->folder; - - camel_object_unhook_event(folder, "folder_changed", folder_changed, self); - camel_object_unhook_event(folder, "renamed", folder_renamed, self); - camel_object_unhook_event(folder, "finalize", folder_finalised, self); - } - - if ((mfi->flags & CAMEL_FOLDER_NOSELECT) == 0) { - up = g_malloc0(sizeof(*up)); - - up->remove = TRUE; - up->delete = delete; - up->unsub = unsub; - up->store = mfi->store_info->store; - up->full_name = g_strdup (mfi->full_name); - g_object_ref (up->store); - up->uri = g_strdup(mfi->uri); - - g_queue_push_head (&self->priv->updates, up); - flush_updates(self); - } -} - -static void -free_folder_info(struct _folder_info *mfi) -{ - g_free(mfi->full_name); - g_free(mfi->uri); - g_free(mfi); -} - /* This is how unread counts work (and don't work): * * camel_folder_unread_message_count() only gives a correct answer if @@ -337,72 +286,21 @@ update_1folder(MailFolderCache *self, struct _folder_info *mfi, gint new, const up->full_name = g_strdup(mfi->full_name); up->unread = unread; up->new = new; - up->store = mfi->store_info->store; + up->store = g_object_ref (mfi->store_info->store); up->uri = g_strdup(mfi->uri); up->msg_uid = g_strdup (msg_uid); up->msg_sender = g_strdup (msg_sender); up->msg_subject = g_strdup (msg_subject); - g_object_ref (up->store); g_queue_push_head (&self->priv->updates, up); flush_updates(self); } static void -setup_folder(MailFolderCache *self, CamelFolderInfo *fi, struct _store_info *si) -{ - struct _folder_info *mfi; - struct _folder_update *up; - - mfi = g_hash_table_lookup(si->folders, fi->full_name); - if (mfi) { - update_1folder (self, mfi, 0, NULL, NULL, NULL, fi); - } else { - d(printf("Adding new folder: %s (%s)\n", fi->full_name, fi->uri)); - mfi = g_malloc0(sizeof(*mfi)); - mfi->full_name = g_strdup(fi->full_name); - mfi->uri = g_strdup(fi->uri); - mfi->store_info = si; - mfi->flags = fi->flags; - - g_hash_table_insert(si->folders, mfi->full_name, mfi); - g_hash_table_insert(si->folders_uri, mfi->uri, mfi); - - up = g_malloc0(sizeof(*up)); - up->full_name = g_strdup(mfi->full_name); - up->uri = g_strdup(fi->uri); - up->unread = fi->unread; - up->store = si->store; - g_object_ref (up->store); - - if ((fi->flags & CAMEL_FOLDER_NOSELECT) == 0) - up->add = TRUE; - - g_queue_push_head (&self->priv->updates, up); - flush_updates(self); - } -} - -static void -create_folders(MailFolderCache *self, CamelFolderInfo *fi, struct _store_info *si) -{ - d(printf("Setup new folder: %s\n %s\n", fi->uri, fi->full_name)); - - while (fi) { - setup_folder(self, fi, si); - - if (fi->child) - create_folders(self, fi->child, si); - - fi = fi->next; - } -} - -static void -folder_changed (CamelObject *o, gpointer event_data, gpointer user_data) +folder_changed_cb (CamelFolder *folder, + CamelFolderChangeInfo *changes, + MailFolderCache *self) { static time_t last_newmail = 0; - CamelFolderChangeInfo *changes = event_data; - CamelFolder *folder = (CamelFolder *)o; CamelFolder *local_drafts; CamelFolder *local_outbox; CamelFolder *local_sent; @@ -415,7 +313,6 @@ folder_changed (CamelObject *o, gpointer event_data, gpointer user_data) gint i; guint32 flags; gchar *uid = NULL, *sender = NULL, *subject = NULL; - MailFolderCache *self = (MailFolderCache*) user_data; full_name = camel_folder_get_full_name (folder); parent_store = camel_folder_get_parent_store (folder); @@ -477,146 +374,158 @@ folder_changed (CamelObject *o, gpointer event_data, gpointer user_data) } static void -folder_finalised(CamelObject *o, gpointer event_data, gpointer user_data) +unset_folder_info(MailFolderCache *self, struct _folder_info *mfi, gint delete, gint unsub) { - CamelFolder *folder = (CamelFolder *)o; - CamelStore *parent_store; - struct _store_info *si; - struct _folder_info *mfi; - MailFolderCache *self = (MailFolderCache*) user_data; - const gchar *full_name; + struct _folder_update *up; - full_name = camel_folder_get_full_name (folder); - parent_store = camel_folder_get_parent_store (folder); + d(printf("unset folderinfo '%s'\n", mfi->uri)); - g_mutex_lock (self->priv->stores_mutex); - if (self->priv->stores != NULL - && (si = g_hash_table_lookup(self->priv->stores, parent_store)) != NULL - && (mfi = g_hash_table_lookup(si->folders, full_name)) != NULL - && mfi->folder == folder) { - mfi->folder = NULL; + if (mfi->folder) { + CamelFolder *folder = mfi->folder; + + g_signal_handlers_disconnect_by_func ( + folder, folder_changed_cb, self); + + g_object_remove_weak_pointer ( + G_OBJECT (mfi->folder), &mfi->folder); + } + + if ((mfi->flags & CAMEL_FOLDER_NOSELECT) == 0) { + up = g_malloc0(sizeof(*up)); + + up->remove = TRUE; + up->delete = delete; + up->unsub = unsub; + up->store = g_object_ref (mfi->store_info->store); + up->full_name = g_strdup (mfi->full_name); + up->uri = g_strdup(mfi->uri); + + g_queue_push_head (&self->priv->updates, up); + flush_updates(self); } - g_mutex_unlock (self->priv->stores_mutex); } static void -folder_renamed(CamelObject *o, gpointer event_data, gpointer user_data) +free_folder_info(struct _folder_info *mfi) { - CamelFolder *folder = (CamelFolder *)o; - gchar *old = event_data; - - old = old; - folder = folder; - /* Dont do anything, do it from the store rename event? */ + g_free(mfi->full_name); + g_free(mfi->uri); + g_free(mfi); } -/** - * mail_folder_cache_note_folder: - * - * When a folder has been opened, notify it for watching. The folder must have - * already been created on the store (which has already been noted) before the - * folder can be opened - */ -void mail_folder_cache_note_folder(MailFolderCache *self, CamelFolder *folder) +static void +setup_folder(MailFolderCache *self, CamelFolderInfo *fi, struct _store_info *si) { - CamelStore *parent_store; - struct _store_info *si; struct _folder_info *mfi; - const gchar *full_name; + struct _folder_update *up; - full_name = camel_folder_get_full_name (folder); - parent_store = camel_folder_get_parent_store (folder); + mfi = g_hash_table_lookup(si->folders, fi->full_name); + if (mfi) { + update_1folder (self, mfi, 0, NULL, NULL, NULL, fi); + } else { + d(printf("Adding new folder: %s (%s)\n", fi->full_name, fi->uri)); + mfi = g_malloc0(sizeof(*mfi)); + mfi->full_name = g_strdup(fi->full_name); + mfi->uri = g_strdup(fi->uri); + mfi->store_info = si; + mfi->flags = fi->flags; - g_mutex_lock (self->priv->stores_mutex); - if (self->priv->stores == NULL - || (si = g_hash_table_lookup(self->priv->stores, parent_store)) == NULL - || (mfi = g_hash_table_lookup(si->folders, full_name)) == NULL) { - w(g_warning("Noting folder before store initialised")); - g_mutex_unlock (self->priv->stores_mutex); - return; - } + g_hash_table_insert(si->folders, mfi->full_name, mfi); + g_hash_table_insert(si->folders_uri, mfi->uri, mfi); - /* dont do anything if we already have this */ - if (mfi->folder == folder) { - g_mutex_unlock (self->priv->stores_mutex); - return; + up = g_malloc0(sizeof(*up)); + up->full_name = g_strdup(mfi->full_name); + up->uri = g_strdup(fi->uri); + up->unread = fi->unread; + up->store = g_object_ref (si->store); + + if ((fi->flags & CAMEL_FOLDER_NOSELECT) == 0) + up->add = TRUE; + + g_queue_push_head (&self->priv->updates, up); + flush_updates(self); } +} - mfi->folder = folder; +static void +create_folders(MailFolderCache *self, CamelFolderInfo *fi, struct _store_info *si) +{ + d(printf("Setup new folder: %s\n %s\n", fi->uri, fi->full_name)); - update_1folder (self, mfi, 0, NULL, NULL, NULL, NULL); + while (fi) { + setup_folder(self, fi, si); - g_mutex_unlock (self->priv->stores_mutex); + if (fi->child) + create_folders(self, fi->child, si); - camel_object_hook_event(folder, "folder_changed", folder_changed, self); - camel_object_hook_event(folder, "renamed", folder_renamed, self); - camel_object_hook_event(folder, "finalize", folder_finalised, self); + fi = fi->next; + } } static void -store_folder_subscribed(CamelObject *o, gpointer event_data, gpointer data) +store_folder_subscribed_cb (CamelStore *store, + CamelFolderInfo *info, + MailFolderCache *self) { struct _store_info *si; - CamelFolderInfo *fi = event_data; - MailFolderCache *self = (MailFolderCache*) data; - - d(printf("Store folder subscribed '%s' store '%s' \n", fi->full_name, camel_url_to_string(((CamelService *)o)->url, 0))); g_mutex_lock (self->priv->stores_mutex); - si = g_hash_table_lookup(self->priv->stores, o); + si = g_hash_table_lookup (self->priv->stores, store); if (si) - setup_folder(self, fi, si); + setup_folder (self, info, si); g_mutex_unlock (self->priv->stores_mutex); } static void -store_folder_created(CamelObject *o, gpointer event_data, gpointer data) +store_folder_created_cb (CamelStore *store, + CamelFolderInfo *info, + MailFolderCache *cache) { - /* we only want created events to do more work if we dont support subscriptions */ - if (!camel_store_supports_subscriptions(CAMEL_STORE(o))) - store_folder_subscribed(o, event_data, data); + /* We only want created events to do more work + * if we dont support subscriptions. */ + if (!camel_store_supports_subscriptions (store)) + store_folder_subscribed_cb (store, info, cache); } static void -store_folder_opened(CamelObject *o, gpointer event_data, gpointer data) +store_folder_opened_cb (CamelStore *store, + CamelFolder *folder, + MailFolderCache *self) { - CamelFolder *folder = event_data; - MailFolderCache *self = (MailFolderCache*) data; - - mail_folder_cache_note_folder(self, folder); + mail_folder_cache_note_folder (self, folder); } static void -store_folder_unsubscribed(CamelObject *o, gpointer event_data, gpointer data) +store_folder_unsubscribed_cb (CamelStore *store, + CamelFolderInfo *info, + MailFolderCache *self) { struct _store_info *si; - CamelFolderInfo *fi = event_data; struct _folder_info *mfi; - CamelStore *store = (CamelStore *)o; - MailFolderCache *self = (MailFolderCache*) data; - - d(printf("Store Folder deleted: %s\n", fi->full_name)); g_mutex_lock (self->priv->stores_mutex); - si = g_hash_table_lookup(self->priv->stores, store); + si = g_hash_table_lookup (self->priv->stores, store); if (si) { - mfi = g_hash_table_lookup(si->folders, fi->full_name); + mfi = g_hash_table_lookup(si->folders, info->full_name); if (mfi) { - g_hash_table_remove(si->folders, mfi->full_name); - g_hash_table_remove(si->folders_uri, mfi->uri); - unset_folder_info(self, mfi, TRUE, TRUE); - free_folder_info(mfi); + g_hash_table_remove (si->folders, mfi->full_name); + g_hash_table_remove (si->folders_uri, mfi->uri); + unset_folder_info (self, mfi, TRUE, TRUE); + free_folder_info (mfi); } } g_mutex_unlock (self->priv->stores_mutex); } static void -store_folder_deleted(CamelObject *o, gpointer event_data, gpointer data) +store_folder_deleted_cb (CamelStore *store, + CamelFolderInfo *info, + MailFolderCache *self) { - /* we only want deleted events to do more work if we dont support subscriptions */ - if (!camel_store_supports_subscriptions(CAMEL_STORE(o))) - store_folder_unsubscribed(o, event_data, data); + /* We only want deleted events to do more work + * if we dont support subscriptions. */ + if (!camel_store_supports_subscriptions (store)) + store_folder_unsubscribed_cb (store, info, self); } static gchar * @@ -687,8 +596,7 @@ rename_folders(MailFolderCache *self, struct _store_info *si, const gchar *oldba up->full_name = g_strdup(mfi->full_name); up->uri = g_strdup(mfi->uri); up->unread = fi->unread==-1?0:fi->unread; - up->store = si->store; - g_object_ref (up->store); + up->store = g_object_ref (si->store); if ((fi->flags & CAMEL_FOLDER_NOSELECT) == 0) up->add = TRUE; @@ -747,14 +655,12 @@ folder_cmp(gconstpointer ap, gconstpointer bp) } static void -store_folder_renamed(CamelObject *o, gpointer event_data, gpointer data) +store_folder_renamed_cb (CamelStore *store, + const gchar *old_name, + CamelFolderInfo *info, + MailFolderCache *self) { - CamelStore *store = (CamelStore *)o; - CamelRenameInfo *info = event_data; struct _store_info *si; - MailFolderCache *self = (MailFolderCache*) data; - - d(printf("Folder renamed: oldbase = '%s' new->full = '%s'\n", info->old_base, info->new->full_name)); g_mutex_lock (self->priv->stores_mutex); si = g_hash_table_lookup(self->priv->stores, store); @@ -765,12 +671,12 @@ store_folder_renamed(CamelObject *o, gpointer event_data, gpointer data) /* Ok, so for some reason the folderinfo we have comes in all messed up from imap, should find out why ... this makes it workable */ - get_folders(info->new, folders); + get_folders(info, folders); qsort(folders->pdata, folders->len, sizeof(folders->pdata[0]), folder_cmp); top = folders->pdata[0]; for (i=0;ilen;i++) { - rename_folders(self, si, info->old_base, top->full_name, folders->pdata[i]); + rename_folders(self, si, old_name, top->full_name, folders->pdata[i]); } g_ptr_array_free(folders, TRUE); @@ -801,58 +707,6 @@ free_folder_info_hash(gchar *path, struct _folder_info *mfi, gpointer data) free_folder_info(mfi); } -/** - * mail_folder_cache_note_store_remove: - * - * Notify the cache that the specified @store can be removed from the cache - */ -void -mail_folder_cache_note_store_remove(MailFolderCache *self, CamelStore *store) -{ - struct _store_info *si; - - g_return_if_fail (CAMEL_IS_STORE(store)); - - if (self->priv->stores == NULL) - return; - - d(printf("store removed!!\n")); - g_mutex_lock (self->priv->stores_mutex); - si = g_hash_table_lookup(self->priv->stores, store); - if (si) { - GList *link; - g_hash_table_remove(self->priv->stores, store); - - camel_object_unhook_event(store, "folder_opened", store_folder_opened, self); - camel_object_unhook_event(store, "folder_created", store_folder_created, self); - camel_object_unhook_event(store, "folder_deleted", store_folder_deleted, self); - camel_object_unhook_event(store, "folder_renamed", store_folder_renamed, self); - camel_object_unhook_event(store, "folder_subscribed", store_folder_subscribed, self); - camel_object_unhook_event(store, "folder_unsubscribed", store_folder_unsubscribed, self); - g_hash_table_foreach(si->folders, (GHFunc)unset_folder_info_hash, self); - - link = g_queue_peek_head_link (&si->folderinfo_updates); - - while (link != NULL) { - struct _update_data *ud = link->data; - - d(printf("Cancelling outstanding folderinfo update %d\n", ud->id)); - mail_msg_cancel(ud->id); - ud->cancel = 1; - - link = g_list_next (link); - } - - g_object_unref (si->store); - g_hash_table_foreach(si->folders, (GHFunc)free_folder_info_hash, NULL); - g_hash_table_destroy(si->folders); - g_hash_table_destroy(si->folders_uri); - g_free(si); - } - - g_mutex_unlock (self->priv->stores_mutex); -} - static gboolean update_folders(CamelStore *store, CamelFolderInfo *fi, gpointer data) { @@ -883,16 +737,16 @@ update_folders(CamelStore *store, CamelFolderInfo *fi, gpointer data) struct _ping_store_msg { MailMsg base; - CamelStore *store; }; static gchar * ping_store_desc (struct _ping_store_msg *m) { - gchar *service_name = camel_service_get_name (CAMEL_SERVICE (m->store), TRUE); + gchar *service_name; gchar *msg; + service_name = camel_service_get_name (CAMEL_SERVICE (m->store), TRUE); msg = g_strdup_printf (_("Pinging %s"), service_name); g_free (service_name); @@ -931,28 +785,25 @@ static MailMsgInfo ping_store_info = { }; static void -ping_store (gpointer key, gpointer val, gpointer user_data) +ping_store (CamelStore *store) { - CamelStore *store = (CamelStore *) key; struct _ping_store_msg *m; if (CAMEL_SERVICE (store)->status != CAMEL_SERVICE_CONNECTED) return; m = mail_msg_new (&ping_store_info); - m->store = store; - g_object_ref (store); + m->store = g_object_ref (store); mail_msg_slow_ordered_push (m); } static gboolean -ping_cb (gpointer user_data) +ping_cb (MailFolderCache *self) { - MailFolderCache *self = (MailFolderCache*) user_data; g_mutex_lock (self->priv->stores_mutex); - g_hash_table_foreach (self->priv->stores, ping_store, NULL); + g_hash_table_foreach (self->priv->stores, (GHFunc) ping_store, NULL); g_mutex_unlock (self->priv->stores_mutex); @@ -978,84 +829,6 @@ store_online_cb (CamelStore *store, gpointer data) g_mutex_unlock (ud->cache->priv->stores_mutex); } -/** - * mail_folder_cache_note_store: - * - * Add a store whose folders should appear in the shell The folders are scanned - * from the store, and/or added at runtime via the folder_created event. The - * @done function returns if we can free folder info. - */ -void -mail_folder_cache_note_store(MailFolderCache *self, CamelStore *store, CamelOperation *op, - NoteDoneFunc done, gpointer data) -{ - struct _store_info *si; - struct _update_data *ud; - gint hook = 0; - - g_return_if_fail (CAMEL_IS_STORE(store)); - g_return_if_fail (mail_in_main_thread()); - - g_mutex_lock (self->priv->stores_mutex); - - si = g_hash_table_lookup(self->priv->stores, store); - if (si == NULL) { - d(printf("Noting a new store: %p: %s\n", store, camel_url_to_string(((CamelService *)store)->url, 0))); - - si = g_malloc0(sizeof(*si)); - si->folders = g_hash_table_new(g_str_hash, g_str_equal); - si->folders_uri = g_hash_table_new(CAMEL_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(store))->hash_folder_name, - CAMEL_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(store))->compare_folder_name); - si->store = store; - g_object_ref ((CamelObject *)store); - g_hash_table_insert(self->priv->stores, store, si); - g_queue_init (&si->folderinfo_updates); - hook = TRUE; - } - - ud = g_malloc(sizeof(*ud)); - ud->done = done; - ud->data = data; - ud->cancel = 0; - ud->cache = self; - - /* We might get a race when setting up a store, such that it is still left in offline mode, - after we've gone online. This catches and fixes it up when the shell opens us */ - if (CAMEL_IS_DISCO_STORE (store)) { - if (camel_session_is_online (session) - && camel_disco_store_status (CAMEL_DISCO_STORE (store)) == CAMEL_DISCO_STORE_OFFLINE) { - /* Note: we use the 'id' here, even though its not the right id, its still ok */ - ud->id = mail_store_set_offline (store, FALSE, store_online_cb, ud); - } else { - goto normal_setup; - } - } else if (CAMEL_IS_OFFLINE_STORE (store)) { - if (camel_session_is_online (session) && CAMEL_OFFLINE_STORE (store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) { - /* Note: we use the 'id' here, even though its not the right id, its still ok */ - ud->id = mail_store_set_offline (store, FALSE, store_online_cb, ud); - } else { - goto normal_setup; - } - } else { - normal_setup: - ud->id = mail_get_folderinfo (store, op, update_folders, ud); - } - - g_queue_push_tail (&si->folderinfo_updates, ud); - - g_mutex_unlock (self->priv->stores_mutex); - - /* there is potential for race here, but it is safe as we check for the store anyway */ - if (hook) { - camel_object_hook_event(store, "folder_opened", store_folder_opened, self); - camel_object_hook_event(store, "folder_created", store_folder_created, self); - camel_object_hook_event(store, "folder_deleted", store_folder_deleted, self); - camel_object_hook_event(store, "folder_renamed", store_folder_renamed, self); - camel_object_hook_event(store, "folder_subscribed", store_folder_subscribed, self); - camel_object_hook_event(store, "folder_unsubscribed", store_folder_unsubscribed, self); - } -} - struct _find_info { const gchar *uri; struct _folder_info *fi; @@ -1063,7 +836,10 @@ struct _find_info { }; /* look up on each storeinfo using proper hash function for that stores uri's */ -static void storeinfo_find_folder_info(CamelStore *store, struct _store_info *si, struct _find_info *fi) +static void +storeinfo_find_folder_info (CamelStore *store, + struct _store_info *si, + struct _find_info *fi) { if (fi->fi == NULL) { if (((CamelService *)store)->provider->url_equal(fi->url, ((CamelService *)store)->url)) { @@ -1076,77 +852,11 @@ static void storeinfo_find_folder_info(CamelStore *store, struct _store_info *si } } -/** - * mail_folder_cache_get_folder_from_uri: - * - * Gets the #CamelFolder for the supplied @uri. - * - * Return value: TRUE if the uri is available, folderp is set to a reffed folder if - * the folder has also already been opened - */ -gboolean -mail_folder_cache_get_folder_from_uri(MailFolderCache *self, const gchar *uri, CamelFolder **folderp) -{ - struct _find_info fi = { uri, NULL, NULL }; - - if (self->priv->stores == NULL) - return FALSE; - - fi.url = camel_url_new(uri, NULL); - - g_mutex_lock (self->priv->stores_mutex); - g_hash_table_foreach(self->priv->stores, (GHFunc)storeinfo_find_folder_info, &fi); - if (folderp) { - if (fi.fi && fi.fi->folder) { - *folderp = fi.fi->folder; - g_object_ref (*folderp); - } else { - *folderp = NULL; - } - } - g_mutex_unlock (self->priv->stores_mutex); - - camel_url_free(fi.url); - - return fi.fi != NULL; -} - -gboolean -mail_folder_cache_get_folder_info_flags (MailFolderCache *self, CamelFolder *folder, gint *flags) -{ - gchar *uri = mail_tools_folder_to_url (folder); - struct _find_info fi = { uri, NULL, NULL }; - - if (self->priv->stores == NULL) - return FALSE; - - fi.url = camel_url_new (uri, NULL); - - g_mutex_lock (self->priv->stores_mutex); - g_hash_table_foreach(self->priv->stores, (GHFunc)storeinfo_find_folder_info, &fi); - if (flags) { - if (fi.fi) { - *flags = fi.fi->flags; - } - } - g_mutex_unlock (self->priv->stores_mutex); - - camel_url_free(fi.url); - g_free (uri); - - return fi.fi != NULL; -} - -static void -mail_folder_cache_dispose (GObject *object) -{ - G_OBJECT_CLASS (mail_folder_cache_parent_class)->dispose (object); -} - static void mail_folder_cache_finalize (GObject *object) { MailFolderCache *cache = (MailFolderCache*) object; + g_hash_table_destroy (cache->priv->stores); g_mutex_free (cache->priv->stores_mutex); @@ -1160,17 +870,18 @@ mail_folder_cache_finalize (GObject *object) cache->priv->update_id = 0; } + /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (mail_folder_cache_parent_class)->finalize (object); } static void -mail_folder_cache_class_init (MailFolderCacheClass *klass) +mail_folder_cache_class_init (MailFolderCacheClass *class) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); + GObjectClass *object_class; - g_type_class_add_private (klass, sizeof (MailFolderCachePrivate)); + g_type_class_add_private (class, sizeof (MailFolderCachePrivate)); - object_class->dispose = mail_folder_cache_dispose; + object_class = G_OBJECT_CLASS (class); object_class->finalize = mail_folder_cache_finalize; /** @@ -1186,9 +897,9 @@ mail_folder_cache_class_init (MailFolderCacheClass *klass) G_SIGNAL_RUN_FIRST, 0, /* struct offset */ NULL, NULL, /* accumulator */ - e_marshal_VOID__BOXED_STRING, + e_marshal_VOID__OBJECT_STRING, G_TYPE_NONE, 2, - E_TYPE_CAMEL_OBJECT, G_TYPE_STRING); + CAMEL_TYPE_OBJECT, G_TYPE_STRING); /** * MailFolderCache::folder-unavailable @@ -1205,9 +916,9 @@ mail_folder_cache_class_init (MailFolderCacheClass *klass) G_SIGNAL_RUN_FIRST, 0, /* struct offset */ NULL, NULL, /* accumulator */ - e_marshal_VOID__BOXED_STRING, + e_marshal_VOID__OBJECT_STRING, G_TYPE_NONE, 2, - E_TYPE_CAMEL_OBJECT, G_TYPE_STRING); + CAMEL_TYPE_OBJECT, G_TYPE_STRING); /** * MailFolderCache::folder-deleted @@ -1222,9 +933,9 @@ mail_folder_cache_class_init (MailFolderCacheClass *klass) G_SIGNAL_RUN_FIRST, 0, /* struct offset */ NULL, NULL, /* accumulator */ - e_marshal_VOID__BOXED_STRING, + e_marshal_VOID__OBJECT_STRING, G_TYPE_NONE, 2, - E_TYPE_CAMEL_OBJECT, G_TYPE_STRING); + CAMEL_TYPE_OBJECT, G_TYPE_STRING); /** * MailFolderCache::folder-renamed @@ -1240,9 +951,9 @@ mail_folder_cache_class_init (MailFolderCacheClass *klass) G_SIGNAL_RUN_FIRST, 0, /* struct offset */ NULL, NULL, /* accumulator */ - e_marshal_VOID__BOXED_STRING_STRING, + e_marshal_VOID__OBJECT_STRING_STRING, G_TYPE_NONE, 3, - E_TYPE_CAMEL_OBJECT, G_TYPE_STRING, G_TYPE_STRING); + CAMEL_TYPE_OBJECT, G_TYPE_STRING, G_TYPE_STRING); /** * MailFolderCache::folder-unread-updated @@ -1258,9 +969,9 @@ mail_folder_cache_class_init (MailFolderCacheClass *klass) G_SIGNAL_RUN_FIRST, 0, /* struct offset */ NULL, NULL, /* accumulator */ - e_marshal_VOID__BOXED_STRING_INT, + e_marshal_VOID__OBJECT_STRING_INT, G_TYPE_NONE, 3, - E_TYPE_CAMEL_OBJECT, G_TYPE_STRING, G_TYPE_INT); + CAMEL_TYPE_OBJECT, G_TYPE_STRING, G_TYPE_INT); /** * MailFolderCache::folder-changed @@ -1281,9 +992,9 @@ mail_folder_cache_class_init (MailFolderCacheClass *klass) G_SIGNAL_RUN_FIRST, 0, /* struct offset */ NULL, NULL, /* accumulator */ - e_marshal_VOID__BOXED_STRING_STRING_INT_STRING_STRING_STRING, + e_marshal_VOID__OBJECT_STRING_STRING_INT_STRING_STRING_STRING, G_TYPE_NONE, 7, - E_TYPE_CAMEL_OBJECT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, + CAMEL_TYPE_OBJECT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); } @@ -1293,7 +1004,7 @@ mail_folder_cache_init (MailFolderCache *self) const gchar *buf; guint timeout; - self->priv = FOLDER_CACHE_PRIVATE (self); + self->priv = MAIL_FOLDER_CACHE_GET_PRIVATE (self); /* initialize values */ self->priv->stores = g_hash_table_new(NULL, NULL); @@ -1306,19 +1017,8 @@ mail_folder_cache_init (MailFolderCache *self) buf = getenv ("EVOLUTION_PING_TIMEOUT"); timeout = buf ? strtoul (buf, NULL, 10) : 600; - self->priv->ping_id = g_timeout_add_seconds (timeout, ping_cb, self); -} - -/** - * mail_folder_cache_new: - * - * You probably don't want to use this. Use mail_folder_cache_get_default() - * instead - */ -MailFolderCache * -mail_folder_cache_new (void) -{ - return g_object_new (MAIL_TYPE_FOLDER_CACHE, NULL); + self->priv->ping_id = g_timeout_add_seconds ( + timeout, (GSourceFunc) ping_cb, self); } static MailFolderCache *default_cache = NULL; @@ -1339,3 +1039,265 @@ mail_folder_cache_get_default (void) return default_cache; } + +/** + * mail_folder_cache_note_store: + * + * Add a store whose folders should appear in the shell The folders are scanned + * from the store, and/or added at runtime via the folder_created event. The + * @done function returns if we can free folder info. + */ +void +mail_folder_cache_note_store (MailFolderCache *self, + CamelStore *store, + CamelOperation *op, + NoteDoneFunc done, + gpointer data) +{ + struct _store_info *si; + struct _update_data *ud; + gint hook = 0; + + g_return_if_fail (CAMEL_IS_STORE(store)); + g_return_if_fail (mail_in_main_thread()); + + g_mutex_lock (self->priv->stores_mutex); + + si = g_hash_table_lookup (self->priv->stores, store); + if (si == NULL) { + d(printf("Noting a new store: %p: %s\n", store, camel_url_to_string(((CamelService *)store)->url, 0))); + + si = g_malloc0(sizeof(*si)); + si->folders = g_hash_table_new(g_str_hash, g_str_equal); + si->folders_uri = g_hash_table_new(CAMEL_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(store))->hash_folder_name, + CAMEL_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(store))->compare_folder_name); + si->store = g_object_ref (store); + g_hash_table_insert(self->priv->stores, store, si); + g_queue_init (&si->folderinfo_updates); + hook = TRUE; + } + + ud = g_malloc(sizeof(*ud)); + ud->done = done; + ud->data = data; + ud->cancel = 0; + ud->cache = self; + + /* We might get a race when setting up a store, such that it is still left in offline mode, + after we've gone online. This catches and fixes it up when the shell opens us */ + if (CAMEL_IS_DISCO_STORE (store)) { + if (camel_session_get_online (session) + && camel_disco_store_status (CAMEL_DISCO_STORE (store)) == CAMEL_DISCO_STORE_OFFLINE) { + /* Note: we use the 'id' here, even though its not the right id, its still ok */ + ud->id = mail_store_set_offline (store, FALSE, store_online_cb, ud); + } else { + goto normal_setup; + } + } else if (CAMEL_IS_OFFLINE_STORE (store)) { + if (camel_session_get_online (session) && CAMEL_OFFLINE_STORE (store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) { + /* Note: we use the 'id' here, even though its not the right id, its still ok */ + ud->id = mail_store_set_offline (store, FALSE, store_online_cb, ud); + } else { + goto normal_setup; + } + } else { + normal_setup: + ud->id = mail_get_folderinfo (store, op, update_folders, ud); + } + + g_queue_push_tail (&si->folderinfo_updates, ud); + + g_mutex_unlock (self->priv->stores_mutex); + + /* there is potential for race here, but it is safe as we check for the store anyway */ + if (hook) { + g_signal_connect ( + store, "folder-opened", + G_CALLBACK (store_folder_opened_cb), self); + g_signal_connect ( + store, "folder-created", + G_CALLBACK (store_folder_created_cb), self); + g_signal_connect ( + store, "folder-deleted", + G_CALLBACK (store_folder_deleted_cb), self); + g_signal_connect ( + store, "folder-renamed", + G_CALLBACK (store_folder_renamed_cb), self); + g_signal_connect ( + store, "folder-subscribed", + G_CALLBACK (store_folder_subscribed_cb), self); + g_signal_connect ( + store, "folder-unsubscribed", + G_CALLBACK (store_folder_unsubscribed_cb), self); + } +} + +/** + * mail_folder_cache_note_store_remove: + * + * Notify the cache that the specified @store can be removed from the cache + */ +void +mail_folder_cache_note_store_remove (MailFolderCache *self, + CamelStore *store) +{ + struct _store_info *si; + + g_return_if_fail (CAMEL_IS_STORE(store)); + + if (self->priv->stores == NULL) + return; + + d(printf("store removed!!\n")); + g_mutex_lock (self->priv->stores_mutex); + si = g_hash_table_lookup (self->priv->stores, store); + if (si) { + GList *link; + + g_hash_table_remove(self->priv->stores, store); + + g_signal_handlers_disconnect_matched ( + store, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, self); + + g_hash_table_foreach ( + si->folders, (GHFunc) + unset_folder_info_hash, self); + + link = g_queue_peek_head_link (&si->folderinfo_updates); + + while (link != NULL) { + struct _update_data *ud = link->data; + + d(printf("Cancelling outstanding folderinfo update %d\n", ud->id)); + mail_msg_cancel(ud->id); + ud->cancel = 1; + + link = g_list_next (link); + } + + g_object_unref (si->store); + g_hash_table_foreach(si->folders, (GHFunc)free_folder_info_hash, NULL); + g_hash_table_destroy(si->folders); + g_hash_table_destroy(si->folders_uri); + g_free(si); + } + + g_mutex_unlock (self->priv->stores_mutex); +} + +/** + * mail_folder_cache_note_folder: + * + * When a folder has been opened, notify it for watching. The folder must have + * already been created on the store (which has already been noted) before the + * folder can be opened + */ +void +mail_folder_cache_note_folder (MailFolderCache *self, + CamelFolder *folder) +{ + CamelStore *parent_store; + struct _store_info *si; + struct _folder_info *mfi; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + g_mutex_lock (self->priv->stores_mutex); + if (self->priv->stores == NULL + || (si = g_hash_table_lookup(self->priv->stores, parent_store)) == NULL + || (mfi = g_hash_table_lookup(si->folders, full_name)) == NULL) { + w(g_warning("Noting folder before store initialised")); + g_mutex_unlock (self->priv->stores_mutex); + return; + } + + /* dont do anything if we already have this */ + if (mfi->folder == folder) { + g_mutex_unlock (self->priv->stores_mutex); + return; + } + + mfi->folder = folder; + + g_object_add_weak_pointer (G_OBJECT (folder), &mfi->folder); + + update_1folder (self, mfi, 0, NULL, NULL, NULL, NULL); + + g_mutex_unlock (self->priv->stores_mutex); + + g_signal_connect ( + folder, "changed", + G_CALLBACK (folder_changed_cb), self); +} + +/** + * mail_folder_cache_get_folder_from_uri: + * + * Gets the #CamelFolder for the supplied @uri. + * + * Returns: %TRUE if the URI is available, folderp is set to a reffed + * folder if the folder has also already been opened + */ +gboolean +mail_folder_cache_get_folder_from_uri (MailFolderCache *self, + const gchar *uri, + CamelFolder **folderp) +{ + struct _find_info fi = { uri, NULL, NULL }; + + if (self->priv->stores == NULL) + return FALSE; + + fi.url = camel_url_new (uri, NULL); + + g_mutex_lock (self->priv->stores_mutex); + g_hash_table_foreach ( + self->priv->stores, (GHFunc) + storeinfo_find_folder_info, &fi); + if (folderp) { + if (fi.fi && fi.fi->folder) + *folderp = g_object_ref (fi.fi->folder); + else + *folderp = NULL; + } + g_mutex_unlock (self->priv->stores_mutex); + + camel_url_free (fi.url); + + return fi.fi != NULL; +} + +gboolean +mail_folder_cache_get_folder_info_flags (MailFolderCache *self, + CamelFolder *folder, + gint *flags) +{ + gchar *uri = mail_tools_folder_to_url (folder); + struct _find_info fi = { uri, NULL, NULL }; + + if (self->priv->stores == NULL) + return FALSE; + + fi.url = camel_url_new (uri, NULL); + + g_mutex_lock (self->priv->stores_mutex); + g_hash_table_foreach ( + self->priv->stores, (GHFunc) + storeinfo_find_folder_info, &fi); + if (flags) { + if (fi.fi) + *flags = fi.fi->flags; + else + *flags = 0; + } + g_mutex_unlock (self->priv->stores_mutex); + + camel_url_free (fi.url); + g_free (uri); + + return fi.fi != NULL; +} + diff --git a/mail/mail-folder-cache.h b/mail/mail-folder-cache.h index de6f90570f..1a3cf2ad5a 100644 --- a/mail/mail-folder-cache.h +++ b/mail/mail-folder-cache.h @@ -23,61 +23,81 @@ * */ -#ifndef _MAIL_FOLDER_CACHE_H -#define _MAIL_FOLDER_CACHE_H +#ifndef MAIL_FOLDER_CACHE_H +#define MAIL_FOLDER_CACHE_H -#include #include -G_BEGIN_DECLS +/* Standard GObject macros */ +#define MAIL_TYPE_FOLDER_CACHE \ + (mail_folder_cache_get_type ()) +#define MAIL_FOLDER_CACHE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), MAIL_TYPE_FOLDER_CACHE, MailFolderCache)) +#define MAIL_FOLDER_CACHE_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_CAST \ + ((cls), MAIL_TYPE_FOLDER_CACHE, MailFolderCacheClass)) +#define MAIL_IS_FOLDER_CACHE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), MAIL_TYPE_FOLDER_CACHE)) +#define MAIL_IS_FOLDER_CACHE_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_TYPE \ + ((cls), MAIL_TYPE_FOLDER_CACHE)) +#define MAIL_FOLDER_CACHE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), MAIL_TYPE_FOLDER_CACHE, MailFolderCacheClass)) -#define MAIL_TYPE_FOLDER_CACHE mail_folder_cache_get_type() -#define MAIL_FOLDER_CACHE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAIL_TYPE_FOLDER_CACHE, MailFolderCache)) -#define MAIL_FOLDER_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MAIL_TYPE_FOLDER_CACHE, MailFolderCacheClass)) -#define MAIL_IS_FOLDER_CACHE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAIL_TYPE_FOLDER_CACHE)) -#define MAIL_IS_FOLDER_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAIL_TYPE_FOLDER_CACHE)) -#define MAIL_FOLDER_CACHE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MAIL_TYPE_FOLDER_CACHE, MailFolderCacheClass)) +G_BEGIN_DECLS typedef struct _MailFolderCache MailFolderCache; typedef struct _MailFolderCacheClass MailFolderCacheClass; typedef struct _MailFolderCachePrivate MailFolderCachePrivate; +/** + * NoteDoneFunc: + * + * The signature of a function to be registered as a callback for + * mail_folder_cache_note_store() + */ +typedef gboolean (*NoteDoneFunc)(CamelStore *store, CamelFolderInfo *info, gpointer data); + /** * MailFolderCache: * * Contains only private data that should be read and manipulated using the * functions below. */ -struct _MailFolderCache -{ +struct _MailFolderCache { GObject parent; - MailFolderCachePrivate *priv; }; -struct _MailFolderCacheClass -{ +struct _MailFolderCacheClass { GObjectClass parent_class; }; -GType mail_folder_cache_get_type (void) G_GNUC_CONST; - -MailFolderCache *mail_folder_cache_new (void); - -MailFolderCache *mail_folder_cache_get_default (void); - -/** - * NoteDoneFunc: - * - * The signature of a function to be registered as a callback for - * mail_folder_cache_note_store() - */ -typedef gboolean (*NoteDoneFunc)(CamelStore *store, CamelFolderInfo *info, gpointer data); -void mail_folder_cache_note_store (MailFolderCache *self, CamelStore *store, CamelOperation *op, NoteDoneFunc done, gpointer data); -void mail_folder_cache_note_store_remove (MailFolderCache *self, CamelStore *store); -void mail_folder_cache_note_folder (MailFolderCache *self, CamelFolder *folder); -gboolean mail_folder_cache_get_folder_from_uri (MailFolderCache *self, const gchar *uri, CamelFolder **folderp); -gboolean mail_folder_cache_get_folder_info_flags (MailFolderCache *self, CamelFolder *folder, gint *flags); +GType mail_folder_cache_get_type (void) G_GNUC_CONST; +MailFolderCache * + mail_folder_cache_get_default (void); +void mail_folder_cache_note_store (MailFolderCache *self, + CamelStore *store, + CamelOperation *op, + NoteDoneFunc done, + gpointer data); +void mail_folder_cache_note_store_remove + (MailFolderCache *self, + CamelStore *store); +void mail_folder_cache_note_folder (MailFolderCache *self, + CamelFolder *folder); +gboolean mail_folder_cache_get_folder_from_uri + (MailFolderCache *self, + const gchar *uri, + CamelFolder **folderp); +gboolean mail_folder_cache_get_folder_info_flags + (MailFolderCache *self, + CamelFolder *folder, + gint *flags); G_END_DECLS -#endif + +#endif /* MAIL_FOLDER_CACHE_H */ diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c index 1cfe345919..149b11d4e8 100644 --- a/mail/mail-send-recv.c +++ b/mail/mail-send-recv.c @@ -984,7 +984,7 @@ mail_send_receive (GtkWindow *parent) return send_recv_dialog; } - if (!camel_session_is_online (session)) + if (!camel_session_get_online (session)) return send_recv_dialog; account = e_get_default_account (); @@ -1043,7 +1043,7 @@ auto_timeout(gpointer data) { struct _auto_data *info = data; - if (camel_session_is_online (session)) { + if (camel_session_get_online (session)) { const gchar *uri; gboolean keep_on_server; diff --git a/mail/mail-session.c b/mail/mail-session.c index f55103290e..efbe42b03c 100644 --- a/mail/mail-session.c +++ b/mail/mail-session.c @@ -549,7 +549,7 @@ main_get_filter_driver (CamelSession *session, const gchar *type, CamelException camel_filter_driver_set_system_beep_func (driver, session_system_beep, NULL); if ((!strcmp (type, E_FILTER_SOURCE_INCOMING) || !strcmp (type, E_FILTER_SOURCE_JUNKTEST)) - && camel_session_check_junk (session)) { + && camel_session_get_check_junk (session)) { /* implicit junk check as 1st rule */ camel_filter_driver_add_rule (driver, "Junk check", "(junk-test)", "(begin (set-system-flag \"junk\"))"); } diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c index a97b5bb6b6..3e9199aebe 100644 --- a/mail/mail-vfolder.c +++ b/mail/mail-vfolder.c @@ -895,20 +895,9 @@ static void context_rule_removed(ERuleContext *ctx, EFilterRule *rule) } static void -store_folder_created(CamelObject *o, gpointer event_data, gpointer data) +store_folder_deleted_cb (CamelStore *store, + CamelFolderInfo *info) { - CamelStore *store = (CamelStore *)o; - CamelFolderInfo *info = event_data; - - store = store; - info = info; -} - -static void -store_folder_deleted(CamelObject *o, gpointer event_data, gpointer data) -{ - CamelStore *store = (CamelStore *)o; - CamelFolderInfo *info = event_data; EFilterRule *rule; gchar *user; @@ -943,9 +932,10 @@ store_folder_deleted(CamelObject *o, gpointer event_data, gpointer data) } static void -store_folder_renamed(CamelObject *o, gpointer event_data, gpointer data) +store_folder_renamed_cb (CamelStore *store, + const gchar *old_name, + CamelFolderInfo *info) { - CamelRenameInfo *info = event_data; EFilterRule *rule; gchar *user; @@ -953,19 +943,19 @@ store_folder_renamed(CamelObject *o, gpointer event_data, gpointer data) /* This should be more-or-less thread-safe */ - d(printf("Folder renamed to '%s' from '%s'\n", info->new->full_name, info->old_base)); + d(printf("Folder renamed to '%s' from '%s'\n", info->full_name, old_name)); /* Folder is already renamed? */ G_LOCK (vfolder); - d(printf("Changing folder name in hash table to '%s'\n", info->new->full_name)); - if (g_hash_table_lookup_extended (vfolder_hash, info->old_base, &key, &folder)) { + d(printf("Changing folder name in hash table to '%s'\n", info->full_name)); + if (g_hash_table_lookup_extended (vfolder_hash, old_name, &key, &folder)) { const gchar *data_dir; g_hash_table_remove (vfolder_hash, key); g_free (key); - g_hash_table_insert (vfolder_hash, g_strdup(info->new->full_name), folder); + g_hash_table_insert (vfolder_hash, g_strdup(info->full_name), folder); - rule = e_rule_context_find_rule((ERuleContext *)context, info->old_base, NULL); + rule = e_rule_context_find_rule((ERuleContext *)context, old_name, NULL); if (!rule) { G_UNLOCK (vfolder); g_warning ("Rule shouldn't be NULL\n"); @@ -974,7 +964,7 @@ store_folder_renamed(CamelObject *o, gpointer event_data, gpointer data) g_signal_handlers_disconnect_matched(rule, G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA, 0, 0, NULL, rule_changed, folder); - e_filter_rule_set_name(rule, info->new->full_name); + e_filter_rule_set_name(rule, info->full_name); g_signal_connect(rule, "changed", G_CALLBACK(rule_changed), folder); data_dir = mail_session_get_data_dir (); @@ -985,7 +975,7 @@ store_folder_renamed(CamelObject *o, gpointer event_data, gpointer data) G_UNLOCK (vfolder); } else { G_UNLOCK (vfolder); - g_warning("couldn't find a vfolder rule in our table? %s", info->new->full_name); + g_warning("couldn't find a vfolder rule in our table? %s", info->full_name); } } @@ -1051,12 +1041,13 @@ vfolder_load_storage(void) camel_exception_clear (&ex); - camel_object_hook_event(vfolder_store, "folder_created", - (CamelObjectEventHookFunc)store_folder_created, NULL); - camel_object_hook_event(vfolder_store, "folder_deleted", - (CamelObjectEventHookFunc)store_folder_deleted, NULL); - camel_object_hook_event(vfolder_store, "folder_renamed", - (CamelObjectEventHookFunc)store_folder_renamed, NULL); + g_signal_connect ( + vfolder_store, "folder-deleted", + G_CALLBACK (store_folder_deleted_cb), NULL); + + g_signal_connect ( + vfolder_store, "folder-renamed", + G_CALLBACK (store_folder_renamed_cb), NULL); d(printf("got store '%s' = %p\n", storeuri, vfolder_store)); diff --git a/mail/message-list.c b/mail/message-list.c index db8dbfa176..e09ac09b77 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -201,8 +201,6 @@ static gint on_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent static gchar *filter_date (time_t date); static gchar *filter_size (gint size); -static void folder_changed (CamelObject *o, gpointer event_data, gpointer user_data); - /* note: @changes is owned/freed by the caller */ /*static void mail_do_regenerate_messagelist (MessageList *list, const gchar *search, const gchar *hideexpr, CamelFolderChangeInfo *changes);*/ static void mail_regen_list(MessageList *ml, const gchar *search, const gchar *hideexpr, CamelFolderChangeInfo *changes); @@ -210,6 +208,10 @@ static void mail_regen_cancel(MessageList *ml); static void clear_info(gchar *key, ETreePath *node, MessageList *ml); +static void folder_changed (CamelFolder *folder, + CamelFolderChangeInfo *info, + MessageList *ml); + enum { MESSAGE_SELECTED, MESSAGE_LIST_BUILT, @@ -2374,7 +2376,8 @@ message_list_destroy(GtkObject *object) message_list->uid_nodemap = NULL; } - camel_object_unhook_event(message_list->folder, "folder_changed", folder_changed, message_list); + g_signal_handlers_disconnect_by_func ( + message_list->folder, folder_changed, message_list); g_object_unref (message_list->folder); message_list->folder = NULL; } @@ -3530,22 +3533,25 @@ main_folder_changed (CamelObject *o, gpointer event_data, gpointer user_data) } static void -folder_changed (CamelObject *o, gpointer event_data, gpointer user_data) +folder_changed (CamelFolder *folder, + CamelFolderChangeInfo *info, + MessageList *ml) { CamelFolderChangeInfo *changes; - MessageList *ml = MESSAGE_LIST (user_data); if (ml->priv->destroyed) return; - if (event_data) { + if (info != NULL) { changes = camel_folder_change_info_new(); - camel_folder_change_info_cat(changes, (CamelFolderChangeInfo *)event_data); + camel_folder_change_info_cat (changes, info); } else { changes = NULL; } - mail_async_event_emit(ml->async_event, MAIL_ASYNC_GUI, (MailAsyncFunc)main_folder_changed, o, changes, user_data); + mail_async_event_emit ( + ml->async_event, MAIL_ASYNC_GUI, (MailAsyncFunc) + main_folder_changed, folder, changes, ml); } /** @@ -3599,8 +3605,8 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const g } if (message_list->folder) { - camel_object_unhook_event((CamelObject *)message_list->folder, "folder_changed", - folder_changed, message_list); + g_signal_handlers_disconnect_by_func ( + message_list->folder, folder_changed, message_list); g_object_unref (message_list->folder); message_list->folder = NULL; } @@ -3651,7 +3657,9 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const g /* Build the etree suitable for this folder */ message_list_setup_etree (message_list, outgoing); - camel_object_hook_event (folder, "folder_changed", folder_changed, message_list); + g_signal_connect ( + folder, "changed", + G_CALLBACK (folder_changed), message_list); gconf = mail_config_get_gconf_client (); hide_deleted = !gconf_client_get_bool (gconf, "/apps/evolution/mail/display/show_deleted", NULL); diff --git a/plugins/itip-formatter/itip-formatter.c b/plugins/itip-formatter/itip-formatter.c index 90f5b9ae27..c2e38464ec 100644 --- a/plugins/itip-formatter/itip-formatter.c +++ b/plugins/itip-formatter/itip-formatter.c @@ -2017,7 +2017,7 @@ view_response_cb (GtkWidget *widget, ItipViewResponse response, gpointer data) camel_folder_summary_remove_uid(pitip->folder->summary, pitip->uid); camel_folder_change_info_remove_uid (changes, pitip->uid); } - camel_object_trigger_event (pitip->folder, "folder_changed", changes); + camel_folder_changed (pitip->folder, changes); camel_folder_change_info_free (changes); } } diff --git a/widgets/misc/e-attachment.c b/widgets/misc/e-attachment.c index ba2c705e10..ba4e4004b3 100644 --- a/widgets/misc/e-attachment.c +++ b/widgets/misc/e-attachment.c @@ -784,11 +784,11 @@ attachment_class_init (EAttachmentClass *class) g_object_class_install_property ( object_class, PROP_MIME_PART, - g_param_spec_boxed ( + g_param_spec_object ( "mime-part", "MIME Part", NULL, - E_TYPE_CAMEL_OBJECT, + CAMEL_TYPE_MIME_PART, G_PARAM_READWRITE)); g_object_class_install_property ( -- cgit v1.2.3