Skip to content
Snippets Groups Projects
Commit e1bee48c authored by Alexandre Savard's avatar Alexandre Savard
Browse files

[#3755] Fix addresbook, able to make synchronous calls to eds

parent ea8b54ac
No related branches found
No related tags found
No related merge requests found
......@@ -56,31 +56,31 @@ addressbook_config_load_parameters(AddressBook_Config **settings)
// Fetch the settings from D-Bus
_params = (GHashTable*) dbus_get_addressbook_settings();
if (_params == NULL)
{
_settings->enable = 1;
_settings->max_results = 30;
_settings->display_contact_photo = 0;
_settings->search_phone_business = 1;
_settings->search_phone_home = 1;
_settings->search_phone_mobile = 1;
if (_params == NULL) {
DEBUG("Addressbook: No parameters received, use default");
_settings->enable = 1;
_settings->max_results = 30;
_settings->display_contact_photo = 0;
_settings->search_phone_business = 1;
_settings->search_phone_home = 1;
_settings->search_phone_mobile = 1;
}
else
{
_settings->enable = (gint64) (g_hash_table_lookup (_params,
ADDRESSBOOK_ENABLE));
_settings->max_results = (gint64) (g_hash_table_lookup(_params,
ADDRESSBOOK_MAX_RESULTS));
_settings->display_contact_photo = (gint64) (g_hash_table_lookup(_params,
ADDRESSBOOK_DISPLAY_CONTACT_PHOTO));
_settings->search_phone_business = (gint64) (g_hash_table_lookup(_params,
ADDRESSBOOK_DISPLAY_PHONE_BUSINESS));
_settings->search_phone_home = (gint64) (g_hash_table_lookup(_params,
ADDRESSBOOK_DISPLAY_PHONE_HOME));
_settings->search_phone_mobile = (gint64) (g_hash_table_lookup(_params,
ADDRESSBOOK_DISPLAY_PHONE_MOBILE));
else {
_settings->enable = (size_t) (g_hash_table_lookup (_params, ADDRESSBOOK_ENABLE));
_settings->max_results = (size_t) (g_hash_table_lookup(_params, ADDRESSBOOK_MAX_RESULTS));
_settings->display_contact_photo = (size_t) (g_hash_table_lookup(_params, ADDRESSBOOK_DISPLAY_CONTACT_PHOTO));
_settings->search_phone_business = (size_t) (g_hash_table_lookup(_params, ADDRESSBOOK_DISPLAY_PHONE_BUSINESS));
_settings->search_phone_home = (size_t) (g_hash_table_lookup(_params, ADDRESSBOOK_DISPLAY_PHONE_HOME));
_settings->search_phone_mobile = (size_t) (g_hash_table_lookup(_params, ADDRESSBOOK_DISPLAY_PHONE_MOBILE));
}
DEBUG("Addressbook: Settings: enabled %d, max_result %d, photo %d, business %d, home %d, mobile %d",
_settings->enable, _settings->max_results, _settings->display_contact_photo,
_settings->search_phone_business, _settings->search_phone_home, _settings->search_phone_mobile);
*settings = _settings;
}
......@@ -92,17 +92,17 @@ addressbook_config_save_parameters(void)
params = g_hash_table_new(NULL, g_str_equal);
g_hash_table_replace(params, (gpointer) ADDRESSBOOK_ENABLE,
(gpointer) addressbook_config->enable);
(gpointer)(size_t) addressbook_config->enable);
g_hash_table_replace(params, (gpointer) ADDRESSBOOK_MAX_RESULTS,
(gpointer) addressbook_config->max_results);
(gpointer)(size_t) addressbook_config->max_results);
g_hash_table_replace(params, (gpointer) ADDRESSBOOK_DISPLAY_CONTACT_PHOTO,
(gpointer) addressbook_config->display_contact_photo);
(gpointer)(size_t) addressbook_config->display_contact_photo);
g_hash_table_replace(params, (gpointer) ADDRESSBOOK_DISPLAY_PHONE_BUSINESS,
(gpointer) addressbook_config->search_phone_business);
(gpointer)(size_t) addressbook_config->search_phone_business);
g_hash_table_replace(params, (gpointer) ADDRESSBOOK_DISPLAY_PHONE_HOME,
(gpointer) addressbook_config->search_phone_home);
(gpointer)(size_t) addressbook_config->search_phone_home);
g_hash_table_replace(params, (gpointer) ADDRESSBOOK_DISPLAY_PHONE_MOBILE,
(gpointer) addressbook_config->search_phone_mobile);
(gpointer)(size_t) addressbook_config->search_phone_mobile);
dbus_set_addressbook_settings(params);
......
......@@ -50,12 +50,12 @@ typedef struct _AddressBook_Config
{
// gint64: a signed integer guaranteed to be 64 bits on all platforms
// To print or scan values of this type, use G_GINT64_MODIFIER and/or G_GINT64_FORMAT
gint64 enable;
gint64 max_results;
gint64 display_contact_photo;
gint64 search_phone_home;
gint64 search_phone_business;
gint64 search_phone_mobile;
gint enable;
gint max_results;
gint display_contact_photo;
gint search_phone_home;
gint search_phone_business;
gint search_phone_mobile;
} AddressBook_Config;
/**
......
......@@ -44,6 +44,18 @@ addressbook_search(GtkEntry* entry)
{
const gchar* query = gtk_entry_get_text(GTK_ENTRY (entry));
DEBUG("Addressbook: Search %s", query);
AddressBook_Config *addressbook_config;
activateWaitingLayer();
addressbook_config_load_parameters(&addressbook_config);
search_async_by_contacts(gtk_entry_get_text(GTK_ENTRY (entry)), addressbook_config->max_results, &handler_async_search, addressbook_config);
/*
if (strlen(query) >= 3) {
AddressBook_Config *addressbook_config;
......@@ -54,10 +66,12 @@ addressbook_search(GtkEntry* entry)
// Load the address book parameters
addressbook_config_load_parameters(&addressbook_config);
// Start the asynchronous search as soon as we have an entry */
// Start the asynchronous search as soon as we have an entry
search_async(gtk_entry_get_text(GTK_ENTRY (entry)), addressbook_config->max_results, &handler_async_search, addressbook_config);
}
*/
}
/**
......@@ -104,24 +118,23 @@ addressbook_config_books()
book_data_t *book_data;
gchar **list;
// Retrieve list of books
list = (gchar **) dbus_get_addressbook_list();
if (list) {
for (config_book_uid = list; *config_book_uid; config_book_uid++) {
for (config_book_uid = list; *config_book_uid; config_book_uid++) {
// Get corresponding book data
book_data = books_get_book_data_by_uid(*config_book_uid);
// If book_data exists
if (book_data != NULL) {
book_data->active = TRUE;
}
}
g_strfreev(list);
// Get corresponding book data
book_data = books_get_book_data_by_uid(*config_book_uid);
// If book_data exists
if (book_data)
book_data->active = TRUE;
else
ERROR("Addressbook: Error: Could not open book");
}
g_strfreev(list);
}
// Update buttons
......@@ -134,6 +147,8 @@ addressbook_config_books()
GSList *
addressbook_get_books_data()
{
DEBUG("Addressboook: Get books data");
addressbook_config_books();
return books_data;
}
......@@ -145,7 +160,7 @@ addressbook_get_books_data()
void
addressbook_init()
{
DEBUG("Addressbook: Init");
DEBUG("Addressbook: Initialize addressbook");
// Call books initialization
init(&addressbook_config_books);
......@@ -163,11 +178,12 @@ handler_async_search(GList *hits, gpointer user_data)
AddressBook_Config *addressbook_config;
callable_obj_t *j;
DEBUG("Addressbook, callback async search");
// freeing calls
while ((j = (callable_obj_t *) g_queue_pop_tail(contacts->callQueue)) != NULL)
{
free_callable_obj_t(j);
}
while ((j = (callable_obj_t *) g_queue_pop_tail(contacts->callQueue)) != NULL) {
free_callable_obj_t(j);
}
// Retrieve the address book parameters
addressbook_config = (AddressBook_Config*) user_data;
......
......@@ -41,6 +41,7 @@
#include <pango/pango.h>
#include "eds.h"
/**
* Structure used to store search callback and data
*/
......@@ -119,7 +120,6 @@ books_active()
if (book_data->active)
return TRUE;
}
// If no result
return FALSE;
}
......@@ -139,10 +139,13 @@ books_get_book_data_by_uid(gchar *uid)
= book_list_iterator->next)
{
book_data = (book_data_t *) book_list_iterator->data;
if (strcmp(book_data->uid, uid) == 0)
if (strcmp(book_data->uid, uid) == 0) {
DEBUG("Addressbook: Book %s found", uid);
return book_data;
}
}
DEBUG("Addressbook: Could not found Book %s", uid);
// If no result
return NULL;
}
......@@ -297,7 +300,7 @@ eds_async_open_callback(EBook *book, EBookStatus status, gpointer closure)
if (status == E_BOOK_ERROR_OK) {
book_data_t *book_data = g_new(book_data_t, 1);
book_data->active = FALSE;
book_data->active = TRUE;
book_data->name = g_strdup(e_source_peek_name(e_book_get_source(book)));
book_data->uid = g_strdup(e_source_peek_uid(e_book_get_source(book)));
DEBUG("Addressbook: Name: %s", book_data->name);
......@@ -305,6 +308,10 @@ eds_async_open_callback(EBook *book, EBookStatus status, gpointer closure)
book_data->ebook = book;
books_data = g_slist_prepend(books_data, book_data);
had->handler();
// We must open the addressbook
e_book_open (book_data->ebook, FALSE, NULL);
}
else {
WARN("Addressbook: Got error when opening book");
......@@ -382,6 +389,7 @@ eds_async_open_callback(EBook *book, EBookStatus status, gpointer closure)
g_free(state_string);
}
}
/**
......@@ -413,29 +421,34 @@ init(OpenAsyncHandler callback)
Open_Handler_And_Data *had = g_new (Open_Handler_And_Data, 1);
had->handler = callback;
for (l = list; l != NULL; l = l->next)
{
for (l = list; l != NULL; l = l->next) {
ESourceGroup *group = l->data;
GSList *sources = NULL, *m;
sources = e_source_group_peek_sources(group);
for (m = sources; m != NULL; m = m->next)
{
DEBUG("Addressbook: Group name %s", e_source_group_peek_name(group));
DEBUG("Addressbook: Group uid %s", e_source_group_peek_uid(group));
ESourceGroup *group = l->data;
GSList *sources = NULL, *m;
sources = e_source_group_peek_sources(group);
for (m = sources; m != NULL; m = m->next) {
ESource *source = m->data;
EBook *book = e_book_new(source, NULL);
if (book != NULL)
{
// Keep count of remaining books to open
remaining_books_to_open++;
// Asynchronous open
e_book_async_open(book, FALSE, eds_async_open_callback, had);
}
}
DEBUG("Addressbook: Group name %s", e_source_group_peek_name(group));
DEBUG("Addressbook: Group uid %s", e_source_group_peek_uid(group));
ESource *source = m->data;
EBook *book = e_book_new(source, NULL);
if (book) {
DEBUG("Addressbook: Created empty book successfully");
// Keep count of remaining books to open
remaining_books_to_open++;
// Add Notification callback
// g_signal_connect (book, "contacts_added", (GCallback) view_contacts_added_cb, had);
// Asynchronous open
e_book_async_open(book, FALSE, eds_async_open_callback, had);
}
else
ERROR("Addressbook: Error: Could not create empty book");
}
}
current_search_id = 0;
g_object_unref(source_list);
......@@ -485,12 +498,14 @@ view_finish(EBookView *book_view, Search_Handler_And_Data *had)
*/
static void
view_contacts_added_cb(EBookView *book_view, GList *contacts,
gpointer user_data)
gpointer user_data)
{
GdkPixbuf *photo;
Search_Handler_And_Data *had = (Search_Handler_And_Data *) user_data;
DEBUG("Addressbook: Vew contact added callback");
// If it's not the last search launched, stop it
if (had->search_id != current_search_id)
{
......@@ -561,6 +576,7 @@ view_contacts_added_cb(EBookView *book_view, GList *contacts,
}
}
/**
* Callback called after each ebook search completed.
* Used to call final callback when all books have been read.
......@@ -569,35 +585,87 @@ static void
view_completed_cb(EBookView *book_view, EBookViewStatus status UNUSED,
gpointer user_data)
{
DEBUG("Addressbook: View completed callback");
Search_Handler_And_Data *had = (Search_Handler_And_Data *) user_data;
had->book_views_remaining--;
// All books have been prcessed
if (had->book_views_remaining == 0)
{
// Call finish function
view_finish(book_view, had);
}
if (had->book_views_remaining == 0) {
// Call finish function
view_finish(book_view, had);
}
}
/**
* Callback called after a contact have been found in EDS.
*/
static void
eds_query_result_cb(EBook *book, EBookStatus status, EContact *contact, gpointer user_data) {
DEBUG("Addressbook: Search Result callback callled");
if(!contact)
DEBUG("Addressbook: Error: Contact is NULL");
if (status == E_BOOK_ERROR_OK) {
GdkPixbuf *photo;
gchar *number;
Search_Handler_And_Data *had = (Search_Handler_And_Data *) user_data;
Hit *hit = g_new(Hit, 1);
// Get the photo contact
photo = pixbuf_from_contact(E_CONTACT(contact));
// Get business phone information
fetch_information_from_contact(E_CONTACT(contact), E_CONTACT_PHONE_BUSINESS, &number);
hit->phone_business = g_strdup(number);
// Get home phone information
fetch_information_from_contact(E_CONTACT(contact), E_CONTACT_PHONE_HOME, &number);
hit->phone_home = g_strdup(number);
// Get mobile phone information
fetch_information_from_contact(E_CONTACT(contact), E_CONTACT_PHONE_MOBILE, &number);
hit->phone_mobile = g_strdup(number);
hit->name = g_strdup((char *) e_contact_get_const(E_CONTACT(contact), E_CONTACT_NAME_OR_ORG));
if (!hit->name)
hit->name = "";
had->hits = g_list_append(had->hits, hit);
}
}
/**
* Perform an asynchronous search
*/
void
search_async(const char *query, int max_results, SearchAsyncHandler handler,
gpointer user_data)
gpointer user_data)
{
// Increment search id
current_search_id++;
DEBUG("Addressbook: Search %d: %s, max_results %d", current_search_id, query, max_results);
// If query is null
if (strlen(query) < 1 || g_slist_length(books_data) == 0)
{
// If data displayed (from previous search), directly call callback
handler(NULL, user_data);
if (strlen(query) < 1 || g_slist_length(books_data) == 0) {
return;
}
DEBUG("Addressbook: Query is empty or no addressbook opened");
// If data displayed (from previous search), directly call callback
handler(NULL, user_data);
return;
}
GSList *iter;
EBookQuery* book_query = create_query(query);
......@@ -613,46 +681,108 @@ search_async(const char *query, int max_results, SearchAsyncHandler handler,
had->book_views_remaining = 0;
// Iterate throw books data
for (iter = books_data; iter != NULL; iter = iter->next)
{
book_data_t *book_data = (book_data_t *) iter->data;
// If book is active
if (book_data->active)
{
EBookView *book_view = NULL;
e_book_get_book_view(book_data->ebook, book_query, NULL, max_results,
&book_view, NULL);
// If book view exists
if (book_view != NULL)
{
// Perform search
had->book_views_remaining++;
g_signal_connect (book_view, "contacts_added", (GCallback) view_contacts_added_cb, had);
g_signal_connect (book_view, "sequence_complete", (GCallback) view_completed_cb, had);
e_book_view_start(book_view);
search_count++;
}
}
for (iter = books_data; iter != NULL; iter = iter->next) {
book_data_t *book_data = (book_data_t *) iter->data;
// If book is active
if (book_data->active) {
EBookView *book_view = NULL;
if(!e_book_get_book_view(book_data->ebook, book_query, NULL, max_results, &book_view, NULL))
ERROR("Addressbook: Error: Could not create a new book view");
// If book view exists
if (book_view != NULL) {
DEBUG("Addressbook: BookView create, performing search");
// Perform search
had->book_views_remaining++;
g_signal_connect (book_view, "contacts_added", (GCallback) view_contacts_added_cb, had);
g_signal_connect (book_view, "sequence_complete", (GCallback) view_completed_cb, had);
e_book_view_start(book_view);
search_count++;
}
else {
ERROR("Addressbook: Book's view does'not exit, could not perform search");
}
}
else
{
ERROR("Addressbook: Book data not activated");
}
}
e_book_query_unref(book_query);
// If no search has been executed (no book selected)
if (search_count == 0)
{
// Call last callback anyway
view_finish(NULL, had);
if (search_count == 0) {
DEBUG("Addressbook: Error no search performed");
// Call last callback anyway
view_finish(NULL, had);
}
else
DEBUG("Addressbook: Search Count %d", search_count);
}
void
search_async_by_contacts(const char *query, int max_results, SearchAsyncHandler handler, gpointer user_data) {
EBookQuery *equery;
EBookQuery *queries[4];
GList *l, *list, *iter;
GError *error;
current_search_id++;
DEBUG("Addressbook: Search %d: %s, max_results %d", current_search_id, query, max_results);
if(strlen(query) < 1 || g_slist_length(books_data) == 0) {
DEBUG("Addressbook: Query is empty or no addressbook opened");
handler(NULL, user_data);
return;
}
Search_Handler_And_Data *had = g_new(Search_Handler_And_Data, 1);
// initialize search data
had->search_id = current_search_id;
had->handler = handler;
had->user_data = user_data;
had->hits = NULL;
had->max_results_remaining = max_results;
had->book_views_remaining = 0;
// Create the query
int cpt = 0;
// We could also use E_BOOK_QUERY_IS instead of E_BOOK_QUERY_CONTAINS
queries[cpt++] = e_book_query_field_test(E_CONTACT_FULL_NAME, E_BOOK_QUERY_CONTAINS, query);
queries[cpt++] = e_book_query_field_test(E_CONTACT_PHONE_HOME, E_BOOK_QUERY_CONTAINS, query);
queries[cpt++] = e_book_query_field_test(E_CONTACT_PHONE_BUSINESS, E_BOOK_QUERY_CONTAINS, query);
queries[cpt++] = e_book_query_field_test(E_CONTACT_PHONE_MOBILE, E_BOOK_QUERY_CONTAINS, query);
equery = e_book_query_or(cpt, queries, TRUE);
// Iterate through all opened books
for(iter = books_data; iter != NULL; iter = iter->next) {
book_data_t *book_data = (book_data_t *)iter->data;
if(book_data->active) {
// if(e_book_get_contacts(book_data->ebook, equery, &list, NULL)) {
if(e_book_async_get_contacts(book_data->ebook, equery, eds_query_result_cb, had))
DEBUG("Addressbook: Queries sent successfully");
}
}
}
/**
* Fetch information for a specific contact
*/
void
fetch_information_from_contact(EContact *contact, EContactField field,
gchar **info)
fetch_information_from_contact(EContact *contact, EContactField field, gchar **info)
{
gchar *to_fetch;
......
......@@ -43,6 +43,7 @@
#include <libebook/e-book.h>
#include <sflphone_const.h>
#define EMPTY_ENTRY "empty"
G_BEGIN_DECLS
......@@ -110,6 +111,9 @@ void
search_async(const char *query, int max_results, SearchAsyncHandler handler,
gpointer user_data);
void
search_async_by_contacts(const char *query, int max_results, SearchAsyncHandler handler, gpointer user_data);
/**
* Retrieve the specified information from the contact
*/
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment