diff --git a/sflphone-gtk/src/config/addressbook-config.c b/sflphone-gtk/src/config/addressbook-config.c index 7437396f1ad0dfaf85c9876877763f2fc428c6a4..29451d2b225f3d8464f5048b608854af69932832 100644 --- a/sflphone-gtk/src/config/addressbook-config.c +++ b/sflphone-gtk/src/config/addressbook-config.c @@ -18,159 +18,317 @@ */ #include "addressbook-config.h" +#include <contacts/addressbook/eds.h> AddressBook_Config *addressbook_config; +GtkWidget *book_tree_view; -void addressbook_load_parameters (AddressBook_Config **settings) { +enum +{ + COLUMN_BOOK_ACTIVE, COLUMN_BOOK_NAME +}; - GHashTable *_params = NULL; - AddressBook_Config *_settings; +void +addressbook_config_load_parameters(AddressBook_Config **settings) +{ - // Allocate a struct - _settings = g_new0 (AddressBook_Config, 1); + GHashTable *_params = NULL; + AddressBook_Config *_settings; - // Fetch the settings from D-Bus - _params = (GHashTable*) dbus_get_addressbook_settings (); + // Allocate a struct + _settings = g_new0 (AddressBook_Config, 1); - if (_params == NULL) { - _settings->max_results = 30; - _settings->display_contact_photo = 0; - _settings->search_phone_business = 1; - _settings->search_phone_home = 1; - _settings->search_phone_mobile = 1; + // Fetch the settings from D-Bus + _params = (GHashTable*) dbus_get_addressbook_settings(); + + if (_params == NULL) + { + _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->max_results = (guint)(g_hash_table_lookup (_params, ADDRESSBOOK_MAX_RESULTS)); - _settings->display_contact_photo = (guint) (g_hash_table_lookup (_params, ADDRESSBOOK_DISPLAY_CONTACT_PHOTO)); - _settings->search_phone_business = (guint) (g_hash_table_lookup (_params, ADDRESSBOOK_DISPLAY_PHONE_BUSINESS)); - _settings->search_phone_home = (guint) (g_hash_table_lookup (_params, ADDRESSBOOK_DISPLAY_PHONE_HOME)); - _settings->search_phone_mobile = (guint) (g_hash_table_lookup (_params, ADDRESSBOOK_DISPLAY_PHONE_MOBILE)); + else + { + _settings->max_results = (guint) (g_hash_table_lookup(_params, + ADDRESSBOOK_MAX_RESULTS)); + _settings->display_contact_photo = (guint) (g_hash_table_lookup(_params, + ADDRESSBOOK_DISPLAY_CONTACT_PHOTO)); + _settings->search_phone_business = (guint) (g_hash_table_lookup(_params, + ADDRESSBOOK_DISPLAY_PHONE_BUSINESS)); + _settings->search_phone_home = (guint) (g_hash_table_lookup(_params, + ADDRESSBOOK_DISPLAY_PHONE_HOME)); + _settings->search_phone_mobile = (guint) (g_hash_table_lookup(_params, + ADDRESSBOOK_DISPLAY_PHONE_MOBILE)); } - *settings = _settings; + *settings = _settings; } -void addressbook_save_parameters (void) { +void +addressbook_config_save_parameters(void) +{ - GHashTable *params = NULL; + GHashTable *params = NULL; - params = g_hash_table_new (NULL, g_str_equal); - g_hash_table_replace (params, (gpointer)ADDRESSBOOK_MAX_RESULTS, (gpointer)addressbook_config->max_results); - g_hash_table_replace (params, (gpointer)ADDRESSBOOK_DISPLAY_CONTACT_PHOTO, (gpointer)addressbook_config->display_contact_photo); - g_hash_table_replace (params, (gpointer)ADDRESSBOOK_DISPLAY_PHONE_BUSINESS, (gpointer)addressbook_config->search_phone_business); - g_hash_table_replace (params, (gpointer)ADDRESSBOOK_DISPLAY_PHONE_HOME, (gpointer)addressbook_config->search_phone_home); - g_hash_table_replace (params, (gpointer)ADDRESSBOOK_DISPLAY_PHONE_MOBILE, (gpointer)addressbook_config->search_phone_mobile); + params = g_hash_table_new(NULL, g_str_equal); + g_hash_table_replace(params, (gpointer) ADDRESSBOOK_MAX_RESULTS, + (gpointer) addressbook_config->max_results); + g_hash_table_replace(params, (gpointer) ADDRESSBOOK_DISPLAY_CONTACT_PHOTO, + (gpointer) addressbook_config->display_contact_photo); + g_hash_table_replace(params, (gpointer) ADDRESSBOOK_DISPLAY_PHONE_BUSINESS, + (gpointer) addressbook_config->search_phone_business); + g_hash_table_replace(params, (gpointer) ADDRESSBOOK_DISPLAY_PHONE_HOME, + (gpointer) addressbook_config->search_phone_home); + g_hash_table_replace(params, (gpointer) ADDRESSBOOK_DISPLAY_PHONE_MOBILE, + (gpointer) addressbook_config->search_phone_mobile); - dbus_set_addressbook_settings (params); + dbus_set_addressbook_settings(params); - // Decrement the reference count - g_hash_table_unref (params); + // Decrement the reference count + g_hash_table_unref(params); } -static void max_results_cb (GtkRange* scale) { +static void +max_results_cb(GtkRange* scale) +{ - addressbook_config->max_results = (guint) gtk_range_get_value (GTK_RANGE (scale)); + addressbook_config->max_results = (guint) gtk_range_get_value(GTK_RANGE (scale)); } -static void display_contact_photo_cb (GtkWidget *widget) { +static void +display_contact_photo_cb(GtkWidget *widget) +{ - addressbook_config->display_contact_photo = (guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget)); + addressbook_config->display_contact_photo + = (guint) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); } -static void search_phone_business_cb (GtkWidget *widget) { +static void +search_phone_business_cb(GtkWidget *widget) +{ - addressbook_config->search_phone_business = (guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget)); + addressbook_config->search_phone_business + = (guint) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); } -static void search_phone_home_cb (GtkWidget *widget) { +static void +search_phone_home_cb(GtkWidget *widget) +{ - addressbook_config->search_phone_home = (guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget)); + addressbook_config->search_phone_home = (guint) gtk_toggle_button_get_active( + GTK_TOGGLE_BUTTON(widget)); } -static void search_phone_mobile_cb (GtkWidget *widget) { +static void +search_phone_mobile_cb(GtkWidget *widget) +{ - addressbook_config->search_phone_mobile = (guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget)); + addressbook_config->search_phone_mobile + = (guint) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); } -GtkWidget* create_addressbook_settings () { - - GtkWidget *ret, *result_frame, *table, *value, *label, *photo, *item; - - // Load the user value - addressbook_load_parameters (&addressbook_config); - - ret = gtk_vbox_new(FALSE, 10); - gtk_container_set_border_width(GTK_CONTAINER(ret), 10); - - result_frame = gtk_frame_new(_("Search Parameters")); - gtk_box_pack_start(GTK_BOX(ret), result_frame, FALSE, FALSE, 0); - gtk_widget_show (result_frame); - - table = gtk_table_new ( 5, 3, FALSE/* homogeneous */); - gtk_table_set_row_spacings( GTK_TABLE(table), 10); - gtk_table_set_col_spacings( GTK_TABLE(table), 10); - gtk_widget_show(table); - gtk_container_add( GTK_CONTAINER (result_frame) , table ); - - // SCALE BUTTON - NUMBER OF RESULTS - label = gtk_label_new (_("Maximum result number for a request: ")); - gtk_table_attach ( GTK_TABLE( table ), label, 0, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 10); - value = gtk_hscale_new_with_range (25.0 , 50.0 , 5.0); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), value); - gtk_scale_set_digits (GTK_SCALE(value) , 0); - gtk_scale_set_value_pos (GTK_SCALE(value) , GTK_POS_RIGHT); - gtk_range_set_value (GTK_RANGE( value ) , addressbook_config->max_results); - g_signal_connect (G_OBJECT (value) , "value-changed" , G_CALLBACK(max_results_cb), NULL ); - gtk_table_attach ( GTK_TABLE( table ), value, 2, 3, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); - - // PHOTO DISPLAY - photo = gtk_check_button_new_with_mnemonic( _("_Display contact photo if available")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(photo), addressbook_config->display_contact_photo); - g_signal_connect (G_OBJECT(photo) , "clicked" , G_CALLBACK (display_contact_photo_cb), NULL); - gtk_table_attach ( GTK_TABLE( table ), photo, 0, 3, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); - - label = gtk_label_new (_("Search for and display: ")); - gtk_table_attach ( GTK_TABLE( table ), label, 0, 1, 2, 3, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); - - item = gtk_check_button_new_with_mnemonic( _("_Business phone")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(item), addressbook_config->search_phone_business); - g_signal_connect (G_OBJECT(item) , "clicked" , G_CALLBACK (search_phone_business_cb) , NULL); - gtk_table_attach ( GTK_TABLE( table ), item, 1, 3, 2, 3, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); - - item = gtk_check_button_new_with_mnemonic( _("_Home phone")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(item), addressbook_config->search_phone_home); - g_signal_connect (G_OBJECT(item) , "clicked" , G_CALLBACK (search_phone_home_cb) , NULL); - gtk_table_attach ( GTK_TABLE( table ), item, 1, 3, 3, 4, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); - - item = gtk_check_button_new_with_mnemonic( _("_Mobile phone")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(item), addressbook_config->search_phone_mobile); - g_signal_connect (G_OBJECT(item) , "clicked" , G_CALLBACK (search_phone_mobile_cb) , NULL); - gtk_table_attach ( GTK_TABLE( table ), item, 1, 3, 4, 5, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 10); - - gtk_widget_show_all(ret); +/** + * Toggle active value of book on click and update changes to the deamon + * and in configuration files + */ +static void +addressbook_config_book_active_toggled( + GtkCellRendererToggle *renderer UNUSED, gchar *path, gpointer data) +{ + GtkTreeIter iter; + GtkTreePath *treePath; + GtkTreeModel *model; + gboolean active; + char* name; + + // Get path of clicked book active toggle box + treePath = gtk_tree_path_new_from_string(path); + model = gtk_tree_view_get_model(GTK_TREE_VIEW(data)); + gtk_tree_model_get_iter(model, &iter, treePath); + + // Get active value and name at iteration + gtk_tree_model_get(model, &iter, COLUMN_BOOK_ACTIVE, &active, + COLUMN_BOOK_NAME, &name, -1); + + // Toggle active value + active = !active; + + // Store value + gtk_list_store_set(GTK_LIST_STORE(model), &iter, COLUMN_BOOK_ACTIVE, active, -1); + + gtk_tree_path_free(treePath); + + printf("%s : %d\n", name, active); + printf("Not implemented !\n"); +} - return ret; +static void +addressbook_config_fill_book_list() +{ + GtkTreeIter list_store_iterator; + GSList *book_list_iterator; + GtkListStore *store; + EBook *book; + ESource *source; + + // Get model of view and clear it + store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(book_tree_view))); + gtk_list_store_clear(store); + + // Get list of books + GSList *books = get_books(); + + // Populate window + for (book_list_iterator = books; book_list_iterator != NULL; book_list_iterator + = book_list_iterator->next) + { + book = (EBook *) book_list_iterator->data; + source = e_book_get_source(book); + gtk_list_store_append(store, &list_store_iterator); + gtk_list_store_set(store, &list_store_iterator, COLUMN_BOOK_ACTIVE, TRUE, + COLUMN_BOOK_NAME, e_source_peek_name(source), -1); + } +} +GtkWidget* +create_addressbook_settings() +{ + + GtkWidget *ret, *result_frame, *table, *value, *label, *photo, *item; + + GtkListStore *store; + GtkCellRenderer *renderer; + GtkTreeSelection *tree_selection; + GtkTreeViewColumn *tree_view_column; + GtkWidget *scrolled_window, *hbox; + + // Load the user value + addressbook_config_load_parameters(&addressbook_config); + + ret = gtk_vbox_new(FALSE, 10); + gtk_container_set_border_width(GTK_CONTAINER(ret), 10); + + result_frame = gtk_frame_new(_("General")); + gtk_box_pack_start(GTK_BOX(ret), result_frame, FALSE, FALSE, 0); + gtk_widget_show (result_frame); + + table = gtk_table_new ( 5, 3, FALSE/* homogeneous */); + gtk_table_set_row_spacings( GTK_TABLE(table), 10); + gtk_table_set_col_spacings( GTK_TABLE(table), 10); + gtk_widget_show(table); + gtk_container_add( GTK_CONTAINER (result_frame) , table ); + + // SCALE BUTTON - NUMBER OF RESULTS + hbox = gtk_hbox_new(FALSE, 0); + label = gtk_label_new (_("Maximum results: ")); + gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); + value = gtk_hscale_new_with_range (25.0 , 50.0 , 5.0); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), value); + gtk_scale_set_digits (GTK_SCALE(value) , 0); + gtk_scale_set_value_pos (GTK_SCALE(value) , GTK_POS_RIGHT); + gtk_range_set_value (GTK_RANGE( value ) , addressbook_config->max_results); + g_signal_connect (G_OBJECT (value) , "value-changed" , G_CALLBACK(max_results_cb), NULL ); + gtk_box_pack_start(GTK_BOX(hbox),value,TRUE,TRUE,10); + gtk_table_attach ( GTK_TABLE( table ), hbox, 1, 3, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND |GTK_FILL, 0, 0); + gtk_widget_show_all(hbox); + + // PHOTO DISPLAY + photo = gtk_check_button_new_with_mnemonic( _("_Display contact photo if available")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(photo), addressbook_config->display_contact_photo); + g_signal_connect (G_OBJECT(photo) , "clicked" , G_CALLBACK (display_contact_photo_cb), NULL); + gtk_table_attach ( GTK_TABLE( table ), photo, 1, 3, 2, 3, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); + + result_frame = gtk_frame_new(_("Fields")); + gtk_box_pack_start(GTK_BOX(ret), result_frame, FALSE, FALSE, 0); + gtk_widget_show (result_frame); + + table = gtk_table_new ( 5, 3, FALSE); + gtk_table_set_row_spacings( GTK_TABLE(table), 10); + gtk_table_set_col_spacings( GTK_TABLE(table), 10); + gtk_widget_show(table); + gtk_container_add( GTK_CONTAINER (result_frame) , table ); + + item = gtk_check_button_new_with_mnemonic( _("_Business phone")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(item), addressbook_config->search_phone_business); + g_signal_connect (G_OBJECT(item) , "clicked" , G_CALLBACK (search_phone_business_cb) , NULL); + gtk_table_attach ( GTK_TABLE( table ), item, 1, 3, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); + + item = gtk_check_button_new_with_mnemonic( _("_Home phone")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(item), addressbook_config->search_phone_home); + g_signal_connect (G_OBJECT(item) , "clicked" , G_CALLBACK (search_phone_home_cb) , NULL); + gtk_table_attach ( GTK_TABLE( table ), item, 1, 3, 2, 3, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); + + item = gtk_check_button_new_with_mnemonic( _("_Mobile phone")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(item), addressbook_config->search_phone_mobile); + g_signal_connect (G_OBJECT(item) , "clicked" , G_CALLBACK (search_phone_mobile_cb) , NULL); + gtk_table_attach ( GTK_TABLE( table ), item, 1, 3, 3, 4, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); + + result_frame = gtk_frame_new(_("Books")); + gtk_box_pack_start(GTK_BOX(ret), result_frame, TRUE, TRUE, 0); + gtk_widget_show (result_frame); + + scrolled_window = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN); + + gtk_container_add( GTK_CONTAINER (result_frame) , scrolled_window ); + + store = gtk_list_store_new(2, + G_TYPE_BOOLEAN, // Active + G_TYPE_STRING // Name + ); + + // Create tree view with list store + book_tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); + + // Get tree selection manager + tree_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(book_tree_view)); + + // Active column + renderer = gtk_cell_renderer_toggle_new(); + tree_view_column = gtk_tree_view_column_new_with_attributes("", renderer, "active", COLUMN_BOOK_ACTIVE, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(book_tree_view), tree_view_column); + + // Toggle active property on clicked + g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(addressbook_config_book_active_toggled), (gpointer)book_tree_view); + + // Name column + renderer = gtk_cell_renderer_text_new(); + tree_view_column = gtk_tree_view_column_new_with_attributes(_("Name"), renderer, "markup", COLUMN_BOOK_NAME, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(book_tree_view), tree_view_column); + + g_object_unref(G_OBJECT(store)); + gtk_container_add(GTK_CONTAINER(scrolled_window), book_tree_view); + + addressbook_config_fill_book_list(); + + gtk_widget_show_all(ret); + + return ret; } -gboolean addressbook_display (AddressBook_Config *settings, const gchar *field) { +gboolean +addressbook_display(AddressBook_Config *settings, const gchar *field) +{ - gboolean display = FALSE; + gboolean display = FALSE; - if (g_strcasecmp (field, ADDRESSBOOK_DISPLAY_CONTACT_PHOTO) == 0) - display = (settings->display_contact_photo == 1)? TRUE : FALSE; + if (g_strcasecmp(field, ADDRESSBOOK_DISPLAY_CONTACT_PHOTO) == 0) + display = (settings->display_contact_photo == 1) ? TRUE : FALSE; - else if (g_strcasecmp (field, ADDRESSBOOK_DISPLAY_PHONE_BUSINESS) == 0) - display = (settings->search_phone_business == 1)? TRUE : FALSE; + else if (g_strcasecmp(field, ADDRESSBOOK_DISPLAY_PHONE_BUSINESS) == 0) + display = (settings->search_phone_business == 1) ? TRUE : FALSE; - else if (g_strcasecmp (field, ADDRESSBOOK_DISPLAY_PHONE_HOME) == 0) - display = (settings->search_phone_home == 1)? TRUE : FALSE; + else if (g_strcasecmp(field, ADDRESSBOOK_DISPLAY_PHONE_HOME) == 0) + display = (settings->search_phone_home == 1) ? TRUE : FALSE; - else if (g_strcasecmp (field, ADDRESSBOOK_DISPLAY_PHONE_MOBILE) == 0) - display = (settings->search_phone_mobile == 1)? TRUE : FALSE; + else if (g_strcasecmp(field, ADDRESSBOOK_DISPLAY_PHONE_MOBILE) == 0) + display = (settings->search_phone_mobile == 1) ? TRUE : FALSE; - else - display = FALSE; + else + display = FALSE; - return display; + return display; } diff --git a/sflphone-gtk/src/config/addressbook-config.h b/sflphone-gtk/src/config/addressbook-config.h index 7e6e7438e5c8643f4185c4b3124ce6898d949fe8..ec7a8d16360e56090421b60120bcd26cd63221b7 100644 --- a/sflphone-gtk/src/config/addressbook-config.h +++ b/sflphone-gtk/src/config/addressbook-config.h @@ -33,29 +33,34 @@ G_BEGIN_DECLS #define ADDRESSBOOK_DISPLAY_PHONE_HOME "ADDRESSBOOK_DISPLAY_PHONE_HOME" #define ADDRESSBOOK_DISPLAY_PHONE_MOBILE "ADDRESSBOOK_DISPLAY_PHONE_MOBILE" -typedef struct _AddressBook_Config { - guint max_results; - guint display_contact_photo; - guint search_phone_home; - guint search_phone_business; - guint search_phone_mobile; +typedef struct _AddressBook_Config +{ + guint max_results; + guint display_contact_photo; + guint search_phone_home; + guint search_phone_business; + guint search_phone_mobile; } AddressBook_Config; /** * Save the parameters through D-BUS */ -void addressbook_save_parameters (void); +void +addressbook_config_save_parameters(void); /** * Initialize the address book structure, and retrieve the saved parameters through D-Bus * * @param settings The addressbook structure */ -void addressbook_load_parameters (AddressBook_Config **settings); +void +addressbook_config_load_parameters(AddressBook_Config **settings); -gboolean addressbook_display (AddressBook_Config *settings, const gchar *field); +gboolean +addressbook_display(AddressBook_Config *settings, const gchar *field); -GtkWidget* create_addressbook_settings (); +GtkWidget* +create_addressbook_settings(); G_END_DECLS diff --git a/sflphone-gtk/src/config/configwindow.c b/sflphone-gtk/src/config/configwindow.c index 222816c9cee858e38aa614251778153da643fc82..87dfc907fa3f299f4a1d9743a62b16d9beecf91a 100644 --- a/sflphone-gtk/src/config/configwindow.c +++ b/sflphone-gtk/src/config/configwindow.c @@ -862,7 +862,7 @@ void config_window_set_stun_visible() void save_configuration_parameters (void) { - addressbook_save_parameters (); + addressbook_config_save_parameters (); hooks_save_parameters (); } diff --git a/sflphone-gtk/src/contacts/addressbook.c b/sflphone-gtk/src/contacts/addressbook.c index 5dddf09f9bda76ebaa01089d38821f947dd3feba..083d7ade72bb053b47ec98cd988782c7d62243e8 100644 --- a/sflphone-gtk/src/contacts/addressbook.c +++ b/sflphone-gtk/src/contacts/addressbook.c @@ -21,10 +21,12 @@ #include <searchbar.h> #include <addressbook-config.h> -static void handler_async_search (GList *, gpointer); +static void +handler_async_search(GList *, gpointer); void -addressbook_search(GtkEntry* entry){ +addressbook_search(GtkEntry* entry) +{ AddressBook_Config *addressbook_config; @@ -32,60 +34,71 @@ addressbook_search(GtkEntry* entry){ activateWaitingLayer(); // Load the address book parameters - addressbook_load_parameters (&addressbook_config); + addressbook_config_load_parameters(&addressbook_config); // 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); + search_async(gtk_entry_get_text(GTK_ENTRY (entry)), addressbook_config->max_results, &handler_async_search, + addressbook_config); } void -addressbook_init(){ +addressbook_init() +{ init(); } -static void handler_async_search (GList *hits, gpointer user_data) { +static void +handler_async_search(GList *hits, gpointer user_data) +{ - GList *i; - GdkPixbuf *photo = NULL; - AddressBook_Config *addressbook_config; - call_t *j; + GList *i; + GdkPixbuf *photo = NULL; + AddressBook_Config *addressbook_config; + call_t *j; - // freeing calls - while((j = (call_t *)g_queue_pop_tail (contacts->callQueue)) != NULL) + // freeing calls + while ((j = (call_t *) g_queue_pop_tail(contacts->callQueue)) != NULL) { - free_call_t(j); + free_call_t(j); } - // Retrieve the address book parameters - addressbook_config = (AddressBook_Config*) user_data; + // Retrieve the address book parameters + addressbook_config = (AddressBook_Config*) user_data; - // reset previous results - calltree_reset(contacts); - calllist_reset(contacts); + // reset previous results + calltree_reset(contacts); + calllist_reset(contacts); - for (i = hits; i != NULL; i = i->next) + for (i = hits; i != NULL; i = i->next) { - Hit *entry; - entry = i->data; - if (entry) + Hit *entry; + entry = i->data; + if (entry) { - /* Get the photo */ - if (addressbook_display (addressbook_config, ADDRESSBOOK_DISPLAY_CONTACT_PHOTO)) - photo = entry->photo; - /* Create entry for business phone information */ - if (addressbook_display (addressbook_config, ADDRESSBOOK_DISPLAY_PHONE_BUSINESS)) - calllist_add_contact (entry->name, entry->phone_business, CONTACT_PHONE_BUSINESS, photo); - /* Create entry for home phone information */ - if (addressbook_display (addressbook_config, ADDRESSBOOK_DISPLAY_PHONE_HOME)) - calllist_add_contact (entry->name, entry->phone_home, CONTACT_PHONE_HOME, photo); - /* Create entry for mobile phone information */ - if (addressbook_display (addressbook_config, ADDRESSBOOK_DISPLAY_PHONE_MOBILE)) - calllist_add_contact (entry->name, entry->phone_mobile, CONTACT_PHONE_MOBILE, photo); + /* Get the photo */ + if (addressbook_display(addressbook_config, + ADDRESSBOOK_DISPLAY_CONTACT_PHOTO)) + photo = entry->photo; + /* Create entry for business phone information */ + if (addressbook_display(addressbook_config, + ADDRESSBOOK_DISPLAY_PHONE_BUSINESS)) + calllist_add_contact(entry->name, entry->phone_business, + CONTACT_PHONE_BUSINESS, photo); + /* Create entry for home phone information */ + if (addressbook_display(addressbook_config, + ADDRESSBOOK_DISPLAY_PHONE_HOME)) + calllist_add_contact(entry->name, entry->phone_home, + CONTACT_PHONE_HOME, photo); + /* Create entry for mobile phone information */ + if (addressbook_display(addressbook_config, + ADDRESSBOOK_DISPLAY_PHONE_MOBILE)) + calllist_add_contact(entry->name, entry->phone_mobile, + CONTACT_PHONE_MOBILE, photo); } - free_hit(entry); + free_hit(entry); } - g_list_free(hits); + g_list_free(hits); - // Deactivate waiting image - deactivateWaitingLayer(); + // Deactivate waiting image + deactivateWaitingLayer(); } diff --git a/sflphone-gtk/src/contacts/addressbook/eds.c b/sflphone-gtk/src/contacts/addressbook/eds.c index b2a6d4c9e445c16a5158214b44a008bb03016ac0..7552640abd00ca1985a743db97fb0a9840bcd98f 100644 --- a/sflphone-gtk/src/contacts/addressbook/eds.c +++ b/sflphone-gtk/src/contacts/addressbook/eds.c @@ -30,211 +30,248 @@ #include <pango/pango.h> #include "eds.h" -typedef struct _Handler_And_Data { - int search_id; - SearchAsyncHandler handler; - gpointer user_data; - GList *hits; - int max_results_remaining; - int book_views_remaining; +typedef struct _Handler_And_Data +{ + int search_id; + SearchAsyncHandler handler; + gpointer user_data; + GList *hits; + int max_results_remaining; + int book_views_remaining; } Handler_And_Data; static GSList *books = NULL; static int pixbuf_size = 32; -static EContactField search_fields[] = { E_CONTACT_FULL_NAME, E_CONTACT_PHONE_BUSINESS, E_CONTACT_NICKNAME, 0 }; +static EContactField search_fields[] = + { E_CONTACT_FULL_NAME, E_CONTACT_PHONE_BUSINESS, E_CONTACT_NICKNAME, 0 }; static int n_search_fields = G_N_ELEMENTS (search_fields) - 1; - void -free_hit (Hit *h) +void +free_hit(Hit *h) { - g_free (h->name); - g_free (h->phone_business); - g_free (h->phone_home); - g_free (h->phone_mobile); - g_free (h); + g_free(h->name); + g_free(h->phone_business); + g_free(h->phone_home); + g_free(h->phone_mobile); + g_free(h); } /** * Split a string of tokens separated by whitespace into an array of tokens. */ - static GArray * -split_query_string (const gchar *str) +static GArray * +split_query_string(const gchar *str) { - GArray *parts = g_array_sized_new (FALSE, FALSE, sizeof (char *), 2); - PangoLogAttr *attrs; - guint str_len = strlen (str), word_start = 0, i; - - attrs = g_new0 (PangoLogAttr, str_len + 1); - /* TODO: do we need to specify a particular language or is NULL ok? */ - pango_get_log_attrs (str, -1, -1, NULL, attrs, str_len + 1); - - for (i = 0; i < str_len + 1; i++) { - char *start_word, *end_word, *word; - if (attrs[i].is_word_end) { - start_word = g_utf8_offset_to_pointer (str, word_start); - end_word = g_utf8_offset_to_pointer (str, i); - word = g_strndup (start_word, end_word - start_word); - g_array_append_val (parts, word); + GArray *parts = g_array_sized_new(FALSE, FALSE, sizeof (char *), 2); + PangoLogAttr *attrs; + guint str_len = strlen (str), word_start = 0, i; + + attrs = g_new0 (PangoLogAttr, str_len + 1); + /* TODO: do we need to specify a particular language or is NULL ok? */ + pango_get_log_attrs (str, -1, -1, NULL, attrs, str_len + 1); + + for (i = 0; i < str_len + 1; i++) + { + char *start_word, *end_word, *word; + if (attrs[i].is_word_end) + { + start_word = g_utf8_offset_to_pointer (str, word_start); + end_word = g_utf8_offset_to_pointer (str, i); + word = g_strndup (start_word, end_word - start_word); + g_array_append_val (parts, word); } - if (attrs[i].is_word_start) { - word_start = i; + if (attrs[i].is_word_start) + { + word_start = i; } } - g_free (attrs); - return parts; + g_free (attrs); + return parts; } -/** - * Create a query which looks for the specified string in a contact's full name, email addresses and - * nick name. - */ - static EBookQuery* -create_query (const char* s) + /** + * Create a query which looks for the specified string in a contact's full name, email addresses and + * nick name. + */ +static EBookQuery* +create_query(const char* s) { - EBookQuery *query; - GArray *parts = split_query_string (s); - EBookQuery ***field_queries; - EBookQuery **q; - EBookQuery **phone; - guint j; - int i; - - q = g_new0 (EBookQuery *, n_search_fields); - field_queries = g_new0 (EBookQuery **, n_search_fields); - - for (i = 0; i < n_search_fields; i++) { - field_queries[i] = g_new0 (EBookQuery *, parts->len); - for (j = 0; j < parts->len; j++) { - field_queries[i][j] = e_book_query_field_test (search_fields[i], E_BOOK_QUERY_CONTAINS, g_array_index (parts, gchar *, j)); + EBookQuery *query; + GArray *parts = split_query_string(s); + EBookQuery ***field_queries; + EBookQuery **q; + EBookQuery **phone; + guint j; + int i; + + q = g_new0 (EBookQuery *, n_search_fields); + field_queries = g_new0 (EBookQuery **, n_search_fields); + + for (i = 0; i < n_search_fields; i++) + { + field_queries[i] = g_new0 (EBookQuery *, parts->len); + for (j = 0; j < parts->len; j++) + { + field_queries[i][j] = e_book_query_field_test(search_fields[i], + E_BOOK_QUERY_CONTAINS, g_array_index (parts, gchar *, j)); } - q[i] = e_book_query_and (parts->len, field_queries[i], TRUE); + q[i] = e_book_query_and(parts->len, field_queries[i], TRUE); } - g_array_free (parts, TRUE); + g_array_free(parts, TRUE); - phone = g_new0 (EBookQuery *, 3); - phone[0] = e_book_query_field_exists (E_CONTACT_PHONE_BUSINESS); - phone[1] = e_book_query_field_exists (E_CONTACT_PHONE_HOME); - phone[2] = e_book_query_field_exists (E_CONTACT_PHONE_MOBILE); + phone = g_new0 (EBookQuery *, 3); + phone[0] = e_book_query_field_exists(E_CONTACT_PHONE_BUSINESS); + phone[1] = e_book_query_field_exists(E_CONTACT_PHONE_HOME); + phone[2] = e_book_query_field_exists(E_CONTACT_PHONE_MOBILE); - query = e_book_query_andv (e_book_query_or (n_search_fields, q, FALSE), e_book_query_or (3, phone, FALSE), NULL); + query = e_book_query_andv(e_book_query_or(n_search_fields, q, FALSE), + e_book_query_or(3, phone, FALSE), NULL); - for (i = 0; i < n_search_fields; i++) { - g_free (field_queries[i]); + for (i = 0; i < n_search_fields; i++) + { + g_free(field_queries[i]); } - g_free (field_queries); - g_free (q); - g_free (phone); + g_free(field_queries); + g_free(q); + g_free(phone); - return query; + return query; } static GdkPixbuf* -pixbuf_from_contact (EContact *contact) +pixbuf_from_contact(EContact *contact) { - GdkPixbuf *pixbuf = NULL; - EContactPhoto *photo = e_contact_get (contact, E_CONTACT_PHOTO); - if (photo) { - GdkPixbufLoader *loader; - loader = gdk_pixbuf_loader_new (); + GdkPixbuf *pixbuf = NULL; + EContactPhoto *photo = e_contact_get(contact, E_CONTACT_PHOTO); + if (photo) + { + GdkPixbufLoader *loader; + + loader = gdk_pixbuf_loader_new(); - if (photo->type == E_CONTACT_PHOTO_TYPE_INLINED) { - if (gdk_pixbuf_loader_write (loader, (guchar *) photo->data.inlined.data, photo->data.inlined.length, NULL)) - pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); + if (photo->type == E_CONTACT_PHOTO_TYPE_INLINED) + { + if (gdk_pixbuf_loader_write(loader, + (guchar *) photo->data.inlined.data, photo->data.inlined.length, + NULL)) + pixbuf = gdk_pixbuf_loader_get_pixbuf(loader); } - if (pixbuf) { - GdkPixbuf *tmp; - gint width = gdk_pixbuf_get_width (pixbuf); - gint height = gdk_pixbuf_get_height (pixbuf); - double scale = 1.0; + if (pixbuf) + { + GdkPixbuf *tmp; + gint width = gdk_pixbuf_get_width(pixbuf); + gint height = gdk_pixbuf_get_height(pixbuf); + double scale = 1.0; - if (height > width) { - scale = pixbuf_size / (double) height; - } else { - scale = pixbuf_size / (double) width; + if (height > width) + { + scale = pixbuf_size / (double) height; + } + else + { + scale = pixbuf_size / (double) width; } - if (scale < 1.0) { - tmp = gdk_pixbuf_scale_simple (pixbuf, width * scale, height * scale, GDK_INTERP_BILINEAR); - g_object_unref (pixbuf); - pixbuf = tmp; + if (scale < 1.0) + { + tmp = gdk_pixbuf_scale_simple(pixbuf, width * scale, height + * scale, GDK_INTERP_BILINEAR); + g_object_unref(pixbuf); + pixbuf = tmp; } } - e_contact_photo_free (photo); + e_contact_photo_free(photo); } - return pixbuf; + return pixbuf; } /** * Initialize address book */ - void -init (void) +void +init(void) { - GSList *list, *l; - ESourceList *source_list; - source_list = e_source_list_new_for_gconf_default ("/apps/evolution/addressbook/sources"); + GSList *list, *l; + ESourceList *source_list; + source_list = e_source_list_new_for_gconf_default( + "/apps/evolution/addressbook/sources"); - if (source_list == NULL) { - return; + if (source_list == NULL) + { + return; } - list = e_source_list_peek_groups (source_list); - - 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) { - ESource *source = m->data; - EBook *book = e_book_new (source, NULL); - if (book != NULL) { - books = g_slist_prepend (books, book); - e_book_open(book, TRUE, NULL); + list = e_source_list_peek_groups(source_list); + + 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) + { + ESource *source = m->data; + //printf("%s\n",e_source_peek_name(source)); + //printf("%s\n",e_source_get_property (source, "limit")); + //printf("%s\n",e_source_get_property (source, "timeout")); + //printf("end\n"); + EBook *book = e_book_new(source, NULL); + if (book != NULL) + { + books = g_slist_prepend(books, book); + e_book_open(book, TRUE, NULL); } } } - current_search_id = 0; + current_search_id = 0; + + g_object_unref (source_list); + get_books(); +} - g_object_unref (source_list); +GSList* +get_books(void) +{ + return books; } /** * Final callback after all books have been processed. */ - static void -view_finish (EBookView *book_view, Handler_And_Data *had) +static void +view_finish(EBookView *book_view, Handler_And_Data *had) { - GList *i; - SearchAsyncHandler had_handler = had->handler; - GList *had_hits = had->hits; - gpointer had_user_data = had->user_data; - int search_id = had->search_id; - g_free (had); + GList *i; + SearchAsyncHandler had_handler = had->handler; + GList *had_hits = had->hits; + gpointer had_user_data = had->user_data; + int search_id = had->search_id; + g_free(had); - g_return_if_fail (book_view != NULL); - g_object_unref (book_view); + g_return_if_fail (book_view != NULL); + g_object_unref(book_view); - if(search_id == current_search_id) + if (search_id == current_search_id) { // Reinitialize search id to prevent overflow - if(current_search_id > 5000) + if (current_search_id > 5000) current_search_id = 0; // Call display callback - had_handler (had_hits, had_user_data); + had_handler(had_hits, had_user_data); } - else + else { // Some hits could have been processed but will not be used for (i = had_hits; i != NULL; i = i->next) - { + { Hit *entry; entry = i->data; free_hit(entry); - } + } g_list_free(had_hits); } } @@ -243,64 +280,71 @@ view_finish (EBookView *book_view, Handler_And_Data *had) * Callback called after each ebook search completed. * Used to store book search results. */ - static void -view_contacts_added_cb (EBookView *book_view, GList *contacts, gpointer user_data) +static void +view_contacts_added_cb(EBookView *book_view, GList *contacts, + gpointer user_data) { - GdkPixbuf *photo; + GdkPixbuf *photo; - Handler_And_Data *had = (Handler_And_Data *) user_data; + Handler_And_Data *had = (Handler_And_Data *) user_data; - if(had->search_id != current_search_id) + if (had->search_id != current_search_id) { - e_book_view_stop (book_view); + e_book_view_stop(book_view); return; } - if (had->max_results_remaining <= 0) { - e_book_view_stop (book_view); - had->book_views_remaining--; - if (had->book_views_remaining == 0) { - view_finish (book_view, had); - return; + if (had->max_results_remaining <= 0) + { + e_book_view_stop(book_view); + had->book_views_remaining--; + if (had->book_views_remaining == 0) + { + view_finish(book_view, had); + return; } } - for (; contacts != NULL; contacts = g_list_next (contacts)) { - EContact *contact; - Hit *hit; - gchar *number; - - contact = E_CONTACT (contacts->data); - hit = g_new (Hit, 1); - - /* Get the photo contact */ - photo = pixbuf_from_contact (contact); - hit->photo = photo; - - /* Get business phone information */ - fetch_information_from_contact (contact, E_CONTACT_PHONE_BUSINESS, &number); - hit->phone_business = g_strdup (number); - - /* Get home phone information */ - fetch_information_from_contact (contact, E_CONTACT_PHONE_HOME, &number); - hit->phone_home = g_strdup (number); - - /* Get mobile phone information */ - fetch_information_from_contact (contact, E_CONTACT_PHONE_MOBILE, &number); - hit->phone_mobile = g_strdup (number); - - hit->name = g_strdup ((char*) e_contact_get_const (contact, E_CONTACT_NAME_OR_ORG)); - if(! hit->name) - hit->name = ""; - - had->hits = g_list_append (had->hits, hit); - had->max_results_remaining--; - if (had->max_results_remaining <= 0) { - e_book_view_stop (book_view); - had->book_views_remaining--; - if (had->book_views_remaining == 0) { - view_finish (book_view, had); + for (; contacts != NULL; contacts = g_list_next (contacts)) + { + EContact *contact; + Hit *hit; + gchar *number; + + contact = E_CONTACT (contacts->data); + hit = g_new (Hit, 1); + + /* Get the photo contact */ + photo = pixbuf_from_contact(contact); + hit->photo = photo; + + /* Get business phone information */ + fetch_information_from_contact(contact, E_CONTACT_PHONE_BUSINESS, &number); + hit->phone_business = g_strdup(number); + + /* Get home phone information */ + fetch_information_from_contact(contact, E_CONTACT_PHONE_HOME, &number); + hit->phone_home = g_strdup(number); + + /* Get mobile phone information */ + fetch_information_from_contact(contact, E_CONTACT_PHONE_MOBILE, &number); + hit->phone_mobile = g_strdup(number); + + hit->name = g_strdup((char*) e_contact_get_const(contact, + E_CONTACT_NAME_OR_ORG)); + if (!hit->name) + hit->name = ""; + + had->hits = g_list_append(had->hits, hit); + had->max_results_remaining--; + if (had->max_results_remaining <= 0) + { + e_book_view_stop(book_view); + had->book_views_remaining--; + if (had->book_views_remaining == 0) + { + view_finish(book_view, had); } - break; + break; } } } @@ -309,28 +353,27 @@ view_contacts_added_cb (EBookView *book_view, GList *contacts, gpointer user_dat * Callback called after each ebook search completed. * Used to call final callback when all books have been read. */ - static void -view_completed_cb (EBookView *book_view, EBookViewStatus status, gpointer user_data) +static void +view_completed_cb(EBookView *book_view, EBookViewStatus status, + gpointer user_data) { - Handler_And_Data *had = (Handler_And_Data *) user_data; - had->book_views_remaining--; - if (had->book_views_remaining == 0) { - view_finish (book_view, had); + Handler_And_Data *had = (Handler_And_Data *) user_data; + had->book_views_remaining--; + if (had->book_views_remaining == 0) + { + view_finish(book_view, had); } } - - void -search_async (const char *query, - int max_results, - SearchAsyncHandler handler, - gpointer user_data) +void +search_async(const char *query, int max_results, SearchAsyncHandler handler, + gpointer user_data) { - // Increment search id - current_search_id++; + // Increment search id + current_search_id++; - // If query is null - if(strlen(query) < 1) + // If query is null + if (strlen(query) < 1) { // If data displayed (from previous search), directly call callback handler(NULL, user_data); @@ -338,42 +381,50 @@ search_async (const char *query, return; } - GSList *iter; - EBookQuery* book_query = create_query (query); - Handler_And_Data *had = g_new (Handler_And_Data, 1); - - 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; - for (iter = books; iter != NULL; iter = iter->next) { - EBook *book = (EBook *) iter->data; - EBookView *book_view = NULL; - e_book_get_book_view (book, book_query, NULL, max_results, &book_view, NULL); - if (book_view != NULL) { - 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); + GSList *iter; + EBookQuery* book_query = create_query(query); + Handler_And_Data *had = g_new (Handler_And_Data, 1); + + 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; + for (iter = books; iter != NULL; iter = iter->next) + { + EBook *book = (EBook *) iter->data; + EBookView *book_view = NULL; + e_book_get_book_view(book, book_query, NULL, max_results, &book_view, + NULL); + if (book_view != NULL) + { + 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); } } - if (had->book_views_remaining == 0) { - g_free (had); + if (had->book_views_remaining == 0) + { + g_free(had); } - e_book_query_unref (book_query); + e_book_query_unref(book_query); } -void fetch_information_from_contact (EContact *contact, EContactField field, gchar **info){ +void +fetch_information_from_contact(EContact *contact, EContactField field, + gchar **info) +{ - gchar *to_fetch; + gchar *to_fetch; - to_fetch = g_strdup ((char*) e_contact_get_const (contact, field)); - if(! to_fetch) { - to_fetch = g_strdup (EMPTY_ENTRY); + to_fetch = g_strdup((char*) e_contact_get_const(contact, field)); + if (!to_fetch) + { + to_fetch = g_strdup(EMPTY_ENTRY); } - *info = g_strdup (to_fetch); + *info = g_strdup(to_fetch); } diff --git a/sflphone-gtk/src/contacts/addressbook/eds.h b/sflphone-gtk/src/contacts/addressbook/eds.h index 64d464e04f70c044111d2ba898e37993a5f5da2f..be5c3d9a421054a62bce06815ab98eb31d047a99 100644 --- a/sflphone-gtk/src/contacts/addressbook/eds.h +++ b/sflphone-gtk/src/contacts/addressbook/eds.h @@ -42,41 +42,48 @@ int current_search_id; */ typedef struct _Hit { - gchar *name; - GdkPixbuf *photo; - gchar *phone_business; - gchar *phone_home; - gchar *phone_mobile; + gchar *name; + GdkPixbuf *photo; + gchar *phone_business; + gchar *phone_home; + gchar *phone_mobile; } Hit; /** * Free a contact entry */ -void free_hit (Hit *h); +void +free_hit(Hit *h); /** * Template callback function for the asynchronous search */ -typedef void (* SearchAsyncHandler) (GList *hits, gpointer user_data); +typedef void +(* SearchAsyncHandler)(GList *hits, gpointer user_data); /** * Initialize the address book. * Connection to evolution data server */ -void init (void); +void +init(void); /** * Asynchronous search function */ -void search_async (const char *query, - int max_results, - SearchAsyncHandler handler, - gpointer user_data); +void +search_async(const char *query, int max_results, SearchAsyncHandler handler, + gpointer user_data); /** * Retrieve the specified information from the contact */ -void fetch_information_from_contact (EContact *contact, EContactField field, gchar **info); +void +fetch_information_from_contact(EContact *contact, EContactField field, + gchar **info); + +GSList* +get_books(void); G_END_DECLS