diff options
Diffstat (limited to 'e-util')
-rw-r--r-- | e-util/e-name-selector-dialog.c | 125 | ||||
-rw-r--r-- | e-util/e-name-selector-dialog.h | 7 | ||||
-rw-r--r-- | e-util/e-name-selector-entry.c | 120 | ||||
-rw-r--r-- | e-util/e-name-selector-entry.h | 11 | ||||
-rw-r--r-- | e-util/e-name-selector-list.c | 8 | ||||
-rw-r--r-- | e-util/e-name-selector-list.h | 4 | ||||
-rw-r--r-- | e-util/e-name-selector.c | 120 | ||||
-rw-r--r-- | e-util/e-name-selector.h | 9 | ||||
-rw-r--r-- | e-util/test-name-selector.c | 33 |
9 files changed, 251 insertions, 186 deletions
diff --git a/e-util/e-name-selector-dialog.c b/e-util/e-name-selector-dialog.c index fd72818612..e40c673284 100644 --- a/e-util/e-name-selector-dialog.c +++ b/e-util/e-name-selector-dialog.c @@ -33,7 +33,7 @@ #include <libebook/libebook.h> #include <libebackend/libebackend.h> -#include "e-source-combo-box.h" +#include "e-client-combo-box.h" #include "e-destination-store.h" #include "e-contact-store.h" #include "e-name-selector-dialog.h" @@ -61,7 +61,7 @@ typedef struct { } SelData; struct _ENameSelectorDialogPrivate { - ESourceRegistry *registry; + EClientCache *client_cache; ENameSelectorModel *name_selector_model; GtkTreeModelSort *contact_sort; GCancellable *cancellable; @@ -83,11 +83,12 @@ struct _ENameSelectorDialogPrivate { enum { PROP_0, - PROP_REGISTRY + PROP_CLIENT_CACHE }; static void search_changed (ENameSelectorDialog *name_selector_dialog); -static void source_changed (ENameSelectorDialog *name_selector_dialog, ESourceComboBox *source_combo_box); +static void source_changed (ENameSelectorDialog *name_selector_dialog, + EClientComboBox *combo_box); static void transfer_button_clicked (ENameSelectorDialog *name_selector_dialog, GtkButton *transfer_button); static void contact_selection_changed (ENameSelectorDialog *name_selector_dialog); static void setup_name_selector_model (ENameSelectorDialog *name_selector_dialog); @@ -146,13 +147,13 @@ name_selector_dialog_populate_categories (ENameSelectorDialog *name_selector_dia } static void -name_selector_dialog_set_registry (ENameSelectorDialog *name_selector_dialog, - ESourceRegistry *registry) +name_selector_dialog_set_client_cache (ENameSelectorDialog *name_selector_dialog, + EClientCache *client_cache) { - g_return_if_fail (E_IS_SOURCE_REGISTRY (registry)); - g_return_if_fail (name_selector_dialog->priv->registry == NULL); + g_return_if_fail (E_IS_CLIENT_CACHE (client_cache)); + g_return_if_fail (name_selector_dialog->priv->client_cache == NULL); - name_selector_dialog->priv->registry = g_object_ref (registry); + name_selector_dialog->priv->client_cache = g_object_ref (client_cache); } static void @@ -162,8 +163,8 @@ name_selector_dialog_set_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_REGISTRY: - name_selector_dialog_set_registry ( + case PROP_CLIENT_CACHE: + name_selector_dialog_set_client_cache ( E_NAME_SELECTOR_DIALOG (object), g_value_get_object (value)); return; @@ -179,10 +180,10 @@ name_selector_dialog_get_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_REGISTRY: - g_value_set_object ( + case PROP_CLIENT_CACHE: + g_value_take_object ( value, - e_name_selector_dialog_get_registry ( + e_name_selector_dialog_ref_client_cache ( E_NAME_SELECTOR_DIALOG (object))); return; } @@ -200,10 +201,7 @@ name_selector_dialog_dispose (GObject *object) remove_books (E_NAME_SELECTOR_DIALOG (object)); shutdown_name_selector_model (E_NAME_SELECTOR_DIALOG (object)); - if (priv->registry != NULL) { - g_object_unref (priv->registry); - priv->registry = NULL; - } + g_clear_object (&priv->client_cache); /* Chain up to parent's dispose() method. */ G_OBJECT_CLASS (e_name_selector_dialog_parent_class)->dispose (object); @@ -235,6 +233,7 @@ name_selector_dialog_constructed (GObject *object) GtkTreeViewColumn *column; GtkCellRenderer *cell_renderer; GtkTreeSelection *selection; + ESourceRegistry *registry; ESource *source; gchar *tmp_str; GtkWidget *name_selector_grid; @@ -259,7 +258,7 @@ name_selector_dialog_constructed (GObject *object) GtkWidget *source_tree_view; GtkWidget *destination_vgrid; GtkWidget *status_message; - GtkWidget *source_combo; + GtkWidget *client_combo; const gchar *extension_name; priv = E_NAME_SELECTOR_DIALOG_GET_PRIVATE (object); @@ -514,18 +513,22 @@ name_selector_dialog_constructed (GObject *object) /* Create source menu */ extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK; - source_combo = e_source_combo_box_new (priv->registry, extension_name); + client_combo = e_client_combo_box_new ( + priv->client_cache, extension_name); g_signal_connect_swapped ( - source_combo, "changed", + client_combo, "changed", G_CALLBACK (source_changed), object); - source_changed (E_NAME_SELECTOR_DIALOG (object), E_SOURCE_COMBO_BOX (source_combo)); + source_changed ( + E_NAME_SELECTOR_DIALOG (object), + E_CLIENT_COMBO_BOX (client_combo)); - gtk_label_set_mnemonic_widget (GTK_LABEL (AddressBookLabel), source_combo); - gtk_widget_show (source_combo); - gtk_widget_set_hexpand (source_combo, TRUE); - gtk_widget_set_halign (source_combo, GTK_ALIGN_FILL); - gtk_container_add (GTK_CONTAINER (source_menu_hgrid), source_combo); + gtk_label_set_mnemonic_widget ( + GTK_LABEL (AddressBookLabel), client_combo); + gtk_widget_show (client_combo); + gtk_widget_set_hexpand (client_combo, TRUE); + gtk_widget_set_halign (client_combo, GTK_ALIGN_FILL); + gtk_container_add (GTK_CONTAINER (source_menu_hgrid), client_combo); name_selector_dialog_populate_categories ( E_NAME_SELECTOR_DIALOG (object)); @@ -538,10 +541,12 @@ name_selector_dialog_constructed (GObject *object) /* Display initial source */ - source = e_source_registry_ref_default_address_book (priv->registry); + registry = e_client_cache_ref_registry (priv->client_cache); + source = e_source_registry_ref_default_address_book (registry); e_source_combo_box_set_active ( - E_SOURCE_COMBO_BOX (source_combo), source); + E_SOURCE_COMBO_BOX (client_combo), source); g_object_unref (source); + g_object_unref (registry); /* Set up dialog defaults */ @@ -592,14 +597,19 @@ e_name_selector_dialog_class_init (ENameSelectorDialogClass *class) object_class->finalize = name_selector_dialog_finalize; object_class->constructed = name_selector_dialog_constructed; + /** + * ENameSelectorDialog:client-cache: + * + * Cache of shared #EClient instances. + **/ g_object_class_install_property ( object_class, - PROP_REGISTRY, + PROP_CLIENT_CACHE, g_param_spec_object ( - "registry", - "Registry", - "Data source registry", - E_TYPE_SOURCE_REGISTRY, + "client-cache", + "Client Cache", + "Cache of shared EClient instances", + E_TYPE_CLIENT_CACHE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); @@ -614,40 +624,42 @@ e_name_selector_dialog_init (ENameSelectorDialog *name_selector_dialog) /** * e_name_selector_dialog_new: - * @registry: an #ESourceRegistry + * @client_cache: an #EClientCache * * Creates a new #ENameSelectorDialog. * * Returns: A new #ENameSelectorDialog. **/ ENameSelectorDialog * -e_name_selector_dialog_new (ESourceRegistry *registry) +e_name_selector_dialog_new (EClientCache *client_cache) { - g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL); + g_return_val_if_fail (E_IS_CLIENT_CACHE (client_cache), NULL); return g_object_new ( E_TYPE_NAME_SELECTOR_DIALOG, - "registry", registry, NULL); + "client-cache", client_cache, NULL); } /** - * e_name_selector_dialog_get_registry: + * e_name_selector_dialog_ref_client_cache: * @name_selector_dialog: an #ENameSelectorDialog * - * Returns the #ESourceRegistry that was passed to - * e_name_selector_dialog_new(). + * Returns the #EClientCache passed to e_name_selector_dialog_new(). + * + * The returned #EClientCache is referenced for thread-safety and must be + * unreferenced with g_object_unref() when finished with it. * - * Returns: the #ESourceRegistry + * Returns: an #EClientCache * - * Since: 3.6 + * Since: 3.8 **/ -ESourceRegistry * -e_name_selector_dialog_get_registry (ENameSelectorDialog *name_selector_dialog) +EClientCache * +e_name_selector_dialog_ref_client_cache (ENameSelectorDialog *name_selector_dialog) { g_return_val_if_fail ( E_IS_NAME_SELECTOR_DIALOG (name_selector_dialog), NULL); - return name_selector_dialog->priv->registry; + return g_object_ref (name_selector_dialog->priv->client_cache); } /* --------- * @@ -1133,9 +1145,9 @@ stop_client_view_cb (EContactStore *store, } static void -book_client_connect_cb (GObject *source_object, - GAsyncResult *result, - gpointer user_data) +name_selector_dialog_get_client_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) { ENameSelectorDialog *name_selector_dialog = user_data; EClient *client; @@ -1144,7 +1156,8 @@ book_client_connect_cb (GObject *source_object, ENameSelectorModel *model; GError *error = NULL; - client = e_book_client_connect_finish (result, &error); + client = e_client_combo_box_get_client_finish ( + E_CLIENT_COMBO_BOX (source_object), result, &error); /* Sanity check. */ g_return_if_fail ( @@ -1181,13 +1194,13 @@ book_client_connect_cb (GObject *source_object, static void source_changed (ENameSelectorDialog *name_selector_dialog, - ESourceComboBox *source_combo_box) + EClientComboBox *combo_box) { GCancellable *cancellable; ESource *source; gpointer parent; - source = e_source_combo_box_ref_active (source_combo_box); + source = e_source_combo_box_ref_active (E_SOURCE_COMBO_BOX (combo_box)); parent = gtk_widget_get_toplevel (GTK_WIDGET (name_selector_dialog)); parent = gtk_widget_is_toplevel (parent) ? parent : NULL; @@ -1201,10 +1214,10 @@ source_changed (ENameSelectorDialog *name_selector_dialog, cancellable = g_cancellable_new (); name_selector_dialog->priv->cancellable = cancellable; - /* Connect to the selected book. */ - e_book_client_connect ( - source, cancellable, - book_client_connect_cb, + /* Connect to the selected source. */ + e_client_combo_box_get_client ( + combo_box, source, cancellable, + name_selector_dialog_get_client_cb, g_object_ref (name_selector_dialog)); g_object_unref (source); diff --git a/e-util/e-name-selector-dialog.h b/e-util/e-name-selector-dialog.h index 69bd969704..c5e8d65b34 100644 --- a/e-util/e-name-selector-dialog.h +++ b/e-util/e-name-selector-dialog.h @@ -29,8 +29,8 @@ #define E_NAME_SELECTOR_DIALOG_H #include <gtk/gtk.h> -#include <libedataserver/libedataserver.h> +#include <e-util/e-client-cache.h> #include <e-util/e-contact-store.h> #include <e-util/e-name-selector-model.h> @@ -70,9 +70,8 @@ struct _ENameSelectorDialogClass { GType e_name_selector_dialog_get_type (void) G_GNUC_CONST; ENameSelectorDialog * - e_name_selector_dialog_new (ESourceRegistry *registry); -ESourceRegistry * - e_name_selector_dialog_get_registry + e_name_selector_dialog_new (EClientCache *client_cache); +EClientCache * e_name_selector_dialog_ref_client_cache (ENameSelectorDialog *name_selector_dialog); ENameSelectorModel * e_name_selector_dialog_peek_model diff --git a/e-util/e-name-selector-entry.c b/e-util/e-name-selector-entry.c index a8a1b23cdb..78b82f2cdb 100644 --- a/e-util/e-name-selector-entry.c +++ b/e-util/e-name-selector-entry.c @@ -35,8 +35,7 @@ ((obj), E_TYPE_NAME_SELECTOR_ENTRY, ENameSelectorEntryPrivate)) struct _ENameSelectorEntryPrivate { - - ESourceRegistry *registry; + EClientCache *client_cache; gint minimum_query_length; gboolean show_address; @@ -70,7 +69,7 @@ struct _ENameSelectorEntryPrivate { enum { PROP_0, - PROP_REGISTRY, + PROP_CLIENT_CACHE, PROP_MINIMUM_QUERY_LENGTH, PROP_SHOW_ADDRESS }; @@ -119,8 +118,8 @@ name_selector_entry_set_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_REGISTRY: - e_name_selector_entry_set_registry ( + case PROP_CLIENT_CACHE: + e_name_selector_entry_set_client_cache ( E_NAME_SELECTOR_ENTRY (object), g_value_get_object (value)); return; @@ -148,10 +147,10 @@ name_selector_entry_get_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_REGISTRY: - g_value_set_object ( + case PROP_CLIENT_CACHE: + g_value_take_object ( value, - e_name_selector_entry_get_registry ( + e_name_selector_entry_ref_client_cache ( E_NAME_SELECTOR_ENTRY (object))); return; @@ -180,9 +179,9 @@ name_selector_entry_dispose (GObject *object) priv = E_NAME_SELECTOR_ENTRY_GET_PRIVATE (object); - if (priv->registry != NULL) { - g_object_unref (priv->registry); - priv->registry = NULL; + if (priv->client_cache != NULL) { + g_object_unref (priv->client_cache); + priv->client_cache = NULL; } if (priv->attr_list != NULL) { @@ -327,14 +326,19 @@ e_name_selector_entry_class_init (ENameSelectorEntryClass *class) widget_class->realize = name_selector_entry_realize; widget_class->drag_data_received = name_selector_entry_drag_data_received; + /** + * ENameSelectorEntry:client-cache: + * + * Cache of shared #EClient instances. + **/ g_object_class_install_property ( object_class, - PROP_REGISTRY, + PROP_CLIENT_CACHE, g_param_spec_object ( - "registry", - "Registry", - "Data source registry", - E_TYPE_SOURCE_REGISTRY, + "client-cache", + "Client Cache", + "Cache of shared EClient instances", + E_TYPE_CLIENT_CACHE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); @@ -2219,16 +2223,17 @@ setup_contact_store (ENameSelectorEntry *name_selector_entry) } static void -book_client_connect_cb (GObject *source_object, - GAsyncResult *result, - gpointer user_data) +name_selector_entry_get_client_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) { EContactStore *contact_store = user_data; EBookClient *book_client; EClient *client; GError *error = NULL; - client = e_book_client_connect_finish (result, &error); + client = e_client_cache_get_client_finish ( + E_CLIENT_CACHE (source_object), result, &error); /* Sanity check. */ g_return_if_fail ( @@ -2259,6 +2264,7 @@ book_client_connect_cb (GObject *source_object, static void setup_default_contact_store (ENameSelectorEntry *name_selector_entry) { + EClientCache *client_cache; ESourceRegistry *registry; EContactStore *contact_store; GList *list, *iter; @@ -2272,10 +2278,8 @@ setup_default_contact_store (ENameSelectorEntry *name_selector_entry) name_selector_entry->priv->contact_store = contact_store; extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK; - registry = e_name_selector_entry_get_registry (name_selector_entry); - - /* An ESourceRegistry should have been set by now. */ - g_return_if_fail (registry != NULL); + client_cache = e_name_selector_entry_ref_client_cache (name_selector_entry); + registry = e_client_cache_ref_registry (client_cache); list = e_source_registry_list_sources (registry, extension_name); @@ -2302,14 +2306,19 @@ setup_default_contact_store (ENameSelectorEntry *name_selector_entry) &name_selector_entry->priv->cancellables, cancellable); - e_book_client_connect ( - source, cancellable, - book_client_connect_cb, + e_client_cache_get_client ( + client_cache, source, + E_SOURCE_EXTENSION_ADDRESS_BOOK, + cancellable, + name_selector_entry_get_client_cb, g_object_ref (contact_store)); } g_list_free_full (list, (GDestroyNotify) g_object_unref); + g_object_unref (registry); + g_object_unref (client_cache); + setup_contact_store (name_selector_entry); } @@ -3308,73 +3317,80 @@ e_name_selector_entry_init (ENameSelectorEntry *name_selector_entry) /** * e_name_selector_entry_new: + * @client_cache: an #EClientCache * * Creates a new #ENameSelectorEntry. * * Returns: A new #ENameSelectorEntry. **/ -ENameSelectorEntry * -e_name_selector_entry_new (ESourceRegistry *registry) +GtkWidget * +e_name_selector_entry_new (EClientCache *client_cache) { - g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL); + g_return_val_if_fail (E_IS_CLIENT_CACHE (client_cache), NULL); return g_object_new ( E_TYPE_NAME_SELECTOR_ENTRY, - "registry", registry, NULL); + "client-cache", client_cache, NULL); } /** - * e_name_selector_entry_get_registry: + * e_name_selector_entry_ref_client_cache: * @name_selector_entry: an #ENameSelectorEntry * - * Returns the #ESourceRegistry used to query address books. + * Returns the #EClientCache passed to e_name_selector_entry_new(). * - * Returns: the #ESourceRegistry, or %NULL + * The returned #EClientCache is referenced for thread-safety and must be + * unreferenced with g_object_unref() when finished with it. * - * Since: 3.6 + * Returns: an #EClientCache + * + * Since: 3.8 **/ -ESourceRegistry * -e_name_selector_entry_get_registry (ENameSelectorEntry *name_selector_entry) +EClientCache * +e_name_selector_entry_ref_client_cache (ENameSelectorEntry *name_selector_entry) { g_return_val_if_fail ( E_IS_NAME_SELECTOR_ENTRY (name_selector_entry), NULL); - return name_selector_entry->priv->registry; + if (name_selector_entry->priv->client_cache == NULL) + return NULL; + + return g_object_ref (name_selector_entry->priv->client_cache); } /** - * e_name_selector_entry_set_registry: + * e_name_selector_entry_set_client_cache: * @name_selector_entry: an #ENameSelectorEntry - * @registry: an #ESourceRegistry + * @client_cache: an #EClientCache * - * Sets the #ESourceRegistry used to query address books. + * Sets the #EClientCache used to query address books. * * This function is intended for cases where @name_selector_entry is - * instantiated by a #GtkBuilder and has to be given an #EsourceRegistry + * instantiated by a #GtkBuilder and has to be given an #EClientCache * after it is fully constructed. * * Since: 3.6 **/ void -e_name_selector_entry_set_registry (ENameSelectorEntry *name_selector_entry, - ESourceRegistry *registry) +e_name_selector_entry_set_client_cache (ENameSelectorEntry *name_selector_entry, + EClientCache *client_cache) { g_return_if_fail (E_IS_NAME_SELECTOR_ENTRY (name_selector_entry)); - if (name_selector_entry->priv->registry == registry) + if (client_cache == name_selector_entry->priv->client_cache) return; - if (registry != NULL) { - g_return_if_fail (E_IS_SOURCE_REGISTRY (registry)); - g_object_ref (registry); + if (client_cache != NULL) { + g_return_if_fail (E_IS_CLIENT_CACHE (client_cache)); + g_object_ref (client_cache); } - if (name_selector_entry->priv->registry != NULL) - g_object_unref (name_selector_entry->priv->registry); + if (name_selector_entry->priv->client_cache != NULL) + g_object_unref (name_selector_entry->priv->client_cache); - name_selector_entry->priv->registry = registry; + name_selector_entry->priv->client_cache = client_cache; - g_object_notify (G_OBJECT (name_selector_entry), "registry"); + g_object_notify (G_OBJECT (name_selector_entry), "client-cache"); } /** diff --git a/e-util/e-name-selector-entry.h b/e-util/e-name-selector-entry.h index 6aa0943e56..ce48aa6b64 100644 --- a/e-util/e-name-selector-entry.h +++ b/e-util/e-name-selector-entry.h @@ -31,6 +31,7 @@ #include <gtk/gtk.h> #include <libebook/libebook.h> +#include <e-util/e-client-cache.h> #include <e-util/e-contact-store.h> #include <e-util/e-destination-store.h> #include <e-util/e-tree-model-generator.h> @@ -75,14 +76,12 @@ struct _ENameSelectorEntryClass { }; GType e_name_selector_entry_get_type (void) G_GNUC_CONST; -ENameSelectorEntry * - e_name_selector_entry_new (ESourceRegistry *registry); -ESourceRegistry * - e_name_selector_entry_get_registry +GtkWidget * e_name_selector_entry_new (EClientCache *client_cache); +EClientCache * e_name_selector_entry_ref_client_cache (ENameSelectorEntry *name_selector_entry); -void e_name_selector_entry_set_registry +void e_name_selector_entry_set_client_cache (ENameSelectorEntry *name_selector_entry, - ESourceRegistry *registry); + EClientCache *client_cache); gint e_name_selector_entry_get_minimum_query_length (ENameSelectorEntry *name_selector_entry); void e_name_selector_entry_set_minimum_query_length diff --git a/e-util/e-name-selector-list.c b/e-util/e-name-selector-list.c index 180dfbf986..52516a5621 100644 --- a/e-util/e-name-selector-list.c +++ b/e-util/e-name-selector-list.c @@ -780,12 +780,12 @@ e_name_selector_list_init (ENameSelectorList *list) } -ENameSelectorList * -e_name_selector_list_new (ESourceRegistry *registry) +GtkWidget * +e_name_selector_list_new (EClientCache *client_cache) { - g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL); + g_return_val_if_fail (E_IS_CLIENT_CACHE (client_cache), NULL); return g_object_new ( E_TYPE_NAME_SELECTOR_LIST, - "registry", registry, NULL); + "client-cache", client_cache, NULL); } diff --git a/e-util/e-name-selector-list.h b/e-util/e-name-selector-list.h index 28f7451592..008f991001 100644 --- a/e-util/e-name-selector-list.h +++ b/e-util/e-name-selector-list.h @@ -32,6 +32,7 @@ #include <gtk/gtk.h> #include <libebook/libebook.h> +#include <e-util/e-client-cache.h> #include <e-util/e-contact-store.h> #include <e-util/e-destination-store.h> #include <e-util/e-tree-model-generator.h> @@ -72,8 +73,7 @@ struct _ENameSelectorListClass { }; GType e_name_selector_list_get_type (void) G_GNUC_CONST; -ENameSelectorList * - e_name_selector_list_new (ESourceRegistry *registry); +GtkWidget * e_name_selector_list_new (EClientCache *client_cache); void e_name_selector_list_expand_clicked (ENameSelectorList *list); diff --git a/e-util/e-name-selector.c b/e-util/e-name-selector.c index 38ade81fb3..f6e6658731 100644 --- a/e-util/e-name-selector.c +++ b/e-util/e-name-selector.c @@ -50,7 +50,7 @@ typedef struct { } SourceBook; struct _ENameSelectorPrivate { - ESourceRegistry *registry; + EClientCache *client_cache; ENameSelectorModel *model; ENameSelectorDialog *dialog; @@ -63,7 +63,7 @@ struct _ENameSelectorPrivate { enum { PROP_0, - PROP_REGISTRY + PROP_CLIENT_CACHE }; G_DEFINE_TYPE (ENameSelector, e_name_selector, G_TYPE_OBJECT) @@ -90,9 +90,9 @@ reset_pointer_cb (gpointer data, } static void -name_selector_book_client_connect_cb (GObject *source_object, - GAsyncResult *result, - gpointer user_data) +name_selector_get_client_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) { ENameSelector *name_selector = user_data; EBookClient *book_client; @@ -102,7 +102,8 @@ name_selector_book_client_connect_cb (GObject *source_object, guint ii; GError *error = NULL; - client = e_book_client_connect_finish (result, &error); + client = e_client_cache_get_client_finish ( + E_CLIENT_CACHE (source_object), result, &error); /* Sanity check. */ g_return_if_fail ( @@ -160,6 +161,7 @@ name_selector_book_client_connect_cb (GObject *source_object, void e_name_selector_load_books (ENameSelector *name_selector) { + EClientCache *client_cache; ESourceRegistry *registry; GList *list, *iter; const gchar *extension_name; @@ -167,7 +169,9 @@ e_name_selector_load_books (ENameSelector *name_selector) g_return_if_fail (E_IS_NAME_SELECTOR (name_selector)); extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK; - registry = e_name_selector_get_registry (name_selector); + client_cache = e_name_selector_ref_client_cache (name_selector); + registry = e_client_cache_ref_registry (client_cache); + list = e_source_registry_list_sources (registry, extension_name); for (iter = list; iter != NULL; iter = g_list_next (iter)) { @@ -187,13 +191,21 @@ e_name_selector_load_books (ENameSelector *name_selector) if (!e_source_autocomplete_get_include_me (extension)) continue; - e_book_client_connect ( - source, name_selector->priv->cancellable, - name_selector_book_client_connect_cb, + /* FIXME GCancellable is only to be used for one + * operation at a time, not for multiple + * concurrent operations like this. */ + e_client_cache_get_client ( + client_cache, source, + E_SOURCE_EXTENSION_ADDRESS_BOOK, + name_selector->priv->cancellable, + name_selector_get_client_cb, g_object_ref (name_selector)); } g_list_free_full (list, (GDestroyNotify) g_object_unref); + + g_object_unref (registry); + g_object_unref (client_cache); } /** @@ -215,13 +227,13 @@ e_name_selector_cancel_loading (ENameSelector *name_selector) } static void -name_selector_set_registry (ENameSelector *name_selector, - ESourceRegistry *registry) +name_selector_set_client_cache (ENameSelector *name_selector, + EClientCache *client_cache) { - g_return_if_fail (E_IS_SOURCE_REGISTRY (registry)); - g_return_if_fail (name_selector->priv->registry == NULL); + g_return_if_fail (E_IS_CLIENT_CACHE (client_cache)); + g_return_if_fail (name_selector->priv->client_cache == NULL); - name_selector->priv->registry = g_object_ref (registry); + name_selector->priv->client_cache = g_object_ref (client_cache); } static void @@ -231,8 +243,8 @@ name_selector_set_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_REGISTRY: - name_selector_set_registry ( + case PROP_CLIENT_CACHE: + name_selector_set_client_cache ( E_NAME_SELECTOR (object), g_value_get_object (value)); return; @@ -248,10 +260,10 @@ name_selector_get_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_REGISTRY: - g_value_set_object ( + case PROP_CLIENT_CACHE: + g_value_take_object ( value, - e_name_selector_get_registry ( + e_name_selector_ref_client_cache ( E_NAME_SELECTOR (object))); return; } @@ -337,14 +349,19 @@ e_name_selector_class_init (ENameSelectorClass *class) object_class->dispose = name_selector_dispose; object_class->finalize = name_selector_finalize; + /** + * ENameSelector:client-cache: + * + * Cache of shared #EClient instances. + **/ g_object_class_install_property ( object_class, - PROP_REGISTRY, + PROP_CLIENT_CACHE, g_param_spec_object ( - "registry", - "Registry", - "Data source registry", - E_TYPE_SOURCE_REGISTRY, + "client-cache", + "Client Cache", + "Cache of shared EClient instances", + E_TYPE_CLIENT_CACHE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); @@ -369,38 +386,41 @@ e_name_selector_init (ENameSelector *name_selector) /** * e_name_selector_new: - * @registry: an #ESourceRegistry + * @client_cache: an #EClientCache * * Creates a new #ENameSelector. * * Returns: A new #ENameSelector. **/ ENameSelector * -e_name_selector_new (ESourceRegistry *registry) +e_name_selector_new (EClientCache *client_cache) { - g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL); + g_return_val_if_fail (E_IS_CLIENT_CACHE (client_cache), NULL); return g_object_new ( E_TYPE_NAME_SELECTOR, - "registry", registry, NULL); + "client-cache", client_cache, NULL); } /** - * e_name_selector_get_registry: + * e_name_selector_ref_client_cache: * @name_selector: an #ENameSelector * - * Returns the #ESourceRegistry passed to e_name_selector_new(). + * Returns the #EClientCache passed to e_name_selector_new(). * - * Returns: the #ESourceRegistry + * The returned #EClientCache is referenced for thread-safety and must be + * unreferenced with g_object_unref() when finished with it. * - * Since: 3.6 + * Returns: an #EClientCache + * + * Since: 3.8 **/ -ESourceRegistry * -e_name_selector_get_registry (ENameSelector *name_selector) +EClientCache * +e_name_selector_ref_client_cache (ENameSelector *name_selector) { g_return_val_if_fail (E_IS_NAME_SELECTOR (name_selector), NULL); - return name_selector->priv->registry; + return g_object_ref (name_selector->priv->client_cache); } /* ------- * @@ -479,13 +499,14 @@ e_name_selector_peek_dialog (ENameSelector *name_selector) g_return_val_if_fail (E_IS_NAME_SELECTOR (name_selector), NULL); if (name_selector->priv->dialog == NULL) { - ESourceRegistry *registry; + EClientCache *client_cache; ENameSelectorDialog *dialog; ENameSelectorModel *model; - registry = e_name_selector_get_registry (name_selector); - dialog = e_name_selector_dialog_new (registry); + client_cache = e_name_selector_ref_client_cache (name_selector); + dialog = e_name_selector_dialog_new (client_cache); name_selector->priv->dialog = dialog; + g_object_unref (client_cache); model = e_name_selector_peek_model (name_selector); e_name_selector_dialog_set_model (dialog, model); @@ -563,13 +584,17 @@ e_name_selector_peek_section_entry (ENameSelector *name_selector, section = &g_array_index (name_selector->priv->sections, Section, n); if (!section->entry) { - ESourceRegistry *registry; + EClientCache *client_cache; EContactStore *contact_store; + GtkWidget *widget; gchar *text; gint i; - registry = e_name_selector_get_registry (name_selector); - section->entry = e_name_selector_entry_new (registry); + client_cache = e_name_selector_ref_client_cache (name_selector); + widget = e_name_selector_entry_new (client_cache); + section->entry = E_NAME_SELECTOR_ENTRY (widget); + g_object_unref (client_cache); + g_object_weak_ref (G_OBJECT (section->entry), reset_pointer_cb, name_selector); if (pango_parse_markup (name, -1, '_', NULL, &text, NULL, NULL)) { @@ -635,13 +660,16 @@ e_name_selector_peek_section_list (ENameSelector *name_selector, if (!section->entry) { EContactStore *contact_store; - ESourceRegistry *registry; + EClientCache *client_cache; + GtkWidget *widget; gchar *text; gint i; - registry = name_selector->priv->registry; - section->entry = (ENameSelectorEntry *) - e_name_selector_list_new (registry); + client_cache = e_name_selector_ref_client_cache (name_selector); + widget = e_name_selector_list_new (client_cache); + section->entry = E_NAME_SELECTOR_ENTRY (widget); + g_object_unref (client_cache); + g_object_weak_ref (G_OBJECT (section->entry), reset_pointer_cb, name_selector); if (pango_parse_markup (name, -1, '_', NULL, &text, NULL, NULL)) { diff --git a/e-util/e-name-selector.h b/e-util/e-name-selector.h index c6949c5417..eb4dc79145 100644 --- a/e-util/e-name-selector.h +++ b/e-util/e-name-selector.h @@ -27,8 +27,7 @@ #ifndef E_NAME_SELECTOR_H #define E_NAME_SELECTOR_H -#include <libedataserver/libedataserver.h> - +#include <e-util/e-client-cache.h> #include <e-util/e-name-selector-model.h> #include <e-util/e-name-selector-dialog.h> #include <e-util/e-name-selector-entry.h> @@ -69,9 +68,9 @@ struct _ENameSelectorClass { }; GType e_name_selector_get_type (void) G_GNUC_CONST; -ENameSelector * e_name_selector_new (ESourceRegistry *registry); -ESourceRegistry * - e_name_selector_get_registry (ENameSelector *name_selector); +ENameSelector * e_name_selector_new (EClientCache *client_cache); +EClientCache * e_name_selector_ref_client_cache + (ENameSelector *name_selector); ENameSelectorModel * e_name_selector_peek_model (ENameSelector *name_selector); ENameSelectorDialog * diff --git a/e-util/test-name-selector.c b/e-util/test-name-selector.c index 3744ad9f1a..b8cbee807f 100644 --- a/e-util/test-name-selector.c +++ b/e-util/test-name-selector.c @@ -39,12 +39,12 @@ close_dialog (GtkWidget *widget, } static gboolean -start_test (ESourceRegistry *registry) +start_test (EClientCache *client_cache) { - ENameSelectorModel *name_selector_model; - ENameSelectorEntry *name_selector_entry; - EDestinationStore *destination_store; - GtkWidget *container; + ENameSelectorModel *name_selector_model; + EDestinationStore *destination_store; + GtkWidget *name_selector_entry; + GtkWidget *container; destination_store = e_destination_store_new (); name_selector_model = e_name_selector_model_new (); @@ -53,18 +53,23 @@ start_test (ESourceRegistry *registry) e_name_selector_model_add_section (name_selector_model, "cc", "Cc", NULL); e_name_selector_model_add_section (name_selector_model, "bcc", "Bcc", NULL); - name_selector_dialog = e_name_selector_dialog_new (registry); + name_selector_dialog = e_name_selector_dialog_new (client_cache); e_name_selector_dialog_set_model (name_selector_dialog, name_selector_model); gtk_window_set_modal (GTK_WINDOW (name_selector_dialog), FALSE); - name_selector_entry = e_name_selector_entry_new (registry); - e_name_selector_entry_set_destination_store (name_selector_entry, destination_store); + name_selector_entry = e_name_selector_entry_new (client_cache); + e_name_selector_entry_set_destination_store ( + E_NAME_SELECTOR_ENTRY (name_selector_entry), + destination_store); + + g_signal_connect ( + name_selector_dialog, "response", + G_CALLBACK (close_dialog), name_selector_dialog); - g_signal_connect (name_selector_dialog, "response", G_CALLBACK (close_dialog), name_selector_dialog); gtk_widget_show (GTK_WIDGET (name_selector_dialog)); container = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_container_add (GTK_CONTAINER (container), GTK_WIDGET (name_selector_entry)); + gtk_container_add (GTK_CONTAINER (container), name_selector_entry); gtk_widget_show_all (container); name_selector_entry_window = container; @@ -79,6 +84,7 @@ main (gint argc, gchar **argv) { ESourceRegistry *registry; + EClientCache *client_cache; GError *error = NULL; gtk_init (&argc, &argv); @@ -94,9 +100,14 @@ main (gint argc, g_assert_not_reached (); } - g_idle_add ((GSourceFunc) start_test, registry); + client_cache = e_client_cache_new (registry); + + g_idle_add ((GSourceFunc) start_test, client_cache); gtk_main (); + g_object_unref (registry); + g_object_unref (client_cache); + return 0; } |