From 91aa221f5c85328288e402e48e2f853f20846405 Mon Sep 17 00:00:00 2001
From: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
Date: Fri, 26 Nov 2010 11:28:24 -0500
Subject: [PATCH] [#4637] Fix opening default addressbook at sflphone init

---
 .../src/contacts/addressbook.c                |   2 +-
 .../src/contacts/addressbook/eds.c            | 101 +++++++-----------
 .../src/contacts/addressbook/eds.h            |   4 +-
 .../src/contacts/searchbar.c                  |  21 +++-
 4 files changed, 62 insertions(+), 66 deletions(-)

diff --git a/sflphone-client-gnome/src/contacts/addressbook.c b/sflphone-client-gnome/src/contacts/addressbook.c
index 37012d54b5..bf545a9c30 100644
--- a/sflphone-client-gnome/src/contacts/addressbook.c
+++ b/sflphone-client-gnome/src/contacts/addressbook.c
@@ -133,7 +133,7 @@ addressbook_get_books_data()
     fill_books_data();
     addressbook_config_books();
 
-    return books_data;
+    return get_books_data();
 }
 
 /**
diff --git a/sflphone-client-gnome/src/contacts/addressbook/eds.c b/sflphone-client-gnome/src/contacts/addressbook/eds.c
index 6e2dc08ca2..054622bd1b 100644
--- a/sflphone-client-gnome/src/contacts/addressbook/eds.c
+++ b/sflphone-client-gnome/src/contacts/addressbook/eds.c
@@ -64,6 +64,8 @@ static int pixbuf_size = 32;
  */
 int remaining_books_to_open;
 
+GSList *books_data = NULL;
+
 /**
  * Current selected addressbook's uri and uid, initialized with default
  */
@@ -451,65 +453,27 @@ eds_async_open_callback (EBook *book, EBookStatus status, gpointer closure)
 void
 init ()
 {
-    GError *err = NULL;
-    gchar *absuri, *reluri;
-
-    EBook *default_addressbook = e_book_new_default_addressbook (&err);
-
-    if (err)
-        ERROR ("Addressbook: Error: Could not create new book from source: %s", err->message);
-
-    ESource *default_source = e_book_get_source (default_addressbook);
-
-    // DEBUG ("Addressbook: Default source relative uri %s", e_source_peek_relative_uri (default_source));
-    // DEBUG ("Addressbook: Default source absolute uri %s", e_source_peek_absolute_uri (default_source));
-
-    if (current_uri) {
-        g_free (current_uri);
-        current_uri = NULL;
-    }
+    GSList *book_list_iterator;
+    book_data_t *book_data;
 
-    if (current_uid) {
-        g_free (current_uid);
-        current_uid = NULL;
-    }
+    DEBUG ("Addressbook: Init default addressbook");
 
-    if (strcmp (current_name, "Default") != 0) {
-        g_free (current_name);
-        current_name = NULL;
+    if (books_data == NULL) {
+        DEBUG ("Addressbook: No books data (%s:%d)", __FILE__, __LINE__);
+        return;
     }
 
-    // TODO: This should work but return a NULL pointer ...
-    // if (! (group = e_source_peek_group (default_source)));
-
-    // ERROR ("Addressbook: Error: No group found for default addressbook");
-
-    absuri = g_strdup (e_source_peek_absolute_uri (default_source));
-    // absuri = g_strdup (e_source_group_peek_base_uri (group));
-    reluri = g_strdup (e_source_peek_relative_uri (default_source));
-
-    if (!absuri) {
-        absuri = g_malloc (1);
-        *absuri = 0;
-    }
+    // Iterate throw the list
+    for (book_list_iterator = books_data; book_list_iterator != NULL;
+            book_list_iterator = book_list_iterator->next) {
+        book_data = (book_data_t *) book_list_iterator->data;
 
-    if (!reluri) {
-        reluri = g_malloc (1);
-        *reluri = 0;
+        if (book_data->isdefault) {
+            current_uri = book_data->uri;
+            current_uid = book_data->uid;
+            current_name = book_data->name;
+        }
     }
-
-    // Do not overwrite current_name for default
-    // current_name = g_strdup (e_source_peek_name (default_source));
-
-    current_uid = g_strdup (e_source_peek_uid (default_source));
-
-    if (strcmp (absuri+strlen (absuri)-1, "/") == 0)
-        current_uri = g_strjoin ("", absuri, reluri, NULL);
-    else
-        current_uri = g_strjoin ("/", absuri, reluri, NULL);
-
-    g_free (absuri);
-    g_free (reluri);
 }
 
 
@@ -522,7 +486,7 @@ fill_books_data ()
     GSList *list, *l;
     ESourceList *source_list = NULL;
     remaining_books_to_open = 0;
-    books_data = NULL;
+    gboolean default_found;
 
     source_list = e_source_list_new_for_gconf_default ("/apps/evolution/addressbook/sources");
 
@@ -538,14 +502,14 @@ fill_books_data ()
         return;
     }
 
+    // in case default property is not set for any addressbook
+    default_found = FALSE;
 
     for (l = list; l != NULL; l = l->next) {
 
         ESourceGroup *group = l->data;
         GSList *sources = NULL, *m;
-        gchar *absuri;
-
-        absuri = g_strdup (e_source_group_peek_base_uri (group));
+        gchar *absuri = g_strdup (e_source_group_peek_base_uri (group));
 
         sources = e_source_group_peek_sources (group);
 
@@ -561,12 +525,13 @@ fill_books_data ()
             const gchar *property_name = "default";
             const gchar *prop = e_source_get_property (source, property_name);
 
-            if (prop)
-                if (strcmp (prop, "true") == 0)
+            if (prop) {
+                if (strcmp (prop, "true") == 0) {
                     book_data->isdefault = TRUE;
-                else
+                    default_found = TRUE;
+                } else
                     book_data->isdefault = FALSE;
-            else
+            } else
                 book_data->isdefault = FALSE;
 
             if (strcmp (absuri+strlen (absuri)-1, "/") == 0)
@@ -581,6 +546,12 @@ fill_books_data ()
         g_free (absuri);
     }
 
+    if (!default_found) {
+        DEBUG ("Addressbook: No default addressbook found, using first addressbook as default");
+        book_data_t *book_data = g_slist_nth_data (books_data, 0);
+        book_data->isdefault = TRUE;
+    }
+
     g_object_unref (source_list);
 }
 
