diff options
Diffstat (limited to 'addressbook/backend/ebook/e-book.c')
-rw-r--r-- | addressbook/backend/ebook/e-book.c | 316 |
1 files changed, 316 insertions, 0 deletions
diff --git a/addressbook/backend/ebook/e-book.c b/addressbook/backend/ebook/e-book.c new file mode 100644 index 0000000000..80d5173231 --- /dev/null +++ b/addressbook/backend/ebook/e-book.c @@ -0,0 +1,316 @@ +/* + * The Evolution addressbook client object. + * + * Author: + * Nat Friedman (nat@helixcode.com) + * + * Copyright 1999, 2000, Helix Code, Inc. + */ + +#include <addressbook.h> +#include <e-card-cursor.h> +#include <e-book-listener.h> +#include <e-book.h> + +#include <gtk/gtksignal.h> +#include <gtk/gtkmarshal.h> + +GnomeObjectClass *e_book_parent_class; + +#define CARDSERVER_GOAD_ID "FIXME" + +struct _EBookPrivate { + Evolution_BookFactory book_factory; + EBookListener *listener; + + gboolean operation_pending; + + EBookCallback open_response; + gpointer closure; +}; + +enum { + CARD_CHANGED, + CARD_REMOVED, + CARD_ADDED, + LINK_STATUS, + LAST_SIGNAL +}; + +static guint e_book_signals [LAST_SIGNAL]; + +static EBook * +e_book_construct (EBook *book, + const char *uri, + EBookOpenProgressCallback progress_cb, + EBookCallback open_response, + gpointer closure) +{ + CORBA_Environment ev; + + g_return_val_if_fail (book != NULL, NULL); + g_assert (uri != NULL); + + /* + * Connect to the Personal Addressbook Server. + */ + book->priv->book_factory = (Evolution_BookFactory) + goad_server_activate_with_id (NULL, CARDSERVER_GOAD_ID, 0, NULL); + + if (book->priv->book_factory == CORBA_OBJECT_NIL) { + g_warning ("e_book_construct: Could not obtain a handle " + "to the Personal Addressbook Server!\n"); + return NULL; + } + + /* + * Create our local BookListener interface. + */ + book->priv->listener = e_book_listener_new (book); + if (book->priv->listener == NULL) { + g_warning ("e_book_construct: Could not create EBookListener!\n"); + return NULL; + } + + /* + * Setup the callback for getting book-opening progress + * notifications. + */ + book->priv->listener->open_progress = progress_cb; + book->priv->listener->closure = closure; + book->priv->open_response = open_response; + book->priv->closure = closure; + book->priv->operation_pending = TRUE; + + /* + * Load the addressbook into the PAS. + */ + CORBA_exception_init (&ev); + + Evolution_BookFactory_open_book ( + book->priv->book_factory, uri, + gnome_object_corba_objref (GNOME_OBJECT (book->priv->listener)), + &ev); + + if (ev._major != CORBA_NO_EXCEPTION) { + g_warning ("e_book_construct: CORBA exception while opening addressbook!\n"); + CORBA_exception_free (&ev); + return NULL; + } + + CORBA_exception_free (&ev); +} + +/** + * e_book_new: + */ +EBook * +e_book_new (const char *uri, + EBookOpenProgressCallback progress_cb, + EBookCallback open_response, + gpointer closure) +{ + EBook *book; + EBook *retval; + + g_return_val_if_fail (uri != NULL, NULL); + + book = gtk_type_new (E_BOOK_TYPE); + + retval = e_book_construct (book, uri, progress_cb, + open_response, closure); + + if (retval == NULL) { + g_warning ("e_book_new: Could not construct EBook!\n"); + gtk_object_unref (GTK_OBJECT (book)); + + return NULL; + } + + return retval; +} + +static void +e_book_init (EBook *book) +{ + book->priv = g_new0 (EBookPrivate, 1); +} + +static void +e_book_destroy (GtkObject *object) +{ + EBook *book = E_BOOK (object); + CORBA_Environment ev; + + gtk_object_unref (GTK_OBJECT (book->priv->listener)); + + CORBA_exception_init (&ev); + + CORBA_Object_release (book->priv->book_factory, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + g_warning ("EBook: Exception while releasing BookFactory\n"); + + CORBA_exception_free (&ev); + CORBA_exception_init (&ev); + } + + g_free (book->priv); + + GTK_OBJECT_CLASS (e_book_parent_class)->destroy (object); +} + +static void +e_book_class_init (EBookClass *klass) +{ + GtkObjectClass *object_class = (GtkObjectClass *) klass; + + e_book_parent_class = gtk_type_class (gtk_object_get_type ()); + + e_book_signals [CARD_CHANGED] = + gtk_signal_new ("card_changed", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (EBookClass, card_changed), + gtk_marshal_NONE__POINTER, + GTK_TYPE_NONE, 1, + GTK_TYPE_POINTER); + + e_book_signals [CARD_ADDED] = + gtk_signal_new ("card_added", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (EBookClass, card_changed), + gtk_marshal_NONE__POINTER, + GTK_TYPE_NONE, 1, + GTK_TYPE_POINTER); + + e_book_signals [CARD_REMOVED] = + gtk_signal_new ("card_removed", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (EBookClass, card_changed), + gtk_marshal_NONE__POINTER, + GTK_TYPE_NONE, 1, + GTK_TYPE_POINTER); + + e_book_signals [LINK_STATUS] = + gtk_signal_new ("link_status", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (EBookClass, link_status), + gtk_marshal_NONE__BOOL, + GTK_TYPE_NONE, 1, + GTK_TYPE_BOOL); + + gtk_object_class_add_signals (object_class, e_book_signals, + LAST_SIGNAL); + + object_class->destroy = e_book_destroy; +} + +/* Fetching cards */ +ECard * +e_book_get_card (EBook *book, + char *id) +{ + g_return_val_if_fail (book != NULL, NULL); + g_return_val_if_fail (E_IS_BOOK (book), NULL); + + if (book->priv->operation_pending) { + g_warning ("EBook: Operation attempted on busy EBook!\n"); + return; + } +} + +char * +e_book_get_vcard (EBook *book, + char *id) +{ +} + +ECardCursor * +e_book_query (EBook *book, + char *query) +{ +} + +/* Deleting cards. */ +void +e_book_remove_card (EBook *book, + ECard *card, + EBookCallback cb, + gpointer closure) +{ +} + +void +e_book_remove_card_by_id (EBook *book, + char *id, + EBookCallback cb, + gpointer closure) + +{ +} + +/* Adding cards. */ +void +e_book_add_card (EBook *book, + ECard *card, + EBookCallback cb, + gpointer closure) +{ +} + +void +e_book_add_vcard (EBook *book, + char *vcard, + char *id, + EBookCallback cb, + gpointer closure) +{ +} + + +/* Modifying cards. */ +void +e_book_commit_card (EBook *book, + ECard *card, + EBookCallback cb, + gpointer closure) +{ +} + +void +e_book_commit_vcard (EBook *book, + char *vcard, + EBookCallback cb, + gpointer closure) +{ +} + + +/** + * e_book_get_type: + */ +GtkType +e_book_get_type (void) +{ + static GtkType type = 0; + + if (! type) { + GtkTypeInfo info = { + "EBook", + sizeof (EBook), + sizeof (EBookClass), + (GtkClassInitFunc) e_book_class_init, + (GtkObjectInitFunc) e_book_init, + NULL, /* reserved 1 */ + NULL, /* reserved 2 */ + (GtkClassInitFunc) NULL + }; + + type = gtk_type_unique (gtk_object_get_type (), &info); + } + + return type; +} |