From 60a7e80b52a1dc94ec176dc94bfa8264b0d4f9bb Mon Sep 17 00:00:00 2001 From: Alexandre Savard <alexandre.savard@savoirfairelinux.net> Date: Thu, 27 Aug 2009 09:17:59 -0400 Subject: [PATCH] [#2006] Add multilayered capabilities to calltree (GtkTreeStore) --- sflphone-client-gnome/src/actions.c | 7 +- sflphone-client-gnome/src/conference_obj.c | 2 +- sflphone-client-gnome/src/conference_obj.h | 2 +- sflphone-client-gnome/src/contacts/calllist.c | 4 +- sflphone-client-gnome/src/contacts/calllist.h | 2 +- sflphone-client-gnome/src/contacts/calltree.c | 75 +++++++++++-------- sflphone-client-gnome/src/contacts/calltree.h | 2 +- .../src/dbus/callmanager-introspec.xml | 7 +- sflphone-client-gnome/src/dbus/dbus.c | 28 +++++-- sflphone-client-gnome/src/menus.c | 4 +- sflphone-client-gnome/src/toolbar.c | 4 +- .../src/dbus/callmanager-introspec.xml | 7 +- sflphone-common/src/dbus/callmanager.cpp | 6 ++ sflphone-common/src/dbus/callmanager.h | 1 + sflphone-common/src/managerimpl.cpp | 32 +++++++- sflphone-common/src/managerimpl.h | 7 ++ 16 files changed, 135 insertions(+), 55 deletions(-) diff --git a/sflphone-client-gnome/src/actions.c b/sflphone-client-gnome/src/actions.c index e7d5408035..4ad8189e35 100644 --- a/sflphone-client-gnome/src/actions.c +++ b/sflphone-client-gnome/src/actions.c @@ -476,7 +476,7 @@ sflphone_incoming_call (callable_obj_t * c) c->_history_state = MISSED; calllist_add ( current_calls, c ); calllist_add( history, c ); - calltree_add_call( current_calls , c ); + calltree_add_call( current_calls, c, NULL); update_menus(); calltree_display (current_calls); } @@ -578,7 +578,7 @@ sflphone_new_call() create_new_call (CALL, CALL_STATE_DIALING, "", "", peer_name, peer_number, &c); calllist_add (current_calls,c); - calltree_add_call (current_calls,c); + calltree_add_call (current_calls, c, NULL); update_menus(); return c; @@ -967,7 +967,7 @@ void sflphone_fill_call_list (void) DEBUG ("Add call retrieved from server side: %s\n", c->_callID); calllist_add (current_calls, c); // Update the GUI - calltree_add_call (current_calls, c); + calltree_add_call (current_calls, c, NULL); } } } @@ -989,6 +989,7 @@ void sflphone_fill_conference_list(void) { c = g_new0(conference_obj_t, 1); conf_id = (gchar*)(*conferences); + conference_details = dbus_get_conference_details(conf_id); create_new_call_from_details (conf_id, conference_details, &c); c->_confID = g_strdup(conf_id); diff --git a/sflphone-client-gnome/src/conference_obj.c b/sflphone-client-gnome/src/conference_obj.c index 5da1ea062e..52e31bff50 100644 --- a/sflphone-client-gnome/src/conference_obj.c +++ b/sflphone-client-gnome/src/conference_obj.c @@ -34,7 +34,7 @@ gint is_confID_confstruct ( gconstpointer a, gconstpointer b) } } -void create_new_conference (conference_state_t state, gchar* confID, conference_obj_t ** new_conf) +void create_new_conference (conference_state_t state, const gchar* confID, conference_obj_t ** new_conf) { conference_obj_t *obj; diff --git a/sflphone-client-gnome/src/conference_obj.h b/sflphone-client-gnome/src/conference_obj.h index f63c0b7633..1671a7d5f1 100644 --- a/sflphone-client-gnome/src/conference_obj.h +++ b/sflphone-client-gnome/src/conference_obj.h @@ -48,7 +48,7 @@ typedef struct { } conference_obj_t; -void create_new_conference (conference_state_t, gchar*, conference_obj_t **); +void create_new_conference (conference_state_t, const gchar*, conference_obj_t **); void create_new_conference_from_details (const gchar *, GHashTable *, conference_obj_t *); diff --git a/sflphone-client-gnome/src/contacts/calllist.c b/sflphone-client-gnome/src/contacts/calllist.c index 3573e0194c..b44c9dfd5d 100644 --- a/sflphone-client-gnome/src/contacts/calllist.c +++ b/sflphone-client-gnome/src/contacts/calllist.c @@ -54,7 +54,7 @@ void calllist_add_contact (gchar *contact_name, gchar *contact_phone, contact_ty } calllist_add (contacts, new_call); - calltree_add_call(contacts, new_call); + calltree_add_call(contacts, new_call, NULL); } } @@ -84,7 +84,7 @@ void calllist_add_history_entry (callable_obj_t *obj) if (state == 1) { g_queue_push_tail (history->callQueue, (gpointer *) obj); - calltree_add_call (history, obj); + calltree_add_call (history, obj, NULL); } } diff --git a/sflphone-client-gnome/src/contacts/calllist.h b/sflphone-client-gnome/src/contacts/calllist.h index 29e83c9928..ac914023c7 100644 --- a/sflphone-client-gnome/src/contacts/calllist.h +++ b/sflphone-client-gnome/src/contacts/calllist.h @@ -28,7 +28,7 @@ */ typedef struct { - GtkListStore* store; + GtkTreeStore* store; GtkWidget* view; GtkWidget* tree; GtkWidget* searchbar; diff --git a/sflphone-client-gnome/src/contacts/calltree.c b/sflphone-client-gnome/src/contacts/calltree.c index f9ac4d05a1..c9b4befcb0 100644 --- a/sflphone-client-gnome/src/contacts/calltree.c +++ b/sflphone-client-gnome/src/contacts/calltree.c @@ -66,16 +66,20 @@ selected(GtkTreeSelection *sel, void* data UNUSED ) DEBUG("Selection Callback"); - GtkTreeIter iter; + GtkTreeIter iter; GValue val; GtkTreeModel *model = (GtkTreeModel*)active_calltree->store; GtkTreePath* path; char* string_path; + char* type; + GValue typeval; + if (! gtk_tree_selection_get_selected (sel, &model, &iter)) return; + val.g_type = 0; gtk_tree_model_get_value (model, &iter, 2, &val); @@ -153,7 +157,7 @@ void row_activated(GtkTreeView *tree_view UNUSED, create_new_call (CALL, CALL_STATE_DIALING, "", account_id, selectedCall->_peer_name, selectedCall->_peer_number, &new_call); calllist_add(current_calls, new_call); - calltree_add_call(current_calls, new_call); + calltree_add_call(current_calls, new_call, NULL); sflphone_place_call(new_call); calltree_display(current_calls); } @@ -189,7 +193,7 @@ button_pressed(GtkWidget* widget, GdkEventButton *event, gpointer user_data UNUS void calltree_reset (calltab_t* tab) { - gtk_list_store_clear (tab->store); + gtk_tree_store_clear (tab->store); } void @@ -225,10 +229,10 @@ calltree_create (calltab_t* tab, gboolean searchbar_type) gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); - tab->store = gtk_list_store_new (3, + tab->store = gtk_tree_store_new (3, GDK_TYPE_PIXBUF,// Icon G_TYPE_STRING, // Description - G_TYPE_POINTER // Pointer to the Object + G_TYPE_POINTER // Pointer to the Object ); tab->view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(tab->store)); @@ -315,7 +319,7 @@ calltree_remove_call (calltab_t* tab, callable_obj_t * c) GtkTreeIter iter; GValue val; callable_obj_t * iterCall; - GtkListStore* store = tab->store; + GtkTreeStore* store = tab->store; int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL); int i; @@ -331,7 +335,7 @@ calltree_remove_call (calltab_t* tab, callable_obj_t * c) if(iterCall == c) { - gtk_list_store_remove(store, &iter); + gtk_tree_store_remove(store, &iter); } } } @@ -348,7 +352,7 @@ calltree_update_call (calltab_t* tab, callable_obj_t * c) GtkTreeIter iter; GValue val; callable_obj_t * iterCall; - GtkListStore* store = tab->store; + GtkTreeStore* store = tab->store; int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL); int i; @@ -450,7 +454,7 @@ calltree_update_call (calltab_t* tab, callable_obj_t * c) pixbuf = gdk_pixbuf_scale_simple(pixbuf, 32, 32, GDK_INTERP_BILINEAR); } } - gtk_list_store_set(store, &iter, + gtk_tree_store_set(store, &iter, 0, pixbuf, // Icon 1, description, // Description -1); @@ -480,7 +484,7 @@ void calltree_add_history_entry (callable_obj_t * c) c->_peer_number, c->_peer_name); - gtk_list_store_prepend (history->store, &iter); + gtk_tree_store_prepend (history->store, &iter, NULL); switch(c->_history_state) { @@ -510,7 +514,7 @@ void calltree_add_history_entry (callable_obj_t * c) pixbuf = gdk_pixbuf_scale_simple(pixbuf, 32, 32, GDK_INTERP_BILINEAR); } } - gtk_list_store_set(history->store, &iter, + gtk_tree_store_set(history->store, &iter, 0, pixbuf, // Icon 1, description, // Description 2, c, // Pointer @@ -525,7 +529,7 @@ void calltree_add_history_entry (callable_obj_t * c) } -void calltree_add_call (calltab_t* tab, callable_obj_t * c) +void calltree_add_call (calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent) { if (tab == history) @@ -545,7 +549,7 @@ void calltree_add_call (calltab_t* tab, callable_obj_t * c) c->_peer_number, c->_peer_name); - gtk_list_store_prepend (tab->store, &iter); + gtk_tree_store_prepend (tab->store, &iter, parent); if( tab == current_calls ) @@ -596,7 +600,7 @@ void calltree_add_call (calltab_t* tab, callable_obj_t * c) pixbuf = gdk_pixbuf_scale_simple(pixbuf, 32, 32, GDK_INTERP_BILINEAR); } } - gtk_list_store_set(tab->store, &iter, + gtk_tree_store_set(tab->store, &iter, 0, pixbuf, // Icon 1, description, // Description 2, c, // Pointer @@ -634,12 +638,18 @@ void calltree_add_conference (calltab_t* tab, const conference_obj_t* conf) GdkPixbuf *pixbuf=NULL; GtkTreeIter iter; + gchar** participant = (gchar**)dbus_get_participant_list(conf->_confID); + gchar** pl; + gchar* call_id; + + callable_obj_t * call; + // New call in the list gchar * description; description = g_markup_printf_escaped("<b>%s</b>", conf->_confID); - gtk_list_store_prepend (tab->store, &iter); + gtk_tree_store_prepend (tab->store, &iter, NULL); if( tab == current_calls ) { @@ -650,7 +660,7 @@ void calltree_add_conference (calltab_t* tab, const conference_obj_t* conf) WARN ("Conferences cannot be added in this widget - This is a bug in the application."); } - /* + DEBUG("PIXWITH: %i\n", gdk_pixbuf_get_width(pixbuf)); //Resize it if(pixbuf) { @@ -659,8 +669,8 @@ void calltree_add_conference (calltab_t* tab, const conference_obj_t* conf) pixbuf = gdk_pixbuf_scale_simple(pixbuf, 32, 32, GDK_INTERP_BILINEAR); } } - */ - gtk_list_store_set(tab->store, &iter, + + gtk_tree_store_set(tab->store, &iter, 0, pixbuf, // Icon 1, description, // Description 2, conf, // Pointer @@ -670,23 +680,24 @@ void calltree_add_conference (calltab_t* tab, const conference_obj_t* conf) if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf)); - /* - // history_reinit (tab); - - // sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tab->view)); - // gtk_tree_selection_select_iter(GTK_TREE_SELECTION(sel), &iter); - // history_reinit (tab); + if(participant) + { + for (pl = participant; *participant; participant++) + { + + call_id = (gchar*)(*participant); + call = calllist_get (tab, call_id); + // create_new_call_from_details (conf_id, conference_details, &c); + + calltree_remove_call(tab, call); + calltree_add_call (tab, call, &iter); + } + } - */ gtk_tree_view_set_model(GTK_TREE_VIEW(tab->view), GTK_TREE_MODEL(tab->store)); - // gtk_tree_view_set_model (GTK_TREE_VIEW (tab->view), GTK_TREE_MODEL (history_filter)); - - /* - gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(tab->view)), &iter); - */ toolbar_update_buttons(); @@ -709,7 +720,7 @@ void calltree_remove_conference (calltab_t* tab, const conference_obj_t* conf) GtkTreeIter iter; GValue val; conference_obj_t * iterCall; - GtkListStore* store = tab->store; + GtkTreeStore* store = tab->store; int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL); int i; @@ -725,7 +736,7 @@ void calltree_remove_conference (calltab_t* tab, const conference_obj_t* conf) if(iterCall == conf) { - gtk_list_store_remove(store, &iter); + gtk_tree_store_remove(store, &iter); } } } diff --git a/sflphone-client-gnome/src/contacts/calltree.h b/sflphone-client-gnome/src/contacts/calltree.h index 657e3c9bce..3e3d1aed0d 100644 --- a/sflphone-client-gnome/src/contacts/calltree.h +++ b/sflphone-client-gnome/src/contacts/calltree.h @@ -40,7 +40,7 @@ calltree_create(calltab_t* tab, gboolean searchbar_type); * @param c The call to add */ void -calltree_add_call (calltab_t* ct, callable_obj_t * c); +calltree_add_call (calltab_t* ct, callable_obj_t * c, GtkTreeIter *parent); /* * Update the call tree if the call state changes diff --git a/sflphone-client-gnome/src/dbus/callmanager-introspec.xml b/sflphone-client-gnome/src/dbus/callmanager-introspec.xml index fd26631730..630f2252d1 100644 --- a/sflphone-client-gnome/src/dbus/callmanager-introspec.xml +++ b/sflphone-client-gnome/src/dbus/callmanager-introspec.xml @@ -123,7 +123,12 @@ <signal name="conferenceChanged"> </signal> - <signal name="conferenceAdded"> + <method name="getParticipantList"> + <arg type="s" name="confID" direction="in"/> + <arg type="as" name="list" direction="out"/> + </method> + + <signal name="conferenceCreated"> <arg type="s" name="confID" direction="out"/> </signal> diff --git a/sflphone-client-gnome/src/dbus/dbus.c b/sflphone-client-gnome/src/dbus/dbus.c index 7a6fe42395..db62bc33f0 100644 --- a/sflphone-client-gnome/src/dbus/dbus.c +++ b/sflphone-client-gnome/src/dbus/dbus.c @@ -194,7 +194,7 @@ call_state_cb (DBusGProxy *proxy UNUSED, calllist_add (current_calls, new_call); calllist_add (history, new_call); - calltree_add_call (current_calls, new_call); + calltree_add_call (current_calls, new_call, NULL); update_menus (); calltree_display (current_calls); @@ -213,7 +213,7 @@ conference_changed_cb (DBusGProxy *proxy UNUSED, static void -conference_added_cb (DBusGProxy *proxy UNUSED, +conference_created_cb (DBusGProxy *proxy UNUSED, const gchar* confID, void * foo UNUSED ) { @@ -399,17 +399,17 @@ dbus_connect () dbus_g_proxy_connect_signal (callManagerProxy, "transferFailed", G_CALLBACK(transfer_failed_cb), NULL, NULL); + dbus_g_object_register_marshaller(g_cclosure_user_marshal_VOID__STRING, + G_TYPE_NONE, G_TYPE_STRING, G_TYPE_INVALID); dbus_g_proxy_add_signal (callManagerProxy, "conferenceChanged", G_TYPE_INVALID); dbus_g_proxy_connect_signal (callManagerProxy, "conferenceChanged", G_CALLBACK(conference_changed_cb), NULL, NULL); - dbus_g_object_register_marshaller(g_cclosure_user_marshal_VOID__STRING, - G_TYPE_NONE, G_TYPE_STRING, G_TYPE_INVALID); dbus_g_proxy_add_signal (callManagerProxy, - "conferenceAdded", G_TYPE_STRING, G_TYPE_INVALID); + "conferenceCreated", G_TYPE_STRING, G_TYPE_INVALID); dbus_g_proxy_connect_signal (callManagerProxy, - "conferenceAdded", G_CALLBACK(conference_added_cb), NULL, NULL); + "conferenceCreated", G_CALLBACK(conference_created_cb), NULL, NULL); dbus_g_proxy_add_signal (callManagerProxy, "conferenceRemoved", G_TYPE_STRING, G_TYPE_INVALID); @@ -1850,6 +1850,22 @@ gchar** dbus_get_conference_list (void) return list; } + +gchar** dbus_get_participant_list (const char * confID) +{ + GError *error = NULL; + gchar **list = NULL; + + org_sflphone_SFLphone_CallManager_get_participant_list (callManagerProxy, confID, &list, &error); + if (error){ + ERROR ("Error calling org_sflphone_SFLphone_CallManager_get_participant_list"); + g_error_free (error); + } + + return list; +} + + GHashTable* dbus_get_conference_details (const gchar *confID) { GError *error = NULL; diff --git a/sflphone-client-gnome/src/menus.c b/sflphone-client-gnome/src/menus.c index 76e9552c7c..ba9ec4b24f 100644 --- a/sflphone-client-gnome/src/menus.c +++ b/sflphone-client-gnome/src/menus.c @@ -278,7 +278,7 @@ call_back( void * foo UNUSED) create_new_call (CALL, CALL_STATE_DIALING, "", "", selected_call->_peer_name, selected_call->_peer_number, &new_call); calllist_add(current_calls, new_call); - calltree_add_call(current_calls, new_call); + calltree_add_call(current_calls, new_call, NULL); sflphone_place_call(new_call); calltree_display (current_calls); } @@ -1020,7 +1020,7 @@ static void ok_cb (GtkWidget *widget UNUSED, gpointer userdata) { // Update the internal data structure and the GUI calllist_add(current_calls, modified_call); - calltree_add_call(current_calls, modified_call); + calltree_add_call(current_calls, modified_call, NULL); sflphone_place_call(modified_call); calltree_display (current_calls); diff --git a/sflphone-client-gnome/src/toolbar.c b/sflphone-client-gnome/src/toolbar.c index b5a52d016f..862c8ef04b 100644 --- a/sflphone-client-gnome/src/toolbar.c +++ b/sflphone-client-gnome/src/toolbar.c @@ -61,7 +61,7 @@ call_mailbox( GtkWidget* widget UNUSED, gpointer data UNUSED) create_new_call (CALL, CALL_STATE_DIALING, "", account_id, _("Voicemail"), to, &mailbox_call); DEBUG("TO : %s" , mailbox_call->_peer_number); calllist_add( current_calls , mailbox_call ); - calltree_add_call( current_calls , mailbox_call ); + calltree_add_call( current_calls, mailbox_call, NULL); update_menus(); sflphone_place_call( mailbox_call ); calltree_display(current_calls); @@ -88,7 +88,7 @@ call_button( GtkWidget *widget UNUSED, gpointer data UNUSED) create_new_call (CALL, CALL_STATE_DIALING, "", "", "", selectedCall->_peer_number, &new_call); calllist_add(current_calls, new_call); - calltree_add_call(current_calls, new_call); + calltree_add_call(current_calls, new_call, NULL); sflphone_place_call(new_call); calltree_display (current_calls); } diff --git a/sflphone-common/src/dbus/callmanager-introspec.xml b/sflphone-common/src/dbus/callmanager-introspec.xml index 0957a6410a..1527c2f812 100644 --- a/sflphone-common/src/dbus/callmanager-introspec.xml +++ b/sflphone-common/src/dbus/callmanager-introspec.xml @@ -123,7 +123,12 @@ <signal name="conferenceChanged"> </signal> - <signal name="conferenceAdded"> + <method name="getParticipantList"> + <arg type="s" name="confID" direction="in"/> + <arg type="as" name="list" direction="out"/> + </method> + + <signal name="conferenceCreated"> <arg type="s" name="confID" direction="out"/> </signal> diff --git a/sflphone-common/src/dbus/callmanager.cpp b/sflphone-common/src/dbus/callmanager.cpp index c0019364b4..032c612537 100644 --- a/sflphone-common/src/dbus/callmanager.cpp +++ b/sflphone-common/src/dbus/callmanager.cpp @@ -145,6 +145,12 @@ CallManager::getConferenceList (void) return Manager::instance().getConferenceList(); } +std::vector< std::string > +CallManager::getParticipantList (const std::string& confID) +{ + return Manager::instance().getParticipantList(confID); +} + void CallManager::setRecording (const std::string& callID) { diff --git a/sflphone-common/src/dbus/callmanager.h b/sflphone-common/src/dbus/callmanager.h index fc3c16c468..2e1da9e8e7 100644 --- a/sflphone-common/src/dbus/callmanager.h +++ b/sflphone-common/src/dbus/callmanager.h @@ -51,6 +51,7 @@ public: void joinParticipant( const std::string& sel_callID, const std::string& drag_callID ); void detachParticipant( const std::string& callID ); std::vector< std::string > getConferenceList (void); + std::vector< std::string > getParticipantList (const std::string& confID); std::map< std::string, std::string > getConferenceDetails ( const std::string& callID ); void setRecording( const std::string& callID ); bool getIsRecording(const std::string& callID); diff --git a/sflphone-common/src/managerimpl.cpp b/sflphone-common/src/managerimpl.cpp index 8154ba3964..b3b40613f5 100644 --- a/sflphone-common/src/managerimpl.cpp +++ b/sflphone-common/src/managerimpl.cpp @@ -659,7 +659,7 @@ ManagerImpl::createConference(const CallID& id1, const CallID& id2) conf->add(id2); // broadcast a signal over dbus - _dbus->getCallManager()->conferenceAdded(default_conf); + _dbus->getCallManager()->conferenceCreated(default_conf); } @@ -3497,7 +3497,7 @@ ManagerImpl::getConferenceDetails(const ConfID& confID) iter_conf = _conferencemap.find(confID); - Conference *conf; + Conference *conf = NULL; if(iter_conf != _conferencemap.end()) { @@ -3523,3 +3523,31 @@ ManagerImpl::getConferenceList (void) return v; } + + +std::vector< std::string > +ManagerImpl::getParticipantList (const std::string& confID) +{ + _debug("ManagerImpl::getParticipantList\n"); + std::vector< std::string > v; + + ConferenceMap::iterator iter_conf = _conferencemap.find(confID); + Conference *conf = NULL; + if(iter_conf != _conferencemap.end()) + conf = iter_conf->second; + + ConferenceCallMap::iterator iter_call = _conferencecall.begin(); + Conference *temp; + while (iter_call != _conferencecall.end ()) { + + temp = iter_call->second; + + if (conf == temp) + v.push_back (iter_call->first); + + iter_call++; + } + + return v; +} + diff --git a/sflphone-common/src/managerimpl.h b/sflphone-common/src/managerimpl.h index 2c0b0cb084..e0cf6a924a 100644 --- a/sflphone-common/src/managerimpl.h +++ b/sflphone-common/src/managerimpl.h @@ -363,6 +363,13 @@ class ManagerImpl { */ std::vector< std::string > getConferenceList (void); + + /** + * Get a list of participant to a conference + * @return std::vector<std::string> A list of call IDs + */ + std::vector< std::string > getParticipantList (const std::string& confID); + /** * Save the details of an existing account, given the account ID * This will load the configuration map with the given data. -- GitLab