diff options
Diffstat (limited to 'addressbook/backend/ebook/e-book-view-listener.c')
-rw-r--r-- | addressbook/backend/ebook/e-book-view-listener.c | 263 |
1 files changed, 64 insertions, 199 deletions
diff --git a/addressbook/backend/ebook/e-book-view-listener.c b/addressbook/backend/ebook/e-book-view-listener.c index 668c442a9a..3ab2ff2708 100644 --- a/addressbook/backend/ebook/e-book-view-listener.c +++ b/addressbook/backend/ebook/e-book-view-listener.c @@ -13,13 +13,13 @@ #include <bonobo/bonobo-main.h> #include "e-book-view-listener.h" #include "e-book-view.h" -#include "e-card.h" +#include "e-contact.h" #include "e-book-marshal.h" -static EBookViewStatus e_book_view_listener_convert_status (GNOME_Evolution_Addressbook_BookViewListener_CallStatus status); +static EBookViewStatus e_book_view_listener_convert_status (GNOME_Evolution_Addressbook_CallStatus status); enum { - RESPONSES_QUEUED, + RESPONSE, LAST_SIGNAL }; @@ -28,36 +28,9 @@ static guint e_book_view_listener_signals [LAST_SIGNAL]; static BonoboObjectClass *parent_class; struct _EBookViewListenerPrivate { - GList *response_queue; - gint timeout_id; - - guint timeout_lock : 1; guint stopped : 1; }; -static gboolean -e_book_view_listener_check_queue (EBookViewListener *listener) -{ - if (listener->priv->timeout_lock) - return TRUE; - - listener->priv->timeout_lock = TRUE; - - if (listener->priv->response_queue != NULL && !listener->priv->stopped) { - g_signal_emit (listener, e_book_view_listener_signals [RESPONSES_QUEUED], 0); - } - - if (listener->priv->response_queue == NULL || listener->priv->stopped) { - listener->priv->timeout_id = 0; - listener->priv->timeout_lock = FALSE; - bonobo_object_unref (BONOBO_OBJECT (listener)); - return FALSE; - } - - listener->priv->timeout_lock = FALSE; - return TRUE; -} - static void e_book_view_listener_queue_response (EBookViewListener *listener, EBookViewListenerResponse *response) @@ -69,45 +42,14 @@ e_book_view_listener_queue_response (EBookViewListener *listener, /* Free response and return */ g_list_foreach (response->ids, (GFunc)g_free, NULL); g_list_free (response->ids); - g_list_foreach (response->cards, (GFunc) g_object_unref, NULL); - g_list_free (response->cards); + g_list_foreach (response->contacts, (GFunc) g_object_unref, NULL); + g_list_free (response->contacts); g_free (response->message); g_free (response); return; } - /* a slight optimization for huge ldap queries. if there's an - existing Add response on the end of the queue, and we're an - Add response, we just glom the two lists of cards - together */ - if (response->op == CardAddedEvent) { - GList *last = g_list_last (listener->priv->response_queue); - EBookViewListenerResponse *last_resp = NULL; - - if (last) last_resp = last->data; - - if (last_resp && last_resp->op == CardAddedEvent ) { - response->cards = g_list_concat (last_resp->cards, response->cards); - g_free (response); - /* there should already be a timeout since the - queue isn't empty, so we'll just return - here */ - return; - } - else - listener->priv->response_queue = g_list_append (last, response); - } - else - listener->priv->response_queue = g_list_append (listener->priv->response_queue, response); - - if (listener->priv->timeout_id == 0) { - - /* Here, 20 == an arbitrary small number */ - listener->priv->timeout_id = g_timeout_add (20, (GSourceFunc) e_book_view_listener_check_queue, listener); - - /* Hold a reference to the listener on behalf of the timeout */ - bonobo_object_ref (BONOBO_OBJECT (listener)); - } + g_signal_emit (listener, e_book_view_listener_signals [RESPONSE], 0, response); } /* Add, Remove, Modify */ @@ -125,9 +67,6 @@ e_book_view_listener_queue_status_event (EBookViewListener *listener, resp->op = op; resp->status = status; - resp->ids = NULL; - resp->cards = NULL; - resp->message = NULL; e_book_view_listener_queue_response (listener, resp); } @@ -136,7 +75,7 @@ e_book_view_listener_queue_status_event (EBookViewListener *listener, static void e_book_view_listener_queue_idlist_event (EBookViewListener *listener, EBookViewListenerOperation op, - const GNOME_Evolution_Addressbook_CardIdList *ids) + const GNOME_Evolution_Addressbook_ContactIdList *ids) { EBookViewListenerResponse *resp; int i; @@ -147,10 +86,7 @@ e_book_view_listener_queue_idlist_event (EBookViewListener *listener, resp = g_new0 (EBookViewListenerResponse, 1); resp->op = op; - resp->status = E_BOOK_VIEW_STATUS_SUCCESS; - resp->ids = NULL; - resp->cards = NULL; - resp->message = NULL; + resp->status = E_BOOK_VIEW_STATUS_OK; for (i = 0; i < ids->_length; i ++) { resp->ids = g_list_prepend (resp->ids, g_strdup (ids->_buffer[i])); @@ -163,7 +99,7 @@ e_book_view_listener_queue_idlist_event (EBookViewListener *listener, static void e_book_view_listener_queue_sequence_event (EBookViewListener *listener, EBookViewListenerOperation op, - const GNOME_Evolution_Addressbook_VCardList *cards) + const GNOME_Evolution_Addressbook_VCardList *vcards) { EBookViewListenerResponse *resp; int i; @@ -174,13 +110,10 @@ e_book_view_listener_queue_sequence_event (EBookViewListener *listener, resp = g_new0 (EBookViewListenerResponse, 1); resp->op = op; - resp->status = E_BOOK_VIEW_STATUS_SUCCESS; - resp->ids = NULL; - resp->cards = NULL; - resp->message = NULL; + resp->status = E_BOOK_VIEW_STATUS_OK; - for ( i = 0; i < cards->_length; i++ ) { - resp->cards = g_list_append(resp->cards, e_card_new(cards->_buffer[i])); + for ( i = 0; i < vcards->_length; i++ ) { + resp->contacts = g_list_append(resp->contacts, e_contact_new_from_vcard (vcards->_buffer[i])); } e_book_view_listener_queue_response (listener, resp); @@ -200,135 +133,93 @@ e_book_view_listener_queue_message_event (EBookViewListener *listener, resp = g_new0 (EBookViewListenerResponse, 1); resp->op = op; - resp->status = E_BOOK_VIEW_STATUS_SUCCESS; - resp->ids = NULL; - resp->cards = NULL; + resp->status = E_BOOK_VIEW_STATUS_OK; resp->message = g_strdup(message); e_book_view_listener_queue_response (listener, resp); } static void -impl_BookViewListener_notify_card_added (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_VCardList *cards, - CORBA_Environment *ev) +impl_BookViewListener_notify_contacts_added (PortableServer_Servant servant, + const GNOME_Evolution_Addressbook_VCardList *vcards, + CORBA_Environment *ev) { EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object (servant)); + printf ("impl_BookViewListener_notify_contacts_added\n"); + e_book_view_listener_queue_sequence_event ( - listener, CardAddedEvent, cards); + listener, ContactsAddedEvent, vcards); } static void -impl_BookViewListener_notify_cards_removed (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_CardIdList *ids, - CORBA_Environment *ev) +impl_BookViewListener_notify_contacts_removed (PortableServer_Servant servant, + const GNOME_Evolution_Addressbook_ContactIdList *ids, + CORBA_Environment *ev) { EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object (servant)); - e_book_view_listener_queue_idlist_event (listener, CardsRemovedEvent, ids); + printf ("impl_BookViewListener_notify_contacts_removed\n"); + + e_book_view_listener_queue_idlist_event (listener, ContactsRemovedEvent, ids); } static void -impl_BookViewListener_notify_card_changed (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_VCardList *cards, - CORBA_Environment *ev) +impl_BookViewListener_notify_contacts_changed (PortableServer_Servant servant, + const GNOME_Evolution_Addressbook_VCardList *vcards, + CORBA_Environment *ev) { EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object (servant)); + printf ("impl_BookViewListener_notify_contacts_changed\n"); + e_book_view_listener_queue_sequence_event ( - listener, CardModifiedEvent, cards); + listener, ContactsModifiedEvent, vcards); } static void impl_BookViewListener_notify_sequence_complete (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_BookViewListener_CallStatus status, + const GNOME_Evolution_Addressbook_CallStatus status, CORBA_Environment *ev) { EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object (servant)); + printf ("impl_BookViewListener_notify_sequence_complete\n"); + e_book_view_listener_queue_status_event (listener, SequenceCompleteEvent, e_book_view_listener_convert_status (status)); } static void -impl_BookViewListener_notify_status_message (PortableServer_Servant servant, - const char *message, - CORBA_Environment *ev) +impl_BookViewListener_notify_progress (PortableServer_Servant servant, + const char *message, + const CORBA_short percent, + CORBA_Environment *ev) { EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object (servant)); - e_book_view_listener_queue_message_event (listener, StatusMessageEvent, message); -} + printf ("impl_BookViewListener_notify_progress\n"); -/** - * e_book_view_listener_check_pending: - * @listener: the #EBookViewListener - * - * Returns: the number of items on the response queue, - * or -1 if the @listener is isn't an #EBookViewListener. - */ -int -e_book_view_listener_check_pending (EBookViewListener *listener) -{ - g_return_val_if_fail (listener != NULL, -1); - g_return_val_if_fail (E_IS_BOOK_VIEW_LISTENER (listener), -1); - - return g_list_length (listener->priv->response_queue); -} - -/** - * e_book_view_listener_pop_response: - * @listener: the #EBookViewListener for which a request is to be popped - * - * Returns: an #EBookViewListenerResponse if there are responses on the - * queue to be returned; %NULL if there aren't, or if the @listener - * isn't an EBookViewListener. - */ -EBookViewListenerResponse * -e_book_view_listener_pop_response (EBookViewListener *listener) -{ - EBookViewListenerResponse *resp; - GList *popped; - - g_return_val_if_fail (listener != NULL, NULL); - g_return_val_if_fail (E_IS_BOOK_VIEW_LISTENER (listener), NULL); - - if (listener->priv->response_queue == NULL) - return NULL; - - resp = listener->priv->response_queue->data; - - popped = listener->priv->response_queue; - listener->priv->response_queue = - g_list_remove_link (listener->priv->response_queue, - listener->priv->response_queue); - g_list_free_1 (popped); - - return resp; + e_book_view_listener_queue_message_event (listener, StatusMessageEvent, message); } static EBookViewStatus -e_book_view_listener_convert_status (const GNOME_Evolution_Addressbook_BookViewListener_CallStatus status) +e_book_view_listener_convert_status (const GNOME_Evolution_Addressbook_CallStatus status) { switch (status) { - case GNOME_Evolution_Addressbook_BookViewListener_Success: - return E_BOOK_VIEW_STATUS_SUCCESS; - case GNOME_Evolution_Addressbook_BookViewListener_SearchTimeLimitExceeded: + case GNOME_Evolution_Addressbook_Success: + return E_BOOK_VIEW_STATUS_OK; + case GNOME_Evolution_Addressbook_SearchTimeLimitExceeded: return E_BOOK_VIEW_STATUS_TIME_LIMIT_EXCEEDED; - case GNOME_Evolution_Addressbook_BookViewListener_SearchSizeLimitExceeded: + case GNOME_Evolution_Addressbook_SearchSizeLimitExceeded: return E_BOOK_VIEW_STATUS_SIZE_LIMIT_EXCEEDED; - case GNOME_Evolution_Addressbook_BookViewListener_InvalidQuery: - return E_BOOK_VIEW_STATUS_INVALID_QUERY; - case GNOME_Evolution_Addressbook_BookViewListener_QueryRefused: - return E_BOOK_VIEW_STATUS_QUERY_REFUSED; - case GNOME_Evolution_Addressbook_BookViewListener_OtherError: - return E_BOOK_VIEW_STATUS_OTHER_ERROR; + case GNOME_Evolution_Addressbook_InvalidQuery: + return E_BOOK_VIEW_ERROR_INVALID_QUERY; + case GNOME_Evolution_Addressbook_QueryRefused: + return E_BOOK_VIEW_ERROR_QUERY_REFUSED; + case GNOME_Evolution_Addressbook_OtherError: default: - g_warning ("e_book_view_listener_convert_status: Unknown status " - "from card server: %d\n", (int) status); - return E_BOOK_VIEW_STATUS_UNKNOWN; - + return E_BOOK_VIEW_ERROR_OTHER_ERROR; } } @@ -351,7 +242,9 @@ e_book_view_listener_new () { EBookViewListener *listener; - listener = g_object_new (E_TYPE_BOOK_VIEW_LISTENER, NULL); + listener = g_object_new (E_TYPE_BOOK_VIEW_LISTENER, + "poa", bonobo_poa_get_threaded (ORBIT_THREAD_HINT_ALL_AT_IDLE, NULL), + NULL); e_book_view_listener_construct (listener); @@ -362,9 +255,6 @@ static void e_book_view_listener_init (EBookViewListener *listener) { listener->priv = g_new0 (EBookViewListenerPrivate, 1); - listener->priv->response_queue = NULL; - listener->priv->timeout_id = 0; - listener->priv->timeout_lock = FALSE; listener->priv->stopped = FALSE; } @@ -381,32 +271,6 @@ e_book_view_listener_dispose (GObject *object) EBookViewListener *listener = E_BOOK_VIEW_LISTENER (object); if (listener->priv) { - GList *l; - /* Remove our response queue handler: In theory, this - can never happen since we always hold a reference - to the listener while the timeout is running. */ - if (listener->priv->timeout_id) { - g_source_remove (listener->priv->timeout_id); - } - - /* Clear out the queue */ - for (l = listener->priv->response_queue; l != NULL; l = l->next) { - EBookViewListenerResponse *resp = l->data; - - g_list_foreach (resp->ids, (GFunc)g_free, NULL); - g_list_free (resp->ids); - - g_list_foreach(resp->cards, (GFunc) g_object_unref, NULL); - g_list_free(resp->cards); - resp->cards = NULL; - - g_free (resp->message); - resp->message = NULL; - - g_free (resp); - } - g_list_free (listener->priv->response_queue); - g_free (listener->priv); listener->priv = NULL; } @@ -423,23 +287,24 @@ e_book_view_listener_class_init (EBookViewListenerClass *klass) parent_class = g_type_class_ref (BONOBO_TYPE_OBJECT); - e_book_view_listener_signals [RESPONSES_QUEUED] = - g_signal_new ("responses_queued", + e_book_view_listener_signals [RESPONSE] = + g_signal_new ("response", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EBookViewListenerClass, responses_queued), + G_STRUCT_OFFSET (EBookViewListenerClass, response), NULL, NULL, - e_book_marshal_NONE__NONE, - G_TYPE_NONE, 0); + e_book_marshal_NONE__POINTER, + G_TYPE_NONE, + 1, G_TYPE_POINTER); object_class->dispose = e_book_view_listener_dispose; epv = &klass->epv; - epv->notifyCardChanged = impl_BookViewListener_notify_card_changed; - epv->notifyCardsRemoved = impl_BookViewListener_notify_cards_removed; - epv->notifyCardAdded = impl_BookViewListener_notify_card_added; + epv->notifyContactsChanged = impl_BookViewListener_notify_contacts_changed; + epv->notifyContactsRemoved = impl_BookViewListener_notify_contacts_removed; + epv->notifyContactsAdded = impl_BookViewListener_notify_contacts_added; epv->notifySequenceComplete = impl_BookViewListener_notify_sequence_complete; - epv->notifyStatusMessage = impl_BookViewListener_notify_status_message; + epv->notifyProgress = impl_BookViewListener_notify_progress; } BONOBO_TYPE_FUNC_FULL ( |