From c6b9609a313d85900a3bb2574f6150349b1dabf2 Mon Sep 17 00:00:00 2001
From: Emmanuel Milou <manu@manu-crunchbang.(none)>
Date: Thu, 5 Mar 2009 23:38:27 -0500
Subject: [PATCH] Enable to display multiple information for each contact

---
 sflphone-gtk/src/calltree.c        | 87 +++++++++++++++++-------------
 sflphone-gtk/src/contactlist/eds.c | 37 +++++++++----
 sflphone-gtk/src/contactlist/eds.h |  7 +++
 3 files changed, 83 insertions(+), 48 deletions(-)

diff --git a/sflphone-gtk/src/calltree.c b/sflphone-gtk/src/calltree.c
index f82ae49a70..354c1e08c5 100644
--- a/sflphone-gtk/src/calltree.c
+++ b/sflphone-gtk/src/calltree.c
@@ -93,28 +93,30 @@ button_pressed(GtkWidget* widget, GdkEventButton *event, gpointer user_data UNUS
   static void
 call_button( GtkWidget *widget UNUSED, gpointer   data UNUSED)
 {
-  call_t * selectedCall = call_get_selected(active_calltree);
-  call_t* newCall =  g_new0 (call_t, 1);
-  printf("Call button pressed\n");
+  call_t * selectedCall;
+  call_t* new_call;
+  gchar *to, *from;
+
+  selectedCall = call_get_selected(active_calltree);
+  
   if(call_list_get_size(current_calls)>0)
     sflphone_pick_up();
+  
   else if(call_list_get_size(active_calltree) > 0){
     if( selectedCall)
     {
       printf("Calling a called num\n");
 
-      newCall->to = g_strdup(call_get_number(selectedCall));
-      newCall->from = g_strconcat("\"\" <", call_get_number(selectedCall), ">",NULL);
-      newCall->state = CALL_STATE_DIALING;
-      newCall->callID = g_new0(gchar, 30);
-      g_sprintf(newCall->callID, "%d", rand());
-      newCall->_start = 0;
-      newCall->_stop = 0;
-
-      printf("call : from : %s to %s\n", newCall->from, newCall->to);
-      call_list_add(current_calls, newCall);
-      update_call_tree_add(current_calls, newCall);
-      sflphone_place_call(newCall);
+      to = g_strdup(call_get_number(selectedCall));
+      from = g_strconcat("\"\" <", call_get_number(selectedCall), ">",NULL);
+
+      create_new_call (to, from, CALL_STATE_DIALING, "", &new_call);
+
+      printf("call : from : %s to %s\n", new_call->from, new_call->to);
+
+      call_list_add(current_calls, new_call);
+      update_call_tree_add(current_calls, new_call);
+      sflphone_place_call(new_call);
       switch_tab(current_calls);
     }
     else
@@ -256,14 +258,12 @@ show_contacts_tab(GtkToggleToolButton *toggle_tool_button UNUSED,
     entry = i->data;
     if (entry)
     {
-      call_t * call;
-      call = g_new0 (call_t, 1);
-      call->from = g_strconcat("\"" , entry->name, "\"<", entry->phone_business, ">", NULL);
-      call->state = CALL_STATE_DIALING;
-      //call->history_state = MISSED;
-
-      call_list_add (contacts, call);
-      update_call_tree_add(contacts,call);
+        /* Create entry for business phone information */
+        create_new_entry_in_contactlist (entry->name, entry->phone_business);
+        /* Create entry for home phone information */
+        create_new_entry_in_contactlist (entry->name, entry->phone_home);
+        /* Create entry for mobile phone information */
+        create_new_entry_in_contactlist (entry->name, entry->phone_mobile);
     }
     free_hit(entry);
   }
@@ -279,6 +279,21 @@ show_contacts_tab(GtkToggleToolButton *toggle_tool_button UNUSED,
   toolbar_update_buttons();
 }
 
+void create_new_entry_in_contactlist (gchar *contact_name, gchar *contact_phone){
+   
+    gchar *from;
+    call_t *new_call;
+
+    /* Check if the information is valid */
+    if (strcmp (contact_phone, EMPTY_ENTRY) != 0){
+        from = g_strconcat("\"" , contact_name, "\"<", contact_phone, ">", NULL);
+        create_new_call (from, from, CALL_STATE_DIALING, "", &new_call);
+        call_list_add (contacts, new_call);
+        update_call_tree_add(contacts, new_call);
+    }
+
+}
+
   static void
 call_mailbox( GtkWidget* widget UNUSED, gpointer data UNUSED)
 {
@@ -449,7 +464,8 @@ void  row_activated(GtkTreeView       *tree_view UNUSED,
 {
   g_print("double click action\n");
   call_t* selectedCall;
-  call_t* newCall;
+  call_t* new_call;
+  gchar *to, *from, *account_id;
   selectedCall = call_get_selected( active_calltree );
 
   if (selectedCall)
@@ -481,20 +497,15 @@ void  row_activated(GtkTreeView       *tree_view UNUSED,
     // if history
     else
     {
-      newCall = g_new0( call_t, 1 );
-      newCall->to = g_strdup(call_get_number(selectedCall));
-      newCall->from = g_strconcat("\"\" <", call_get_number(selectedCall), ">",NULL);
-      newCall->state = CALL_STATE_DIALING;
-      newCall->callID = g_new0(gchar, 30);
-      g_sprintf(newCall->callID, "%d", rand());
-      newCall->_start = 0;
-      newCall->_stop = 0;
-      printf("call : account : %s \n", selectedCall->accountID);
-      newCall->accountID = selectedCall->accountID;
-      printf("call : from : %s to %s\n", newCall->from, newCall->to);
-      call_list_add(current_calls, newCall);
-      update_call_tree_add(current_calls, newCall);
-      sflphone_place_call(newCall);
+      to = g_strdup(call_get_number(selectedCall));
+      from = g_strconcat("\"\" <", call_get_number(selectedCall), ">",NULL);
+      account_id = g_strdup (selectedCall->accountID);
+
+      create_new_call (to, from, CALL_STATE_DIALING, account_id, &new_call);
+
+      call_list_add(current_calls, new_call);
+      update_call_tree_add(current_calls, new_call);
+      sflphone_place_call(new_call);
       switch_tab(current_calls);
     }
   }
diff --git a/sflphone-gtk/src/contactlist/eds.c b/sflphone-gtk/src/contactlist/eds.c
index 04c56cede1..19404ce585 100644
--- a/sflphone-gtk/src/contactlist/eds.c
+++ b/sflphone-gtk/src/contactlist/eds.c
@@ -26,7 +26,6 @@
 
 #include <glib.h>
 #include <glib/gstring.h>
-#include <libebook/e-book.h>
 #include <pango/pango.h>
 #include "eds.h"
 
@@ -40,6 +39,8 @@ 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);
 }
 
@@ -164,19 +165,23 @@ search_sync (const char *query,
     for (; contacts != NULL; contacts = g_list_next (contacts)) {
       EContact *contact;
       Hit *hit;
+      gchar *number;
 
       contact = E_CONTACT (contacts->data);
-      hit = g_new (Hit, 1);
+      hit = g_new0 (Hit, 1);
         
-      hit->phone_business = g_strdup ((char*) e_contact_get_const (contact, E_CONTACT_PHONE_BUSINESS));
-      if(! hit->phone_business)
-      {
-        // Temporary fix for empty phone numbers
-        sprintf(ext, "%d", rand()%100 + 100);
-        hit->phone_business = g_strconcat("rand",ext,NULL);
-        //hit->phone = "";
-      }
+      /* 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 = "";
@@ -192,3 +197,15 @@ search_sync (const char *query,
 
   return hits;
 }
+
+void fetch_information_from_contact (EContact *contact, EContactField field, gchar **info){
+
+    gchar *to_fetch;
+
+    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);
+}
diff --git a/sflphone-gtk/src/contactlist/eds.h b/sflphone-gtk/src/contactlist/eds.h
index f3e41aa892..55cbbe8ae9 100644
--- a/sflphone-gtk/src/contactlist/eds.h
+++ b/sflphone-gtk/src/contactlist/eds.h
@@ -28,6 +28,9 @@
 #define __EDS_H__
 
 #include <glib/gtypes.h>
+#include <libebook/e-book.h>
+
+#define EMPTY_ENTRY     "empty"
 
 G_BEGIN_DECLS
 
@@ -35,6 +38,8 @@ typedef struct _Hit
 {
   gchar *name;
   gchar *phone_business;
+  gchar *phone_home;
+  gchar *phone_mobile;
 } Hit;
 
 void free_hit (Hit *h);
@@ -43,6 +48,8 @@ void init (void);
 
 GList * search_sync (const char *query, int max_results);
 
+void fetch_information_from_contact (EContact *contact, EContactField field, gchar **info);
+
 G_END_DECLS
 
 #endif /* __EDS_H__ */
-- 
GitLab