aboutsummaryrefslogblamecommitdiffstats
path: root/addressbook/backend/ebook/e-book.c
blob: 80d51732316c5756029d1b24965685633f44697a (plain) (tree)



























































































































































































































































































































                                                                                             
/*
 * 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;
}