/* * The Evolution addressbook client object. * * Author: * Nat Friedman (nat@helixcode.com) * * Copyright 1999, 2000, Helix Code, Inc. */ #include #include #include #include #include #include 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; }