diff options
-rw-r--r-- | addressbook/ChangeLog | 18 | ||||
-rw-r--r-- | addressbook/backend/ebook/e-book-util.c | 20 | ||||
-rw-r--r-- | addressbook/gui/component/e-address-popup.c | 48 |
3 files changed, 70 insertions, 16 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index bfd7a3262a..72ca85d4c7 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,21 @@ +2001-10-26 Jon Trowbridge <trow@ximian.com> + + * backend/ebook/e-book-util.c (simple_query_card_added_cb): Return + on cancellation. + (simple_query_sequence_complete_cb): Act if not cancelled. + (simple_query_book_view_cb): Free & return on cancellation. + (e_book_simple_query_cancel): Set cancellation flag. + + * gui/component/e-address-popup.c (e_address_popup_query): Hold a + reference to ourselves for the duration of our addressbook fetch. + (start_query): Release when we've fetched our addressbook. + (e_address_popup_cleanup): Break out most of what we do in + _destroy into a separate function. + (e_address_popup_destroy): Class cleanup. + (contact_editor_cb): Paranoid clean-up. + (add_contacts_cb): Paranoid clean-up. + (e_address_popup_ambiguous_email_add): Paranoid clean-up. + 2001-10-26 JP Rosevear <jpr@ximian.com> * conduit/e-address.conduit.in: remove the merges as valid sync diff --git a/addressbook/backend/ebook/e-book-util.c b/addressbook/backend/ebook/e-book-util.c index ffe18c62f8..753ace8575 100644 --- a/addressbook/backend/ebook/e-book-util.c +++ b/addressbook/backend/ebook/e-book-util.c @@ -138,6 +138,7 @@ struct _SimpleQueryInfo { guint add_tag; guint seq_complete_tag; GList *cards; + gboolean cancelled; }; static void @@ -199,6 +200,7 @@ simple_query_new (EBook *book, const char *query, EBookSimpleQueryCallback cb, g sq->query = g_strdup_printf (query); sq->cb = cb; sq->closure = closure; + sq->cancelled = FALSE; /* Automatically add ourselves to the EBook's pending list. */ book_add_simple_query (book, sq); @@ -228,13 +230,13 @@ simple_query_disconnect (SimpleQueryInfo *sq) static void simple_query_free (SimpleQueryInfo *sq) { + simple_query_disconnect (sq); + /* Remove ourselves from the EBook's pending list. */ book_remove_simple_query (sq->book, sq); g_free (sq->query); - simple_query_disconnect (sq); - if (sq->book) gtk_object_unref (GTK_OBJECT (sq->book)); @@ -249,6 +251,9 @@ simple_query_card_added_cb (EBookView *view, const GList *cards, gpointer closur { SimpleQueryInfo *sq = closure; + if (sq->cancelled) + return; + sq->cards = g_list_concat (sq->cards, g_list_copy ((GList *) cards)); g_list_foreach ((GList *) cards, (GFunc) gtk_object_ref, NULL); } @@ -261,7 +266,8 @@ simple_query_sequence_complete_cb (EBookView *view, gpointer closure) /* Disconnect signals, so that we don't pick up any changes to the book that occur in our callback */ simple_query_disconnect (sq); - sq->cb (sq->book, E_BOOK_SIMPLE_QUERY_STATUS_SUCCESS, sq->cards, sq->closure); + if (! sq->cancelled) + sq->cb (sq->book, E_BOOK_SIMPLE_QUERY_STATUS_SUCCESS, sq->cards, sq->closure); simple_query_free (sq); } @@ -270,7 +276,13 @@ simple_query_book_view_cb (EBook *book, EBookStatus status, EBookView *book_view { SimpleQueryInfo *sq = closure; + if (sq->cancelled) { + simple_query_free (sq); + return; + } + if (status != E_BOOK_STATUS_SUCCESS) { + simple_query_disconnect (sq); sq->cb (sq->book, E_BOOK_SIMPLE_QUERY_STATUS_OTHER_ERROR, NULL, sq->closure); simple_query_free (sq); return; @@ -314,8 +326,8 @@ e_book_simple_query_cancel (EBook *book, guint tag) sq = book_lookup_simple_query (book, tag); if (sq) { + sq->cancelled = TRUE; sq->cb (sq->book, E_BOOK_SIMPLE_QUERY_STATUS_CANCELLED, NULL, sq->closure); - simple_query_free (sq); } else { g_warning ("Simple query tag %d is unknown", tag); } diff --git a/addressbook/gui/component/e-address-popup.c b/addressbook/gui/component/e-address-popup.c index 698bad97aa..e02af0b9eb 100644 --- a/addressbook/gui/component/e-address-popup.c +++ b/addressbook/gui/component/e-address-popup.c @@ -677,24 +677,41 @@ e_address_popup_init (EAddressPopup *pop) } static void -e_address_popup_destroy (GtkObject *obj) +e_address_popup_cleanup (EAddressPopup *pop) { - EAddressPopup *pop = E_ADDRESS_POPUP (obj); - - if (pop->card) + if (pop->card) { gtk_object_unref (GTK_OBJECT (pop->card)); + pop = NULL; + } - if (pop->scheduled_refresh) - gtk_idle_remove (pop->scheduled_refresh); + if (pop->scheduled_refresh) { + gtk_timeout_remove (pop->scheduled_refresh); + pop->scheduled_refresh = 0; + } - if (pop->query_tag) + if (pop->query_tag) { e_book_simple_query_cancel (pop->book, pop->query_tag); + pop->query_tag = 0; + } - if (pop->book) + if (pop->book) { gtk_object_unref (GTK_OBJECT (pop->book)); + pop->book = NULL; + } g_free (pop->name); + pop->name = NULL; + g_free (pop->email); + pop->email = NULL; +} + +static void +e_address_popup_destroy (GtkObject *obj) +{ + EAddressPopup *pop = E_ADDRESS_POPUP (obj); + + e_address_popup_cleanup (pop); if (GTK_OBJECT_CLASS (parent_class)->destroy) GTK_OBJECT_CLASS (parent_class)->destroy (obj); @@ -751,7 +768,7 @@ e_address_popup_refresh_names (EAddressPopup *pop) } static gint -refresh_idle_cb (gpointer ptr) +refresh_timeout_cb (gpointer ptr) { EAddressPopup *pop = E_ADDRESS_POPUP (ptr); e_address_popup_refresh_names (pop); @@ -763,7 +780,7 @@ static void e_address_popup_schedule_refresh (EAddressPopup *pop) { if (pop->scheduled_refresh == 0) - pop->scheduled_refresh = gtk_idle_add (refresh_idle_cb, pop); + pop->scheduled_refresh = gtk_timeout_add (20, refresh_timeout_cb, pop); } /* If we are handed something of the form "Foo <bar@bar.com>", @@ -911,6 +928,7 @@ contact_editor_cb (EBook *book, gpointer closure) { EAddressPopup *pop = E_ADDRESS_POPUP (closure); EContactEditor *ce = e_addressbook_show_contact_editor (book, pop->card, FALSE, TRUE); + e_address_popup_cleanup (pop); emit_event (pop, "Destroy"); e_contact_editor_raise (ce); } @@ -957,6 +975,7 @@ add_contacts_cb (EAddressPopup *pop) e_contact_quick_add_free_form (pop->email, NULL, NULL); } + e_address_popup_cleanup (pop); emit_event (pop, "Destroy"); } @@ -1021,6 +1040,7 @@ e_address_popup_ambiguous_email_add (EAddressPopup *pop, const GList *cards) card_picker_init (wiz, cards, pop->name, pop->email); + e_address_popup_cleanup (pop); emit_event (pop, "Destroy"); gtk_container_add (GTK_CONTAINER (win), wiz->body); @@ -1097,17 +1117,20 @@ static void start_query (EBook *book, gpointer closure) { EAddressPopup *pop = E_ADDRESS_POPUP (closure); - + if (pop->query_tag) e_book_simple_query_cancel (book, pop->query_tag); if (pop->book != book) { gtk_object_ref (GTK_OBJECT (book)); - gtk_object_unref (GTK_OBJECT (pop->book)); + if (pop->book) + gtk_object_unref (GTK_OBJECT (pop->book)); pop->book = book; } pop->query_tag = e_book_name_and_email_query (book, pop->name, pop->email, query_cb, pop); + + gtk_object_unref (GTK_OBJECT (pop)); } static void @@ -1115,6 +1138,7 @@ e_address_popup_query (EAddressPopup *pop) { g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); + gtk_object_ref (GTK_OBJECT (pop)); e_book_use_local_address_book (start_query, pop); } |