diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2010-10-07 11:38:52 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2010-10-13 01:58:59 +0800 |
commit | a06e4484b8df804124b5bcf88d94dec5acfba270 (patch) | |
tree | 4fa42793d7dc461f2b3767296d76592182c48222 /mail/em-folder-tree.c | |
parent | 5e0758bb6934a7859b1d8a247c8fb21c156772cf (diff) | |
download | gsoc2013-evolution-a06e4484b8df804124b5bcf88d94dec5acfba270.tar.gz gsoc2013-evolution-a06e4484b8df804124b5bcf88d94dec5acfba270.tar.zst gsoc2013-evolution-a06e4484b8df804124b5bcf88d94dec5acfba270.zip |
Give MailSession a permanent home.
Global variables in shared libraries are a bad idea. EMailBackend now
owns the MailSession instance, which is actually now EMailSession.
Move the blocking utility functions in mail-tools.c to e-mail-session.c
and add asynchronous variants. Same approach as Camel.
Replace EMailReader.get_shell_backend() with EMailReader.get_backend(),
which returns an EMailBackend. Easier access to the EMailSession.
Diffstat (limited to 'mail/em-folder-tree.c')
-rw-r--r-- | mail/em-folder-tree.c | 118 |
1 files changed, 106 insertions, 12 deletions
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c index db23df4969..4441d391a6 100644 --- a/mail/em-folder-tree.c +++ b/mail/em-folder-tree.c @@ -64,6 +64,7 @@ #include "em-event.h" #include "e-mail-local.h" +#include "e-mail-session.h" /* backward-compatibility cruft */ #include "e-util/gtk-compat.h" @@ -82,6 +83,8 @@ struct _selected_uri { }; struct _EMFolderTreePrivate { + EMailSession *session; + /* selected_uri structures of each path pending selection. */ GSList *select_uris; @@ -120,6 +123,11 @@ struct _EMFolderTreePrivate { }; enum { + PROP_0, + PROP_SESSION +}; + +enum { FOLDER_ACTIVATED, /* aka double-clicked or user hit enter */ FOLDER_SELECTED, POPUP_EVENT, @@ -159,7 +167,6 @@ static GdkAtom drop_atoms[NUM_DROP_TYPES]; static guint signals[LAST_SIGNAL] = { 0 }; -extern CamelSession *session; extern CamelStore *vfolder_store; struct _folder_tree_selection_data { @@ -442,6 +449,7 @@ folder_tree_expand_node (const gchar *key, GtkTreeModel *model; GtkTreePath *path; EAccount *account; + EMailSession *session; CamelStore *store; const gchar *p; gchar *uid; @@ -460,9 +468,11 @@ folder_tree_expand_node (const gchar *key, tree_view = GTK_TREE_VIEW (folder_tree); model = gtk_tree_view_get_model (tree_view); + session = em_folder_tree_get_session (folder_tree); + if ((account = e_get_account_by_uid (uid)) && account->enabled) { store = (CamelStore *) camel_session_get_service ( - session, account->source->url, + CAMEL_SESSION (session), account->source->url, CAMEL_PROVIDER_STORE, NULL); if (store == NULL) @@ -699,6 +709,51 @@ exit: } static void +folder_tree_set_session (EMFolderTree *folder_tree, + EMailSession *session) +{ + g_return_if_fail (CAMEL_IS_SESSION (session)); + g_return_if_fail (folder_tree->priv->session == NULL); + + folder_tree->priv->session = g_object_ref (session); +} + +static void +folder_tree_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_SESSION: + folder_tree_set_session ( + EM_FOLDER_TREE (object), + g_value_get_object (value)); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +folder_tree_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_SESSION: + g_value_set_object ( + value, + em_folder_tree_get_session ( + EM_FOLDER_TREE (object))); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void folder_tree_dispose (GObject *object) { EMFolderTreePrivate *priv; @@ -725,6 +780,11 @@ folder_tree_dispose (GObject *object) priv->autoexpand_id = 0; } + if (priv->session != NULL) { + g_object_unref (priv->session); + priv->session = NULL; + } + if (priv->text_renderer != NULL) { g_object_unref (priv->text_renderer); priv->text_renderer = NULL; @@ -959,6 +1019,8 @@ folder_tree_class_init (EMFolderTreeClass *class) g_type_class_add_private (class, sizeof (EMFolderTreePrivate)); object_class = G_OBJECT_CLASS (class); + object_class->set_property = folder_tree_set_property; + object_class->get_property = folder_tree_get_property; object_class->dispose = folder_tree_dispose; object_class->finalize = folder_tree_finalize; @@ -972,6 +1034,17 @@ folder_tree_class_init (EMFolderTreeClass *class) tree_view_class->test_collapse_row = folder_tree_test_collapse_row; tree_view_class->row_expanded = folder_tree_row_expanded; + g_object_class_install_property ( + object_class, + PROP_SESSION, + g_param_spec_object ( + "session", + NULL, + NULL, + E_TYPE_MAIL_SESSION, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY)); + signals[FOLDER_SELECTED] = g_signal_new ( "folder-selected", G_OBJECT_CLASS_TYPE (object_class), @@ -1451,9 +1524,20 @@ em_folder_tree_get_type (void) } GtkWidget * -em_folder_tree_new (void) +em_folder_tree_new (EMailSession *session) +{ + g_return_val_if_fail (E_IS_MAIL_SESSION (session), NULL); + + return g_object_new ( + EM_TYPE_FOLDER_TREE, "session", session, NULL); +} + +EMailSession * +em_folder_tree_get_session (EMFolderTree *folder_tree) { - return g_object_new (EM_TYPE_FOLDER_TREE, NULL); + g_return_val_if_fail (EM_IS_FOLDER_TREE (folder_tree), NULL); + + return folder_tree->priv->session; } static void @@ -1597,6 +1681,7 @@ struct _DragDataReceivedAsync { /* Only selection->data and selection->length are valid */ GtkSelectionData *selection; + EMailSession *session; CamelStore *store; gchar *full_name; guint32 action; @@ -1619,8 +1704,10 @@ folder_tree_drop_folder (struct _DragDataReceivedAsync *m) d(printf(" * Drop folder '%s' onto '%s'\n", data, m->full_name)); - if (!(folder = mail_tool_uri_to_folder ( - (gchar *)data, 0, m->base.cancellable, &m->base.error))) + folder = e_mail_session_uri_to_folder_sync ( + m->session, (gchar *) data, 0, + m->base.cancellable, &m->base.error); + if (folder == NULL) return; full_name = camel_folder_get_full_name (folder); @@ -1690,7 +1777,7 @@ folder_tree_drop_async__exec (struct _DragDataReceivedAsync *m) case DND_DROP_TYPE_UID_LIST: /* import a list of uids from another evo folder */ em_utils_selection_get_uidlist ( - m->selection, folder, m->move, + m->selection, m->session, folder, m->move, m->base.cancellable, &m->base.error); m->moved = m->move && (m->base.error == NULL); break; @@ -1712,6 +1799,7 @@ folder_tree_drop_async__exec (struct _DragDataReceivedAsync *m) static void folder_tree_drop_async__free (struct _DragDataReceivedAsync *m) { + g_object_unref (m->session); g_object_unref (m->context); g_object_unref (m->store); g_free (m->full_name); @@ -1747,6 +1835,7 @@ tree_drag_data_received (GtkWidget *widget, GtkTreeModel *model; GtkTreeView *tree_view; GtkTreePath *dest_path; + EMailSession *session; struct _DragDataReceivedAsync *m; gboolean is_store; CamelStore *store; @@ -1756,6 +1845,8 @@ tree_drag_data_received (GtkWidget *widget, tree_view = GTK_TREE_VIEW (folder_tree); model = gtk_tree_view_get_model (tree_view); + session = em_folder_tree_get_session (folder_tree); + if (!gtk_tree_view_get_dest_row_at_pos (tree_view, x, y, &dest_path, &pos)) return; @@ -1788,10 +1879,9 @@ tree_drag_data_received (GtkWidget *widget, } m = mail_msg_new (&folder_tree_drop_async_info); - m->context = context; - g_object_ref (context); - m->store = store; - g_object_ref (store); + m->session = g_object_ref (session); + m->context = g_object_ref (context); + m->store = g_object_ref (store); m->full_name = full_name; m->action = gdk_drag_context_get_selected_action (context); m->info = info; @@ -2416,8 +2506,11 @@ em_folder_tree_set_selected_list (EMFolderTree *folder_tree, gboolean expand_only) { EMFolderTreePrivate *priv = folder_tree->priv; + EMailSession *session; gint id = 0; + session = em_folder_tree_get_session (folder_tree); + /* FIXME: need to remove any currently selected stuff? */ if (!expand_only) folder_tree_clear_selected_list (folder_tree); @@ -2428,7 +2521,8 @@ em_folder_tree_set_selected_list (EMFolderTree *folder_tree, u->uri = g_strdup (list->data); u->store = (CamelStore *) camel_session_get_service ( - session, u->uri, CAMEL_PROVIDER_STORE, NULL); + CAMEL_SESSION (session), u->uri, + CAMEL_PROVIDER_STORE, NULL); url = camel_url_new (u->uri, NULL); if (u->store == NULL || url == NULL) { |