diff options
Diffstat (limited to 'addressbook/backend/ebook/e-book-util.c')
-rw-r--r-- | addressbook/backend/ebook/e-book-util.c | 210 |
1 files changed, 96 insertions, 114 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); -} - |