aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/backend/ebook/e-book-listener.c
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/backend/ebook/e-book-listener.c')
-rw-r--r--addressbook/backend/ebook/e-book-listener.c432
1 files changed, 336 insertions, 96 deletions
diff --git a/addressbook/backend/ebook/e-book-listener.c b/addressbook/backend/ebook/e-book-listener.c
index b0e10fc90c..e1182981fe 100644
--- a/addressbook/backend/ebook/e-book-listener.c
+++ b/addressbook/backend/ebook/e-book-listener.c
@@ -1,20 +1,313 @@
/*
+ * Exports the BookListener interface. Maintains a queue of messages
+ * which come in on the interface.
+ *
* Author:
* Nat Friedman (nat@helixcode.com)
*
* Copyright 2000, Helix Code, Inc.
*/
-#include <e-book-listener.h>
+#include <gtk/gtksignal.h>
+ #include <e-book-listener.h>
+
+static EBookStatus e_book_listener_convert_status (Evolution_BookListener_CallStatus status);
+
+enum {
+ RESPONSES_QUEUED,
+ LAST_SIGNAL
+};
+
+static guint e_book_listener_signals [LAST_SIGNAL];
static GnomeObjectClass *e_book_listener_parent_class;
POA_Evolution_BookListener__vepv e_book_listener_vepv;
+struct _EBookListenerPrivate {
+ EBook *book;
+ GList *response_queue;
+ gint idle_id;
+};
+
+static gboolean
+e_book_listener_check_queue (EBookListener *listener)
+{
+ if (listener->priv->response_queue != NULL) {
+ gtk_signal_emit (GTK_OBJECT (listener),
+ e_book_listener_signals [RESPONSES_QUEUED]);
+ }
+
+ if (listener->priv->response_queue == NULL) {
+ listener->priv->idle_id = 0;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+e_book_listener_queue_response (EBookListener *listener,
+ EBookListenerResponse *response)
+{
+ listener->priv->response_queue =
+ g_list_append (listener->priv->response_queue,
+ response);
+
+ if (listener->priv->idle_id == 0) {
+ listener->priv->idle_id = g_idle_add (
+ (GSourceFunc) e_book_listener_check_queue, listener);
+ }
+}
+
+/* Add, Remove, Modify */
+static void
+e_book_listener_queue_generic_response (EBookListener *listener,
+ EBookListenerOperation op,
+ EBookStatus status)
+{
+ EBookListenerResponse *resp;
+
+ resp = g_new0 (EBookListenerResponse, 1);
+
+ resp->op = op;
+ resp->status = status;
+
+ e_book_listener_queue_response (listener, resp);
+}
+
+static void
+e_book_listener_queue_open_response (EBookListener *listener,
+ EBookStatus status,
+ Evolution_Book book)
+{
+ EBookListenerResponse *resp;
+
+ resp = g_new0 (EBookListenerResponse, 1);
+
+ resp->op = OpenBookResponse;
+ resp->status = status;
+ resp->book = book;
+
+ e_book_listener_queue_response (listener, resp);
+}
+
+static void
+e_book_listener_queue_open_progress (EBookListener *listener,
+ const char *msg,
+ short percent)
+{
+ EBookListenerResponse *resp;
+
+ resp = g_new0 (EBookListenerResponse, 1);
+
+ resp->op = OpenProgressEvent;
+ resp->msg = g_strdup (msg);
+ resp->percent = percent;
+
+ e_book_listener_queue_response (listener, resp);
+}
+
+
+static void
+e_book_listener_queue_link_status (EBookListener *listener,
+ gboolean connected)
+{
+ EBookListenerResponse *resp;
+
+ resp = g_new0 (EBookListenerResponse, 1);
+
+ resp->op = LinkStatusEvent;
+ resp->connected = connected;
+
+ e_book_listener_queue_response (listener, resp);
+}
+
+static void
+e_book_listener_queue_generic_event (EBookListener *listener,
+ EBookStatus status,
+ const char *id)
+{
+ EBookListenerResponse *resp;
+
+ resp = g_new0 (EBookListenerResponse, 1);
+
+ resp->op = LinkStatusEvent;
+ resp->status = status;
+ resp->id = g_strdup (id);
+
+ e_book_listener_queue_response (listener, resp);
+}
+
+static void
+impl_BookListener_respond_create_card (PortableServer_Servant servant,
+ const Evolution_BookListener_CallStatus status,
+ CORBA_Environment *ev)
+{
+ EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
+
+ e_book_listener_queue_generic_response (
+ listener, CreateCardResponse,
+ e_book_listener_convert_status (status));
+}
+
+static void
+impl_BookListener_respond_remove_card (PortableServer_Servant servant,
+ const Evolution_BookListener_CallStatus status,
+ CORBA_Environment *ev)
+{
+ EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
+
+ e_book_listener_queue_generic_response (
+ listener, RemoveCardResponse,
+ e_book_listener_convert_status (status));
+}
+
+static void
+impl_BookListener_respond_modify_card (PortableServer_Servant servant,
+ const Evolution_BookListener_CallStatus status,
+ CORBA_Environment *ev)
+{
+ EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
+
+ e_book_listener_queue_generic_response (
+ listener, ModifyCardResponse,
+ e_book_listener_convert_status (status));
+}
+
+static void
+impl_BookListener_respond_open_book (PortableServer_Servant servant,
+ const Evolution_BookListener_CallStatus status,
+ const Evolution_Book book,
+ CORBA_Environment *ev)
+{
+ EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
+ Evolution_Book book_copy;
+
+ book_copy = CORBA_Object_duplicate (book, ev);
+
+ if (ev->_major != CORBA_NO_EXCEPTION) {
+ g_warning ("EBookListener: Exception while duplicating Book!\n");
+ return;
+ }
+
+ e_book_listener_queue_open_response (
+ listener,
+ e_book_listener_convert_status (status),
+ book_copy);
+}
+
+static void
+impl_BookListener_report_open_book_progress (PortableServer_Servant servant,
+ const CORBA_char *status_message,
+ const CORBA_short percent,
+ CORBA_Environment *ev)
+{
+ EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
+
+ e_book_listener_queue_open_progress (
+ listener, status_message, percent);
+}
+
+static void
+impl_BookListener_report_connection_status (PortableServer_Servant servant,
+ const CORBA_boolean connected,
+ CORBA_Environment *ev)
+{
+ EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
+
+ e_book_listener_queue_link_status (
+ listener, connected);
+}
+
+static void
+impl_BookListener_signal_card_added (PortableServer_Servant servant,
+ const Evolution_CardId id,
+ CORBA_Environment *ev)
+{
+ EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
+
+ e_book_listener_queue_generic_event (
+ listener, CardAddedEvent, (const char *) id);
+}
+
+static void
+impl_BookListener_signal_card_removed (PortableServer_Servant servant,
+ const Evolution_CardId id,
+ CORBA_Environment *ev)
+{
+ EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
+
+ e_book_listener_queue_generic_event (
+ listener, CardRemovedEvent, (const char *) id);
+}
+
+static void
+impl_BookListener_signal_card_changed (PortableServer_Servant servant,
+ const Evolution_CardId id,
+ CORBA_Environment *ev)
+{
+ EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
+
+ e_book_listener_queue_generic_event (
+ listener, CardModifiedEvent, (const char *) id);
+}
+
+/**
+ * e_book_listener_get_book:
+ */
+EBook *
+e_book_listener_get_book (EBookListener *listener)
+{
+ g_return_val_if_fail (listener != NULL, NULL);
+ g_return_val_if_fail (E_IS_BOOK_LISTENER (listener), NULL);
+
+ return listener->priv->book;
+}
+
+/**
+ * e_book_listener_check_pending:
+ */
+int
+e_book_listener_check_pending (EBookListener *listener)
+{
+ g_return_val_if_fail (listener != NULL, -1);
+ g_return_val_if_fail (E_IS_BOOK_LISTENER (listener), -1);
+
+ return g_list_length (listener->priv->response_queue);
+}
+
+/**
+ * e_book_listener_pop_response:
+ */
+EBookListenerResponse *
+e_book_listener_pop_response (EBookListener *listener)
+{
+ EBookListenerResponse *resp;
+ GList *popped;
+
+ g_return_val_if_fail (listener != NULL, NULL);
+ g_return_val_if_fail (E_IS_BOOK_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;
+}
+
static EBookStatus
e_book_listener_convert_status (const Evolution_BookListener_CallStatus status)
{
switch (status) {
-
+ case Evolution_BookListener_Success:
+ return E_BOOK_STATUS_SUCCESS;
case Evolution_BookListener_RepositoryOffline:
return E_BOOK_STATUS_REPOSITORY_OFFLINE;
case Evolution_BookListener_PermissionDenied:
@@ -41,7 +334,7 @@ e_book_listener_construct (EBookListener *listener, EBook *book)
g_assert (book != NULL);
g_assert (E_IS_BOOK (book));
- listener->book = book;
+ listener->priv->book = book;
servant = (POA_Evolution_BookListener *) g_new0 (GnomeObjectServant, 1);
servant->vepv = &e_book_listener_vepv;
@@ -97,112 +390,45 @@ e_book_listener_new (EBook *book)
}
static void
-impl_BookListener_respond_create_card (PortableServer_Servant servant,
- const Evolution_BookListener_CallStatus status,
- CORBA_Environment *ev)
+e_book_listener_init (EBookListener *listener)
{
- EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
-
- if (listener->create_response == NULL)
- return;
-
- (listener->create_response) (listener->book,
- e_book_listener_convert_status (status),
- listener->closure);
+ listener->priv = g_new0 (EBookListenerPrivate, 1);
}
static void
-impl_BookListener_respond_remove_card (PortableServer_Servant servant,
- const Evolution_BookListener_CallStatus status,
- CORBA_Environment *ev)
-{
- EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
-
- if (listener->remove_response == NULL)
- return;
-
- (listener->remove_response) (listener->book,
- e_book_listener_convert_status (status),
- listener->closure);
-}
-
-static void
-impl_BookListener_respond_modify_card (PortableServer_Servant servant,
- const Evolution_BookListener_CallStatus status,
- CORBA_Environment *ev)
-{
- EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
-
- if (listener->modify_response == NULL)
- return;
-
- (listener->modify_response) (listener->book,
- e_book_listener_convert_status (status),
- listener->closure);
-}
-
-static void
-impl_BookListener_report_open_book_progress (PortableServer_Servant servant,
- const CORBA_char *status_message,
- const CORBA_short percent,
- CORBA_Environment *ev)
-{
- EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
-
- if (listener->open_progress == NULL)
- return;
-
- (listener->open_progress) (listener->book,
- status_message,
- percent,
- listener->closure);
-}
-
-static void
-impl_BookListener_respond_open_book (PortableServer_Servant servant,
- const Evolution_BookListener_CallStatus status,
- const Evolution_Book book,
- CORBA_Environment *ev)
+e_book_listener_destroy (GtkObject *object)
{
- EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
-
- if (listener->open_response == NULL)
- return;
-
- (listener->open_response) (listener->book,
- e_book_listener_convert_status (status),
- book,
- listener->closure);
-}
-
+ EBookListener *listener = E_BOOK_LISTENER (object);
+ GList *l;
-static void
-impl_BookListener_report_connection_status (PortableServer_Servant servant,
- const CORBA_boolean connected,
- CORBA_Environment *ev)
-{
- EBookListener *listener = E_BOOK_LISTENER (gnome_object_from_servant (servant));
+ for (l = listener->priv->response_queue; l != NULL; l = l->next) {
+ EBookListenerResponse *resp = l->data;
- if (listener->connect_status == NULL)
- return;
+ g_free (resp->msg);
+ g_free (resp->id);
- (listener->connect_status) (listener->book, connected, listener->closure);
-}
+ if (resp->book != CORBA_OBJECT_NIL) {
+ CORBA_Environment ev;
+ CORBA_exception_init (&ev);
-static void
-e_book_listener_init (EBook *listener)
-{
-}
+ CORBA_Object_release (resp->book, &ev);
-static void
-e_book_listener_destroy (GtkObject *object)
-{
- EBookListener *listener = E_BOOK_LISTENER (object);
- CORBA_Environment ev;
+ if (ev._major != CORBA_NO_EXCEPTION) {
+ g_warning ("e_book_listener_destroy: "
+ "Exception destroying book "
+ "in response queue!\n");
+ }
+
+ CORBA_exception_free (&ev);
+ }
- CORBA_exception_init (&ev);
+ g_free (resp);
+ }
+ g_list_free (listener->priv->response_queue);
+ g_free (listener->priv);
+
GTK_OBJECT_CLASS (e_book_listener_parent_class)->destroy (object);
}
@@ -222,6 +448,10 @@ e_book_listener_get_epv (void)
epv->report_connection_status = impl_BookListener_report_connection_status;
+ epv->signal_card_changed = impl_BookListener_signal_card_changed;
+ epv->signal_card_removed = impl_BookListener_signal_card_removed;
+ epv->signal_card_added = impl_BookListener_signal_card_added;
+
return epv;
}
@@ -239,6 +469,16 @@ e_book_listener_class_init (EBookListenerClass *klass)
e_book_listener_parent_class = gtk_type_class (gnome_object_get_type ());
+ e_book_listener_signals [RESPONSES_QUEUED] =
+ gtk_signal_new ("responses_queued",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (EBookListenerClass, responses_queued),
+ gtk_marshal_NONE__NONE,
+ GTK_TYPE_NONE, 0);
+
+ gtk_object_class_add_signals (object_class, e_book_listener_signals, LAST_SIGNAL);
+
object_class->destroy = e_book_listener_destroy;
e_book_listener_corba_class_init ();