diff --git a/gnome/src/contacts/addrbookfactory.c b/gnome/src/contacts/addrbookfactory.c index 821adcf280dd81e29cc3786407a1a6a0fa6a41ee..4058b31251303903849d223dc461488498cbb76b 100644 --- a/gnome/src/contacts/addrbookfactory.c +++ b/gnome/src/contacts/addrbookfactory.c @@ -89,10 +89,11 @@ handler_async_search(GList *hits, gpointer user_data) void abook_init() { - void *handle = dlopen(PLUGINS_DIR"/libevladdrbook.so", RTLD_LAZY); + const gchar *addrbook_path = PLUGINS_DIR "/libevladdrbook.so"; + void *handle = dlopen(addrbook_path, RTLD_LAZY); if (handle == NULL) { - DEBUG("Did not load addressbook"); + DEBUG("Did not load addressbook from path %s", addrbook_path); return; } diff --git a/plugins/addressbook/evolution/addressbook.h b/plugins/addressbook/evolution/addressbook.h index 68ac7bb666edf3679ddf236eef0bc46a1002185c..89732b28714790a8c51c7d075949a5f903fb91d1 100644 --- a/plugins/addressbook/evolution/addressbook.h +++ b/plugins/addressbook/evolution/addressbook.h @@ -60,6 +60,13 @@ typedef struct _Hit { /** * Book structure for "outside world" */ +#if EDS_CHECK_VERSION(3,5,3) +typedef struct { + gchar *uid; + gchar *name; + gboolean active; +} book_data_t; +#else typedef struct { gchar *uid; gchar *uri; @@ -67,6 +74,7 @@ typedef struct { gboolean active; gboolean isdefault; } book_data_t; +#endif typedef struct _AddressBook_Config { // gint64: a signed integer guaranteed to be 64 bits on all platforms diff --git a/plugins/addressbook/evolution/eds.c b/plugins/addressbook/evolution/eds.c index 475cf8bb62c5bdab755886d727ceeeb3fc676708..9a47d9086c429999e8e0561e935bdd8d90236e4b 100644 --- a/plugins/addressbook/evolution/eds.c +++ b/plugins/addressbook/evolution/eds.c @@ -46,6 +46,7 @@ #include <libedataserver/libedataserver.h> #else #include <libedataserver/e-source.h> +#include <libebook/e-book-client.h> #endif /** @@ -68,7 +69,9 @@ static GStaticMutex books_data_mutex = G_STATIC_MUTEX_INIT; /** * Current selected addressbook's uri and uid, initialized with default */ +#if !EDS_CHECK_VERSION(3,5,3) static gchar *current_uri = NULL; +#endif static gchar *current_uid = NULL; static gchar *current_name = "Default"; @@ -201,7 +204,7 @@ pixbuf_from_contact (EContact *contact) * Final callback after all books have been processed. */ static void -view_finish_callback (EBookView *book_view, Search_Handler_And_Data *had) +view_finish_callback (EBookClientView *book_client_view, Search_Handler_And_Data *had) { SearchAsyncHandler had_handler = had->search_handler; GList *had_hits = had->hits; @@ -209,8 +212,8 @@ view_finish_callback (EBookView *book_view, Search_Handler_And_Data *had) g_free (had); - if (book_view != NULL) - g_object_unref (book_view); + if (book_client_view != NULL) + g_object_unref (book_client_view); // Call display callback had_handler (had_hits, had_user_data); @@ -219,32 +222,23 @@ view_finish_callback (EBookView *book_view, Search_Handler_And_Data *had) /** * Callback called after a contact have been found in EDS by search_async_by_contacts. */ -#ifdef LIBEDATASERVER_VERSION_2_32 + static void -eds_query_result_cb (EBook *book, const GError *error, GList *contacts, gpointer user_data) +eds_query_result_cb (GObject *object, GAsyncResult *result, gpointer user_data) { - if (error) + EBookClient *book_client = E_BOOK_CLIENT(object); + if (!book_client) return; -#else -static void -eds_query_result_cb (EBook *book, EBookStatus status, GList *contacts, gpointer user_data) -{ - if (status != E_BOOK_ERROR_OK) + GSList *contacts; + if (!e_book_client_get_contacts_finish(book_client, result, &contacts, NULL)) return; -#endif - Search_Handler_And_Data *had = (Search_Handler_And_Data *) user_data; - if (contacts == NULL) { - had->search_handler (NULL, user_data); - return; - } - // make sure we have a new list of hits had->hits = NULL; - for (GList *l = contacts; l; l = g_list_next (l)) { - Hit *hit = g_new (Hit, 1); + for (GSList *l = contacts; l; l = l->next) { + Hit *hit = g_new0(Hit, 1); EContact *contact = E_CONTACT(l->data); hit->photo = pixbuf_from_contact(contact); @@ -258,43 +252,30 @@ eds_query_result_cb (EBook *book, EBookStatus status, GList *contacts, gpointer if (--had->max_results_remaining <= 0) break; } + g_slist_foreach (contacts, (GFunc) g_object_unref, NULL); + g_slist_free (contacts); view_finish_callback (NULL, had); - g_object_unref (book); + g_object_unref (object); } - /** - * Callback for asynchronous open of books + * Callback for asynchronous opening of book client */ -#ifdef LIBEDATASERVER_VERSION_2_32 -void -eds_async_open_callback (EBook *book, const GError *error, gpointer closure) -{ - if(error) - return; -#else static void -eds_async_open_callback (EBook *book, EBookStatus status, gpointer closure) +client_open_async_callback(GObject *client, GAsyncResult *result, gpointer closure) { - if(status == E_BOOK_ERROR_OK) + if (!client) + return; + if (!e_client_open_finish(E_CLIENT(client), result, NULL)) return; - -#endif Search_Handler_And_Data *had = (Search_Handler_And_Data *) closure; - - if (!e_book_is_opened (book)) - e_book_open (book, FALSE, NULL); - -#ifdef LIBEDATASERVER_VERSION_2_32 - e_book_get_contacts_async (book, had->equery, eds_query_result_cb, had); -#else - e_book_async_get_contacts (book, had->equery, eds_query_result_cb, had); -#endif - + gchar *query_str = e_book_query_to_string(had->equery); + e_book_client_get_contacts(E_BOOK_CLIENT(client), query_str, NULL, eds_query_result_cb, closure); + g_free(query_str); } /** @@ -308,8 +289,12 @@ init_eds () for (GSList *iter = books_data; iter != NULL; iter = iter->next) { book_data_t *book_data = (book_data_t *) iter->data; +#if EDS_CHECK_VERSION(3,5,3) + { +#else if (book_data->isdefault) { current_uri = book_data->uri; +#endif current_uid = book_data->uid; current_name = book_data->name; } @@ -318,15 +303,91 @@ init_eds () g_static_mutex_unlock(&books_data_mutex); } +static GSList * +free_books_data(GSList *list) +{ + for (GSList *iter = list; iter != NULL; iter = iter->next) { + book_data_t *book_data = (book_data_t *) iter->data; + + g_free (book_data->name); + g_free (book_data->uid); +#if !EDS_CHECK_VERSION(3,5,3) + g_free (book_data->uri); +#endif + } + return NULL; +} + /** - * Fill book data + * Fill books data */ +#if EDS_CHECK_VERSION(3,5,3) + +static book_data_t * +create_book_data_from_source(ESource *source) +{ + book_data_t *book_data = g_new0(book_data_t, 1); + book_data->active = e_source_get_enabled(source); + book_data->name = g_strdup(e_source_get_display_name(source)); + book_data->uid = g_strdup(e_source_get_uid(source)); + return book_data; +} + +static ESourceRegistry * +get_registry() +{ + static ESourceRegistry * registry; + if (registry == NULL) + registry = e_source_registry_new_sync(NULL, NULL); + return registry; +} + void fill_books_data () { -#if EDS_CHECK_VERSION(3,5,3) -#warning FIXME ESource registry API is not supported yet + // FIXME: add error handling + ESourceRegistry *registry = get_registry(); + const gchar *extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK; + GList *list = e_source_registry_list_sources(registry, extension_name); + + g_static_mutex_lock(&books_data_mutex); + + books_data = free_books_data(books_data); + + for (GList *l = list; l != NULL; l = l->next) { + if (l->data) { + ESource *source = l->data; + book_data_t *book_data = create_book_data_from_source(source); + books_data = g_slist_prepend(books_data, book_data); + } + } + + g_static_mutex_unlock(&books_data_mutex); + + /* Free each source in the list and the list itself */ + g_list_free_full(list, g_object_unref); +} + #else + +static book_data_t * +create_book_data_from_source(ESource *source, ESourceGroup *group) +{ + book_data_t *book_data = g_new0 (book_data_t, 1); + book_data->active = FALSE; + book_data->name = g_strdup (e_source_peek_name (source)); + book_data->uid = g_strdup (e_source_peek_uid (source)); + + const gchar *prop = e_source_get_property (source, "default"); + book_data->isdefault = (prop && !strcmp(prop, "true")); + book_data->uri = g_strconcat(e_source_group_peek_base_uri (group), e_source_peek_relative_uri (source), NULL); + return book_data; +} + + +void +fill_books_data () +{ ESourceList *source_list = e_source_list_new_for_gconf_default ("/apps/evolution/addressbook/sources"); if (source_list == NULL) @@ -341,30 +402,14 @@ fill_books_data () g_static_mutex_lock(&books_data_mutex); - for (GSList *iter = books_data; iter != NULL; iter = iter->next) { - book_data_t *book_data = (book_data_t *) iter->data; - - g_free (book_data->name); - g_free (book_data->uid); - g_free (book_data->uri); - } - books_data = NULL; + books_data = free_books_data(books_data); for (GSList *l = list; l != NULL; l = l->next) { ESourceGroup *group = l->data; for (GSList *m = e_source_group_peek_sources (group); m != NULL; m = m->next) { ESource *source = m->data; - - book_data_t *book_data = g_new (book_data_t, 1); - book_data->active = FALSE; - book_data->name = g_strdup (e_source_peek_name (source)); - book_data->uid = g_strdup (e_source_peek_uid (source)); - - const gchar *prop = e_source_get_property (source, "default"); - book_data->isdefault = (prop && !strcmp(prop, "true")); - book_data->uri = g_strconcat(e_source_group_peek_base_uri (group), e_source_peek_relative_uri (source), NULL); - + book_data_t *book_data = create_book_data_from_source(source, group); books_data = g_slist_prepend (books_data, book_data); } } @@ -372,9 +417,10 @@ fill_books_data () g_static_mutex_unlock(&books_data_mutex); g_object_unref (source_list); -#endif } +#endif +// FIXME: should be obtained by e_source_registry_ref_default_address_book () void determine_default_addressbook() { @@ -385,8 +431,12 @@ determine_default_addressbook() for (GSList *elm = books_data; elm ; elm = g_slist_next (elm)) { book_data_t *book_data = elm->data; +#if EDS_CHECK_VERSION(3,5,3) + { +#else if (book_data->isdefault) { current_uri = book_data->uri; +#endif current_uid = book_data->uid; current_name = book_data->name; default_found = TRUE; @@ -399,8 +449,10 @@ determine_default_addressbook() book_data_t *book_data = elm->data; if (book_data->active) { +#if !EDS_CHECK_VERSION(3,5,3) book_data->isdefault = TRUE; current_uri = book_data->uri; +#endif current_uid = book_data->uid; current_name = book_data->name; break; @@ -428,18 +480,17 @@ search_async_by_contacts (const char *query, int max_results, SearchAsyncHandler had->equery = create_query (query, current_test, (AddressBook_Config *) (user_data)); #if EDS_CHECK_VERSION(3,5,3) -#warning FIXME: use EClient API, EBook API is deprecated + ESourceRegistry *registry = get_registry(); + ESource *source = e_source_registry_ref_source(registry, current_uid); + EBookClient *book_client = e_book_client_new(source, NULL); + g_object_unref(source); #else - EBook *book = e_book_new_from_uri(current_uri, NULL); - if (!book) + EBookClient *book_client = e_book_client_new_from_uri(current_uri, NULL); +#endif + if (!book_client) return; + e_client_open(E_CLIENT(book_client), TRUE, NULL, client_open_async_callback, had); -#ifdef LIBEDATASERVER_VERSION_2_32 - e_book_open_async (book, TRUE, eds_async_open_callback, had); -#else - e_book_async_open(book, TRUE, eds_async_open_callback, had); -#endif -#endif } void @@ -452,8 +503,10 @@ set_current_addressbook (const gchar *name) for (GSList *iter = books_data; iter != NULL; iter = iter->next) { book_data_t *book_data = (book_data_t *) iter->data; - if (strcmp (book_data->name, name) == 0) { + if (g_strcmp0(book_data->name, name) == 0) { +#if !EDS_CHECK_VERSION(3,5,3) current_uri = book_data->uri; +#endif current_uid = book_data->uid; current_name = book_data->name; } diff --git a/plugins/addressbook/evolution/eds.h b/plugins/addressbook/evolution/eds.h index a905dd20f91877240979d020e8eab8f4f17f2787..ef80e8b894edfc51c92be8f0a1c45333febe1352 100644 --- a/plugins/addressbook/evolution/eds.h +++ b/plugins/addressbook/evolution/eds.h @@ -47,6 +47,7 @@ #include <libebook/libebook.h> #else #include <libebook/e-book.h> +#include <libebook/e-book-query.h> #endif #include "addressbook.h"