diff options
author | nobody <nobody@localhost> | 2003-04-02 01:15:53 +0800 |
---|---|---|
committer | nobody <nobody@localhost> | 2003-04-02 01:15:53 +0800 |
commit | 2e5b2bbb530b642dda56b332cfd93810ac415098 (patch) | |
tree | e2b63c11a404a5dd99d407c989c8846fd0d5379d /addressbook/backend | |
parent | 5cda225087bfdc66e19edb703689e8af655e171c (diff) | |
download | gsoc2013-evolution-EVOLUTION_1_2_4.tar gsoc2013-evolution-EVOLUTION_1_2_4.tar.gz gsoc2013-evolution-EVOLUTION_1_2_4.tar.bz2 gsoc2013-evolution-EVOLUTION_1_2_4.tar.lz gsoc2013-evolution-EVOLUTION_1_2_4.tar.xz gsoc2013-evolution-EVOLUTION_1_2_4.tar.zst gsoc2013-evolution-EVOLUTION_1_2_4.zip |
This commit was manufactured by cvs2svn to create tagEVOLUTION_1_2_4
'EVOLUTION_1_2_4'.
svn path=/tags/EVOLUTION_1_2_4/; revision=20614
Diffstat (limited to 'addressbook/backend')
-rw-r--r-- | addressbook/backend/ebook/e-book-util.c | 210 | ||||
-rw-r--r-- | addressbook/backend/ebook/e-card-simple.c | 311 | ||||
-rw-r--r-- | addressbook/backend/ebook/e-card-simple.h | 18 | ||||
-rw-r--r-- | addressbook/backend/ebook/e-card.c | 1174 | ||||
-rw-r--r-- | addressbook/backend/ebook/e-card.h | 28 | ||||
-rw-r--r-- | addressbook/backend/ebook/evolution-ldif-importer.c | 138 | ||||
-rw-r--r-- | addressbook/backend/ebook/evolution-vcard-importer.c | 105 | ||||
-rw-r--r-- | addressbook/backend/pas/pas-backend-file.c | 598 | ||||
-rw-r--r-- | addressbook/backend/pas/pas-backend-ldap.c | 626 |
9 files changed, 1726 insertions, 1482 deletions
diff --git a/addressbook/backend/ebook/e-book-util.c b/addressbook/backend/ebook/e-book-util.c index cc00d045f4..dac9022051 100644 --- a/addressbook/backend/ebook/e-book-util.c +++ b/addressbook/backend/ebook/e-book-util.c @@ -27,10 +27,12 @@ #include <config.h> #include "e-book-util.h" -#include <string.h> -#include <glib.h> -#include <glib-object.h> -#include <e-util/e-config-listener.h> +#include <gtk/gtkobject.h> +#include <gtk/gtksignal.h> +#include <libgnome/gnome-defs.h> +#include <libgnome/gnome-util.h> +#include <bonobo/bonobo-listener.h> +#include <bonobo/bonobo-event-source.h> #include "e-card-compare.h" typedef struct _CommonBookInfo CommonBookInfo; @@ -55,7 +57,7 @@ e_book_expand_uri (const char *uri) char *ret_val; char *file_name; - file_name = g_build_filename(uri + offset, "addressbook.db", NULL); + file_name = g_concat_dir_and_file(uri + offset, "addressbook.db"); ret_val = g_strdup_printf("file://%s", file_name); g_free(file_name); return ret_val; @@ -73,27 +75,32 @@ got_uri_book_cb (EBook *book, EBookStatus status, gpointer closure) if (status == E_BOOK_STATUS_SUCCESS) { info->cb (book, info->closure); } else { - if (book) - g_object_unref (book); info->cb (NULL, info->closure); } g_free (info); } -void +gboolean e_book_load_address_book_by_uri (EBook *book, const char *uri, EBookCallback open_response, gpointer closure) { + gboolean rv; char *real_uri; - g_return_if_fail (book != NULL); - g_return_if_fail (E_IS_BOOK (book)); - g_return_if_fail (open_response != NULL); + g_return_val_if_fail (book != NULL, FALSE); + g_return_val_if_fail (E_IS_BOOK (book), FALSE); + g_return_val_if_fail (open_response != NULL, FALSE); real_uri = e_book_expand_uri (uri); - e_book_load_uri (book, real_uri, open_response, closure); + rv = e_book_load_uri (book, real_uri, open_response, closure); + + if (!rv) { + g_warning ("Couldn't load addressbook %s", real_uri); + } g_free (real_uri); + + return rv; } void @@ -109,16 +116,19 @@ e_book_use_address_book_by_uri (const char *uri, EBookCommonCallback cb, gpointe info->closure = closure; book = e_book_new (); - e_book_load_address_book_by_uri (book, uri, got_uri_book_cb, info); + if (! e_book_load_address_book_by_uri (book, uri, got_uri_book_cb, info)) { + gtk_object_unref (GTK_OBJECT (book)); + g_free (info); + } } -EConfigListener * -e_book_get_config_database () +Bonobo_ConfigDatabase +e_book_get_config_database (CORBA_Environment *ev) { - static EConfigListener *config_db; + static Bonobo_ConfigDatabase config_db; if (config_db == NULL) - config_db = e_config_listener_new (); + config_db = bonobo_get_object ("wombat:", "Bonobo/ConfigDatabase", ev); return config_db; } @@ -136,7 +146,7 @@ got_default_book_cb (EBook *book, EBookStatus status, gpointer closure) default book got loaded twice. */ if (common_default_book) { - g_object_unref (book); + gtk_object_unref (GTK_OBJECT (book)); book = common_default_book; } @@ -147,8 +157,7 @@ got_default_book_cb (EBook *book, EBookStatus status, gpointer closure) } } else { - if (book) - g_object_unref (book); + info->cb (NULL, info->closure); } @@ -173,33 +182,22 @@ e_book_use_default_book (EBookCommonCallback cb, gpointer closure) info->closure = closure; book = e_book_new (); - e_book_load_default_book (book, got_default_book_cb, info); + if (! e_book_load_default_book (book, got_default_book_cb, info)) { + gtk_object_unref (GTK_OBJECT (book)); + g_free (info); + } } static char *default_book_uri; -static char* -get_local_book_uri (void) -{ - char *filename; - char *uri; - - filename = g_build_filename (g_get_home_dir(), - "evolution/local/Contacts/addressbook.db", - NULL); - uri = g_strdup_printf ("file://%s", filename); - - g_free (filename); - - return uri; -} - static void set_default_book_uri_local (void) { - g_free (default_book_uri); + char *filename; - default_book_uri = get_local_book_uri (); + filename = gnome_util_prepend_user_home ("evolution/local/Contacts/addressbook.db"); + default_book_uri = g_strdup_printf ("file://%s", filename); + g_free (filename); } static void @@ -217,33 +215,37 @@ set_default_book_uri (char *val) } } -#define DEFAULT_CONTACTS_URI_PATH "/apps/evolution/shell/default_folders/contacts_uri" static void -default_folder_listener (EConfigListener *cl, const char *key, gpointer data) +default_folder_listener (BonoboListener *listener, char *event_name, + CORBA_any *any, CORBA_Environment *ev, + gpointer user_data) { + Bonobo_ConfigDatabase config_db; char *val; - if (strcmp (key, DEFAULT_CONTACTS_URI_PATH)) - return; - - val = e_config_listener_get_string (cl, DEFAULT_CONTACTS_URI_PATH); + config_db = e_book_get_config_database (ev); + val = bonobo_config_get_string (config_db, "/DefaultFolders/contacts_uri", ev); set_default_book_uri (val); } static void -set_default_book_uri_from_config_db (void) +set_default_book_uri_from_bonobo_conf (void) { char *val; - EConfigListener* config_db; + Bonobo_ConfigDatabase config_db; + CORBA_Environment ev; - config_db = e_book_get_config_database (); - val = e_config_listener_get_string_with_default (config_db, DEFAULT_CONTACTS_URI_PATH, NULL, NULL); + CORBA_exception_init (&ev); + config_db = e_book_get_config_database (&ev); + val = bonobo_config_get_string (config_db, "/DefaultFolders/contacts_uri", &ev); - g_signal_connect (config_db, - "key_changed", - G_CALLBACK (default_folder_listener), NULL); + bonobo_event_source_client_add_listener (config_db, default_folder_listener, + "Bonobo/ConfigDatabase:change/DefaultFolders:contacts_uri", + NULL, + NULL); + CORBA_exception_free (&ev); set_default_book_uri (val); } @@ -262,34 +264,28 @@ e_book_default_book_open (EBook *book, EBookStatus status, gpointer closure) g_free (default_book_closure); /* If there's a transient error, report it to the caller, but - * if the old default folder has disappeared, fall back to the - * local contacts folder instead, except when the default - * folder is also the local folder. + * if the old default folder has disappeared, fall back to + * the local contacts folder instead. */ if (status == E_BOOK_STATUS_PROTOCOL_NOT_SUPPORTED || status == E_BOOK_STATUS_NO_SUCH_BOOK) { - char *local_uri = get_local_book_uri(); - if (strcmp (local_uri, default_book_uri)) { - set_default_book_uri_local (); - e_book_load_default_book (book, user_response, user_closure); - } - else - user_response (book, status, user_closure); - g_free (local_uri); + set_default_book_uri_local (); + e_book_load_default_book (book, user_response, user_closure); } else { user_response (book, status, user_closure); } } -void +gboolean e_book_load_default_book (EBook *book, EBookCallback open_response, gpointer closure) { - const char *uri; + char *uri; + gboolean rv; DefaultBookClosure *default_book_closure; - g_return_if_fail (book != NULL); - g_return_if_fail (E_IS_BOOK (book)); - g_return_if_fail (open_response != NULL); + g_return_val_if_fail (book != NULL, FALSE); + g_return_val_if_fail (E_IS_BOOK (book), FALSE); + g_return_val_if_fail (open_response != NULL, FALSE); uri = e_book_get_default_book_uri (); @@ -298,16 +294,21 @@ e_book_load_default_book (EBook *book, EBookCallback open_response, gpointer clo default_book_closure->closure = closure; default_book_closure->open_response = open_response; - e_book_load_uri (book, uri, - e_book_default_book_open, default_book_closure); + rv = e_book_load_uri (book, uri, + e_book_default_book_open, default_book_closure); + + if (!rv) { + g_warning ("Couldn't load default addressbook"); + } + return rv; } -const char * +char* e_book_get_default_book_uri () { if (!default_book_uri) - set_default_book_uri_from_config_db (); + set_default_book_uri_from_bonobo_conf (); return default_book_uri; } @@ -335,15 +336,15 @@ struct _SimpleQueryInfo { static void book_add_simple_query (EBook *book, SimpleQueryInfo *info) { - GList *pending = g_object_get_data (G_OBJECT(book), "sq_pending"); + GList *pending = gtk_object_get_data (GTK_OBJECT (book), "sq_pending"); pending = g_list_prepend (pending, info); - g_object_set_data (G_OBJECT (book), "sq_pending", pending); + gtk_object_set_data (GTK_OBJECT (book), "sq_pending", pending); } static SimpleQueryInfo * book_lookup_simple_query (EBook *book, guint tag) { - GList *pending = g_object_get_data (G_OBJECT (book), "sq_pending"); + GList *pending = gtk_object_get_data (GTK_OBJECT (book), "sq_pending"); while (pending) { SimpleQueryInfo *sq = pending->data; if (sq->tag == tag) @@ -356,7 +357,7 @@ book_lookup_simple_query (EBook *book, guint tag) static void book_remove_simple_query (EBook *book, SimpleQueryInfo *info) { - GList *pending = g_object_get_data (G_OBJECT (book), "sq_pending"); + GList *pending = gtk_object_get_data (GTK_OBJECT (book), "sq_pending"); GList *i; for (i=pending; i != NULL; i = g_list_next (i)) { @@ -366,17 +367,17 @@ book_remove_simple_query (EBook *book, SimpleQueryInfo *info) break; } } - g_object_set_data (G_OBJECT (book), "sq_pending", pending); + gtk_object_set_data (GTK_OBJECT (book), "sq_pending", pending); } static guint book_issue_tag (EBook *book) { - gpointer ptr = g_object_get_data (G_OBJECT (book), "sq_tag"); + gpointer ptr = gtk_object_get_data (GTK_OBJECT (book), "sq_tag"); guint tag = GPOINTER_TO_UINT (ptr); if (tag == 0) tag = 1; - g_object_set_data (G_OBJECT (book), "sq_tag", GUINT_TO_POINTER (tag+1)); + gtk_object_set_data (GTK_OBJECT (book), "sq_tag", GUINT_TO_POINTER (tag+1)); return tag; } @@ -387,7 +388,7 @@ simple_query_new (EBook *book, const char *query, EBookSimpleQueryCallback cb, g sq->tag = book_issue_tag (book); sq->book = book; - g_object_ref (book); + gtk_object_ref (GTK_OBJECT (book)); sq->query = g_strdup (query); sq->cb = cb; sq->closure = closure; @@ -403,17 +404,17 @@ static void simple_query_disconnect (SimpleQueryInfo *sq) { if (sq->add_tag) { - g_signal_handler_disconnect (sq->view, sq->add_tag); + gtk_signal_disconnect (GTK_OBJECT (sq->view), sq->add_tag); sq->add_tag = 0; } if (sq->seq_complete_tag) { - g_signal_handler_disconnect (sq->view, sq->seq_complete_tag); + gtk_signal_disconnect (GTK_OBJECT (sq->view), sq->seq_complete_tag); sq->seq_complete_tag = 0; } if (sq->view) { - g_object_unref (sq->view); + gtk_object_unref (GTK_OBJECT (sq->view)); sq->view = NULL; } } @@ -429,9 +430,9 @@ simple_query_free (SimpleQueryInfo *sq) g_free (sq->query); if (sq->book) - g_object_unref (sq->book); + gtk_object_unref (GTK_OBJECT (sq->book)); - g_list_foreach (sq->cards, (GFunc) g_object_unref, NULL); + g_list_foreach (sq->cards, (GFunc) gtk_object_unref, NULL); g_list_free (sq->cards); g_free (sq); @@ -446,7 +447,7 @@ simple_query_card_added_cb (EBookView *view, const GList *cards, gpointer closur return; sq->cards = g_list_concat (sq->cards, g_list_copy ((GList *) cards)); - g_list_foreach ((GList *) cards, (GFunc) g_object_ref, NULL); + g_list_foreach ((GList *) cards, (GFunc) gtk_object_ref, NULL); } static void @@ -480,12 +481,16 @@ simple_query_book_view_cb (EBook *book, EBookStatus status, EBookView *book_view } sq->view = book_view; - g_object_ref (book_view); + gtk_object_ref (GTK_OBJECT (book_view)); - sq->add_tag = g_signal_connect (sq->view, "card_added", - G_CALLBACK (simple_query_card_added_cb), sq); - sq->seq_complete_tag = g_signal_connect (sq->view, "sequence_complete", - G_CALLBACK (simple_query_sequence_complete_cb), sq); + sq->add_tag = gtk_signal_connect (GTK_OBJECT (sq->view), + "card_added", + GTK_SIGNAL_FUNC (simple_query_card_added_cb), + sq); + sq->seq_complete_tag = gtk_signal_connect (GTK_OBJECT (sq->view), + "sequence_complete", + GTK_SIGNAL_FUNC (simple_query_sequence_complete_cb), + sq); } guint @@ -783,26 +788,3 @@ e_book_query_address_default (const gchar *email, e_book_use_default_book (have_address_book_open_cb, info); } - -/* bad place for this i know. */ -int -e_utf8_casefold_collate_len (const gchar *str1, const gchar *str2, int len) -{ - gchar *s1 = g_utf8_casefold(str1, len); - gchar *s2 = g_utf8_casefold(str2, len); - int rv; - - rv = g_utf8_collate (s1, s2); - - g_free (s1); - g_free (s2); - - return rv; -} - -int -e_utf8_casefold_collate (const gchar *str1, const gchar *str2) -{ - return e_utf8_casefold_collate_len (str1, str2, -1); -} - diff --git a/addressbook/backend/ebook/e-card-simple.c b/addressbook/backend/ebook/e-card-simple.c index db008011cd..daab2f211c 100644 --- a/addressbook/backend/ebook/e-card-simple.c +++ b/addressbook/backend/ebook/e-card-simple.c @@ -13,19 +13,19 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <bonobo/bonobo-i18n.h> +#include <gtk/gtkobject.h> +#include <gal/util/e-unicode-i18n.h> #include <gal/util/e-util.h> #include <libversit/vcc.h> #include "e-card-simple.h" -/* Object property IDs */ +/* Object argument IDs */ enum { - PROP_0, - PROP_CARD, + ARG_0, + ARG_CARD, }; -static GObjectClass *parent_class; typedef enum _ECardSimpleInternalType ECardSimpleInternalType; typedef struct _ECardSimpleFieldData ECardSimpleFieldData; @@ -115,9 +115,9 @@ static int field_data_count = sizeof (field_data) / sizeof (field_data[0]); static void e_card_simple_init (ECardSimple *simple); static void e_card_simple_class_init (ECardSimpleClass *klass); -static void e_card_simple_dispose (GObject *object); -static void e_card_simple_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_card_simple_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void e_card_simple_destroy (GtkObject *object); +static void e_card_simple_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); +static void e_card_simple_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); static void fill_in_info(ECardSimple *simple); @@ -208,25 +208,24 @@ char *address_names[] = { * * Return value: The type ID of the &ECardSimple class. **/ -GType +GtkType e_card_simple_get_type (void) { - static GType simple_type = 0; + static GtkType simple_type = 0; if (!simple_type) { - static const GTypeInfo simple_info = { - sizeof (ECardSimpleClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_card_simple_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ + GtkTypeInfo simple_info = { + "ECardSimple", sizeof (ECardSimple), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_card_simple_init, + sizeof (ECardSimpleClass), + (GtkClassInitFunc) e_card_simple_class_init, + (GtkObjectInitFunc) e_card_simple_init, + NULL, /* reserved_1 */ + NULL, /* reserved_2 */ + (GtkClassInitFunc) NULL }; - simple_type = g_type_register_static (G_TYPE_OBJECT, "ECardSimple", &simple_info, 0); + simple_type = gtk_type_unique (gtk_object_get_type (), &simple_info); } return simple_type; @@ -241,10 +240,10 @@ e_card_simple_get_type (void) ECardSimple * e_card_simple_new (ECard *card) { - ECardSimple *simple = g_object_new (E_TYPE_CARD_SIMPLE, NULL); - g_object_set(simple, - "card", card, - NULL); + ECardSimple *simple = E_CARD_SIMPLE(gtk_type_new(e_card_simple_get_type())); + gtk_object_set(GTK_OBJECT(simple), + "card", card, + NULL); return simple; } @@ -320,22 +319,16 @@ e_card_simple_get_vcard_assume_utf8 (ECardSimple *simple) static void e_card_simple_class_init (ECardSimpleClass *klass) { - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS(klass); + GtkObjectClass *object_class; - parent_class = g_type_class_ref (G_TYPE_OBJECT); + object_class = GTK_OBJECT_CLASS(klass); - object_class->dispose = e_card_simple_dispose; - object_class->get_property = e_card_simple_get_property; - object_class->set_property = e_card_simple_set_property; + gtk_object_add_arg_type ("ECardSimple::card", + GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_CARD); - g_object_class_install_property (object_class, PROP_CARD, - g_param_spec_object ("card", - _("ECard"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_CARD, - G_PARAM_READWRITE)); + object_class->destroy = e_card_simple_destroy; + object_class->get_arg = e_card_simple_get_arg; + object_class->set_arg = e_card_simple_set_arg; } /* @@ -343,103 +336,73 @@ e_card_simple_class_init (ECardSimpleClass *klass) */ static void -e_card_simple_dispose (GObject *object) +e_card_simple_destroy (GtkObject *object) { ECardSimple *simple; int i; simple = E_CARD_SIMPLE (object); - if (simple->card) { - g_object_unref(simple->card); - simple->card = NULL; - } - if (simple->temp_fields) { - g_list_foreach(simple->temp_fields, (GFunc) g_free, NULL); - g_list_free(simple->temp_fields); - simple->temp_fields = NULL; - } - - for(i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i++) { - if (simple->phone[i]) { - e_card_phone_unref (simple->phone[i]); - simple->phone[i] = NULL; - } - } - for(i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i++) { - if (simple->email[i]) { - g_free(simple->email[i]); - simple->email[i] = NULL; - } - } - for(i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) { - if (simple->address[i]) { - e_card_address_label_unref(simple->address[i]); - simple->address[i] = NULL; - } - } - for(i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) { - if (simple->delivery[i]) { - e_card_delivery_address_unref(simple->delivery[i]); - simple->delivery[i] = NULL; - } - } + if (simple->card) + gtk_object_unref(GTK_OBJECT(simple->card)); + g_list_foreach(simple->temp_fields, (GFunc) g_free, NULL); + g_list_free(simple->temp_fields); + simple->temp_fields = NULL; - if (G_OBJECT_CLASS (parent_class)->dispose) - G_OBJECT_CLASS (parent_class)->dispose (object); + for(i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i++) + e_card_phone_unref (simple->phone[i]); + for(i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i++) + g_free(simple->email[i]); + for(i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) + e_card_address_label_unref(simple->address[i]); + for(i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) + e_card_delivery_address_unref(simple->delivery[i]); } /* Set_arg handler for the simple */ static void -e_card_simple_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +e_card_simple_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) { ECardSimple *simple; simple = E_CARD_SIMPLE (object); - switch (prop_id) { - case PROP_CARD: + switch (arg_id) { + case ARG_CARD: if (simple->card) - g_object_unref(simple->card); + gtk_object_unref(GTK_OBJECT(simple->card)); g_list_foreach(simple->temp_fields, (GFunc) g_free, NULL); g_list_free(simple->temp_fields); simple->temp_fields = NULL; - if (g_value_get_object (value)) - simple->card = E_CARD(g_value_get_object (value)); + if (GTK_VALUE_OBJECT(*arg)) + simple->card = E_CARD(GTK_VALUE_OBJECT(*arg)); else simple->card = NULL; if(simple->card) - g_object_ref(simple->card); + gtk_object_ref(GTK_OBJECT(simple->card)); fill_in_info(simple); break; default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; + return; } } /* Get_arg handler for the simple */ static void -e_card_simple_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +e_card_simple_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) { ECardSimple *simple; simple = E_CARD_SIMPLE (object); - switch (prop_id) { - case PROP_CARD: + switch (arg_id) { + case ARG_CARD: e_card_simple_sync_card(simple); - g_value_set_object (value, simple->card); + GTK_VALUE_OBJECT (*arg) = (GtkObject *) simple->card; break; default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + arg->type = GTK_TYPE_INVALID; break; } } @@ -481,12 +444,12 @@ fill_in_info(ECardSimple *simple) EIterator *iterator; - g_object_get(card, - "address_label", &address_list, - "address", &delivery_list, - "phone", &phone_list, - "email", &email_list, - NULL); + gtk_object_get(GTK_OBJECT(card), + "address_label", &address_list, + "address", &delivery_list, + "phone", &phone_list, + "email", &email_list, + NULL); for (i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i++) { e_card_phone_unref(simple->phone[i]); simple->phone[i] = NULL; @@ -510,7 +473,7 @@ fill_in_info(ECardSimple *simple) } } } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i++) { g_free(simple->email[i]); @@ -525,7 +488,7 @@ fill_in_info(ECardSimple *simple) } } } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) { e_card_address_label_unref(simple->address[i]); @@ -540,7 +503,7 @@ fill_in_info(ECardSimple *simple) } } } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) { e_card_delivery_address_unref(simple->delivery[i]); @@ -555,7 +518,7 @@ fill_in_info(ECardSimple *simple) } } } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); e_card_free_empty_lists (card); } } @@ -577,12 +540,12 @@ e_card_simple_sync_card(ECardSimple *simple) EIterator *iterator; - g_object_get(card, - "address_label", &address_list, - "address", &delivery_list, - "phone", &phone_list, - "email", &email_list, - NULL); + gtk_object_get(GTK_OBJECT(card), + "address_label", &address_list, + "address", &delivery_list, + "phone", &phone_list, + "email", &email_list, + NULL); for (iterator = e_list_get_iterator(phone_list); e_iterator_is_valid(iterator); e_iterator_next(iterator) ) { int i; @@ -622,7 +585,7 @@ e_card_simple_sync_card(ECardSimple *simple) } } } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); for (i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i ++) { if (simple->phone[i]) { simple->phone[i]->flags = phone_correspondences[i]; @@ -648,7 +611,7 @@ e_card_simple_sync_card(ECardSimple *simple) } } } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) { if (simple->email[i]) { e_list_append(email_list, simple->email[i]); @@ -677,7 +640,7 @@ e_card_simple_sync_card(ECardSimple *simple) } } } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) { if (simple->address[i]) { simple->address[i]->flags &= ~E_CARD_ADDR_MASK; @@ -708,7 +671,7 @@ e_card_simple_sync_card(ECardSimple *simple) } } } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) { if (simple->delivery[i]) { simple->delivery[i]->flags &= ~E_CARD_ADDR_MASK; @@ -783,8 +746,6 @@ void e_card_simple_set_delivery_address (ECardSimple *simple { e_card_delivery_address_unref(simple->delivery[id]); simple->delivery[id] = e_card_delivery_address_ref(delivery); - e_card_address_label_unref(simple->address[id]); - simple->address[id] = e_card_delivery_address_to_label(simple->delivery[id]); simple->changed = TRUE; } @@ -809,17 +770,17 @@ char *e_card_simple_get (ECardSimple *simple, switch(type) { case E_CARD_SIMPLE_INTERNAL_TYPE_STRING: if (simple->card) { - g_object_get(simple->card, - field_data[field].ecard_field, &string, - NULL); + gtk_object_get(GTK_OBJECT(simple->card), + field_data[field].ecard_field, &string, + NULL); return g_strdup(string); } else return NULL; case E_CARD_SIMPLE_INTERNAL_TYPE_DATE: if (simple->card) { - g_object_get(simple->card, - field_data[field].ecard_field, &date, - NULL); + gtk_object_get(GTK_OBJECT(simple->card), + field_data[field].ecard_field, &date, + NULL); if (date != NULL) { char buf[26]; struct tm then; @@ -857,9 +818,9 @@ char *e_card_simple_get (ECardSimple *simple, case E_CARD_SIMPLE_INTERNAL_TYPE_BOOL: if (simple->card) { gboolean boole; - g_object_get (simple->card, - field_data[field].ecard_field, &boole, - NULL); + gtk_object_get (GTK_OBJECT (simple->card), + field_data[field].ecard_field, &boole, + NULL); if (boole) return g_strdup("true"); else @@ -873,19 +834,19 @@ char *e_card_simple_get (ECardSimple *simple, if (simple->card) { gboolean is_list; - g_object_get(simple->card, - "file_as", &string, - NULL); + gtk_object_get(GTK_OBJECT(simple->card), + "file_as", &string, + NULL); if (string && *string) return g_strdup(string); - g_object_get(simple->card, - "full_name", &string, - NULL); + gtk_object_get(GTK_OBJECT(simple->card), + "full_name", &string, + NULL); if (string && *string) return g_strdup(string); - g_object_get(simple->card, - "org", &string, - NULL); + gtk_object_get(GTK_OBJECT(simple->card), + "org", &string, + NULL); if (string && *string) return g_strdup(string); is_list = e_card_evolution_list (simple->card); @@ -899,33 +860,33 @@ char *e_card_simple_get (ECardSimple *simple, return NULL; case E_CARD_SIMPLE_FIELD_FAMILY_NAME: if (simple->card) { - g_object_get (simple->card, - "name", &name, - NULL); + gtk_object_get (GTK_OBJECT(simple->card), + "name", &name, + NULL); return g_strdup (name->family); } else return NULL; case E_CARD_SIMPLE_FIELD_GIVEN_NAME: if (simple->card) { - g_object_get (simple->card, - "name", &name, - NULL); + gtk_object_get (GTK_OBJECT(simple->card), + "name", &name, + NULL); return g_strdup (name->given); } else return NULL; case E_CARD_SIMPLE_FIELD_ADDITIONAL_NAME: if (simple->card) { - g_object_get (simple->card, - "name", &name, - NULL); + gtk_object_get (GTK_OBJECT(simple->card), + "name", &name, + NULL); return g_strdup (name->additional); } else return NULL; case E_CARD_SIMPLE_FIELD_NAME_SUFFIX: if (simple->card) { - g_object_get (simple->card, - "name", &name, - NULL); + gtk_object_get (GTK_OBJECT(simple->card), + "name", &name, + NULL); return g_strdup (name->suffix); } else return NULL; @@ -1001,9 +962,9 @@ file_as_get_style (ECardSimple *simple) if (!company) company = g_strdup(""); if (filestring) { - g_object_get (simple->card, - "name", &name, - NULL); + gtk_object_get (GTK_OBJECT (simple->card), + "name", &name, + NULL); if (!name) { goto end; @@ -1039,9 +1000,9 @@ file_as_set_style(ECardSimple *simple, int style) if (!company) company = g_strdup(""); - g_object_get (simple->card, - "name", &name, - NULL); + gtk_object_get (GTK_OBJECT (simple->card), + "name", &name, + NULL); if (name) { string = name_to_style(name, company, style); e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_FILE_AS, string); @@ -1064,17 +1025,17 @@ void e_card_simple_set (ECardSimple *simple, case E_CARD_SIMPLE_FIELD_FULL_NAME: case E_CARD_SIMPLE_FIELD_ORG: style = file_as_get_style(simple); - g_object_set(simple->card, - field_data[field].ecard_field, data, - NULL); + gtk_object_set(GTK_OBJECT(simple->card), + field_data[field].ecard_field, data, + NULL); file_as_set_style(simple, style); break; default: switch(type) { case E_CARD_SIMPLE_INTERNAL_TYPE_STRING: - g_object_set(simple->card, - field_data[field].ecard_field, data, - NULL); + gtk_object_set(GTK_OBJECT(simple->card), + field_data[field].ecard_field, data, + NULL); break; case E_CARD_SIMPLE_INTERNAL_TYPE_DATE: break; /* FIXME!!!! */ @@ -1108,9 +1069,9 @@ void e_card_simple_set (ECardSimple *simple, boole = FALSE; else if (!strcasecmp (data, "false")) boole = FALSE; - g_object_set (simple->card, - field_data[field].ecard_field, boole, - NULL); + gtk_object_set (GTK_OBJECT (simple->card), + field_data[field].ecard_field, boole, + NULL); } break; } @@ -1150,7 +1111,7 @@ const char *e_card_simple_get_ecard_field (ECardSimple *simple, const char *e_card_simple_get_name (ECardSimple *simple, ECardSimpleField field) { - return _(field_data[field].name); + return U_(field_data[field].name); } gboolean @@ -1181,7 +1142,7 @@ e_card_simple_get_allow_newlines (ECardSimple *simple, const char *e_card_simple_get_short_name (ECardSimple *simple, ECardSimpleField field) { - return _(field_data[field].short_name); + return U_(field_data[field].short_name); } void e_card_simple_arbitrary_foreach (ECardSimple *simple, @@ -1191,9 +1152,9 @@ void e_card_simple_arbitrary_foreach (ECardSimple if (simple->card) { EList *list; EIterator *iterator; - g_object_get(simple->card, - "arbitrary", &list, - NULL); + gtk_object_get(GTK_OBJECT(simple->card), + "arbitrary", &list, + NULL); for (iterator = e_list_get_iterator(list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { const ECardArbitrary *arbitrary = e_iterator_get(iterator); if (callback) @@ -1209,9 +1170,9 @@ const ECardArbitrary *e_card_simple_get_arbitrary (ECardSimple *sim if (simple->card) { EList *list; EIterator *iterator; - g_object_get(simple->card, - "arbitrary", &list, - NULL); + gtk_object_get(GTK_OBJECT(simple->card), + "arbitrary", &list, + NULL); for (iterator = e_list_get_iterator(list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { const ECardArbitrary *arbitrary = e_iterator_get(iterator); if (!strcasecmp(arbitrary->key, key)) @@ -1234,9 +1195,9 @@ void e_card_simple_set_arbitrary (ECardSimple *sim EIterator *iterator; simple->changed = TRUE; - g_object_get(simple->card, - "arbitrary", &list, - NULL); + gtk_object_get(GTK_OBJECT(simple->card), + "arbitrary", &list, + NULL); for (iterator = e_list_get_iterator(list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { const ECardArbitrary *arbitrary = e_iterator_get(iterator); if (!strcasecmp(arbitrary->key, key)) { @@ -1263,9 +1224,9 @@ e_card_simple_set_name (ECardSimple *simple, ECardName *name) { int style; style = file_as_get_style(simple); - g_object_set (simple->card, - "name", name, - NULL); + gtk_object_set (GTK_OBJECT (simple->card), + "name", name, + NULL); file_as_set_style(simple, style); } diff --git a/addressbook/backend/ebook/e-card-simple.h b/addressbook/backend/ebook/e-card-simple.h index 868d4e1573..b2b5147f3d 100644 --- a/addressbook/backend/ebook/e-card-simple.h +++ b/addressbook/backend/ebook/e-card-simple.h @@ -13,18 +13,17 @@ #define __E_CARD_SIMPLE_H__ #include <time.h> -#include <glib-object.h> +#include <gtk/gtk.h> #include <stdio.h> #include <ebook/e-card.h> #include <ebook/e-card-types.h> #include <e-util/e-list.h> #define E_TYPE_CARD_SIMPLE (e_card_simple_get_type ()) -#define E_CARD_SIMPLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CARD_SIMPLE, ECardSimple)) -#define E_CARD_SIMPLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CARD_SIMPLE, ECardSimpleClass)) -#define E_IS_CARD_SIMPLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CARD_SIMPLE)) -#define E_IS_CARD_SIMPLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_CARD_SIMPLE)) -#define E_CARD_SIMPLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TYPE_CARD_SIMPLE, ECardSimpleClass)) +#define E_CARD_SIMPLE(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CARD_SIMPLE, ECardSimple)) +#define E_CARD_SIMPLE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CARD_SIMPLE, ECardSimpleClass)) +#define E_IS_CARD_SIMPLE(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CARD_SIMPLE)) +#define E_IS_CARD_SIMPLE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_CARD_SIMPLE)) typedef enum _ECardSimplePhoneId ECardSimplePhoneId; typedef enum _ECardSimpleEmailId ECardSimpleEmailId; @@ -139,7 +138,7 @@ typedef struct _ECardSimple ECardSimple; typedef struct _ECardSimpleClass ECardSimpleClass; struct _ECardSimple { - GObject object; + GtkObject object; ECard *card; GList *temp_fields; @@ -153,7 +152,7 @@ struct _ECardSimple { }; struct _ECardSimpleClass { - GObjectClass parent_class; + GtkObjectClass parent_class; }; typedef void (*ECardSimpleArbitraryCallback) (const ECardArbitrary *arbitrary, gpointer closure); @@ -227,7 +226,8 @@ ECardSimpleField e_card_simple_map_phone_to_field (ECardSimplePho ECardSimpleField e_card_simple_map_email_to_field (ECardSimpleEmailId email_id); ECardSimpleField e_card_simple_map_address_to_field (ECardSimpleAddressId address_id); -GType e_card_simple_get_type (void); +/* Standard Gtk function */ +GtkType e_card_simple_get_type (void); #endif /* ! __E_CARD_SIMPLE_H__ */ diff --git a/addressbook/backend/ebook/e-card.c b/addressbook/backend/ebook/e-card.c index 945888dad7..9c77ab6a4b 100644 --- a/addressbook/backend/ebook/e-card.c +++ b/addressbook/backend/ebook/e-card.c @@ -12,6 +12,7 @@ #include "e-card.h" +#include <gal/util/e-i18n.h> #include <gal/widgets/e-unicode.h> #include <ctype.h> @@ -21,13 +22,15 @@ #include <time.h> #include <math.h> -#include <bonobo/bonobo-i18n.h> +#include <gtk/gtkobject.h> +#include <bonobo/bonobo-object-client.h> #include <gal/util/e-util.h> #include <libversit/vcc.h> #include "e-util/ename/e-name-western.h" #include "e-util/ename/e-address-western.h" #include "e-book.h" +#include "e-destination.h" #define is_a_prop_of(obj,prop) (isAPropertyOf ((obj),(prop))) #define str_val(obj) (the_str = (vObjectValueType (obj))? fakeCString (vObjectUStringZValue (obj)) : calloc (1, 1)) @@ -39,55 +42,53 @@ #define XEV_LIST_SHOW_ADDRESSES "X-EVOLUTION-LIST-SHOW_ADDRESSES" #define XEV_RELATED_CONTACTS "X-EVOLUTION-RELATED_CONTACTS" -/* Object property IDs */ +/* Object argument IDs */ enum { - PROP_0, - PROP_FILE_AS, - PROP_FULL_NAME, - PROP_NAME, - PROP_ADDRESS, - PROP_ADDRESS_LABEL, - PROP_PHONE, - PROP_EMAIL, - PROP_BIRTH_DATE, - PROP_URL, - PROP_ORG, - PROP_ORG_UNIT, - PROP_OFFICE, - PROP_TITLE, - PROP_ROLE, - PROP_MANAGER, - PROP_ASSISTANT, - PROP_NICKNAME, - PROP_SPOUSE, - PROP_ANNIVERSARY, - PROP_MAILER, - PROP_CALURI, - PROP_FBURL, - PROP_ICSCALENDAR, - PROP_NOTE, - PROP_RELATED_CONTACTS, - PROP_CATEGORIES, - PROP_CATEGORY_LIST, - PROP_WANTS_HTML, - PROP_WANTS_HTML_SET, - PROP_EVOLUTION_LIST, - PROP_EVOLUTION_LIST_SHOW_ADDRESSES, - PROP_ARBITRARY, - PROP_ID, - PROP_LAST_USE, - PROP_USE_SCORE, + ARG_0, + ARG_FILE_AS, + ARG_FULL_NAME, + ARG_NAME, + ARG_ADDRESS, + ARG_ADDRESS_LABEL, + ARG_PHONE, + ARG_EMAIL, + ARG_BIRTH_DATE, + ARG_URL, + ARG_ORG, + ARG_ORG_UNIT, + ARG_OFFICE, + ARG_TITLE, + ARG_ROLE, + ARG_MANAGER, + ARG_ASSISTANT, + ARG_NICKNAME, + ARG_SPOUSE, + ARG_ANNIVERSARY, + ARG_MAILER, + ARG_CALURI, + ARG_FBURL, + ARG_ICSCALENDAR, + ARG_NOTE, + ARG_RELATED_CONTACTS, + ARG_CATEGORIES, + ARG_CATEGORY_LIST, + ARG_WANTS_HTML, + ARG_WANTS_HTML_SET, + ARG_EVOLUTION_LIST, + ARG_EVOLUTION_LIST_SHOW_ADDRESSES, + ARG_ARBITRARY, + ARG_ID, + ARG_LAST_USE, + ARG_USE_SCORE, }; -static GObjectClass *parent_class; - static void parse(ECard *card, VObject *vobj, char *default_charset); static void e_card_init (ECard *card); static void e_card_class_init (ECardClass *klass); -static void e_card_dispose (GObject *object); -static void e_card_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_card_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void e_card_destroy (GtkObject *object); +static void e_card_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); +static void e_card_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); static void assign_string(VObject *vobj, char *default_charset, char **string); @@ -182,25 +183,24 @@ struct { * * Return value: The type ID of the &ECard class. **/ -GType +GtkType e_card_get_type (void) { - static GType card_type = 0; + static GtkType card_type = 0; if (!card_type) { - static const GTypeInfo card_info = { - sizeof (ECardClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_card_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ + GtkTypeInfo card_info = { + "ECard", sizeof (ECard), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_card_init, + sizeof (ECardClass), + (GtkClassInitFunc) e_card_class_init, + (GtkObjectInitFunc) e_card_init, + NULL, /* reserved_1 */ + NULL, /* reserved_2 */ + (GtkClassInitFunc) NULL }; - card_type = g_type_register_static (G_TYPE_OBJECT, "ECard", &card_info, 0); + card_type = gtk_type_unique (gtk_object_get_type (), &card_info); } return card_type; @@ -209,7 +209,7 @@ e_card_get_type (void) ECard * e_card_new_with_default_charset (char *vcard, char *default_charset) { - ECard *card = g_object_new (E_TYPE_CARD, NULL); + ECard *card = E_CARD(gtk_type_new(e_card_get_type())); VObject *vobj = Parse_MIME(vcard, strlen(vcard)); while(vobj) { VObject *next; @@ -248,7 +248,7 @@ e_card_duplicate(ECard *card) if (card->book) { new_card->book = card->book; - g_object_ref (new_card->book); + gtk_object_ref (GTK_OBJECT (new_card->book)); } return new_card; @@ -282,7 +282,7 @@ e_card_get_use_score(ECard *card) e_card_get_today (&today); g_date_set_dmy (&last_use, card->last_use->day, card->last_use->month, card->last_use->year); - days_since_last_use = g_date_get_julian (&today) - g_date_get_julian (&last_use); + days_since_last_use = g_date_julian (&today) - g_date_julian (&last_use); /* Apply a seven-day "grace period" to the use score decay. */ days_since_last_use -= 7; @@ -306,9 +306,9 @@ e_card_touch(ECard *card) if (card->last_use == NULL) card->last_use = g_new (ECardDate, 1); - card->last_use->day = g_date_get_day (&today); - card->last_use->month = g_date_get_month (&today); - card->last_use->year = g_date_get_year (&today); + card->last_use->day = g_date_day (&today); + card->last_use->month = g_date_month (&today); + card->last_use->year = g_date_year (&today); card->raw_use_score = use_score + 1.0; } @@ -360,10 +360,10 @@ e_card_set_book (ECard *card, EBook *book) g_return_if_fail (card && E_IS_CARD (card)); if (card->book) - g_object_unref (card->book); + gtk_object_unref (GTK_OBJECT (card->book)); card->book = book; if (card->book) - g_object_ref (card->book); + gtk_object_ref (GTK_OBJECT (card->book)); } gchar * @@ -543,7 +543,7 @@ e_card_get_vobject (const ECard *card, gboolean assumeUTF8) if (!(is_ascii || assumeUTF8)) addPropValue (addressprop, "CHARSET", "UTF-8"); } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); } if ( card->address_label ) { @@ -558,7 +558,7 @@ e_card_get_vobject (const ECard *card, gboolean assumeUTF8) set_address_flags (labelprop, address_label->flags); } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); } if ( card->phone ) { @@ -570,7 +570,7 @@ e_card_get_vobject (const ECard *card, gboolean assumeUTF8) set_phone_flags (phoneprop, phone->flags); } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); } if ( card->email ) { @@ -580,7 +580,7 @@ e_card_get_vobject (const ECard *card, gboolean assumeUTF8) emailprop = ADD_PROP_VALUE(vobj, VCEmailAddressProp, (char *) e_iterator_get(iterator)); addProp (emailprop, VCInternetProp); } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); } if ( card->bday ) { @@ -834,9 +834,9 @@ parse_email(ECard *card, VObject *vobj, char *default_charset) EList *list; assign_string(vobj, default_charset, &next_email); - g_object_get(card, - "email", &list, - NULL); + gtk_object_get(GTK_OBJECT(card), + "email", &list, + NULL); e_list_append(list, next_email); g_free (next_email); } @@ -864,9 +864,9 @@ parse_phone(ECard *card, VObject *vobj, char *default_charset) assign_string(vobj, default_charset, &(next_phone->number)); next_phone->flags = get_phone_flags(vobj); - g_object_get(card, - "phone", &list, - NULL); + gtk_object_get(GTK_OBJECT(card), + "phone", &list, + NULL); e_list_append(list, next_phone); e_card_phone_unref (next_phone); } @@ -886,9 +886,9 @@ parse_address(ECard *card, VObject *vobj, char *default_charset) next_addr->code = e_v_object_get_child_value (vobj, VCPostalCodeProp, default_charset); next_addr->country = e_v_object_get_child_value (vobj, VCCountryNameProp, default_charset); - g_object_get(card, - "address", &list, - NULL); + gtk_object_get(GTK_OBJECT(card), + "address", &list, + NULL); e_list_append(list, next_addr); e_card_delivery_address_unref (next_addr); } @@ -902,9 +902,9 @@ parse_address_label(ECard *card, VObject *vobj, char *default_charset) next_addr->flags = get_address_flags (vobj); assign_string(vobj, default_charset, &next_addr->data); - g_object_get(card, - "address_label", &list, - NULL); + gtk_object_get(GTK_OBJECT(card), + "address_label", &list, + NULL); e_list_append(list, next_addr); e_card_address_label_unref (next_addr); } @@ -1063,7 +1063,7 @@ add_list_unique(ECard *card, EList *list, char *string) e_list_append(list, temp); } g_free(temp); - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); } static void @@ -1073,9 +1073,9 @@ do_parse_categories(ECard *card, char *str) char *copy = g_new(char, length + 1); int i, j; EList *list; - g_object_get(card, - "category_list", &list, - NULL); + gtk_object_get(GTK_OBJECT(card), + "category_list", &list, + NULL); for (i = 0, j = 0; str[i]; i++, j++) { switch (str[i]) { case '\\': @@ -1198,9 +1198,9 @@ parse_arbitrary(ECard *card, VObject *vobj, char *default_charset) assign_string(vobj, default_charset, &(arbitrary->value)); - g_object_get(card, - "arbitrary", &list, - NULL); + gtk_object_get(GTK_OBJECT(card), + "arbitrary", &list, + NULL); e_list_append(list, arbitrary); e_card_arbitrary_unref(arbitrary); } @@ -1242,7 +1242,7 @@ parse_use_score(ECard *card, VObject *vobj, char *default_charset) static void parse_attribute(ECard *card, VObject *vobj, char *default_charset) { - ParsePropertyFunc function = g_hash_table_lookup(E_CARD_GET_CLASS(card)->attribute_jump_table, vObjectName(vobj)); + ParsePropertyFunc function = g_hash_table_lookup(E_CARD_CLASS(GTK_OBJECT(card)->klass)->attribute_jump_table, vObjectName(vobj)); if ( function ) function(card, vobj, default_charset); } @@ -1280,11 +1280,9 @@ static void e_card_class_init (ECardClass *klass) { int i; - GObjectClass *object_class; + GtkObjectClass *object_class; - object_class = G_OBJECT_CLASS(klass); - - parent_class = g_type_class_ref (G_TYPE_OBJECT); + object_class = GTK_OBJECT_CLASS(klass); klass->attribute_jump_table = g_hash_table_new(g_str_hash, g_str_equal); @@ -1292,257 +1290,81 @@ e_card_class_init (ECardClass *klass) g_hash_table_insert(klass->attribute_jump_table, attribute_jump_array[i].key, attribute_jump_array[i].function); } - object_class->dispose = e_card_dispose; - object_class->get_property = e_card_get_property; - object_class->set_property = e_card_set_property; - - g_object_class_install_property (object_class, PROP_FILE_AS, - g_param_spec_string ("file_as", - _("File As"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_FULL_NAME, - g_param_spec_string ("full_name", - _("Full Name"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_NAME, - g_param_spec_pointer ("name", - _("Name"), - /*_( */"XXX blurb" /*)*/, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_ADDRESS, - g_param_spec_object ("address", - _("Address"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_LIST, - G_PARAM_READABLE)); - - g_object_class_install_property (object_class, PROP_ADDRESS_LABEL, - g_param_spec_object ("address_label", - _("Address Label"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_LIST, - G_PARAM_READABLE)); - - g_object_class_install_property (object_class, PROP_PHONE, - g_param_spec_object ("phone", - _("Phone"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_LIST, - G_PARAM_READABLE)); - - g_object_class_install_property (object_class, PROP_EMAIL, - g_param_spec_object ("email", - _("Email"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_LIST, - G_PARAM_READABLE)); - - g_object_class_install_property (object_class, PROP_BIRTH_DATE, - g_param_spec_pointer ("birth_date", - _("Birth date"), - /*_( */"XXX blurb" /*)*/, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_URL, - g_param_spec_string ("url", - _("URL"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_ORG, - g_param_spec_string ("org", - _("Organization"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_ORG_UNIT, - g_param_spec_string ("org_unit", - _("Organizational Unit"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_OFFICE, - g_param_spec_string ("office", - _("Office"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_TITLE, - g_param_spec_string ("title", - _("Title"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_ROLE, - g_param_spec_string ("role", - _("Role"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_MANAGER, - g_param_spec_string ("manager", - _("Manager"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_ASSISTANT, - g_param_spec_string ("assistant", - _("Assistant"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_NICKNAME, - g_param_spec_string ("nickname", - _("Nickname"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_SPOUSE, - g_param_spec_string ("spouse", - _("Spouse"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_ANNIVERSARY, - g_param_spec_pointer ("anniversary", - _("Anniversary"), - /*_( */"XXX blurb" /*)*/, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_MAILER, - g_param_spec_string ("mailer", - _("Mailer"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_CALURI, - g_param_spec_string ("caluri", - _("Calendar URI"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_FBURL, - g_param_spec_string ("fburl", - _("Free/Busy URL"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_ICSCALENDAR, - g_param_spec_string ("icscalendar", - _("ICS Calendar"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_NOTE, - g_param_spec_string ("note", - _("Note"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_RELATED_CONTACTS, - g_param_spec_string ("related_contacts", - _("Related Contacts"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_CATEGORIES, - g_param_spec_string ("categories", - _("Categories"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_CATEGORY_LIST, - g_param_spec_object ("category list", - _("Category List"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_LIST, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_WANTS_HTML, - g_param_spec_boolean ("wants_html", - _("Wants HTML"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_WANTS_HTML_SET, - g_param_spec_boolean ("wants_html_set", - _("Wants HTML set"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READABLE)); - - g_object_class_install_property (object_class, PROP_EVOLUTION_LIST, - g_param_spec_boolean ("list", - _("List"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EVOLUTION_LIST_SHOW_ADDRESSES, - g_param_spec_boolean ("list_show_addresses", - _("List Show Addresses"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_ARBITRARY, - g_param_spec_object ("arbitrary", - _("Arbitrary"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_LIST, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_ID, - g_param_spec_string ("id", - _("ID"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_LAST_USE, - g_param_spec_pointer ("last_use", - _("Last Use"), - /*_( */"XXX blurb" /*)*/, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_USE_SCORE, - /* XXX at some point we - should remove - LAX_VALIDATION and figure - out some hard min & max - scores. */ - g_param_spec_float ("use_score", - _("Use Score"), - /*_( */"XXX blurb" /*)*/, - 0.0, - 0.0, - 0.0, - G_PARAM_READWRITE | G_PARAM_LAX_VALIDATION)); + gtk_object_add_arg_type ("ECard::file_as", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FILE_AS); + gtk_object_add_arg_type ("ECard::full_name", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FULL_NAME); + gtk_object_add_arg_type ("ECard::name", + GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_NAME); + gtk_object_add_arg_type ("ECard::address", + GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_ADDRESS); + gtk_object_add_arg_type ("ECard::address_label", + GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_ADDRESS_LABEL); + gtk_object_add_arg_type ("ECard::phone", + GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_PHONE); + gtk_object_add_arg_type ("ECard::email", + GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_EMAIL); + gtk_object_add_arg_type ("ECard::birth_date", + GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_BIRTH_DATE); + gtk_object_add_arg_type ("ECard::url", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_URL); + gtk_object_add_arg_type ("ECard::org", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ORG); + gtk_object_add_arg_type ("ECard::org_unit", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ORG_UNIT); + gtk_object_add_arg_type ("ECard::office", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_OFFICE); + gtk_object_add_arg_type ("ECard::title", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_TITLE); + gtk_object_add_arg_type ("ECard::role", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ROLE); + gtk_object_add_arg_type ("ECard::manager", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_MANAGER); + gtk_object_add_arg_type ("ECard::assistant", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ASSISTANT); + gtk_object_add_arg_type ("ECard::nickname", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NICKNAME); + gtk_object_add_arg_type ("ECard::spouse", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_SPOUSE); + gtk_object_add_arg_type ("ECard::anniversary", + GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_ANNIVERSARY); + gtk_object_add_arg_type ("ECard::mailer", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_MAILER); + gtk_object_add_arg_type ("ECard::caluri", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_CALURI); + gtk_object_add_arg_type ("ECard::fburl", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FBURL); + gtk_object_add_arg_type ("ECard::icscalendar", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ICSCALENDAR); + gtk_object_add_arg_type ("ECard::note", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NOTE); + gtk_object_add_arg_type ("ECard::related_contacts", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_RELATED_CONTACTS); + gtk_object_add_arg_type ("ECard::categories", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_CATEGORIES); + gtk_object_add_arg_type ("ECard::category_list", + GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_CATEGORY_LIST); + gtk_object_add_arg_type ("ECard::wants_html", + GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_WANTS_HTML); + gtk_object_add_arg_type ("ECard::wants_html_set", + GTK_TYPE_BOOL, GTK_ARG_READABLE, ARG_WANTS_HTML); + gtk_object_add_arg_type ("ECard::list", + GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_EVOLUTION_LIST); + gtk_object_add_arg_type ("ECard::list_show_addresses", + GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_EVOLUTION_LIST_SHOW_ADDRESSES); + gtk_object_add_arg_type ("ECard::arbitrary", + GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_ARBITRARY); + gtk_object_add_arg_type ("ECard::id", + GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ID); + gtk_object_add_arg_type ("ECard::last_use", + GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_LAST_USE); + gtk_object_add_arg_type ("ECard::use_score", + GTK_TYPE_FLOAT, GTK_ARG_READWRITE, ARG_USE_SCORE); + + + object_class->destroy = e_card_destroy; + object_class->get_arg = e_card_get_arg; + object_class->set_arg = e_card_set_arg; } ECardPhone * @@ -1936,7 +1758,7 @@ e_card_email_match_single_string (const gchar *a, const gchar *b) for (xa=a; *xa && *xa != '@'; ++xa); for (xb=b; *xb && *xb != '@'; ++xb); - if (xa-a != xb-b || *xa != *xb || g_ascii_strncasecmp (a, b, xa-a)) + if (xa-a != xb-b || *xa != *xb || g_strncasecmp (a, b, xa-a)) return FALSE; if (*xa == '\0') @@ -1977,7 +1799,7 @@ e_card_email_match_string (const ECard *card, const gchar *str) if (e_card_email_match_single_string (e_iterator_get (iter), str)) return TRUE; } - g_object_unref (iter); + gtk_object_unref (GTK_OBJECT (iter)); return FALSE; } @@ -1996,14 +1818,14 @@ e_card_email_find_number (const ECard *card, const gchar *email) iter = e_list_get_iterator (card->email); for (e_iterator_reset (iter); e_iterator_is_valid (iter); e_iterator_next (iter)) { - if (!g_ascii_strcasecmp (e_iterator_get (iter), email)) + if (!g_strcasecmp (e_iterator_get (iter), email)) goto finished; ++count; } count = -1; finished: - g_object_unref (iter); + gtk_object_unref (GTK_OBJECT (iter)); return count; } @@ -2013,82 +1835,75 @@ e_card_email_find_number (const ECard *card, const gchar *email) */ static void -e_card_dispose (GObject *object) +e_card_destroy (GtkObject *object) { ECard *card = E_CARD(object); + g_free(card->id); + if (card->book) + gtk_object_unref (GTK_OBJECT (card->book)); + g_free(card->file_as); + g_free(card->fname); + e_card_name_unref(card->name); + g_free(card->bday); + + g_free(card->url); + g_free(card->org); + g_free(card->org_unit); + g_free(card->office); + g_free(card->title); + g_free(card->role); + g_free(card->manager); + g_free(card->assistant); + g_free(card->nickname); + g_free(card->spouse); + g_free(card->anniversary); + g_free(card->caluri); + g_free(card->fburl); + g_free(card->icscalendar); + g_free(card->note); + g_free(card->related_contacts); -#define FREE_IF(x) do { if ((x)) { g_free (x); x = NULL; } } while (0) -#define UNREF_IF(x) do { if ((x)) { g_object_unref (x); x = NULL; } } while (0) - - FREE_IF (card->id); - UNREF_IF (card->book); - FREE_IF(card->file_as); - FREE_IF(card->fname); - if (card->name) { - e_card_name_unref(card->name); - card->name = NULL; - } - FREE_IF(card->bday); - - FREE_IF(card->url); - FREE_IF(card->org); - FREE_IF(card->org_unit); - FREE_IF(card->office); - FREE_IF(card->title); - FREE_IF(card->role); - FREE_IF(card->manager); - FREE_IF(card->assistant); - FREE_IF(card->nickname); - FREE_IF(card->spouse); - FREE_IF(card->anniversary); - FREE_IF(card->caluri); - FREE_IF(card->fburl); - FREE_IF(card->icscalendar); - FREE_IF(card->note); - FREE_IF(card->related_contacts); - - UNREF_IF (card->categories); - UNREF_IF (card->email); - UNREF_IF (card->phone); - UNREF_IF (card->address); - UNREF_IF (card->address_label); - - if (G_OBJECT_CLASS (parent_class)->dispose) - G_OBJECT_CLASS (parent_class)->dispose (object); + if (card->categories) + gtk_object_unref(GTK_OBJECT(card->categories)); + if (card->email) + gtk_object_unref(GTK_OBJECT(card->email)); + if (card->phone) + gtk_object_unref(GTK_OBJECT(card->phone)); + if (card->address) + gtk_object_unref(GTK_OBJECT(card->address)); + if (card->address_label) + gtk_object_unref(GTK_OBJECT(card->address_label)); } /* Set_arg handler for the card */ static void -e_card_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +e_card_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) { ECard *card; card = E_CARD (object); - switch (prop_id) { - case PROP_FILE_AS: + switch (arg_id) { + case ARG_FILE_AS: g_free(card->file_as); - card->file_as = g_strdup(g_value_get_string (value)); + card->file_as = g_strdup(GTK_VALUE_STRING(*arg)); if (card->file_as == NULL) card->file_as = g_strdup(""); break; - case PROP_FULL_NAME: + case ARG_FULL_NAME: g_free(card->fname); - card->fname = g_strdup(g_value_get_string (value)); + card->fname = g_strdup(GTK_VALUE_STRING(*arg)); if (card->fname == NULL) card->fname = g_strdup(""); e_card_name_unref (card->name); card->name = e_card_name_from_string (card->fname); break; - case PROP_NAME: + case ARG_NAME: e_card_name_unref (card->name); - card->name = e_card_name_ref(g_value_get_pointer (value)); + card->name = e_card_name_ref(GTK_VALUE_POINTER(*arg)); if (card->name == NULL) card->name = e_card_name_new(); if (card->fname == NULL) { @@ -2108,193 +1923,189 @@ e_card_set_property (GObject *object, card->file_as = string; } break; - case PROP_CATEGORIES: + case ARG_CATEGORIES: if (card->categories) - g_object_unref(card->categories); + gtk_object_unref(GTK_OBJECT(card->categories)); card->categories = NULL; - if (g_value_get_string (value)) - do_parse_categories(card, (char*)g_value_get_string (value)); + if (GTK_VALUE_STRING(*arg)) + do_parse_categories(card, GTK_VALUE_STRING(*arg)); break; - case PROP_CATEGORY_LIST: + case ARG_CATEGORY_LIST: if (card->categories) - g_object_unref(card->categories); - card->categories = E_LIST(g_value_get_object(value)); + gtk_object_unref(GTK_OBJECT(card->categories)); + card->categories = E_LIST(GTK_VALUE_OBJECT(*arg)); if (card->categories) - g_object_ref(card->categories); + gtk_object_ref(GTK_OBJECT(card->categories)); break; - case PROP_BIRTH_DATE: + case ARG_BIRTH_DATE: g_free(card->bday); - if (g_value_get_pointer (value)) { + if (GTK_VALUE_POINTER (*arg)) { card->bday = g_new (ECardDate, 1); - memcpy (card->bday, g_value_get_pointer (value), sizeof (ECardDate)); + memcpy (card->bday, GTK_VALUE_POINTER (*arg), sizeof (ECardDate)); } else { card->bday = NULL; } break; - case PROP_URL: + case ARG_URL: g_free(card->url); - card->url = g_strdup(g_value_get_string(value)); + card->url = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_ORG: + case ARG_ORG: g_free(card->org); - card->org = g_strdup(g_value_get_string(value)); + card->org = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_ORG_UNIT: + case ARG_ORG_UNIT: g_free(card->org_unit); - card->org_unit = g_strdup(g_value_get_string(value)); + card->org_unit = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_OFFICE: + case ARG_OFFICE: g_free(card->office); - card->office = g_strdup(g_value_get_string(value)); + card->office = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_TITLE: + case ARG_TITLE: g_free(card->title); - card->title = g_strdup(g_value_get_string(value)); + card->title = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_ROLE: + case ARG_ROLE: g_free(card->role); - card->role = g_strdup(g_value_get_string(value)); + card->role = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_MANAGER: + case ARG_MANAGER: g_free(card->manager); - card->manager = g_strdup(g_value_get_string(value)); + card->manager = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_ASSISTANT: + case ARG_ASSISTANT: g_free(card->assistant); - card->assistant = g_strdup(g_value_get_string(value)); + card->assistant = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_NICKNAME: + case ARG_NICKNAME: g_free(card->nickname); - card->nickname = g_strdup(g_value_get_string(value)); + card->nickname = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_SPOUSE: + case ARG_SPOUSE: g_free(card->spouse); - card->spouse = g_strdup(g_value_get_string(value)); + card->spouse = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_ANNIVERSARY: + case ARG_ANNIVERSARY: g_free(card->anniversary); - if (g_value_get_pointer (value)) { + if (GTK_VALUE_POINTER (*arg)) { card->anniversary = g_new (ECardDate, 1); - memcpy (card->anniversary, g_value_get_pointer (value), sizeof (ECardDate)); + memcpy (card->anniversary, GTK_VALUE_POINTER (*arg), sizeof (ECardDate)); } else { card->anniversary = NULL; } break; - case PROP_MAILER: + case ARG_MAILER: g_free(card->mailer); - card->mailer = g_strdup(g_value_get_string(value)); + card->mailer = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_CALURI: + case ARG_CALURI: g_free(card->caluri); - card->caluri = g_strdup(g_value_get_string(value)); + card->caluri = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_FBURL: + case ARG_FBURL: g_free(card->fburl); - card->fburl = g_strdup(g_value_get_string(value)); + card->fburl = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_ICSCALENDAR: + case ARG_ICSCALENDAR: g_free(card->icscalendar); - card->icscalendar = g_strdup(g_value_get_string(value)); + card->icscalendar = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_NOTE: + case ARG_NOTE: g_free (card->note); - card->note = g_strdup(g_value_get_string(value)); + card->note = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_RELATED_CONTACTS: + case ARG_RELATED_CONTACTS: g_free (card->related_contacts); - card->related_contacts = g_strdup(g_value_get_string(value)); + card->related_contacts = g_strdup(GTK_VALUE_STRING(*arg)); break; - case PROP_WANTS_HTML: - card->wants_html = g_value_get_boolean (value); + case ARG_WANTS_HTML: + card->wants_html = GTK_VALUE_BOOL(*arg); card->wants_html_set = TRUE; break; - case PROP_ARBITRARY: + case ARG_ARBITRARY: if (card->arbitrary) - g_object_unref(card->arbitrary); - card->arbitrary = E_LIST(g_value_get_pointer(value)); + gtk_object_unref(GTK_OBJECT(card->arbitrary)); + card->arbitrary = E_LIST(GTK_VALUE_OBJECT(*arg)); if (card->arbitrary) - g_object_ref(card->arbitrary); + gtk_object_ref(GTK_OBJECT(card->arbitrary)); break; - case PROP_ID: + case ARG_ID: g_free(card->id); - card->id = g_strdup(g_value_get_string(value)); + card->id = g_strdup(GTK_VALUE_STRING(*arg)); if (card->id == NULL) card->id = g_strdup (""); break; - case PROP_LAST_USE: + case ARG_LAST_USE: g_free(card->last_use); - if (g_value_get_pointer (value)) { + if (GTK_VALUE_POINTER (*arg)) { card->last_use = g_new (ECardDate, 1); - memcpy (card->last_use, g_value_get_pointer (value), sizeof (ECardDate)); + memcpy (card->last_use, GTK_VALUE_POINTER (*arg), sizeof (ECardDate)); } else { card->last_use = NULL; } break; - case PROP_USE_SCORE: - card->raw_use_score = g_value_get_float (value); + case ARG_USE_SCORE: + card->raw_use_score = GTK_VALUE_FLOAT(*arg); break; - case PROP_EVOLUTION_LIST: - card->list = g_value_get_boolean (value); + case ARG_EVOLUTION_LIST: + card->list = GTK_VALUE_BOOL(*arg); break; - case PROP_EVOLUTION_LIST_SHOW_ADDRESSES: - card->list_show_addresses = g_value_get_boolean (value); + case ARG_EVOLUTION_LIST_SHOW_ADDRESSES: + card->list_show_addresses = GTK_VALUE_BOOL(*arg); break; default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; + return; } } /* Get_arg handler for the card */ static void -e_card_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +e_card_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) { ECard *card; card = E_CARD (object); - switch (prop_id) { - case PROP_FILE_AS: - g_value_set_string (value, card->file_as); + switch (arg_id) { + case ARG_FILE_AS: + GTK_VALUE_STRING (*arg) = card->file_as; break; - case PROP_FULL_NAME: - g_value_set_string (value, card->fname); + case ARG_FULL_NAME: + GTK_VALUE_STRING (*arg) = card->fname; break; - case PROP_NAME: - g_value_set_pointer (value, card->name); + case ARG_NAME: + GTK_VALUE_POINTER(*arg) = card->name; break; - case PROP_ADDRESS: + case ARG_ADDRESS: if (!card->address) card->address = e_list_new((EListCopyFunc) e_card_delivery_address_ref, (EListFreeFunc) e_card_delivery_address_unref, NULL); - g_value_set_object (value, card->address); + GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->address); break; - case PROP_ADDRESS_LABEL: + case ARG_ADDRESS_LABEL: if (!card->address_label) card->address_label = e_list_new((EListCopyFunc) e_card_address_label_ref, (EListFreeFunc) e_card_address_label_unref, NULL); - g_value_set_object (value, card->address_label); + GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->address_label); break; - case PROP_PHONE: + case ARG_PHONE: if (!card->phone) card->phone = e_list_new((EListCopyFunc) e_card_phone_ref, (EListFreeFunc) e_card_phone_unref, NULL); - g_value_set_object (value, card->phone); + GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->phone); break; - case PROP_EMAIL: + case ARG_EMAIL: if (!card->email) card->email = e_list_new((EListCopyFunc) g_strdup, (EListFreeFunc) g_free, NULL); - g_value_set_object (value, card->email); + GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->email); break; - case PROP_CATEGORIES: + case ARG_CATEGORIES: { int i; char ** strs; @@ -2310,102 +2121,103 @@ e_card_get_property (GObject *object, strs[i] = (char *)e_iterator_get(iterator); } strs[i] = 0; - g_value_set_string(value, g_strjoinv(", ", strs)); + GTK_VALUE_STRING(*arg) = g_strjoinv(", ", strs); g_free(strs); } break; - case PROP_CATEGORY_LIST: + case ARG_CATEGORY_LIST: if (!card->categories) card->categories = e_list_new((EListCopyFunc) g_strdup, (EListFreeFunc) g_free, NULL); - g_value_set_object (value, card->categories); + GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->categories); break; - case PROP_BIRTH_DATE: - g_value_set_pointer (value, card->bday); + case ARG_BIRTH_DATE: + GTK_VALUE_POINTER(*arg) = card->bday; break; - case PROP_URL: - g_value_set_string (value, card->url); + case ARG_URL: + GTK_VALUE_STRING(*arg) = card->url; break; - case PROP_ORG: - g_value_set_string (value, card->org); + case ARG_ORG: + GTK_VALUE_STRING(*arg) = card->org; break; - case PROP_ORG_UNIT: - g_value_set_string (value, card->org_unit); + case ARG_ORG_UNIT: + GTK_VALUE_STRING(*arg) = card->org_unit; break; - case PROP_OFFICE: - g_value_set_string (value, card->office); + case ARG_OFFICE: + GTK_VALUE_STRING(*arg) = card->office; break; - case PROP_TITLE: - g_value_set_string (value, card->title); + case ARG_TITLE: + GTK_VALUE_STRING(*arg) = card->title; break; - case PROP_ROLE: - g_value_set_string (value, card->role); + case ARG_ROLE: + GTK_VALUE_STRING(*arg) = card->role; break; - case PROP_MANAGER: - g_value_set_string (value, card->manager); + case ARG_MANAGER: + GTK_VALUE_STRING(*arg) = card->manager; break; - case PROP_ASSISTANT: - g_value_set_string (value, card->assistant); + case ARG_ASSISTANT: + GTK_VALUE_STRING(*arg) = card->assistant; break; - case PROP_NICKNAME: - g_value_set_string (value, card->nickname); + case ARG_NICKNAME: + GTK_VALUE_STRING(*arg) = card->nickname; break; - case PROP_SPOUSE: - g_value_set_string (value, card->spouse); + case ARG_SPOUSE: + GTK_VALUE_STRING(*arg) = card->spouse; break; - case PROP_ANNIVERSARY: - g_value_set_pointer (value, card->anniversary); + case ARG_ANNIVERSARY: + GTK_VALUE_POINTER(*arg) = card->anniversary; break; - case PROP_MAILER: - g_value_set_string (value, card->mailer); + case ARG_MAILER: + GTK_VALUE_STRING(*arg) = card->mailer; break; - case PROP_CALURI: - g_value_set_string (value, card->caluri); + case ARG_CALURI: + GTK_VALUE_STRING(*arg) = card->caluri; break; - case PROP_FBURL: - g_value_set_string (value, card->fburl); + case ARG_FBURL: + GTK_VALUE_STRING(*arg) = card->fburl; break; - case PROP_ICSCALENDAR: - g_value_set_string (value, card->icscalendar); + case ARG_ICSCALENDAR: + GTK_VALUE_STRING(*arg) = card->icscalendar; break; - case PROP_NOTE: - g_value_set_string (value, card->note); + case ARG_NOTE: + GTK_VALUE_STRING(*arg) = card->note; break; - case PROP_RELATED_CONTACTS: - g_value_set_string (value, card->related_contacts); + case ARG_RELATED_CONTACTS: + GTK_VALUE_STRING(*arg) = card->related_contacts; break; - case PROP_WANTS_HTML: - g_value_set_boolean (value, card->wants_html); + case ARG_WANTS_HTML: + GTK_VALUE_BOOL(*arg) = card->wants_html; break; - case PROP_WANTS_HTML_SET: - g_value_set_boolean (value, card->wants_html_set); + case ARG_WANTS_HTML_SET: + GTK_VALUE_BOOL(*arg) = card->wants_html_set; break; - case PROP_ARBITRARY: + case ARG_ARBITRARY: if (!card->arbitrary) card->arbitrary = e_list_new((EListCopyFunc) e_card_arbitrary_ref, (EListFreeFunc) e_card_arbitrary_unref, NULL); - g_value_set_object (value, card->arbitrary); + GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->arbitrary); break; - case PROP_ID: - g_value_set_string (value, card->id); + case ARG_ID: + GTK_VALUE_STRING(*arg) = card->id; break; - case PROP_LAST_USE: - g_value_set_pointer (value, card->last_use); + case ARG_LAST_USE: + GTK_VALUE_POINTER(*arg) = card->last_use; break; - case PROP_USE_SCORE: - g_value_set_float (value, e_card_get_use_score (card)); + + case ARG_USE_SCORE: + GTK_VALUE_FLOAT(*arg) = e_card_get_use_score (card); break; - case PROP_EVOLUTION_LIST: - g_value_set_boolean (value, card->list); + case ARG_EVOLUTION_LIST: + GTK_VALUE_BOOL(*arg) = card->list; break; - case PROP_EVOLUTION_LIST_SHOW_ADDRESSES: - g_value_set_boolean (value, card->list_show_addresses); + case ARG_EVOLUTION_LIST_SHOW_ADDRESSES: + GTK_VALUE_BOOL(*arg) = card->list_show_addresses; break; default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + arg->type = GTK_TYPE_INVALID; break; } } @@ -2461,7 +2273,7 @@ e_card_load_cards_from_file_with_default_charset(const char *filename, char *def GList *list = NULL; while(vobj) { VObject *next; - ECard *card = g_object_new (E_TYPE_CARD, NULL); + ECard *card = E_CARD(gtk_type_new(e_card_get_type())); parse(card, vobj, default_charset); next = nextVObjectInList(vobj); cleanVObject(vobj); @@ -2485,7 +2297,7 @@ e_card_load_cards_from_string_with_default_charset(const char *str, char *defaul GList *list = NULL; while(vobj) { VObject *next; - ECard *card = g_object_new (E_TYPE_CARD, NULL); + ECard *card = E_CARD(gtk_type_new(e_card_get_type())); parse(card, vobj, default_charset); next = nextVObjectInList(vobj); cleanVObject(vobj); @@ -2506,32 +2318,32 @@ void e_card_free_empty_lists (ECard *card) { if (card->address && e_list_length (card->address) == 0) { - g_object_unref (card->address); + gtk_object_unref (GTK_OBJECT (card->address)); card->address = NULL; } if (card->address_label && e_list_length (card->address_label) == 0) { - g_object_unref (card->address_label); + gtk_object_unref (GTK_OBJECT (card->address_label)); card->address_label = NULL; } if (card->phone && e_list_length (card->phone) == 0) { - g_object_unref (card->phone); + gtk_object_unref (GTK_OBJECT (card->phone)); card->phone = NULL; } if (card->email && e_list_length (card->email) == 0) { - g_object_unref (card->email); + gtk_object_unref (GTK_OBJECT (card->email)); card->email = NULL; } if (card->categories && e_list_length (card->categories) == 0) { - g_object_unref (card->categories); + gtk_object_unref (GTK_OBJECT (card->categories)); card->categories = NULL; } if (card->arbitrary && e_list_length (card->arbitrary) == 0) { - g_object_unref (card->arbitrary); + gtk_object_unref (GTK_OBJECT (card->arbitrary)); card->arbitrary = NULL; } } @@ -2734,6 +2546,278 @@ set_address_flags (VObject *vobj, ECardAddressFlags flags) } } +#include <Evolution-Composer.h> + +#define COMPOSER_OAFID "OAFIID:GNOME_Evolution_Mail_Composer" + +void +e_card_list_send (GList *cards, ECardDisposition disposition) +{ + BonoboObjectClient *bonobo_server; + GNOME_Evolution_Composer composer_server; + CORBA_Environment ev; + + if (cards == NULL) + return; + + /* First, I obtain an object reference that represents the Composer. */ + bonobo_server = bonobo_object_activate (COMPOSER_OAFID, 0); + + g_return_if_fail (bonobo_server != NULL); + + composer_server = bonobo_object_corba_objref (BONOBO_OBJECT (bonobo_server)); + + CORBA_exception_init (&ev); + + if (disposition == E_CARD_DISPOSITION_AS_TO) { + GNOME_Evolution_Composer_RecipientList *to_list, *cc_list, *bcc_list; + CORBA_char *subject; + int to_i, bcc_i; + GList *iter; + gint to_length = 0, bcc_length = 0; + + /* Figure out how many addresses of each kind we have. */ + for (iter = cards; iter != NULL; iter = g_list_next (iter)) { + ECard *card = E_CARD (iter->data); + if (e_card_evolution_list (card)) { + gint len = card->email ? e_list_length (card->email) : 0; + if (e_card_evolution_list_show_addresses (card)) + to_length += len; + else + bcc_length += len; + } else { + if (card->email != NULL) + ++to_length; + } + } + + /* Now I have to make a CORBA sequences that represents a recipient list with + the right number of entries, for the cards. */ + to_list = GNOME_Evolution_Composer_RecipientList__alloc (); + to_list->_maximum = to_length; + to_list->_length = to_length; + if (to_length > 0) { + to_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (to_length); + } + + cc_list = GNOME_Evolution_Composer_RecipientList__alloc (); + cc_list->_maximum = cc_list->_length = 0; + + bcc_list = GNOME_Evolution_Composer_RecipientList__alloc (); + bcc_list->_maximum = bcc_length; + bcc_list->_length = bcc_length; + if (bcc_length > 0) { + bcc_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (bcc_length); + } + + to_i = 0; + bcc_i = 0; + while (cards != NULL) { + ECard *card = cards->data; + EIterator *iterator; + gchar *name, *addr; + gboolean is_list, is_hidden, free_name_addr; + GNOME_Evolution_Composer_Recipient *recipient; + + if (card->email != NULL) { + + is_list = e_card_evolution_list (card); + is_hidden = is_list && !e_card_evolution_list_show_addresses (card); + + for (iterator = e_list_get_iterator (card->email); e_iterator_is_valid (iterator); e_iterator_next (iterator)) { + + if (is_hidden) { + recipient = &(bcc_list->_buffer[bcc_i]); + ++bcc_i; + } else { + recipient = &(to_list->_buffer[to_i]); + ++to_i; + } + + name = ""; + addr = ""; + free_name_addr = FALSE; + if (e_iterator_is_valid (iterator)) { + + if (is_list) { + /* We need to decode the list entries, which are XMLified EDestinations. */ + EDestination *dest = e_destination_import (e_iterator_get (iterator)); + if (dest != NULL) { + name = g_strdup (e_destination_get_name (dest)); + addr = g_strdup (e_destination_get_email (dest)); + free_name_addr = TRUE; + gtk_object_unref (GTK_OBJECT (dest)); + } + + } else { /* is just a plain old card */ + if (card->name) + name = e_card_name_to_string (card->name); + addr = g_strdup ((char *) e_iterator_get (iterator)); + free_name_addr = TRUE; + } + } + + recipient->name = CORBA_string_dup (name ? name : ""); + recipient->address = CORBA_string_dup (addr ? addr : ""); + + if (free_name_addr) { + g_free ((gchar *) name); + g_free ((gchar *) addr); + } + + /* If this isn't a list, we quit after the first (i.e. the default) address. */ + if (!is_list) + break; + + } + gtk_object_unref (GTK_OBJECT (iterator)); + } + + cards = g_list_next (cards); + } + + subject = CORBA_string_dup (""); + + GNOME_Evolution_Composer_setHeaders (composer_server, "", to_list, cc_list, bcc_list, subject, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + g_printerr ("gui/e-meeting-edit.c: I couldn't set the composer headers via CORBA! Aagh.\n"); + CORBA_exception_free (&ev); + return; + } + + CORBA_free (to_list); + CORBA_free (cc_list); + CORBA_free (bcc_list); + CORBA_free (subject); + } + + if (disposition == E_CARD_DISPOSITION_AS_ATTACHMENT) { + CORBA_char *content_type, *filename, *description; + GNOME_Evolution_Composer_AttachmentData *attach_data; + CORBA_boolean show_inline; + char *tempstr; + + GNOME_Evolution_Composer_RecipientList *to_list, *cc_list, *bcc_list; + CORBA_char *subject; + + content_type = CORBA_string_dup ("text/x-vcard"); + filename = CORBA_string_dup (""); + + if (cards->next) { + description = CORBA_string_dup (_("Multiple VCards")); + } else { + char *file_as; + + gtk_object_get(GTK_OBJECT(cards->data), + "file_as", &file_as, + NULL); + + tempstr = g_strdup_printf (_("VCard for %s"), file_as); + description = CORBA_string_dup (tempstr); + g_free (tempstr); + } + + show_inline = FALSE; + + tempstr = e_card_list_get_vcard (cards); + attach_data = GNOME_Evolution_Composer_AttachmentData__alloc(); + attach_data->_maximum = attach_data->_length = strlen (tempstr); + attach_data->_buffer = CORBA_sequence_CORBA_char_allocbuf (attach_data->_length); + strcpy (attach_data->_buffer, tempstr); + g_free (tempstr); + + GNOME_Evolution_Composer_attachData (composer_server, + content_type, filename, description, + show_inline, attach_data, + &ev); + + if (ev._major != CORBA_NO_EXCEPTION) { + g_printerr ("gui/e-meeting-edit.c: I couldn't attach data to the composer via CORBA! Aagh.\n"); + CORBA_exception_free (&ev); + return; + } + + CORBA_free (content_type); + CORBA_free (filename); + CORBA_free (description); + CORBA_free (attach_data); + + to_list = GNOME_Evolution_Composer_RecipientList__alloc (); + to_list->_maximum = to_list->_length = 0; + + cc_list = GNOME_Evolution_Composer_RecipientList__alloc (); + cc_list->_maximum = cc_list->_length = 0; + + bcc_list = GNOME_Evolution_Composer_RecipientList__alloc (); + bcc_list->_maximum = bcc_list->_length = 0; + + if (!cards || cards->next) { + subject = CORBA_string_dup ("Contact information"); + } else { + ECard *card = cards->data; + const gchar *tempstr2; + + tempstr2 = NULL; + gtk_object_get(GTK_OBJECT(card), + "file_as", &tempstr2, + NULL); + if (!tempstr2 || !*tempstr2) + gtk_object_get(GTK_OBJECT(card), + "full_name", &tempstr2, + NULL); + if (!tempstr2 || !*tempstr2) + gtk_object_get(GTK_OBJECT(card), + "org", &tempstr2, + NULL); + if (!tempstr2 || !*tempstr2) { + EList *list; + EIterator *iterator; + gtk_object_get(GTK_OBJECT(card), + "email", &list, + NULL); + iterator = e_list_get_iterator (list); + if (e_iterator_is_valid (iterator)) { + tempstr2 = e_iterator_get (iterator); + } + gtk_object_unref (GTK_OBJECT (iterator)); + } + + if (!tempstr2 || !*tempstr2) + tempstr = g_strdup_printf ("Contact information"); + else + tempstr = g_strdup_printf ("Contact information for %s", tempstr2); + subject = CORBA_string_dup (tempstr); + g_free (tempstr); + } + + GNOME_Evolution_Composer_setHeaders (composer_server, "", to_list, cc_list, bcc_list, subject, &ev); + + CORBA_free (to_list); + CORBA_free (cc_list); + CORBA_free (bcc_list); + CORBA_free (subject); + } + + GNOME_Evolution_Composer_show (composer_server, &ev); + + if (ev._major != CORBA_NO_EXCEPTION) { + g_printerr ("gui/e-meeting-edit.c: I couldn't show the composer via CORBA! Aagh.\n"); + CORBA_exception_free (&ev); + return; + } + + CORBA_exception_free (&ev); +} + +void +e_card_send (ECard *card, ECardDisposition disposition) +{ + GList *list; + list = g_list_prepend (NULL, card); + e_card_list_send (list, disposition); + g_list_free (list); +} + gboolean e_card_evolution_list (ECard *card) { diff --git a/addressbook/backend/ebook/e-card.h b/addressbook/backend/ebook/e-card.h index d82d5f4cb6..dbaa954ba7 100644 --- a/addressbook/backend/ebook/e-card.h +++ b/addressbook/backend/ebook/e-card.h @@ -13,17 +13,16 @@ #define __E_CARD_H__ #include <time.h> -#include <glib-object.h> +#include <gtk/gtkobject.h> #include <stdio.h> #include <ebook/e-card-types.h> #include <e-util/e-list.h> #define E_TYPE_CARD (e_card_get_type ()) -#define E_CARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CARD, ECard)) -#define E_CARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CARD, ECardClass)) -#define E_IS_CARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CARD)) -#define E_IS_CARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_CARD)) -#define E_CARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TYPE_CARD, ECardClass)) +#define E_CARD(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CARD, ECard)) +#define E_CARD_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CARD, ECardClass)) +#define E_IS_CARD(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CARD)) +#define E_IS_CARD_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_CARD)) typedef struct _ECard ECard; typedef struct _ECardClass ECardClass; @@ -31,7 +30,7 @@ typedef struct _ECardClass ECardClass; struct _EBook; /* Forward reference */ struct _ECard { - GObject object; + GtkObject object; char *id; struct _EBook *book; /* The EBook this card is from. */ @@ -113,7 +112,7 @@ struct _ECard { }; struct _ECardClass { - GObjectClass parent_class; + GtkObjectClass parent_class; GHashTable *attribute_jump_table; }; @@ -196,6 +195,16 @@ GList *e_card_load_cards_from_string_with_default_charset (const char *default_charset); void e_card_free_empty_lists (ECard *card); +enum _ECardDisposition { + E_CARD_DISPOSITION_AS_ATTACHMENT, + E_CARD_DISPOSITION_AS_TO, +}; +typedef enum _ECardDisposition ECardDisposition; +void e_card_send (ECard *card, + ECardDisposition disposition); +void e_card_list_send (GList *cards, + ECardDisposition disposition); + /* Getting ECards via their URIs */ typedef void (*ECardCallback) (ECard *card, gpointer closure); void e_card_load_uri (const gchar *book_uri, @@ -204,6 +213,7 @@ void e_card_load_uri (const gchar gpointer closure); -GType e_card_get_type (void); +/* Standard Gtk function */ +GtkType e_card_get_type (void); #endif /* ! __E_CARD_H__ */ diff --git a/addressbook/backend/ebook/evolution-ldif-importer.c b/addressbook/backend/ebook/evolution-ldif-importer.c index 7a204daa95..5602f3fb18 100644 --- a/addressbook/backend/ebook/evolution-ldif-importer.c +++ b/addressbook/backend/ebook/evolution-ldif-importer.c @@ -13,24 +13,22 @@ */ #include <config.h> +#include <bonobo.h> +#include <gnome.h> +#include <liboaf/liboaf.h> #include <stdio.h> #include <ctype.h> -#include <string.h> #include <e-book.h> -#include <e-book-util.h> #include <e-card-simple.h> #include <e-destination.h> -#include <libgnome/gnome-init.h> -#include <bonobo/bonobo-generic-factory.h> -#include <bonobo/bonobo-main.h> - #include <importer/evolution-importer.h> #include <importer/GNOME_Evolution_Importer.h> #define COMPONENT_FACTORY_IID "OAFIID:GNOME_Evolution_Addressbook_LDIF_ImporterFactory" -#define COMPONENT_IID "OAFIID:GNOME_Evolution_Addressbook_LDIF_Importer" + +static BonoboGenericFactory *factory = NULL; static GHashTable *dn_card_hash; @@ -240,17 +238,17 @@ parseLine( ECardSimple *simple, ECardDeliveryAddress *address, char **buf ) field_handled = FALSE; for (i = 0; i < num_ldif_fields; i ++) { - if (!g_ascii_strcasecmp (ptr, ldif_fields[i].ldif_attribute)) { + if (!g_strcasecmp (ptr, ldif_fields[i].ldif_attribute)) { if (ldif_fields[i].flags & FLAG_ADDRESS) { - if (!g_ascii_strcasecmp (ptr, "locality")) + if (!g_strcasecmp (ptr, "locality")) address->city = g_strdup (ldif_value->str); - else if (!g_ascii_strcasecmp (ptr, "countryname")) + else if (!g_strcasecmp (ptr, "countryname")) address->country = g_strdup (ldif_value->str); - else if (!g_ascii_strcasecmp (ptr, "postalcode")) + else if (!g_strcasecmp (ptr, "postalcode")) address->code = g_strdup (ldif_value->str); - else if (!g_ascii_strcasecmp (ptr, "st")) + else if (!g_strcasecmp (ptr, "st")) address->region = g_strdup (ldif_value->str); - else if (!g_ascii_strcasecmp (ptr, "streetaddress")) + else if (!g_strcasecmp (ptr, "streetaddress")) address->street = g_strdup (ldif_value->str); } else { @@ -264,16 +262,16 @@ parseLine( ECardSimple *simple, ECardDeliveryAddress *address, char **buf ) /* handle objectclass/dn/member out here */ if (!field_handled) { - if (!g_ascii_strcasecmp (ptr, "dn")) + if (!g_strcasecmp (ptr, "dn")) g_hash_table_insert (dn_card_hash, g_strdup(ldif_value->str), simple->card); - else if (!g_ascii_strcasecmp (ptr, "objectclass") && !g_ascii_strcasecmp (ldif_value->str, "groupofnames")) { + else if (!g_strcasecmp (ptr, "objectclass") && !g_strcasecmp (ldif_value->str, "groupofnames")) { e_card_simple_set (simple, E_CARD_SIMPLE_FIELD_IS_LIST, "true"); } - else if (!g_ascii_strcasecmp (ptr, "member")) { + else if (!g_strcasecmp (ptr, "member")) { EList *email; - g_object_get (simple->card, - "email", &email, - NULL); + gtk_object_get (GTK_OBJECT (simple->card), + "email", &email, + NULL); e_list_append (email, ldif_value->str); } } @@ -328,7 +326,7 @@ getNextLDIFEntry( FILE *f ) while (buf) { if (!parseLine (simple, address, &buf)) { /* parsing error */ - g_object_unref (simple); + gtk_object_unref (GTK_OBJECT (simple)); e_card_delivery_address_unref (address); return NULL; } @@ -376,17 +374,17 @@ resolve_list_card (LDIFImporter *gci, ECard *card) if (!e_card_evolution_list (card)) return; - g_object_get (card, - "email", &email, - "full_name", &full_name, - NULL); + gtk_object_get (GTK_OBJECT (card), + "email", &email, + "full_name", &full_name, + NULL); /* set file_as to full_name so we don't later try and figure out a first/last name for the list. */ if (full_name) - g_object_set (card, - "file_as", full_name, - NULL); + gtk_object_set (GTK_OBJECT (card), + "file_as", full_name, + NULL); email_iter = e_list_get_iterator (email); while (e_iterator_is_valid (email_iter)) { @@ -399,7 +397,7 @@ resolve_list_card (LDIFImporter *gci, ECard *card) gchar *dest_xml; e_destination_set_card (dest, dn_card, 0); /* Hard-wired for default e-mail, since netscape only exports 1 email address */ dest_xml = e_destination_export (dest); - g_object_unref (dest); + gtk_object_unref (GTK_OBJECT (dest)); if (dest_xml) { e_iterator_set (email_iter, dest_xml); g_free (dest_xml); @@ -450,18 +448,33 @@ book_open_cb (EBook *book, EBookStatus status, gpointer closure) } static void -ebook_open (LDIFImporter *gci, const char *uri) +ebook_create (LDIFImporter *gci) { + gchar *path, *uri; + gci->book = e_book_new (); if (!gci->book) { printf ("%s: %s(): Couldn't create EBook, bailing.\n", __FILE__, - G_GNUC_FUNCTION); + __FUNCTION__); return; } +#if 0 + path = g_concat_dir_and_file (g_get_home_dir (), + "evolution/local/Contacts/addressbook.db"); + uri = g_strdup_printf ("file://%s", path); + g_free (path); + + if (! e_book_load_uri (gci->book, uri, book_open_cb, gci)) { + printf ("error calling load_uri!\n"); + } + g_free(uri); +#endif - e_book_load_address_book_by_uri (gci->book, uri, book_open_cb, gci); + if (! e_book_load_default_book (gci->book, book_open_cb, gci)) { + g_warning ("Error calling load_default_book"); + } } /* EvolutionImporter methods */ @@ -536,16 +549,16 @@ support_format_fn (EvolutionImporter *importer, } static void -importer_destroy_cb (gpointer data, - GObject *where_object_was) +importer_destroy_cb (GtkObject *object, + LDIFImporter *gci) { - bonobo_main_quit (); + gtk_main_quit (); } static gboolean load_file_fn (EvolutionImporter *importer, const char *filename, - const char *uri, + const char *folderpath, void *closure) { LDIFImporter *gci; @@ -555,33 +568,62 @@ load_file_fn (EvolutionImporter *importer, gci->cardlist = NULL; gci->iterator = NULL; gci->ready = FALSE; - ebook_open (gci, uri); + ebook_create (gci); return TRUE; } static BonoboObject * factory_fn (BonoboGenericFactory *_factory, - const char *component_id, void *closure) { EvolutionImporter *importer; LDIFImporter *gci; - if (!strcmp (component_id, COMPONENT_IID)) { - gci = g_new (LDIFImporter, 1); - importer = evolution_importer_new (support_format_fn, load_file_fn, - process_item_fn, NULL, gci); + gci = g_new (LDIFImporter, 1); + importer = evolution_importer_new (support_format_fn, load_file_fn, + process_item_fn, NULL, gci); - g_object_weak_ref (G_OBJECT (importer), - importer_destroy_cb, gci); + gtk_signal_connect (GTK_OBJECT (importer), "destroy", + GTK_SIGNAL_FUNC (importer_destroy_cb), gci); - return BONOBO_OBJECT (importer); + return BONOBO_OBJECT (importer); +} + +static void +importer_init (void) +{ + if (factory != NULL) + return; + + factory = bonobo_generic_factory_new (COMPONENT_FACTORY_IID, + factory_fn, NULL); + + if (factory == NULL) { + g_error ("Unable to create factory"); } - else { - g_warning (COMPONENT_FACTORY_IID ": Don't know what to do with %s", component_id); - return NULL; + + bonobo_running_context_auto_exit_unref (BONOBO_OBJECT (factory)); +} + +int +main (int argc, + char **argv) +{ + CORBA_ORB orb; + + gnome_init_with_popt_table ("Evolution-LDIF-Importer", + "0.0", argc, argv, oaf_popt_options, 0, + NULL); + orb = oaf_init (argc, argv); + if (bonobo_init (orb, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE) { + g_error ("Could not initialize Bonobo."); } + + importer_init (); + bonobo_main (); + + return 0; } -BONOBO_ACTIVATION_FACTORY (COMPONENT_FACTORY_IID, "Evolution LDIF Importer Factory", VERSION, factory_fn, NULL); + diff --git a/addressbook/backend/ebook/evolution-vcard-importer.c b/addressbook/backend/ebook/evolution-vcard-importer.c index b5baebf2d1..f07192d72c 100644 --- a/addressbook/backend/ebook/evolution-vcard-importer.c +++ b/addressbook/backend/ebook/evolution-vcard-importer.c @@ -1,14 +1,13 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ #include <config.h> #include <stdio.h> -#include <string.h> +#include <liboaf/liboaf.h> #include <bonobo/bonobo-context.h> #include <bonobo/bonobo-generic-factory.h> #include <bonobo/bonobo-main.h> #include <e-book.h> -#include <e-book-util.h> #include <importer/evolution-importer.h> #include <importer/GNOME_Evolution_Importer.h> @@ -16,10 +15,12 @@ #include <e-util/e-path.h> #define COMPONENT_FACTORY_IID "OAFIID:GNOME_Evolution_Addressbook_VCard_ImporterFactory" -#define COMPONENT_IID "OAFIID:GNOME_Evolution_Addressbook_VCard_Importer" + +static BonoboGenericFactory *factory = NULL; typedef struct { char *filename; + char *folderpath; GList *cardlist; GList *iterator; EBook *book; @@ -30,7 +31,7 @@ static void add_card_cb (EBook *book, EBookStatus status, const gchar *id, gpointer closure) { ECard *card = E_CARD(closure); - g_object_unref(card); + gtk_object_unref(GTK_OBJECT(card)); } static void @@ -43,18 +44,39 @@ book_open_cb (EBook *book, EBookStatus status, gpointer closure) } static void -ebook_open (VCardImporter *gci, const char *uri) +ebook_create (VCardImporter *gci) { + gchar *path, *uri; + gchar *epath; + gci->book = e_book_new (); if (!gci->book) { printf ("%s: %s(): Couldn't create EBook, bailing.\n", __FILE__, - G_GNUC_FUNCTION); + __FUNCTION__); return; } - e_book_load_address_book_by_uri (gci->book, uri, book_open_cb, gci); +#if 0 + path = g_concat_dir_and_file (g_get_home_dir (), "evolution/local"); + uri = g_strdup_printf ("file://%s", path); + g_free (path); + + epath = e_path_to_physical (uri, gci->folderpath); + g_free (uri); + uri = g_strdup_printf ("%s/addressbook.db", epath); + g_free (epath); + + if (! e_book_load_uri (gci->book, uri, book_open_cb, gci)) { + printf ("error calling load_uri!\n"); + } + g_free(uri); +#endif + + if (! e_book_load_default_book (gci->book, book_open_cb, gci)) { + g_warning ("Error calling load_default_book"); + } } /* EvolutionImporter methods */ @@ -128,7 +150,7 @@ check_file_is_vcard (const char *filename) return FALSE; } - if (g_ascii_strncasecmp (line, "BEGIN:VCARD", 11) == 0) { + if (g_strncasecmp (line, "BEGIN:VCARD", 11) == 0) { result = TRUE; } else { result = FALSE; @@ -151,7 +173,7 @@ support_format_fn (EvolutionImporter *importer, return check_file_is_vcard (filename); } for (i = 0; supported_extensions[i] != NULL; i++) { - if (g_ascii_strcasecmp (supported_extensions[i], ext) == 0) + if (g_strcasecmp (supported_extensions[i], ext) == 0) return check_file_is_vcard (filename); } @@ -159,16 +181,16 @@ support_format_fn (EvolutionImporter *importer, } static void -importer_destroy_cb (gpointer data, - GObject *where_object_was) +importer_destroy_cb (GtkObject *object, + VCardImporter *gci) { - bonobo_main_quit (); + gtk_main_quit (); } static gboolean load_file_fn (EvolutionImporter *importer, const char *filename, - const char *uri, + const char *folderpath, void *closure) { VCardImporter *gci; @@ -179,35 +201,66 @@ load_file_fn (EvolutionImporter *importer, gci = (VCardImporter *) closure; gci->filename = g_strdup (filename); + gci->folderpath = g_strdup (folderpath); gci->cardlist = NULL; gci->iterator = NULL; gci->ready = FALSE; - ebook_open (gci, uri); + ebook_create (gci); return TRUE; } static BonoboObject * factory_fn (BonoboGenericFactory *_factory, - const char *component_id, void *closure) { EvolutionImporter *importer; VCardImporter *gci; - if (!strcmp (component_id, COMPONENT_IID)) { - gci = g_new (VCardImporter, 1); - importer = evolution_importer_new (support_format_fn, load_file_fn, - process_item_fn, NULL, gci); + gci = g_new (VCardImporter, 1); + importer = evolution_importer_new (support_format_fn, load_file_fn, + process_item_fn, NULL, gci); + + gtk_signal_connect (GTK_OBJECT (importer), "destroy", + GTK_SIGNAL_FUNC (importer_destroy_cb), gci); - g_object_weak_ref (G_OBJECT (importer), - importer_destroy_cb, gci); - return BONOBO_OBJECT (importer); + return BONOBO_OBJECT (importer); +} + +static void +importer_init (void) +{ + if (factory != NULL) + return; + + factory = bonobo_generic_factory_new (COMPONENT_FACTORY_IID, + factory_fn, NULL); + + if (factory == NULL) { + g_error ("Unable to create factory"); } - else { - g_warning (COMPONENT_FACTORY_IID ": Don't know what to do with %s", component_id); - return NULL; + + bonobo_running_context_auto_exit_unref (BONOBO_OBJECT (factory)); +} + +int +main (int argc, + char **argv) +{ + CORBA_ORB orb; + + gnome_init_with_popt_table ("Evolution-VCard-Importer", + PACKAGE, argc, argv, oaf_popt_options, 0, + NULL); + orb = oaf_init (argc, argv); + if (bonobo_init (orb, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE) { + g_error ("Could not initialize Bonobo."); } + + importer_init (); + bonobo_main (); + + return 0; } -BONOBO_ACTIVATION_FACTORY (COMPONENT_FACTORY_IID, "Evolution VCard Importer Factory", VERSION, factory_fn, NULL); + diff --git a/addressbook/backend/pas/pas-backend-file.c b/addressbook/backend/pas/pas-backend-file.c index 06eb84cc4e..ddef2a568b 100644 --- a/addressbook/backend/pas/pas-backend-file.c +++ b/addressbook/backend/pas/pas-backend-file.c @@ -10,13 +10,15 @@ #include "pas-backend-file.h" #include <stdio.h> -#include <string.h> #include <unistd.h> #include <fcntl.h> #include <time.h> #include <db.h> #include <sys/stat.h> +#include <libgnome/gnome-defs.h> +#include <libgnome/gnome-i18n.h> + #include <e-util/e-db3-utils.h> #if DB_VERSION_MAJOR != 3 || \ @@ -25,14 +27,15 @@ #error Including wrong DB3. Need libdb 3.1.17. #endif +#include <gtk/gtksignal.h> +#include <libgnome/gnome-defs.h> +#include <libgnome/gnome-util.h> #include <gal/util/e-util.h> #include <gal/widgets/e-unicode.h> #include <ebook/e-card-simple.h> #include <e-util/e-dbhash.h> #include <e-util/e-db3-utils.h> -#include <libgnome/gnome-i18n.h> - #include "pas-book.h" #include "pas-card-cursor.h" #include "pas-backend-card-sexp.h" @@ -51,10 +54,13 @@ typedef struct _PASBackendFileSearchContext PASBackendFileSearchContext; typedef struct _PasBackendFileChangeContext PASBackendFileChangeContext; struct _PASBackendFilePrivate { + GList *clients; + gboolean loaded; char *uri; char *filename; DB *file_db; EList *book_views; + gboolean writable; GHashTable *address_lists; PASBackendSummary *summary; }; @@ -208,7 +214,7 @@ pas_backend_file_book_view_copy(const PASBackendFileBookView *book_view, void *c new_book_view->search = g_strdup(book_view->search); new_book_view->card_sexp = book_view->card_sexp; if (new_book_view->card_sexp) - g_object_ref(new_book_view->card_sexp); + gtk_object_ref(GTK_OBJECT(new_book_view->card_sexp)); new_book_view->change_id = g_strdup(book_view->change_id); if (book_view->change_context) { @@ -230,7 +236,7 @@ pas_backend_file_book_view_free(PASBackendFileBookView *book_view, void *closure { g_free(book_view->search); if (book_view->card_sexp) - g_object_unref (book_view->card_sexp); + gtk_object_unref (GTK_OBJECT(book_view->card_sexp)); g_free(book_view->change_id); if (book_view->change_context) { @@ -268,7 +274,7 @@ get_nth(PASCardCursor *cursor, long n, gpointer data) } static void -cursor_destroy(gpointer data, GObject *where_object_was) +cursor_destroy(GtkObject *object, gpointer data) { CORBA_Environment ev; GNOME_Evolution_Addressbook_Book corba_book; @@ -294,7 +300,7 @@ cursor_destroy(gpointer data, GObject *where_object_was) } static void -view_destroy(gpointer data, GObject *where_object_was) +view_destroy(GtkObject *object, gpointer data) { PASBook *book = (PASBook *)data; PASBackendFile *bf; @@ -304,7 +310,7 @@ view_destroy(gpointer data, GObject *where_object_was) bf = PAS_BACKEND_FILE(pas_book_get_backend(book)); for (iterator = e_list_get_iterator(bf->priv->book_views); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { const PASBackendFileBookView *view = e_iterator_get(iterator); - if (view->book_view == (PASBookView*)where_object_was) { + if (view->book_view == PAS_BOOK_VIEW(object)) { e_iterator_delete(iterator); success = TRUE; break; @@ -312,7 +318,7 @@ view_destroy(gpointer data, GObject *where_object_was) } if (!success) g_warning ("Failed to remove from book_views list"); - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); bonobo_object_unref(BONOBO_OBJECT(book)); } @@ -337,116 +343,6 @@ vcard_matches_search (const PASBackendFileBookView *view, char *vcard_string) return pas_backend_card_sexp_match_vcard (view->card_sexp, vcard_string); } -static gboolean -ecard_matches_search (const PASBackendFileBookView *view, ECard *card) -{ - /* If this is not a search context view, it doesn't match be default */ - if (view->card_sexp == NULL) - return FALSE; - - return pas_backend_card_sexp_match_ecard (view->card_sexp, card); -} - -typedef struct { - PASBackendFile *bf; - PASBook *book; - const PASBackendFileBookView *view; - DBC *dbc; - - int card_count; - int card_threshold; - int card_threshold_max; - GList *cards; - - gboolean done_first; - gboolean search_needed; -} FileBackendSearchClosure; - -static void -free_search_closure (FileBackendSearchClosure *closure) -{ - g_list_foreach (closure->cards, (GFunc)g_free, NULL); - g_list_free (closure->cards); - g_free (closure); -} - -static gboolean -pas_backend_file_search_timeout (gpointer data) -{ - FileBackendSearchClosure *closure = data; - int db_error = 0; - DBT id_dbt, vcard_dbt; - int file_version_name_len; - DBC *dbc = closure->dbc; - - file_version_name_len = strlen (PAS_BACKEND_FILE_VERSION_NAME); - - memset (&id_dbt, 0, sizeof (id_dbt)); - memset (&vcard_dbt, 0, sizeof (vcard_dbt)); - - if (closure->done_first) { - db_error = dbc->c_get(dbc, &id_dbt, &vcard_dbt, DB_NEXT); - } - else { - db_error = dbc->c_get(dbc, &id_dbt, &vcard_dbt, DB_FIRST); - closure->done_first = TRUE; - } - - while (db_error == 0) { - - /* don't include the version in the list of cards */ - if (id_dbt.size != file_version_name_len+1 - || strcmp (id_dbt.data, PAS_BACKEND_FILE_VERSION_NAME)) { - char *vcard_string = vcard_dbt.data; - - /* check if the vcard matches the search sexp */ - if ((!closure->search_needed) || vcard_matches_search (closure->view, vcard_string)) { - closure->cards = g_list_prepend (closure->cards, g_strdup (vcard_string)); - closure->card_count ++; - } - - /* If we've accumulated a number of checks, pass them off to the client. */ - if (closure->card_count >= closure->card_threshold) { - pas_book_view_notify_add (closure->view->book_view, closure->cards); - /* Clean up the handed-off data. */ - g_list_foreach (closure->cards, (GFunc)g_free, NULL); - g_list_free (closure->cards); - closure->cards = NULL; - closure->card_count = 0; - - /* Yeah, this scheme is overly complicated. But I like it. */ - if (closure->card_threshold < closure->card_threshold_max) { - closure->card_threshold = MIN (2*closure->card_threshold, closure->card_threshold_max); - } - - /* return here, we'll do the next lump in the next callback */ - g_timeout_add (200, pas_backend_file_search_timeout, closure); - - return FALSE; - } - } - - db_error = dbc->c_get(dbc, &id_dbt, &vcard_dbt, DB_NEXT); - } - - dbc->c_close (dbc); - - if (db_error != DB_NOTFOUND) { - g_warning ("pas_backend_file_search: error building list\n"); - free_search_closure (closure); - } - - if (closure->card_count) - pas_book_view_notify_add (closure->view->book_view, closure->cards); - - pas_book_view_notify_complete (closure->view->book_view, GNOME_Evolution_Addressbook_BookViewListener_Success); - - free_search_closure (closure); - - return FALSE; -} - - static void pas_backend_file_search (PASBackendFile *bf, PASBook *book, @@ -456,6 +352,9 @@ pas_backend_file_search (PASBackendFile *bf, PASBackendFileBookView *view = (PASBackendFileBookView *)cnstview; gboolean search_needed; + if (!bf->priv->loaded) + return; + search_needed = TRUE; if ( ! strcmp (view->search, "(contains \"x-evolution-any-field\" \"\")")) @@ -467,7 +366,7 @@ pas_backend_file_search (PASBackendFile *bf, pas_book_view_notify_status_message (view->book_view, _("Loading...")); if (view->card_sexp) { - g_object_unref (view->card_sexp); + gtk_object_unref (GTK_OBJECT(view->card_sexp)); view->card_sexp = NULL; } @@ -482,24 +381,74 @@ pas_backend_file_search (PASBackendFile *bf, do_summary_query (bf, view, completion_search); } else { - FileBackendSearchClosure *closure = g_new0 (FileBackendSearchClosure, 1); - DB *db = bf->priv->file_db; - int db_error; + gint card_count = 0, card_threshold = 20, card_threshold_max = 3000; + int db_error = 0; + GList *cards = NULL; + DB *db = bf->priv->file_db; + DBC *dbc; + DBT id_dbt, vcard_dbt; + int file_version_name_len; + + file_version_name_len = strlen (PAS_BACKEND_FILE_VERSION_NAME); - closure->card_threshold = 20; - closure->card_threshold_max = 3000; - closure->search_needed = search_needed; - closure->view = view; - closure->bf = bf; - closure->book = book; + db_error = db->cursor (db, NULL, &dbc, 0); - db_error = db->cursor (db, NULL, &closure->dbc, 0); + memset (&id_dbt, 0, sizeof (id_dbt)); + memset (&vcard_dbt, 0, sizeof (vcard_dbt)); if (db_error != 0) { g_warning ("pas_backend_file_search: error building list\n"); } else { - g_idle_add (pas_backend_file_search_timeout, closure); + db_error = dbc->c_get(dbc, &id_dbt, &vcard_dbt, DB_FIRST); + + while (db_error == 0) { + + /* don't include the version in the list of cards */ + if (id_dbt.size != file_version_name_len+1 + || strcmp (id_dbt.data, PAS_BACKEND_FILE_VERSION_NAME)) { + char *vcard_string = vcard_dbt.data; + + /* check if the vcard matches the search sexp */ + if ((!search_needed) || vcard_matches_search (view, vcard_string)) { + cards = g_list_prepend (cards, g_strdup (vcard_string)); + card_count ++; + } + + /* If we've accumulated a number of checks, pass them off to the client. */ + if (card_count >= card_threshold) { + pas_book_view_notify_add (view->book_view, cards); + /* Clean up the handed-off data. */ + g_list_foreach (cards, (GFunc)g_free, NULL); + g_list_free (cards); + cards = NULL; + card_count = 0; + + /* Yeah, this scheme is overly complicated. But I like it. */ + if (card_threshold < card_threshold_max) { + card_threshold = MIN (2*card_threshold, card_threshold_max); + } + } + } + + db_error = dbc->c_get(dbc, &id_dbt, &vcard_dbt, DB_NEXT); + } + dbc->c_close (dbc); + + if (db_error != DB_NOTFOUND) { + g_warning ("pas_backend_file_search: error building list\n"); + } } + + if (card_count) + pas_book_view_notify_add (view->book_view, cards); + + pas_book_view_notify_complete (view->book_view, GNOME_Evolution_Addressbook_BookViewListener_Success); + + /* + ** It's fine to do this now since the data has been handed off. + */ + g_list_foreach (cards, (GFunc)g_free, NULL); + g_list_free (cards); } } @@ -541,6 +490,9 @@ pas_backend_file_changes (PASBackendFile *bf, memset (&id_dbt, 0, sizeof (id_dbt)); memset (&vcard_dbt, 0, sizeof (vcard_dbt)); + if (!bf->priv->loaded) + return; + /* Find the changed ids */ dirname = g_strdup (bf->priv->filename); slash = strrchr (dirname, '/'); @@ -572,9 +524,9 @@ pas_backend_file_changes (PASBackendFile *bf, * card changing */ card = e_card_new (vcard_dbt.data); - g_object_set (card, "last_use", NULL, "use_score", 0.0, NULL); + gtk_object_set (GTK_OBJECT (card), "last_use", NULL, "use_score", 0.0, NULL); vcard_string = e_card_get_vcard_assume_utf8 (card); - g_object_unref (card); + gtk_object_unref (GTK_OBJECT (card)); /* check what type of change has occurred, if any */ switch (e_dbhash_compare (ehash, id, vcard_string)) { @@ -612,7 +564,7 @@ pas_backend_file_changes (PASBackendFile *bf, for (v = ctx->del_ids; v != NULL; v = v->next){ char *id = v->data; - pas_book_view_notify_remove_1 (view->book_view, id); + pas_book_view_notify_remove (view->book_view, id); } pas_book_view_notify_complete (view->book_view, GNOME_Evolution_Addressbook_BookViewListener_Success); @@ -684,7 +636,7 @@ do_create(PASBackend *backend, ret_val = NULL; } - g_object_unref(card); + gtk_object_unref(GTK_OBJECT(card)); card = NULL; if (vcard_ptr && ret_val) @@ -716,7 +668,7 @@ pas_backend_file_process_create_card (PASBackend *backend, bonobo_object_unref (BONOBO_OBJECT (view->book_view)); } } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); pas_book_respond_create ( book, @@ -739,76 +691,59 @@ pas_backend_file_process_create_card (PASBackend *backend, } static void -pas_backend_file_process_remove_cards (PASBackend *backend, - PASBook *book, - PASRemoveCardsRequest *req) +pas_backend_file_process_remove_card (PASBackend *backend, + PASBook *book, + PASRemoveCardRequest *req) { PASBackendFile *bf = PAS_BACKEND_FILE (backend); DB *db = bf->priv->file_db; DBT id_dbt, vcard_dbt; int db_error; EIterator *iterator; + char *vcard_string; const char *id; - GList *l; - GList *removed_cards = NULL; - GNOME_Evolution_Addressbook_BookListener_CallStatus rv = GNOME_Evolution_Addressbook_BookListener_Success; - - for (l = req->ids; l; l = l->next) { - id = l->data; - string_to_dbt (id, &id_dbt); - memset (&vcard_dbt, 0, sizeof (vcard_dbt)); + id = req->id; + string_to_dbt (id, &id_dbt); + memset (&vcard_dbt, 0, sizeof (vcard_dbt)); - db_error = db->get (db, NULL, &id_dbt, &vcard_dbt, 0); - if (0 != db_error) { - rv = GNOME_Evolution_Addressbook_BookListener_CardNotFound; - continue; - } + db_error = db->get (db, NULL, &id_dbt, &vcard_dbt, 0); + if (0 != db_error) { + pas_book_respond_remove ( + book, + GNOME_Evolution_Addressbook_BookListener_CardNotFound); + return; + } - db_error = db->del (db, NULL, &id_dbt, 0); - if (0 != db_error) { - rv = GNOME_Evolution_Addressbook_BookListener_CardNotFound; - continue; - } - - removed_cards = g_list_prepend (removed_cards, e_card_new (vcard_dbt.data)); + db_error = db->del (db, NULL, &id_dbt, 0); + if (0 != db_error) { + pas_book_respond_remove ( + book, + GNOME_Evolution_Addressbook_BookListener_CardNotFound); + return; } - /* if we actually removed some, try to sync */ - if (removed_cards) { - db_error = db->sync (db, 0); - if (db_error != 0) - g_warning ("db->sync failed.\n"); - } + db_error = db->sync (db, 0); + if (db_error != 0) + g_warning ("db->sync failed.\n"); + + vcard_string = vcard_dbt.data; for (iterator = e_list_get_iterator (bf->priv->book_views); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { const PASBackendFileBookView *view = e_iterator_get(iterator); - GList *view_removed = NULL; - for (l = removed_cards; l; l = l->next) { - ECard *removed_card = l->data; - if (ecard_matches_search (view, removed_card)) { - view_removed = g_list_prepend (view_removed, (char*)e_card_get_id (removed_card)); - } - } - if (view_removed) { + if (vcard_matches_search (view, vcard_string)) { bonobo_object_ref (BONOBO_OBJECT (view->book_view)); - pas_book_view_notify_remove (view->book_view, view_removed); + pas_book_view_notify_remove (view->book_view, req->id); pas_book_view_notify_complete (view->book_view, GNOME_Evolution_Addressbook_BookViewListener_Success); bonobo_object_unref (BONOBO_OBJECT (view->book_view)); - g_list_free (view_removed); } } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); - pas_book_respond_remove (book, rv); - - for (l = removed_cards; l; l = l->next) { - ECard *c = l->data; - pas_backend_summary_remove_card (bf->priv->summary, e_card_get_id (c)); - g_object_unref (c); - } - - g_list_free (removed_cards); + pas_book_respond_remove ( + book, + GNOME_Evolution_Addressbook_BookListener_Success); + pas_backend_summary_remove_card (bf->priv->summary, id); } static void @@ -878,7 +813,7 @@ pas_backend_file_process_modify_card (PASBackend *backend, else if (new_match) pas_book_view_notify_add_1 (view->book_view, req->vcard); else /* if (old_match) */ - pas_book_view_notify_remove_1 (view->book_view, id); + pas_book_view_notify_remove (view->book_view, id); pas_book_view_notify_complete (view->book_view, GNOME_Evolution_Addressbook_BookViewListener_Success); @@ -887,7 +822,7 @@ pas_backend_file_process_modify_card (PASBackend *backend, CORBA_exception_free (&ev); } - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); pas_book_respond_modify ( book, @@ -904,7 +839,7 @@ pas_backend_file_process_modify_card (PASBackend *backend, g_free(old_vcard_string); - g_object_unref(card); + gtk_object_unref(GTK_OBJECT(card)); } static void @@ -1038,8 +973,8 @@ pas_backend_file_process_get_cursor (PASBackend *backend, get_nth, cursor_data); - g_object_weak_ref (G_OBJECT (cursor), - cursor_destroy, cursor_data); + gtk_signal_connect(GTK_OBJECT(cursor), "destroy", + GTK_SIGNAL_FUNC(cursor_destroy), cursor_data); pas_book_respond_get_cursor ( book, @@ -1059,11 +994,14 @@ pas_backend_file_process_get_book_view (PASBackend *backend, PASBackendFileBookView view; EIterator *iterator; + g_return_if_fail (req->listener != NULL); + bonobo_object_ref(BONOBO_OBJECT(book)); book_view = pas_book_view_new (req->listener); - g_object_weak_ref (G_OBJECT (book_view), view_destroy, book); + gtk_signal_connect(GTK_OBJECT(book_view), "destroy", + GTK_SIGNAL_FUNC(view_destroy), book); view.book_view = book_view; view.search = g_strdup (req->search); @@ -1079,13 +1017,10 @@ pas_backend_file_process_get_book_view (PASBackend *backend, : GNOME_Evolution_Addressbook_BookListener_CardNotFound /* XXX */), book_view); - if (!pas_backend_is_loaded (backend)) - return; - iterator = e_list_get_iterator(bf->priv->book_views); e_iterator_last(iterator); pas_backend_file_search (bf, book, e_iterator_get(iterator), FALSE); - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); } static void @@ -1098,11 +1033,14 @@ pas_backend_file_process_get_completion_view (PASBackend *backend, PASBackendFileBookView view; EIterator *iterator; + g_return_if_fail (req->listener != NULL); + bonobo_object_ref(BONOBO_OBJECT(book)); book_view = pas_book_view_new (req->listener); - g_object_weak_ref (G_OBJECT (book_view), view_destroy, book); + gtk_signal_connect(GTK_OBJECT(book_view), "destroy", + GTK_SIGNAL_FUNC(view_destroy), book); view.book_view = book_view; view.search = g_strdup (req->search); @@ -1118,13 +1056,10 @@ pas_backend_file_process_get_completion_view (PASBackend *backend, : GNOME_Evolution_Addressbook_BookListener_CardNotFound /* XXX */), book_view); - if (!pas_backend_is_loaded (backend)) - return; - iterator = e_list_get_iterator(bf->priv->book_views); e_iterator_last(iterator); pas_backend_file_search (bf, book, e_iterator_get(iterator), TRUE); - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); } static void @@ -1138,11 +1073,14 @@ pas_backend_file_process_get_changes (PASBackend *backend, PASBackendFileChangeContext ctx; EIterator *iterator; + g_return_if_fail (req->listener != NULL); + bonobo_object_ref(BONOBO_OBJECT(book)); book_view = pas_book_view_new (req->listener); - g_object_weak_ref (G_OBJECT (book_view), view_destroy, book); + gtk_signal_connect(GTK_OBJECT(book_view), "destroy", + GTK_SIGNAL_FUNC(view_destroy), book); pas_book_respond_get_changes (book, (book_view != NULL @@ -1164,13 +1102,10 @@ pas_backend_file_process_get_changes (PASBackend *backend, e_list_append(bf->priv->book_views, &view); - if (!pas_backend_is_loaded (backend)) - return; - iterator = e_list_get_iterator(bf->priv->book_views); e_iterator_last(iterator); pas_backend_file_changes (bf, book, e_iterator_get(iterator)); - g_object_unref(iterator); + gtk_object_unref(GTK_OBJECT(iterator)); } static void @@ -1219,14 +1154,85 @@ pas_backend_file_process_get_supported_fields (PASBackend *backend, for (i = 0; i < E_CARD_SIMPLE_FIELD_LAST; i ++) e_list_append (fields, e_card_simple_get_ecard_field (simple, i)); - g_object_unref (card); - g_object_unref (simple); + gtk_object_unref (GTK_OBJECT (card)); + gtk_object_unref (GTK_OBJECT (simple)); pas_book_respond_get_supported_fields (book, GNOME_Evolution_Addressbook_BookListener_Success, fields); } +static void +pas_backend_file_process_client_requests (PASBook *book) +{ + PASBackend *backend; + PASRequest *req; + + backend = pas_book_get_backend (book); + + req = pas_book_pop_request (book); + if (req == NULL) + return; + + switch (req->op) { + case CreateCard: + pas_backend_file_process_create_card (backend, book, (PASCreateCardRequest*)req); + break; + + case RemoveCard: + pas_backend_file_process_remove_card (backend, book, (PASRemoveCardRequest*)req); + break; + + case ModifyCard: + pas_backend_file_process_modify_card (backend, book, (PASModifyCardRequest*)req); + break; + + case CheckConnection: + pas_backend_file_process_check_connection (backend, book, (PASCheckConnectionRequest*)req); + break; + + case GetVCard: + pas_backend_file_process_get_vcard (backend, book, (PASGetVCardRequest*)req); + break; + + case GetCursor: + pas_backend_file_process_get_cursor (backend, book, (PASGetCursorRequest*)req); + break; + + case GetBookView: + pas_backend_file_process_get_book_view (backend, book, (PASGetBookViewRequest*)req); + break; + + case GetCompletionView: + pas_backend_file_process_get_completion_view (backend, book, (PASGetCompletionViewRequest*)req); + break; + + case GetChanges: + pas_backend_file_process_get_changes (backend, book, (PASGetChangesRequest*)req); + break; + + case AuthenticateUser: + pas_backend_file_process_authenticate_user (backend, book, (PASAuthenticateUserRequest*)req); + break; + + case GetSupportedFields: + pas_backend_file_process_get_supported_fields (backend, book, (PASGetSupportedFieldsRequest*)req); + break; + } + + pas_book_free_request (req); +} + +static void +pas_backend_file_book_destroy_cb (PASBook *book, gpointer data) +{ + PASBackendFile *backend; + + backend = PAS_BACKEND_FILE (data); + + pas_backend_remove_client (PAS_BACKEND (backend), book); +} + /* ** versions: ** @@ -1301,7 +1307,7 @@ pas_backend_file_upgrade_db (PASBackendFile *bf, char *old_version) card_failed++; } - g_object_unref (card); + gtk_object_unref (GTK_OBJECT(card)); } db_error = dbc->c_get(dbc, &id_dbt, &vcard_dbt, DB_NEXT); @@ -1353,10 +1359,11 @@ pas_backend_file_maybe_upgrade_db (PASBackendFile *bf) return ret_val; } + #define INITIAL_VCARD "BEGIN:VCARD\n\ X-EVOLUTION-FILE-AS:Ximian, Inc.\n\ LABEL;WORK;QUOTED-PRINTABLE:401 Park Drive 3 West=0ABoston, MA 02215=0AUSA\n\ -TEL;WORK;VOICE:(617) 375-3800\n\ +TEL;WORK;VOICE:(617) 236-0442\n\ TEL;WORK;FAX:(617) 236-8630\n\ EMAIL;INTERNET:hello@ximian.com\n\ URL:www.ximian.com/\n\ @@ -1378,6 +1385,8 @@ pas_backend_file_load_uri (PASBackend *backend, struct stat sb; char *summary_filename; + g_assert (bf->priv->loaded == FALSE); + db_version (&major, &minor, &patch); if (major != 3 || @@ -1422,10 +1431,10 @@ pas_backend_file_load_uri (PASBackend *backend, char *create_initial_file; char *dir; - dir = g_path_get_dirname(filename); - create_initial_file = g_build_filename (dir, "create-initial", NULL); + dir = g_dirname(filename); + create_initial_file = g_concat_dir_and_file(dir, "create-initial"); - if (g_file_test(create_initial_file, G_FILE_TEST_EXISTS)) { + if (g_file_exists(create_initial_file)) { char *id; id = do_create(backend, INITIAL_VCARD, NULL); g_free (id); @@ -1444,9 +1453,14 @@ pas_backend_file_load_uri (PASBackend *backend, return GNOME_Evolution_Addressbook_BookListener_OtherError; } - if (!pas_backend_file_maybe_upgrade_db (bf)) { + bf->priv->writable = writable; + + if (pas_backend_file_maybe_upgrade_db (bf)) + bf->priv->loaded = TRUE; + else { db->close (db, 0); bf->priv->file_db = NULL; + bf->priv->writable = FALSE; return GNOME_Evolution_Addressbook_BookListener_OtherError; } @@ -1459,6 +1473,7 @@ pas_backend_file_load_uri (PASBackend *backend, if (stat (bf->priv->filename, &sb) == -1) { db->close (db, 0); bf->priv->file_db = NULL; + bf->priv->writable = FALSE; return GNOME_Evolution_Addressbook_BookListener_OtherError; } db_mtime = sb.st_mtime; @@ -1472,8 +1487,6 @@ pas_backend_file_load_uri (PASBackend *backend, build_summary (bf->priv); } - pas_backend_set_is_loaded (backend, TRUE); - pas_backend_set_is_writable (backend, writable); return GNOME_Evolution_Addressbook_BookListener_Success; } @@ -1485,15 +1498,99 @@ pas_backend_file_get_uri (PASBackend *backend) bf = PAS_BACKEND_FILE (backend); + g_return_val_if_fail (bf->priv->loaded, NULL); g_assert (bf->priv->uri != NULL); return bf->priv->uri; } +static gboolean +pas_backend_file_add_client (PASBackend *backend, + GNOME_Evolution_Addressbook_BookListener listener) +{ + PASBackendFile *bf; + PASBook *book; + + g_assert (backend != NULL); + g_assert (PAS_IS_BACKEND_FILE (backend)); + + bf = PAS_BACKEND_FILE (backend); + + book = pas_book_new (backend, listener); + + if (!book) { + if (!bf->priv->clients) + pas_backend_last_client_gone (backend); + + return FALSE; + } + + gtk_signal_connect (GTK_OBJECT (book), "destroy", + pas_backend_file_book_destroy_cb, backend); + + gtk_signal_connect (GTK_OBJECT (book), "requests_queued", + pas_backend_file_process_client_requests, NULL); + + bf->priv->clients = g_list_prepend ( + bf->priv->clients, book); + + if (bf->priv->loaded) { + pas_book_respond_open ( + book, GNOME_Evolution_Addressbook_BookListener_Success); + if (bf->priv->writable) + pas_book_report_writable (book, bf->priv->writable); + } else { + pas_book_respond_open ( + book, GNOME_Evolution_Addressbook_BookListener_OtherError); + } + + bonobo_object_unref (BONOBO_OBJECT (book)); + + return TRUE; +} + +static void +pas_backend_file_remove_client (PASBackend *backend, + PASBook *book) +{ + PASBackendFile *bf; + GList *l; + PASBook *lbook; + + g_return_if_fail (backend != NULL); + g_return_if_fail (PAS_IS_BACKEND_FILE (backend)); + g_return_if_fail (book != NULL); + g_return_if_fail (PAS_IS_BOOK (book)); + + bf = PAS_BACKEND_FILE (backend); + + /* Find the book in the list of clients */ + + for (l = bf->priv->clients; l; l = l->next) { + lbook = PAS_BOOK (l->data); + + if (lbook == book) + break; + } + + g_assert (l != NULL); + + /* Disconnect */ + + bf->priv->clients = g_list_remove_link (bf->priv->clients, l); + g_list_free_1 (l); + + /* When all clients go away, notify the parent factory about it so that + * it may decide whether to kill the backend or not. + */ + if (!bf->priv->clients) + pas_backend_last_client_gone (backend); +} + static char * -pas_backend_file_get_static_capabilities (PASBackend *backend) +pas_backend_file_get_static_capabilities (PASBackend *backend) { - return g_strdup("local,do-initial-query,bulk-removes"); + return g_strdup("local,do-initial-query,cache-completions"); } static gboolean @@ -1516,10 +1613,10 @@ pas_backend_file_new (void) { PASBackendFile *backend; - backend = g_object_new (PAS_TYPE_BACKEND_FILE, NULL); + backend = gtk_type_new (pas_backend_file_get_type ()); if (! pas_backend_file_construct (backend)) { - g_object_unref (backend); + gtk_object_unref (GTK_OBJECT (backend)); return NULL; } @@ -1528,53 +1625,40 @@ pas_backend_file_new (void) } static void -pas_backend_file_dispose (GObject *object) +pas_backend_file_destroy (GtkObject *object) { PASBackendFile *bf; bf = PAS_BACKEND_FILE (object); - if (bf->priv) { - g_object_unref(bf->priv->book_views); - g_object_unref(bf->priv->summary); - g_free (bf->priv->uri); - g_free (bf->priv->filename); + gtk_object_unref(GTK_OBJECT(bf->priv->book_views)); + gtk_object_unref(GTK_OBJECT(bf->priv->summary)); + g_free (bf->priv->uri); + g_free (bf->priv->filename); - g_free (bf->priv); - bf->priv = NULL; - } + g_free (bf->priv); - G_OBJECT_CLASS (pas_backend_file_parent_class)->dispose (object); + GTK_OBJECT_CLASS (pas_backend_file_parent_class)->destroy (object); } static void pas_backend_file_class_init (PASBackendFileClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkObjectClass *object_class = (GtkObjectClass *) klass; PASBackendClass *parent_class; - pas_backend_file_parent_class = g_type_class_peek_parent (klass); + pas_backend_file_parent_class = gtk_type_class (pas_backend_get_type ()); parent_class = PAS_BACKEND_CLASS (klass); /* Set the virtual methods. */ parent_class->load_uri = pas_backend_file_load_uri; parent_class->get_uri = pas_backend_file_get_uri; + parent_class->add_client = pas_backend_file_add_client; + parent_class->remove_client = pas_backend_file_remove_client; parent_class->get_static_capabilities = pas_backend_file_get_static_capabilities; - parent_class->create_card = pas_backend_file_process_create_card; - parent_class->remove_cards = pas_backend_file_process_remove_cards; - parent_class->modify_card = pas_backend_file_process_modify_card; - parent_class->check_connection = pas_backend_file_process_check_connection; - parent_class->get_vcard = pas_backend_file_process_get_vcard; - parent_class->get_cursor = pas_backend_file_process_get_cursor; - parent_class->get_book_view = pas_backend_file_process_get_book_view; - parent_class->get_completion_view = pas_backend_file_process_get_completion_view; - parent_class->get_changes = pas_backend_file_process_get_changes; - parent_class->authenticate_user = pas_backend_file_process_authenticate_user; - parent_class->get_supported_fields = pas_backend_file_process_get_supported_fields; - - object_class->dispose = pas_backend_file_dispose; + object_class->destroy = pas_backend_file_destroy; } static void @@ -1583,8 +1667,11 @@ pas_backend_file_init (PASBackendFile *backend) PASBackendFilePrivate *priv; priv = g_new0 (PASBackendFilePrivate, 1); + priv->loaded = FALSE; + priv->clients = NULL; priv->book_views = e_list_new((EListCopyFunc) pas_backend_file_book_view_copy, (EListFreeFunc) pas_backend_file_book_view_free, NULL); priv->uri = NULL; + priv->writable = FALSE; backend->priv = priv; } @@ -1592,25 +1679,24 @@ pas_backend_file_init (PASBackendFile *backend) /** * pas_backend_file_get_type: */ -GType +GtkType pas_backend_file_get_type (void) { - static GType type = 0; + static GtkType type = 0; if (! type) { - GTypeInfo info = { - sizeof (PASBackendFileClass), - NULL, /* base_class_init */ - NULL, /* base_class_finalize */ - (GClassInitFunc) pas_backend_file_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ + GtkTypeInfo info = { + "PASBackendFile", sizeof (PASBackendFile), - 0, /* n_preallocs */ - (GInstanceInitFunc) pas_backend_file_init + sizeof (PASBackendFileClass), + (GtkClassInitFunc) pas_backend_file_class_init, + (GtkObjectInitFunc) pas_backend_file_init, + NULL, /* reserved 1 */ + NULL, /* reserved 2 */ + (GtkClassInitFunc) NULL }; - type = g_type_register_static (PAS_TYPE_BACKEND, "PASBackendFile", &info, 0); + type = gtk_type_unique (pas_backend_get_type (), &info); } return type; diff --git a/addressbook/backend/pas/pas-backend-ldap.c b/addressbook/backend/pas/pas-backend-ldap.c index 237bc8597c..866bad8148 100644 --- a/addressbook/backend/pas/pas-backend-ldap.c +++ b/addressbook/backend/pas/pas-backend-ldap.c @@ -10,7 +10,10 @@ #include "config.h" #include <fcntl.h> -#include <string.h> +#include <gtk/gtksignal.h> + +#include <libgnome/gnome-defs.h> +#include <libgnome/gnome-i18n.h> #ifdef DEBUG #define LDAP_DEBUG @@ -35,7 +38,6 @@ #include <e-util/e-sexp.h> #include <ebook/e-card-simple.h> -#include <libgnome/gnome-i18n.h> #include "pas-backend-ldap.h" #include "pas-backend-card-sexp.h" @@ -44,9 +46,6 @@ #include <stdlib.h> -/* this is broken currently, don't enable it */ -/*#define ENABLE_SASL_BINDS*/ - typedef enum { PAS_BACKEND_LDAP_TLS_NO, PAS_BACKEND_LDAP_TLS_ALWAYS, @@ -88,6 +87,7 @@ typedef struct LDAPOp LDAPOp; struct _PASBackendLDAPPrivate { char *uri; gboolean connected; + GList *clients; gchar *ldap_host; /* the hostname of the server */ int ldap_port; /* the port of the server */ @@ -112,7 +112,6 @@ struct _PASBackendLDAPPrivate { LDAP *ldap; EList *supported_fields; - EList *supported_auth_methods; /* whether or not there's support for the objectclass we need to store all our additional fields */ @@ -120,6 +119,8 @@ struct _PASBackendLDAPPrivate { gboolean calEntrySupported; gboolean evolutionPersonChecked; + gboolean writable; + /* our operations */ GHashTable *id_to_op; int active_ops; @@ -293,7 +294,7 @@ remove_view (int msgid, LDAPOp *op, PASBookView *view) } static void -view_destroy(gpointer data, GObject *where_object_was) +view_destroy(GtkObject *object, gpointer data) { PASBook *book = (PASBook *)data; PASBackendLDAP *bl; @@ -306,7 +307,7 @@ view_destroy(gpointer data, GObject *where_object_was) while (e_iterator_is_valid (iter)) { PASBackendLDAPBookView *view = (PASBackendLDAPBookView*)e_iterator_get (iter); - if (view->book_view == (PASBookView*)where_object_was) { + if (view->book_view == PAS_BOOK_VIEW(object)) { GNOME_Evolution_Addressbook_Book corba_book; CORBA_Environment ev; @@ -321,7 +322,7 @@ view_destroy(gpointer data, GObject *where_object_was) /* free up the view structure */ g_free (view->search); - g_object_unref (view->card_sexp); + gtk_object_unref (GTK_OBJECT (view->card_sexp)); g_free (view); /* and remove it from our list */ @@ -346,7 +347,7 @@ view_destroy(gpointer data, GObject *where_object_was) e_iterator_next (iter); } - g_object_unref (iter); + gtk_object_unref (GTK_OBJECT (iter)); } @@ -371,7 +372,7 @@ find_book_view (PASBackendLDAP *bl) rv = v->book_view; } - g_object_unref (iter); + gtk_object_unref (GTK_OBJECT (iter)); return rv; } @@ -457,20 +458,20 @@ check_schema_support (PASBackendLDAP *bl) continue; for (j = 0; oc->oc_names[j]; j++) - if (!g_ascii_strcasecmp (oc->oc_names[j], EVOLUTIONPERSON)) { + if (!g_strcasecmp (oc->oc_names[j], EVOLUTIONPERSON)) { g_print ("support found on ldap server for objectclass evolutionPerson\n"); bl->priv->evolutionPersonSupported = TRUE; add_oc_attributes_to_supported_fields (bl, oc); } - else if (!g_ascii_strcasecmp (oc->oc_names[j], CALENTRY)) { + else if (!g_strcasecmp (oc->oc_names[j], CALENTRY)) { g_print ("support found on ldap server for objectclass calEntry\n"); bl->priv->calEntrySupported = TRUE; add_oc_attributes_to_supported_fields (bl, oc); } - else if (!g_ascii_strcasecmp (oc->oc_names[j], INETORGPERSON) - || !g_ascii_strcasecmp (oc->oc_names[j], ORGANIZATIONALPERSON) - || !g_ascii_strcasecmp (oc->oc_names[j], PERSON)) { + else if (!g_strcasecmp (oc->oc_names[j], INETORGPERSON) + || !g_strcasecmp (oc->oc_names[j], ORGANIZATIONALPERSON) + || !g_strcasecmp (oc->oc_names[j], PERSON)) { add_oc_attributes_to_supported_fields (bl, oc); } @@ -487,7 +488,7 @@ check_schema_support (PASBackendLDAP *bl) of draconian acl's that keep subschema reads from working until the user is authed. */ - if (!pas_backend_is_writable (PAS_BACKEND (bl))) { + if (!bl->priv->writable) { g_warning ("subschema read returned nothing before successful auth"); bl->priv->evolutionPersonChecked = FALSE; } @@ -590,25 +591,8 @@ query_ldap_root_dse (PASBackendLDAP *bl) values = ldap_get_values (ldap, resp, "supportedSASLMechanisms"); if (values) { - char *auth_method; - if (bl->priv->supported_auth_methods) - g_object_unref (bl->priv->supported_auth_methods); - bl->priv->supported_auth_methods = e_list_new ((EListCopyFunc)g_strdup, (EListFreeFunc)g_free, NULL); - - auth_method = g_strdup_printf ("ldap/simple-binddn|%s", _("Using Distinguished Name (DN)")); - e_list_append (bl->priv->supported_auth_methods, auth_method); - g_free (auth_method); - - auth_method = g_strdup_printf ("ldap/simple-email|%s", _("Using Email Address")); - e_list_append (bl->priv->supported_auth_methods, auth_method); - g_free (auth_method); - - for (i = 0; values[i]; i++) { - auth_method = g_strdup_printf ("sasl/%s|%s", values[i], values[i]); - e_list_append (bl->priv->supported_auth_methods, auth_method); - g_free (auth_method); + for (i = 0; values[i]; i++) g_message ("supported SASL mechanism: %s", values[i]); - } ldap_value_free (values); } @@ -721,7 +705,6 @@ pas_backend_ldap_connect (PASBackendLDAP *bl) if (!bl->priv->evolutionPersonChecked) check_schema_support (bl); - pas_backend_set_is_loaded (PAS_BACKEND (bl), TRUE); return GNOME_Evolution_Addressbook_BookListener_Success; } else @@ -1051,7 +1034,7 @@ static void add_objectclass_mod (PASBackendLDAP *bl, GPtrArray *mod_array, GList *existing_objectclasses) { #define FIND_INSERT(oc) \ - if (!g_list_find_custom (existing_objectclasses, (oc), (GCompareFunc)g_ascii_strcasecmp)) \ + if (!g_list_find_custom (existing_objectclasses, (oc), (GCompareFunc)g_strcasecmp)) \ g_ptr_array_add (objectclasses, g_strdup ((oc))) #define INSERT(oc) \ g_ptr_array_add (objectclasses, g_strdup ((oc))) @@ -1167,7 +1150,7 @@ create_card_handler (LDAPOp *op, LDAPMessage *res) e_iterator_next (iter); } - g_object_unref (iter); + gtk_object_unref (GTK_OBJECT (iter)); } else { ldap_perror (ldap, "create_card"); @@ -1191,14 +1174,14 @@ create_card_dtor (LDAPOp *op) LDAPCreateOp *create_op = (LDAPCreateOp*)op; g_free (create_op->dn); - g_object_unref (create_op->new_card); + gtk_object_unref (GTK_OBJECT (create_op->new_card)); g_free (create_op); } static void pas_backend_ldap_process_create_card (PASBackend *backend, PASBook *book, - PASCreateCardRequest *req) + PASRequest *req) { LDAPCreateOp *create_op = g_new (LDAPCreateOp, 1); PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); @@ -1213,9 +1196,9 @@ pas_backend_ldap_process_create_card (PASBackend *backend, book_view = find_book_view (bl); - printf ("vcard = %s\n", req->vcard); + printf ("vcard = %s\n", req->create.vcard); - new_ecard = e_card_new (req->vcard); + new_ecard = e_card_new (req->create.vcard); create_op->new_card = e_card_simple_new (new_ecard); create_op->dn = create_dn_from_ecard (create_op->new_card, bl->priv->ldap_rootdn); @@ -1235,7 +1218,7 @@ pas_backend_ldap_process_create_card (PASBackend *backend, create_op->dn); g_free (create_op->dn); - g_object_unref (create_op->new_card); + gtk_object_unref (GTK_OBJECT(create_op->new_card)); g_free (create_op); return; } @@ -1350,13 +1333,13 @@ remove_card_handler (LDAPOp *op, LDAPMessage *res) bonobo_object_dup_ref(bonobo_object_corba_objref(BONOBO_OBJECT(view->book_view)), &ev); - pas_book_view_notify_remove_1 (view->book_view, remove_op->id); + pas_book_view_notify_remove (view->book_view, remove_op->id); bonobo_object_release_unref(bonobo_object_corba_objref(BONOBO_OBJECT(view->book_view)), &ev); e_iterator_next (iter); } - g_object_unref (iter); + gtk_object_unref (GTK_OBJECT (iter)); } else { ldap_perror (bl->priv->ldap, "remove_card"); @@ -1379,9 +1362,9 @@ remove_card_dtor (LDAPOp *op) } static void -pas_backend_ldap_process_remove_cards (PASBackend *backend, - PASBook *book, - PASRemoveCardsRequest *req) +pas_backend_ldap_process_remove_card (PASBackend *backend, + PASBook *book, + PASRequest *req) { LDAPRemoveOp *remove_op = g_new (LDAPRemoveOp, 1); PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); @@ -1391,12 +1374,7 @@ pas_backend_ldap_process_remove_cards (PASBackend *backend, book_view = find_book_view (bl); - /* - ** since we didn't pass "bulk-removes" in our static - ** capabilities, we should only get 1 length lists here, so - ** the id we're deleting is the first and only id in the list. - */ - remove_op->id = g_strdup (req->ids->data); + remove_op->id = g_strdup (req->remove.id); do { book_view_notify_status (book_view, _("Removing card from LDAP server...")); @@ -1482,14 +1460,14 @@ modify_card_modify_handler (LDAPOp *op, LDAPMessage *res) else if (new_match) pas_book_view_notify_add_1 (view->book_view, modify_op->vcard); else /* if (old_match) */ - pas_book_view_notify_remove_1 (view->book_view, e_card_simple_get_id (modify_op->card)); + pas_book_view_notify_remove (view->book_view, e_card_simple_get_id (modify_op->card)); pas_book_view_notify_complete (view->book_view, GNOME_Evolution_Addressbook_BookViewListener_Success); bonobo_object_release_unref(bonobo_object_corba_objref(BONOBO_OBJECT(view->book_view)), &ev); e_iterator_next (iter); } - g_object_unref (iter); + gtk_object_unref (GTK_OBJECT (iter)); } else { ldap_perror (ldap, "ldap_modify_s"); @@ -1605,17 +1583,17 @@ modify_card_dtor (LDAPOp *op) g_list_free (modify_op->existing_objectclasses); g_free (modify_op->current_vcard); if (modify_op->current_card) - g_object_unref (modify_op->current_card); + gtk_object_unref (GTK_OBJECT (modify_op->current_card)); g_free (modify_op->vcard); if (modify_op->card) - g_object_unref (modify_op->card); + gtk_object_unref (GTK_OBJECT (modify_op->card)); g_free (modify_op); } static void pas_backend_ldap_process_modify_card (PASBackend *backend, PASBook *book, - PASModifyCardRequest *req) + PASRequest *req) { LDAPModifyOp *modify_op = g_new0 (LDAPModifyOp, 1); PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); @@ -1627,10 +1605,10 @@ pas_backend_ldap_process_modify_card (PASBackend *backend, book_view = find_book_view (bl); - modify_op->vcard = g_strdup (req->vcard); + modify_op->vcard = g_strdup (req->modify.vcard); new_ecard = e_card_new (modify_op->vcard); modify_op->card = e_card_simple_new (new_ecard); - g_object_unref (new_ecard); + gtk_object_unref (GTK_OBJECT (new_ecard)); modify_op->id = e_card_simple_get_id(modify_op->card); ldap = bl->priv->ldap; @@ -1697,7 +1675,7 @@ get_vcard_handler (LDAPOp *op, LDAPMessage *res) GNOME_Evolution_Addressbook_BookListener_Success, vcard); g_free (vcard); - g_object_unref (simple); + gtk_object_unref (GTK_OBJECT (simple)); ldap_op_finished (op); } else if (msg_type == LDAP_RES_SEARCH_RESULT) { @@ -1727,7 +1705,7 @@ get_vcard_dtor (LDAPOp *op) static void pas_backend_ldap_process_get_vcard (PASBackend *backend, PASBook *book, - PASGetVCardRequest *req) + PASRequest *req) { LDAPGetVCardOp *get_vcard_op = g_new0 (LDAPGetVCardOp, 1); PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); @@ -1739,7 +1717,7 @@ pas_backend_ldap_process_get_vcard (PASBackend *backend, book_view = find_book_view (bl); do { - ldap_error = ldap_search_ext (ldap, req->id, + ldap_error = ldap_search_ext (ldap, req->get_vcard.id, LDAP_SCOPE_BASE, "(objectclass=*)", NULL, 0, NULL, NULL, @@ -1786,7 +1764,7 @@ get_nth(PASCardCursor *cursor, long n, gpointer data) } static void -cursor_destroy(gpointer data, GObject *where_object_was) +cursor_destroy(GtkObject *object, gpointer data) { PASBackendLDAPCursorPrivate *cursor_data = (PASBackendLDAPCursorPrivate *) data; @@ -1837,7 +1815,7 @@ get_cursor_handler (LDAPOp *op, LDAPMessage *res) cursor_op->cursor_data->num_elements ++; cursor_op->cursor_data->elements = g_list_prepend (cursor_op->cursor_data->elements, vcard); - g_object_unref (simple); + gtk_object_unref (GTK_OBJECT (simple)); } } } @@ -1852,7 +1830,8 @@ get_cursor_handler (LDAPOp *op, LDAPMessage *res) get_nth, cursor_op->cursor_data); - g_object_weak_ref (G_OBJECT (cursor), cursor_destroy, cursor_op->cursor_data); + gtk_signal_connect(GTK_OBJECT(cursor), "destroy", + GTK_SIGNAL_FUNC(cursor_destroy), cursor_op->cursor_data); cursor_op->responded = TRUE; } @@ -1878,7 +1857,7 @@ get_cursor_dtor (LDAPOp *op) LDAPGetCursorOp *cursor_op = (LDAPGetCursorOp*)op; if (!cursor_op->responded) { - cursor_destroy (cursor_op->cursor_data, NULL); + cursor_destroy (NULL, cursor_op->cursor_data); } g_free (op); @@ -1887,7 +1866,7 @@ get_cursor_dtor (LDAPOp *op) static void pas_backend_ldap_process_get_cursor (PASBackend *backend, PASBook *book, - PASGetCursorRequest *req) + PASRequest *req) { PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); LDAP *ldap = bl->priv->ldap; @@ -2154,9 +2133,9 @@ anniversary_populate (ECardSimple *card, char **values) { if (values[0]) { ECardDate dt = e_card_date_from_string (values[0]); - g_object_set (card->card, - "anniversary", &dt, - NULL); + gtk_object_set (GTK_OBJECT (card->card), + "anniversary", &dt, + NULL); } } @@ -2166,9 +2145,9 @@ anniversary_ber (ECardSimple *card) ECardDate *dt; struct berval** result = NULL; - g_object_get (card->card, - "anniversary", &dt, - NULL); + gtk_object_get (GTK_OBJECT (card->card), + "anniversary", &dt, + NULL); if (dt) { char *anniversary; @@ -2193,15 +2172,15 @@ anniversary_compare (ECardSimple *ecard1, ECardSimple *ecard2) char *date1 = NULL, *date2 = NULL; gboolean equal; - g_object_get (ecard1->card, - "anniversary", &dt, - NULL); + gtk_object_get (GTK_OBJECT (ecard1->card), + "anniversary", &dt, + NULL); if (dt) date1 = e_card_date_to_string (dt); - g_object_get (ecard2->card, - "anniversary", &dt, - NULL); + gtk_object_get (GTK_OBJECT (ecard2->card), + "anniversary", &dt, + NULL); if (dt) date2 = e_card_date_to_string (dt); @@ -2221,9 +2200,9 @@ birthday_populate (ECardSimple *card, char **values) { if (values[0]) { ECardDate dt = e_card_date_from_string (values[0]); - g_object_set (card->card, - "birth_date", &dt, - NULL); + gtk_object_set (GTK_OBJECT (card->card), + "birth_date", &dt, + NULL); } } @@ -2233,9 +2212,9 @@ birthday_ber (ECardSimple *card) ECardDate *dt; struct berval** result = NULL; - g_object_get (card->card, - "birth_date", &dt, - NULL); + gtk_object_get (GTK_OBJECT (card->card), + "birth_date", &dt, + NULL); if (dt) { char *birthday; @@ -2260,15 +2239,15 @@ birthday_compare (ECardSimple *ecard1, ECardSimple *ecard2) char *date1 = NULL, *date2 = NULL; gboolean equal; - g_object_get (ecard1->card, - "birth_date", &dt, - NULL); + gtk_object_get (GTK_OBJECT (ecard1->card), + "birth_date", &dt, + NULL); if (dt) date1 = e_card_date_to_string (dt); - g_object_get (ecard2->card, - "birth_date", &dt, - NULL); + gtk_object_get (GTK_OBJECT (ecard2->card), + "birth_date", &dt, + NULL); if (dt) date2 = e_card_date_to_string (dt); @@ -2290,9 +2269,9 @@ category_populate (ECardSimple *card, char **values) ECard *ecard; EList *categories; - g_object_get (card, - "card", &ecard, - NULL); + gtk_object_get (GTK_OBJECT (card), + "card", &ecard, + NULL); categories = e_list_new((EListCopyFunc) g_strdup, (EListFreeFunc) g_free, @@ -2301,11 +2280,11 @@ category_populate (ECardSimple *card, char **values) for (i = 0; values[i]; i++) e_list_append (categories, values[i]); - g_object_set (ecard, - "category_list", categories, - NULL); + gtk_object_set (GTK_OBJECT (ecard), + "category_list", categories, + NULL); - g_object_unref (categories); + gtk_object_unref (GTK_OBJECT (categories)); e_card_simple_sync_card (card); } @@ -2319,13 +2298,13 @@ category_ber (ECardSimple *card) ECard *ecard; int i; - g_object_get (card, - "card", &ecard, - NULL); + gtk_object_get (GTK_OBJECT (card), + "card", &ecard, + NULL); - g_object_get (ecard, - "category_list", &categories, - NULL); + gtk_object_get (GTK_OBJECT (ecard), + "category_list", &categories, + NULL); if (e_list_length (categories) != 0) { result = g_new0 (struct berval*, e_list_length (categories) + 1); @@ -2339,7 +2318,7 @@ category_ber (ECardSimple *card) result[i]->bv_len = strlen (category); } - g_object_unref (iterator); + gtk_object_unref (GTK_OBJECT (iterator)); } return result; @@ -2615,12 +2594,10 @@ func_beginswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *da str, str)); } else if (!strcmp (ldap_attr, "fileAs")) { - if (ldap_data->bl->priv->evolutionPersonSupported) - ldap_data->list = g_list_prepend(ldap_data->list, - g_strdup_printf("(fileAs=%s*)", str)); - else - ldap_data->list = g_list_prepend(ldap_data->list, - g_strdup_printf("(sn=%s*)", str)); + ldap_data->list = g_list_prepend(ldap_data->list, + g_strdup_printf( + "(|(fileAs=%s*)(&(!(fileAs=*))(sn=%s*)))", + str, str)); } else { ldap_data->list = g_list_prepend(ldap_data->list, @@ -2781,7 +2758,7 @@ build_card_from_entry (LDAP *ldap, LDAPMessage *e, GList **existing_objectclasse struct prop_info *info = NULL; char **values; - if (existing_objectclasses && !g_ascii_strcasecmp (attr, "objectclass")) { + if (existing_objectclasses && !strcasecmp (attr, "objectclass")) { values = ldap_get_values (ldap, e, attr); for (i = 0; values[i]; i ++) *existing_objectclasses = g_list_append (*existing_objectclasses, g_strdup (values[i])); @@ -2790,7 +2767,7 @@ build_card_from_entry (LDAP *ldap, LDAPMessage *e, GList **existing_objectclasse } else { for (i = 0; i < num_prop_infos; i ++) - if (!g_ascii_strcasecmp (attr, prop_info[i].ldap_attr)) { + if (!g_strcasecmp (attr, prop_info[i].ldap_attr)) { info = &prop_info[i]; break; } @@ -2807,7 +2784,7 @@ build_card_from_entry (LDAP *ldap, LDAPMessage *e, GList **existing_objectclasse } else if (info->prop_type & PROP_TYPE_COMPLEX) { /* if it's a list call the ecard-populate function, - which calls g_object_set to set the property */ + which calls gtk_object_set to set the property */ info->populate_ecard_func(card, values); } @@ -2825,7 +2802,7 @@ build_card_from_entry (LDAP *ldap, LDAPMessage *e, GList **existing_objectclasse e_card_simple_sync_card (card); - g_object_unref (ecard); + gtk_object_unref (GTK_OBJECT (ecard)); return card; } @@ -2891,7 +2868,7 @@ poll_ldap (PASBackendLDAP *bl) } e_iterator_next (iter); } - g_object_unref (iter); + gtk_object_unref (GTK_OBJECT (iter)); return TRUE; } @@ -2902,7 +2879,6 @@ send_pending_adds (LDAPSearchOp *search_op) search_op->num_sent_this_time += search_op->num_pending_adds; pas_book_view_notify_add (search_op->op.view, search_op->pending_adds); g_list_foreach (search_op->pending_adds, (GFunc)g_free, NULL); - g_list_free (search_op->pending_adds); search_op->pending_adds = NULL; search_op->num_pending_adds = 0; } @@ -2968,7 +2944,7 @@ ldap_search_handler (LDAPOp *op, LDAPMessage *res) e_card_simple_get_vcard_assume_utf8 (card)); search_op->num_pending_adds ++; - g_object_unref (card); + gtk_object_unref (GTK_OBJECT(card)); e = ldap_next_entry(ldap, e); } @@ -3094,27 +3070,34 @@ pas_backend_ldap_search (PASBackendLDAP *bl, } static void -ldap_get_view (PASBackend *backend, - PASBook *book, - const char *search, - GNOME_Evolution_Addressbook_BookViewListener listener, - int limit) +pas_backend_ldap_process_get_book_view (PASBackend *backend, + PASBook *book, + PASRequest *req) { PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); PASBookView *book_view; PASBackendLDAPBookView *view; - book_view = pas_book_view_new (listener); + g_return_if_fail (req->get_book_view.listener != NULL); + + book_view = pas_book_view_new (req->get_book_view.listener); bonobo_object_ref(BONOBO_OBJECT(book)); - g_object_weak_ref (G_OBJECT (book_view), view_destroy, book); + gtk_signal_connect(GTK_OBJECT(book_view), "destroy", + GTK_SIGNAL_FUNC(view_destroy), book); view = g_new0(PASBackendLDAPBookView, 1); view->book_view = book_view; - view->search = g_strdup(search); + view->search = g_strdup(req->get_book_view.search); view->card_sexp = pas_backend_card_sexp_new (view->search); view->blpriv = bl->priv; - view->limit = limit; + + if (req->op == GetCompletionView) { + view->limit = MIN (bl->priv->ldap_limit, 100); + } + else { + view->limit = bl->priv->ldap_limit; + } e_list_append(bl->priv->book_views, view); @@ -3130,155 +3113,92 @@ ldap_get_view (PASBackend *backend, } static void -pas_backend_ldap_process_get_book_view (PASBackend *backend, - PASBook *book, - PASGetBookViewRequest *req) -{ - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - - ldap_get_view (backend, book, req->search, req->listener, - bl->priv->ldap_limit); -} - -static void -pas_backend_ldap_process_get_completion_view (PASBackend *backend, - PASBook *book, - PASGetCompletionViewRequest *req) -{ - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - - ldap_get_view (backend, book, req->search, req->listener, - MIN (bl->priv->ldap_limit, 100)); -} - -static void -pas_backend_ldap_process_get_changes (PASBackend *backend, - PASBook *book, - PASGetChangesRequest *req) -{ - /* FIXME: implement */ -} - -static void pas_backend_ldap_process_check_connection (PASBackend *backend, PASBook *book, - PASCheckConnectionRequest *req) + PASRequest *req) { PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); pas_book_report_connection (book, bl->priv->connected); } -#define LDAP_SIMPLE_PREFIX "ldap/simple-" -#define SASL_PREFIX "sasl/" - static void pas_backend_ldap_process_authenticate_user (PASBackend *backend, PASBook *book, - PASAuthenticateUserRequest *req) + PASRequest *req) { PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); int ldap_error; char *dn = NULL; - if (!strncasecmp (req->auth_method, LDAP_SIMPLE_PREFIX, strlen (LDAP_SIMPLE_PREFIX))) { - - if (!strcmp (req->auth_method, "ldap/simple-email")) { - LDAPMessage *res, *e; - char *query = g_strdup_printf ("(mail=%s)", req->user); + if (!strcmp (req->auth_user.auth_method, "ldap/simple-email")) { + LDAPMessage *res, *e; + char *query = g_strdup_printf ("(mail=%s)", req->auth_user.user); - ldap_error = ldap_search_s (bl->priv->ldap, - bl->priv->ldap_rootdn, - bl->priv->ldap_scope, - query, - NULL, 0, &res); - g_free (query); + ldap_error = ldap_search_s (bl->priv->ldap, + bl->priv->ldap_rootdn, + bl->priv->ldap_scope, + query, + NULL, 0, &res); + g_free (query); - if (ldap_error == LDAP_SUCCESS) { - char *entry_dn; + if (ldap_error == LDAP_SUCCESS) { + char *entry_dn; - e = ldap_first_entry (bl->priv->ldap, res); + e = ldap_first_entry (bl->priv->ldap, res); - entry_dn = ldap_get_dn (bl->priv->ldap, e); - dn = g_strdup(entry_dn); + entry_dn = ldap_get_dn (bl->priv->ldap, e); + dn = g_strdup(entry_dn); - ldap_memfree (entry_dn); - ldap_msgfree (res); - } - else { - pas_book_respond_authenticate_user (book, - GNOME_Evolution_Addressbook_BookListener_PermissionDenied); - return; - } - } - else if (!strcmp (req->auth_method, "ldap/simple-binddn")) { - dn = g_strdup (req->user); + ldap_memfree (entry_dn); + ldap_msgfree (res); } - - /* now authenticate against the DN we were either supplied or queried for */ - printf ("simple auth as %s\n", dn); - ldap_error = ldap_simple_bind_s(bl->priv->ldap, - dn, - req->passwd); - - pas_book_respond_authenticate_user (book, - ldap_error_to_response (ldap_error)); - } -#ifdef ENABLE_SASL_BINDS - else if (!strncasecmp (req->auth_method, SASL_PREFIX, strlen (SASL_PREFIX))) { - g_print ("sasl bind (mech = %s) as %s", req->auth_method + strlen (SASL_PREFIX), req->user); - ldap_error = ldap_sasl_bind_s (bl->priv->ldap, - NULL, - req->auth_method + strlen (SASL_PREFIX), - req->passwd, - NULL, - NULL, - NULL); - - if (ldap_error == LDAP_NOT_SUPPORTED) - pas_book_respond_authenticate_user (book, - GNOME_Evolution_Addressbook_BookListener_UnsupportedAuthenticationMethod); - else + else { pas_book_respond_authenticate_user (book, - ldap_error_to_response (ldap_error)); + GNOME_Evolution_Addressbook_BookListener_PermissionDenied); + return; + } } -#endif - else { - pas_book_respond_authenticate_user (book, - GNOME_Evolution_Addressbook_BookListener_UnsupportedAuthenticationMethod); - return; + else if (!strcmp (req->auth_user.auth_method, "ldap/simple-binddn")) { + dn = g_strdup (req->auth_user.user); } - if (ldap_error == LDAP_SUCCESS) { - bl->priv->auth_dn = dn; - bl->priv->auth_passwd = g_strdup (req->passwd); + /* now authenticate against the DN we were either supplied or queried for */ + printf ("authenticating as %s\n", dn); + ldap_error = ldap_simple_bind_s(bl->priv->ldap, + dn, + req->auth_user.passwd); - pas_backend_set_is_writable (backend, TRUE); + bl->priv->auth_dn = dn; + bl->priv->auth_passwd = g_strdup (req->auth_user.passwd); - /* force a requery on the root dse since some ldap - servers are set up such that they don't report - anything (including the schema DN) until the user - is authenticated */ - if (!bl->priv->evolutionPersonChecked) { - ldap_error = query_ldap_root_dse (bl); + pas_book_respond_authenticate_user (book, + ldap_error_to_response (ldap_error)); - if (LDAP_SUCCESS == ldap_error) { - if (!bl->priv->evolutionPersonChecked) - check_schema_support (bl); - } - else - g_warning ("Failed to perform root dse query after authenticating, (ldap_error 0x%02x)", ldap_error); - } + bl->priv->writable = (ldap_error == LDAP_SUCCESS); + + /* if the bind was successful we force a requery on the root + dse since some ldap servers are set up such that they don't + report anything (including the schema DN) until the user is + authenticated */ + if (!bl->priv->evolutionPersonChecked && ldap_error == LDAP_SUCCESS) { + ldap_error = query_ldap_root_dse (bl); - pas_book_report_writable (book, TRUE); + if (LDAP_SUCCESS == ldap_error) { + if (!bl->priv->evolutionPersonChecked) + check_schema_support (bl); + } + else + g_warning ("Failed to perform root dse query after authenticating, (ldap_error 0x%02x)", ldap_error); } + pas_book_report_writable (book, bl->priv->writable); } static void pas_backend_ldap_process_get_supported_fields (PASBackend *backend, PASBook *book, - PASGetSupportedFieldsRequest *req) + PASRequest *req) { PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); @@ -3289,16 +3209,75 @@ pas_backend_ldap_process_get_supported_fields (PASBackend *backend, } static void -pas_backend_ldap_process_get_supported_auth_methods (PASBackend *backend, - PASBook *book, - PASGetSupportedAuthMethodsRequest *req) +pas_backend_ldap_process_client_requests (PASBook *book) +{ + PASBackend *backend; + PASRequest *req; + + backend = pas_book_get_backend (book); + + req = pas_book_pop_request (book); + if (req == NULL) + return; + + switch (req->op) { + case CreateCard: + pas_backend_ldap_process_create_card (backend, book, req); + break; + + case RemoveCard: + pas_backend_ldap_process_remove_card (backend, book, req); + break; + + case ModifyCard: + pas_backend_ldap_process_modify_card (backend, book, req); + break; + + case CheckConnection: + pas_backend_ldap_process_check_connection (backend, book, req); + break; + + case GetVCard: + pas_backend_ldap_process_get_vcard (backend, book, req); + break; + + case GetCursor: + pas_backend_ldap_process_get_cursor (backend, book, req); + break; + + case GetBookView: + pas_backend_ldap_process_get_book_view (backend, book, req); + break; + + case GetCompletionView: + /* we don't support summaries so completion view requests are the same as book view requests */ + pas_backend_ldap_process_get_book_view (backend, book, req); + break; + + case GetChanges: + /* FIXME: Code this. */ + break; + + case AuthenticateUser: + pas_backend_ldap_process_authenticate_user (backend, book, req); + break; + case GetSupportedFields: + pas_backend_ldap_process_get_supported_fields (backend, book, req); + break; + } + + pas_book_free_request (req); +} + +static void +pas_backend_ldap_book_destroy_cb (PASBook *book, gpointer data) { - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); + PASBackendLDAP *backend; - pas_book_respond_get_supported_auth_methods (book, - GNOME_Evolution_Addressbook_BookListener_Success, - bl->priv->supported_auth_methods); + backend = PAS_BACKEND_LDAP (data); + + pas_backend_remove_client (PAS_BACKEND (backend), book); } static GNOME_Evolution_Addressbook_BookListener_CallStatus @@ -3392,7 +3371,75 @@ pas_backend_ldap_get_uri (PASBackend *backend) return bl->priv->uri; } -static char* +static gboolean +pas_backend_ldap_add_client (PASBackend *backend, + GNOME_Evolution_Addressbook_BookListener listener) +{ + PASBackendLDAP *bl; + PASBook *book; + + g_assert (backend != NULL); + g_assert (PAS_IS_BACKEND_LDAP (backend)); + + bl = PAS_BACKEND_LDAP (backend); + + book = pas_book_new (backend, listener); + + if (!book) { + if (!bl->priv->clients) + pas_backend_last_client_gone (backend); + + return FALSE; + } + + gtk_signal_connect (GTK_OBJECT (book), "destroy", + pas_backend_ldap_book_destroy_cb, backend); + + gtk_signal_connect (GTK_OBJECT (book), "requests_queued", + pas_backend_ldap_process_client_requests, NULL); + + bl->priv->clients = g_list_prepend ( + bl->priv->clients, book); + + if (bl->priv->connected) { + pas_book_respond_open ( + book, GNOME_Evolution_Addressbook_BookListener_Success); + } else { + pas_book_respond_open ( + book, GNOME_Evolution_Addressbook_BookListener_OtherError); + } + + pas_book_report_writable (book, bl->priv->writable); + + bonobo_object_unref (BONOBO_OBJECT (book)); + + return TRUE; +} + +static void +pas_backend_ldap_remove_client (PASBackend *backend, + PASBook *book) +{ + PASBackendLDAP *bl; + + g_return_if_fail (backend != NULL); + g_return_if_fail (PAS_IS_BACKEND_LDAP (backend)); + g_return_if_fail (book != NULL); + g_return_if_fail (PAS_IS_BOOK (book)); + + bl = PAS_BACKEND_LDAP (backend); + + /* Disconnect */ + bl->priv->clients = g_list_remove (bl->priv->clients, book); + + /* When all clients go away, notify the parent factory about it so that + * it may decide whether to kill the backend or not. + */ + if (!bl->priv->clients) + pas_backend_last_client_gone (backend); +} + +static char * pas_backend_ldap_get_static_capabilities (PASBackend *backend) { return g_strdup("net"); @@ -3418,10 +3465,10 @@ pas_backend_ldap_new (void) { PASBackendLDAP *backend; - backend = g_object_new (PAS_TYPE_BACKEND_LDAP, NULL); + backend = gtk_type_new (pas_backend_ldap_get_type ()); if (! pas_backend_ldap_construct (backend)) { - g_object_unref (backend); + gtk_object_unref (GTK_OBJECT (backend)); return NULL; } @@ -3440,71 +3487,51 @@ call_dtor (int msgid, LDAPOp *op, gpointer data) } static void -pas_backend_ldap_dispose (GObject *object) +pas_backend_ldap_destroy (GtkObject *object) { PASBackendLDAP *bl; bl = PAS_BACKEND_LDAP (object); - if (bl->priv) { - g_hash_table_foreach_remove (bl->priv->id_to_op, (GHRFunc)call_dtor, NULL); - g_hash_table_destroy (bl->priv->id_to_op); + g_hash_table_foreach_remove (bl->priv->id_to_op, (GHRFunc)call_dtor, NULL); + g_hash_table_destroy (bl->priv->id_to_op); - if (bl->priv->poll_timeout != -1) { - printf ("removing timeout\n"); - g_source_remove (bl->priv->poll_timeout); - } - - g_object_unref (bl->priv->book_views); - - if (bl->priv->supported_fields) - g_object_unref (bl->priv->supported_fields); + if (bl->priv->poll_timeout != -1) { + printf ("removing timeout\n"); + g_source_remove (bl->priv->poll_timeout); + } - if (bl->priv->supported_auth_methods) - g_object_unref (bl->priv->supported_auth_methods); + gtk_object_unref (GTK_OBJECT (bl->priv->book_views)); - g_free (bl->priv->uri); + if (bl->priv->supported_fields) + gtk_object_unref (GTK_OBJECT (bl->priv->supported_fields)); - g_free (bl->priv); - bl->priv = NULL; - } + g_free (bl->priv->uri); - if (G_OBJECT_CLASS (pas_backend_ldap_parent_class)->dispose) - G_OBJECT_CLASS (pas_backend_ldap_parent_class)->dispose (object); + GTK_OBJECT_CLASS (pas_backend_ldap_parent_class)->destroy (object); } static void pas_backend_ldap_class_init (PASBackendLDAPClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkObjectClass *object_class = (GtkObjectClass *) klass; PASBackendClass *parent_class; /* get client side information (extensions present in the library) */ get_ldap_library_info (); - pas_backend_ldap_parent_class = g_type_class_peek_parent (klass); + pas_backend_ldap_parent_class = gtk_type_class (pas_backend_get_type ()); parent_class = PAS_BACKEND_CLASS (klass); /* Set the virtual methods. */ parent_class->load_uri = pas_backend_ldap_load_uri; parent_class->get_uri = pas_backend_ldap_get_uri; + parent_class->add_client = pas_backend_ldap_add_client; + parent_class->remove_client = pas_backend_ldap_remove_client; parent_class->get_static_capabilities = pas_backend_ldap_get_static_capabilities; - parent_class->create_card = pas_backend_ldap_process_create_card; - parent_class->remove_cards = pas_backend_ldap_process_remove_cards; - parent_class->modify_card = pas_backend_ldap_process_modify_card; - parent_class->check_connection = pas_backend_ldap_process_check_connection; - parent_class->get_vcard = pas_backend_ldap_process_get_vcard; - parent_class->get_cursor = pas_backend_ldap_process_get_cursor; - parent_class->get_book_view = pas_backend_ldap_process_get_book_view; - parent_class->get_completion_view = pas_backend_ldap_process_get_completion_view; - parent_class->get_changes = pas_backend_ldap_process_get_changes; - parent_class->authenticate_user = pas_backend_ldap_process_authenticate_user; - parent_class->get_supported_fields = pas_backend_ldap_process_get_supported_fields; - parent_class->get_supported_auth_methods = pas_backend_ldap_process_get_supported_auth_methods; - - object_class->dispose = pas_backend_ldap_dispose; + object_class->destroy = pas_backend_ldap_destroy; } static void @@ -3526,25 +3553,24 @@ pas_backend_ldap_init (PASBackendLDAP *backend) /** * pas_backend_ldap_get_type: */ -GType +GtkType pas_backend_ldap_get_type (void) { - static GType type = 0; + static GtkType type = 0; if (! type) { - GTypeInfo info = { - sizeof (PASBackendLDAPClass), - NULL, /* base_class_init */ - NULL, /* base_class_finalize */ - (GClassInitFunc) pas_backend_ldap_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ + GtkTypeInfo info = { + "PASBackendLDAP", sizeof (PASBackendLDAP), - 0, /* n_preallocs */ - (GInstanceInitFunc) pas_backend_ldap_init + sizeof (PASBackendLDAPClass), + (GtkClassInitFunc) pas_backend_ldap_class_init, + (GtkObjectInitFunc) pas_backend_ldap_init, + NULL, /* reserved 1 */ + NULL, /* reserved 2 */ + (GtkClassInitFunc) NULL }; - type = g_type_register_static (PAS_TYPE_BACKEND, "PASBackendLDAP", &info, 0); + type = gtk_type_unique (pas_backend_get_type (), &info); } return type; |