diff options
Diffstat (limited to 'addressbook/gui/contact-editor/e-contact-quick-add.c')
-rw-r--r-- | addressbook/gui/contact-editor/e-contact-quick-add.c | 130 |
1 files changed, 68 insertions, 62 deletions
diff --git a/addressbook/gui/contact-editor/e-contact-quick-add.c b/addressbook/gui/contact-editor/e-contact-quick-add.c index 032f4ac475..ca4fb6f01b 100644 --- a/addressbook/gui/contact-editor/e-contact-quick-add.c +++ b/addressbook/gui/contact-editor/e-contact-quick-add.c @@ -27,8 +27,8 @@ #include <glib/gi18n.h> #include <libebook/e-book.h> #include <libebook/e-contact.h> +#include <libedataserverui/e-book-auth-util.h> #include <libedataserverui/e-source-combo-box.h> -#include <addressbook/util/addressbook.h> #include <addressbook/util/eab-book-util.h> #include "e-contact-editor.h" #include "e-contact-quick-add.h" @@ -41,7 +41,9 @@ struct _QuickAdd { gchar *email; gchar *vcard; EContact *contact; - EBook *book; + GCancellable *cancellable; + ESourceList *source_list; + ESource *source; EContactQuickAddCallback cb; gpointer closure; @@ -60,27 +62,22 @@ quick_add_new (void) { QuickAdd *qa = g_new0 (QuickAdd, 1); qa->contact = e_contact_new (); - qa->book = NULL; qa->refs = 1; return qa; } -#if 0 -static void -quick_add_ref (QuickAdd *qa) -{ - if (qa) { - ++qa->refs; - } -} -#endif - static void quick_add_unref (QuickAdd *qa) { if (qa) { --qa->refs; if (qa->refs == 0) { + if (qa->cancellable != NULL) { + g_cancellable_cancel (qa->cancellable); + g_object_unref (qa->cancellable); + } + if (qa->source_list != NULL) + g_object_unref (qa->source_list); g_free (qa->name); g_free (qa->email); g_free (qa->vcard); @@ -121,9 +118,18 @@ quick_add_set_vcard (QuickAdd *qa, const gchar *vcard) } static void -merge_cb (EBook *book, const GError *error, gpointer closure) +merge_cb (ESource *source, + GAsyncResult *result, + QuickAdd *qa) { - QuickAdd *qa = (QuickAdd *) closure; + EBook *book; + GError *error = NULL; + + book = e_load_book_source_finish (source, result, &error); + + /* Ignore cancellations. */ + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; if (!error) { if (e_book_is_writable (book)) @@ -151,7 +157,16 @@ merge_cb (EBook *book, const GError *error, gpointer closure) static void quick_add_merge_contact (QuickAdd *qa) { - addressbook_load (qa->book, merge_cb, qa); + if (qa->cancellable != NULL) { + g_cancellable_cancel (qa->cancellable); + g_object_unref (qa->cancellable); + } + + qa->cancellable = g_cancellable_new (); + + e_load_book_source_async ( + qa->source, NULL, qa->cancellable, + (GAsyncReadyCallback) merge_cb, qa); } /* @@ -235,9 +250,18 @@ ce_have_contact (EBook *book, const GError *error, EContact *contact, gpointer c } static void -ce_have_book (EBook *book, const GError *error, gpointer closure) +ce_have_book (ESource *source, + GAsyncResult *result, + QuickAdd *qa) { - QuickAdd *qa = (QuickAdd *) closure; + EBook *book; + GError *error = NULL; + + book = e_load_book_source_finish (source, result, &error); + + /* Ignore cancellations. */ + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; if (error) { if (book) @@ -252,7 +276,16 @@ ce_have_book (EBook *book, const GError *error, gpointer closure) static void edit_contact (QuickAdd *qa) { - addressbook_load (qa->book, ce_have_book, qa); + if (qa->cancellable != NULL) { + g_cancellable_cancel (qa->cancellable); + g_object_unref (qa->cancellable); + } + + qa->cancellable = g_cancellable_new (); + + e_load_book_source_async ( + qa->source, NULL, qa->cancellable, + (GAsyncReadyCallback) ce_have_book, qa); } #define QUICK_ADD_RESPONSE_EDIT_FULL 2 @@ -313,11 +346,14 @@ sanitize_widgets (QuickAdd *qa) g_return_if_fail (qa != NULL); g_return_if_fail (qa->dialog != NULL); - /* do not call here e_book_is_writable (qa->book), because it requires opened book, which takes time for remote books */ - enabled = qa->book != NULL && e_source_combo_box_get_active_uid (E_SOURCE_COMBO_BOX (qa->combo_box)); + enabled = (e_source_combo_box_get_active_uid ( + E_SOURCE_COMBO_BOX (qa->combo_box)) != NULL); - gtk_dialog_set_response_sensitive (GTK_DIALOG (qa->dialog), QUICK_ADD_RESPONSE_EDIT_FULL, enabled); - gtk_dialog_set_response_sensitive (GTK_DIALOG (qa->dialog), GTK_RESPONSE_OK, enabled); + gtk_dialog_set_response_sensitive ( + GTK_DIALOG (qa->dialog), + QUICK_ADD_RESPONSE_EDIT_FULL, enabled); + gtk_dialog_set_response_sensitive ( + GTK_DIALOG (qa->dialog), GTK_RESPONSE_OK, enabled); } static void @@ -327,11 +363,9 @@ source_changed (ESourceComboBox *source_combo_box, QuickAdd *qa) source = e_source_combo_box_get_active (source_combo_box); if (source != NULL) { - if (qa->book) { - g_object_unref (qa->book); - qa->book = NULL; - } - qa->book = e_book_new (source, NULL); + if (qa->source != NULL) + g_object_unref (qa->source); + qa->source = g_object_ref (source); } sanitize_widgets (qa); @@ -340,13 +374,12 @@ source_changed (ESourceComboBox *source_combo_box, QuickAdd *qa) static GtkWidget * build_quick_add_dialog (QuickAdd *qa) { - ESourceList *source_list; GConfClient *gconf_client; GtkWidget *container; GtkWidget *dialog; GtkWidget *label; GtkTable *table; - EBook *book; + ESource *source; const gint xpad=0, ypad=0; g_return_val_if_fail (qa != NULL, NULL); @@ -386,46 +419,19 @@ build_quick_add_dialog (QuickAdd *qa) } gconf_client = gconf_client_get_default (); - source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/addressbook/sources"); + qa->source_list = e_source_list_new_for_gconf ( + gconf_client, "/apps/evolution/addressbook/sources"); + source = e_source_list_peek_default_source (qa->source_list); g_object_unref (gconf_client); - qa->combo_box = e_source_combo_box_new (source_list); - book = e_book_new_default_addressbook (NULL); + qa->combo_box = e_source_combo_box_new (qa->source_list); e_source_combo_box_set_active ( - E_SOURCE_COMBO_BOX (qa->combo_box), - e_book_get_source (book)); - - if (!e_source_combo_box_get_active_uid (E_SOURCE_COMBO_BOX (qa->combo_box))) { - /* this means the e_book_new_default_addressbook didn't find any "default" nor "system" source, - and created new one for us. That is wrong, choose one from combo instead. */ + E_SOURCE_COMBO_BOX (qa->combo_box), source); - if (book) { - g_object_unref (book); - book = NULL; - } - - book = e_book_new (e_source_list_peek_source_any (source_list), NULL); - e_source_combo_box_set_active (E_SOURCE_COMBO_BOX (qa->combo_box), e_book_get_source (book)); - - if (!e_source_combo_box_get_active_uid (E_SOURCE_COMBO_BOX (qa->combo_box))) { - /* Does it failed again? What is going on? */ - if (book) - g_object_unref (book); - book = NULL; - } - } - - if (qa->book) { - g_object_unref (qa->book); - qa->book = NULL; - } - qa->book = book; source_changed (E_SOURCE_COMBO_BOX (qa->combo_box), qa); g_signal_connect ( qa->combo_box, "changed", G_CALLBACK (source_changed), qa); - g_object_unref (source_list); - table = GTK_TABLE (gtk_table_new (3, 2, FALSE)); gtk_table_set_row_spacings (table, 6); gtk_table_set_col_spacings (table, 12); |