/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Exports the BookViewListener interface. Maintains a queue of messages * which come in on the interface. * * Author: * Nat Friedman (nat@ximian.com) * * Copyright 2000, Ximian, Inc. */ #include #include #include "e-book-view-listener.h" #include "e-book-view.h" #include "e-contact.h" #include "e-book-marshal.h" static EBookViewStatus e_book_view_listener_convert_status (GNOME_Evolution_Addressbook_CallStatus status); enum { RESPONSE, LAST_SIGNAL }; static guint e_book_view_listener_signals [LAST_SIGNAL]; static BonoboObjectClass *parent_class; struct _EBookViewListenerPrivate { guint stopped : 1; }; static void e_book_view_listener_queue_response (EBookViewListener *listener, EBookViewListenerResponse *response) { if (response == NULL) return; if (listener->priv->stopped) { /* Free response and return */ g_list_foreach (response->ids, (GFunc)g_free, NULL); g_list_free (response->ids); g_list_foreach (response->contacts, (GFunc) g_object_unref, NULL); g_list_free (response->contacts); g_free (response->message); g_free (response); return; } g_signal_emit (listener, e_book_view_listener_signals [RESPONSE], 0, response); } /* Add, Remove, Modify */ static void e_book_view_listener_queue_status_event (EBookViewListener *listener, EBookViewListenerOperation op, EBookViewStatus status) { EBookViewListenerResponse *resp; if (listener->priv->stopped) return; resp = g_new0 (EBookViewListenerResponse, 1); resp->op = op; resp->status = status; e_book_view_listener_queue_response (listener, resp); } /* Add, Remove, Modify */ static void e_book_view_listener_queue_idlist_event (EBookViewListener *listener, EBookViewListenerOperation op, const GNOME_Evolution_Addressbook_ContactIdList *ids) { EBookViewListenerResponse *resp; int i; if (listener->priv->stopped) return; resp = g_new0 (EBookViewListenerResponse, 1); resp->op = op; 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])); } e_book_view_listener_queue_response (listener, resp); } /* Add, Remove, Modify */ static void e_book_view_listener_queue_sequence_event (EBookViewListener *listener, EBookViewListenerOperation op, const GNOME_Evolution_Addressbook_VCardList *vcards) { EBookViewListenerResponse *resp; int i; if (listener->priv->stopped) return; resp = g_new0 (EBookViewListenerResponse, 1); resp->op = op; resp->status = E_BOOK_VIEW_STATUS_OK; 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); } /* Status Message */ static void e_book_view_listener_queue_message_event (EBookViewListener *listener, EBookViewListenerOperation op, const char *message) { EBookViewListenerResponse *resp; if (listener->priv->stopped) return; resp = g_new0 (EBookViewListenerResponse, 1); resp->op = op; 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_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, ContactsAddedEvent, vcards); } static void 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)); printf ("impl_BookViewListener_notify_contacts_removed\n"); e_book_view_listener_queue_idlist_event (listener, ContactsRemovedEvent, ids); } static void 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, ContactsModifiedEvent, vcards); } static void impl_BookViewListener_notify_sequence_complete (PortableServer_Servant servant, 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_progress (PortableServer_Servant servant, const char *message, const CORBA_short percent, CORBA_Environment *ev) { EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object (servant)); printf ("impl_BookViewListener_notify_progress\n"); e_book_view_listener_queue_message_event (listener, StatusMessageEvent, message); } static EBookViewStatus e_book_view_listener_convert_status (const GNOME_Evolution_Addressbook_CallStatus status) { switch (status) { 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_SearchSizeLimitExceeded: return E_BOOK_VIEW_STATUS_SIZE_LIMIT_EXCEEDED; 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: return E_BOOK_VIEW_ERROR_OTHER_ERROR; } } static void e_book_view_listener_construct (EBookViewListener *listener) { /* nothing needed here */ } /** * e_book_view_listener_new: * @book: the #EBookView for which the listener is to be bound * * Creates and returns a new #EBookViewListener for the book. * * Returns: a new #EBookViewListener */ EBookViewListener * e_book_view_listener_new () { EBookViewListener *listener; 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); return listener; } static void e_book_view_listener_init (EBookViewListener *listener) { listener->priv = g_new0 (EBookViewListenerPrivate, 1); listener->priv->stopped = FALSE; } void e_book_view_listener_stop (EBookViewListener *listener) { g_return_if_fail (E_IS_BOOK_VIEW_LISTENER (listener)); listener->priv->stopped = TRUE; } static void e_book_view_listener_dispose (GObject *object) { EBookViewListener *listener = E_BOOK_VIEW_LISTENER (object); if (listener->priv) { g_free (listener->priv); listener->priv = NULL; } if (G_OBJECT_CLASS (parent_class)->dispose) G_OBJECT_CLASS (parent_class)->dispose (object); } static void e_book_view_listener_class_init (EBookViewListenerClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); POA_GNOME_Evolution_Addressbook_BookViewListener__epv *epv; parent_class = g_type_class_ref (BONOBO_TYPE_OBJECT); e_book_view_listener_signals [RESPONSE] = g_signal_new ("response", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EBookViewListenerClass, response), NULL, NULL, e_book_marshal_NONE__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); object_class->dispose = e_book_view_listener_dispose; epv = &klass->epv; 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->notifyProgress = impl_BookViewListener_notify_progress; } BONOBO_TYPE_FUNC_FULL ( EBookViewListener, GNOME_Evolution_Addressbook_BookViewListener, BONOBO_TYPE_OBJECT, e_book_view_listener);