@@ -662,7 +633,7 @@ set_current_addressbook (const gchar *name)
 
     if (!books_data) {
         DEBUG ("Addressbook: No books data (%s:%d)", __FILE__, __LINE__);
-        return NULL;
+        return;
     }
 
     // Iterate throw the list
@@ -697,3 +668,9 @@ get_current_addressbook_test (void)
 {
     return current_test;
 }
+
+GSList *
+get_books_data()
+{
+    return books_data;
+}
diff --git a/sflphone-client-gnome/src/contacts/addressbook/eds.h b/sflphone-client-gnome/src/contacts/addressbook/eds.h
index 51b8421c9b..361fc88243 100644
--- a/sflphone-client-gnome/src/contacts/addressbook/eds.h
+++ b/sflphone-client-gnome/src/contacts/addressbook/eds.h
@@ -76,7 +76,6 @@ typedef struct {
     gboolean isdefault;
 } book_data_t;
 
-GSList *books_data;
 
 /**
  * Free a contact entry
@@ -164,6 +163,9 @@ set_current_addressbook_test (EBookQueryTest test);
 EBookQueryTest
 get_current_addressbook_test (void);
 
+GSList *
+get_books_data();
+
 
 G_END_DECLS
 
diff --git a/sflphone-client-gnome/src/contacts/searchbar.c b/sflphone-client-gnome/src/contacts/searchbar.c
index 09d3085e4a..e0f6960f13 100644
--- a/sflphone-client-gnome/src/contacts/searchbar.c
+++ b/sflphone-client-gnome/src/contacts/searchbar.c
@@ -77,6 +77,8 @@ static void cbox_changed_cb (GtkWidget *widget, gpointer user_data UNUSED)
 {
     gchar *name;
 
+    DEBUG ("Searchbar: CBOX changed callback");
+
     name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (widget));
 
     set_current_addressbook (name);
@@ -93,6 +95,8 @@ void update_searchbar_addressbook_list()
     book_data_t *book_data;
     GSList *books_data = addressbook_get_books_data();
 
+    DEBUG ("Searchbar: Update addressbook list");
+
     // we must disconnect signal from teh cbox while updating its content
     gtk_signal_disconnect (cbox, cboxSignalId);
 
@@ -365,6 +369,9 @@ GtkWidget* contacts_searchbar_new ()
     int count, cbox_height, cbox_width;
     GtkTreeIter iter, activeIter;
     GtkCellRenderer *cell;
+    // gchar *current_addressbook = NULL;
+
+    DEBUG ("Addressbook: Create addressbook search bar");
 
     ret = gtk_hbox_new (FALSE, 0);
 
@@ -380,13 +387,14 @@ GtkWidget* contacts_searchbar_new ()
     count = 0;
     gboolean activeIsSet = FALSE;
 
-    for (book_list_iterator = books_data; book_list_iterator != NULL; book_list_iterator
-            = book_list_iterator->next) {
+    for (book_list_iterator = books_data; book_list_iterator != NULL;
+            book_list_iterator = book_list_iterator->next) {
         book_data = (book_data_t *) book_list_iterator->data;
 
         if (book_data->active) {
 
             gtk_list_store_append (liststore, &iter);
+
             gtk_list_store_set (liststore, &iter, 0, book_data->name, -1);
 
             if (book_data->isdefault) {
@@ -398,6 +406,8 @@ GtkWidget* contacts_searchbar_new ()
         }
     }
 
+    // current_addressbook = get_current_addressbook();
+
     cbox = gtk_combo_box_new_with_model ( (GtkTreeModel *) liststore);
 
     if (activeIsSet)
@@ -413,11 +423,14 @@ GtkWidget* contacts_searchbar_new ()
     gtk_widget_set_size_request (GTK_WIDGET (cbox), cbox_width, 26);
 
     cboxSignalId = gtk_signal_connect (GTK_OBJECT (cbox), "changed", G_CALLBACK (cbox_changed_cb), NULL);
+    // cbox_changed_cb (GTK_WIDGET (cbox), NULL);
 
     cell = gtk_cell_renderer_text_new();
     gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cbox), cell, TRUE);
     gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (cbox), cell, "text", 0, NULL);
 
+
+
 #if GTK_CHECK_VERSION(2,16,0)
 
     // GdkPixbuf *pixbuf;
@@ -464,6 +477,10 @@ GtkWidget* contacts_searchbar_new ()
 
     g_free (tooltip_text);
 
+
+    // current_addressbook = gtk_combo_box_get_active_text (GTK_COMBO_BOX (cbox));
+    // set_current_addressbook (current_addressbook);
+
     return ret;
 }
 
-- 
GitLab