diff --git a/sflphone-client-gnome/src/actions.c b/sflphone-client-gnome/src/actions.c index 9a5f6bf187ba75894cdafc90488ecfc92e4954c8..8f39264d30d634c5e3cc120a94326c54e2592634 100644 --- a/sflphone-client-gnome/src/actions.c +++ b/sflphone-client-gnome/src/actions.c @@ -305,6 +305,16 @@ sflphone_hang_up() } +void +sflphone_conference_hang_up() +{ + conference_obj_t * selectedConf = calltab_get_selected_conf(); + + if(selectedConf) + dbus_hang_up_conference(selectedConf); +} + + void sflphone_pick_up() { @@ -887,6 +897,19 @@ sflphone_add_conference() // dbus_join_participant(selected_call, dragged_call); } +void +sflphone_conference_on_hold() +{ + +} + +void +sflphone_conference_off_hold() +{ + +} + + void sflphone_rec_call() { diff --git a/sflphone-client-gnome/src/contacts/calllist.h b/sflphone-client-gnome/src/contacts/calllist.h index ac914023c76adfb9d9c498ba18117ba3f8cafd3f..befb97048e8a867298551eb1afb69a2a584678b7 100644 --- a/sflphone-client-gnome/src/contacts/calllist.h +++ b/sflphone-client-gnome/src/contacts/calllist.h @@ -21,6 +21,7 @@ #define __CALLLIST_H__ #include <callable_obj.h> +#include <conference_obj.h> #include <gtk/gtk.h> /** @file calllist.h @@ -35,7 +36,9 @@ typedef struct { // Calllist vars GQueue* callQueue; + gint selectedType; callable_obj_t* selectedCall; + conference_obj_t* selectedConf; gchar *_name; } calltab_t; diff --git a/sflphone-client-gnome/src/contacts/calltab.c b/sflphone-client-gnome/src/contacts/calltab.c index 00cfc85343213d062e0b11d96d35dc2737300745..f832d6c561f5c65baa091b0e13b80c1c48d2cfe6 100644 --- a/sflphone-client-gnome/src/contacts/calltab.c +++ b/sflphone-client-gnome/src/contacts/calltab.c @@ -32,10 +32,11 @@ calltab_t* calltab_init (gboolean searchbar_type, gchar *name) ret->store = NULL; ret->view = NULL; ret->tree = NULL; - ret->searchbar = NULL; + ret->searchbar = NULL; ret->callQueue = NULL; ret->selectedCall = NULL; - ret->_name = g_strdup (name); + ret->selectedConf = NULL; + ret->_name = g_strdup (name); calltree_create (ret, searchbar_type); calllist_init(ret); @@ -47,16 +48,36 @@ calltab_t* calltab_init (gboolean searchbar_type, gchar *name) void calltab_select_call (calltab_t* tab, callable_obj_t * c ) { - tab->selectedCall = c; + tab->selectedType = A_CALL; + tab->selectedCall = c; } +void +calltab_select_conf (conference_obj_t * c ) +{ + current_calls->selectedType = A_CONFERENCE; + current_calls->selectedConf = c; +} + +gint +calltab_get_selected_type(calltab_t* tab) +{ + return tab->selectedType; +} + callable_obj_t * calltab_get_selected_call (calltab_t* tab) { return tab->selectedCall; } +conference_obj_t* +calltab_get_selected_conf () +{ + return current_calls->selectedConf; +} + void calltab_create_searchbar (calltab_t* tab) { diff --git a/sflphone-client-gnome/src/contacts/calltab.h b/sflphone-client-gnome/src/contacts/calltab.h index dfa4dfda53480c08be64e68c3950cd2b8f315d2a..bf3b11b8407efda3ab1e7a74c4ff9b3050279860 100644 --- a/sflphone-client-gnome/src/contacts/calltab.h +++ b/sflphone-client-gnome/src/contacts/calltab.h @@ -31,17 +31,28 @@ calltab_t* contacts; calltab_t* calltab_init (gboolean searchbar_type, gchar *name); + + /** Mark a call as selected. There can be only one selected call. This call * is the currently highlighted one in the list. * @param c The call */ void calltab_select_call (calltab_t*, callable_obj_t *); +void +calltab_select_conf (conference_obj_t *); + +gint +calltab_get_selected_type(calltab_t* tab); + /** Return the selected call. * @return The number of the caller */ callable_obj_t * calltab_get_selected_call (calltab_t*); +conference_obj_t * +calltab_get_selected_conf (); + void calltab_create_searchbar (calltab_t *); diff --git a/sflphone-client-gnome/src/contacts/calltree.c b/sflphone-client-gnome/src/contacts/calltree.c index 702d227ca0f94ade814dfad47bf552de26603925..d497534105d70f09c6cf2460535dbc6dfa0a9f4e 100644 --- a/sflphone-client-gnome/src/contacts/calltree.c +++ b/sflphone-client-gnome/src/contacts/calltree.c @@ -32,12 +32,6 @@ GtkCellRenderer *rend; GtkTreeViewColumn *col; GtkTreeSelection *sel; -enum -{ - A_CALL, - A_CONFERENCE -}; - gint dragged_type; gint selected_type; @@ -105,6 +99,8 @@ selected(GtkTreeSelection *sel, void* data UNUSED ) val.g_type = 0; gtk_tree_model_get_value (model, &iter, 2, &val); + calltab_select_conf((conference_obj_t*) g_value_get_pointer(&val)); + selected_conf = (conference_obj_t*)g_value_get_pointer(&val); selected_call_id = selected_conf->_confID; diff --git a/sflphone-client-gnome/src/contacts/calltree.h b/sflphone-client-gnome/src/contacts/calltree.h index 9efe2c5af3c28ae0d5b0941452d41dd4533f3625..f724c9817bece111c7258b3641a48979c2788758 100644 --- a/sflphone-client-gnome/src/contacts/calltree.h +++ b/sflphone-client-gnome/src/contacts/calltree.h @@ -29,6 +29,12 @@ * @brief The GtkTreeView that list calls in the main window. */ +enum +{ + A_CALL, + A_CONFERENCE +}; + /** * Create a new widget calltree * @return GtkWidget* A new widget diff --git a/sflphone-client-gnome/src/dbus/callmanager-introspec.xml b/sflphone-client-gnome/src/dbus/callmanager-introspec.xml index 8eef3a25a660e3d1996bfa64581038b9523fabae..164272b29bd2a809f9d8855bed60ff3759aad152 100644 --- a/sflphone-client-gnome/src/dbus/callmanager-introspec.xml +++ b/sflphone-client-gnome/src/dbus/callmanager-introspec.xml @@ -19,6 +19,10 @@ <method name="hangUp"> <arg type="s" name="callID" direction="in"/> </method> + + <method name="hangUpConference"> + <arg type="s" name="confID" direction="in"/> + </method> <method name="hold"> <arg type="s" name="callID" direction="in"/> @@ -146,7 +150,7 @@ <arg type="s" name="confID" direction="in"/> </method> - <method name="unHoldConference"> + <method name="unholdConference"> <arg type="s" name="confID" direction="in"/> </method> diff --git a/sflphone-client-gnome/src/dbus/dbus.c b/sflphone-client-gnome/src/dbus/dbus.c index c73142467c49c18d5f95a10833a9c299c9fec278..174f2d3774c2a9c6f0e019fa3860736035f41e6f 100644 --- a/sflphone-client-gnome/src/dbus/dbus.c +++ b/sflphone-client-gnome/src/dbus/dbus.c @@ -501,6 +501,36 @@ dbus_unhold (const callable_obj_t * c) } } + void +dbus_hold_conference (const conference_obj_t * c) +{ + DEBUG("dbus_hold_conference %s\n", c->_confID); + + GError *error = NULL; + org_sflphone_SFLphone_CallManager_hold_conference ( callManagerProxy, c->_confID, &error); + if (error) + { + ERROR ("Failed to call hold() on CallManager: %s", + error->message); + g_error_free (error); + } +} + + void +dbus_unhold_conference (const conference_obj_t * c) +{ + DEBUG("dbus_unhold_conference %s\n", c->_confID); + + GError *error = NULL; + org_sflphone_SFLphone_CallManager_unhold_conference ( callManagerProxy, c->_confID, &error); + if (error) + { + ERROR ("Failed to call unhold() on CallManager: %s", + error->message); + g_error_free (error); + } +} + void dbus_hang_up (const callable_obj_t * c) { @@ -516,6 +546,22 @@ dbus_hang_up (const callable_obj_t * c) } } + + void +dbus_hang_up_conference (const conference_obj_t * c) +{ + DEBUG("dbus_hang_up_conference %s\n", c->_confID); + + GError *error = NULL; + org_sflphone_SFLphone_CallManager_hang_up_conference ( callManagerProxy, c->_confID, &error); + if (error) + { + ERROR ("Failed to call hang_up() on CallManager: %s", + error->message); + g_error_free (error); + } +} + void dbus_transfert (const callable_obj_t * c) { diff --git a/sflphone-client-gnome/src/menus.c b/sflphone-client-gnome/src/menus.c index 558137c5165de2006b84516563f43e601b5c7063..ccfd6e0e1b588352fec6d691be86d7e7ffb43b4d 100644 --- a/sflphone-client-gnome/src/menus.c +++ b/sflphone-client-gnome/src/menus.c @@ -230,6 +230,26 @@ call_hold (void* foo UNUSED) } } + static void +conference_hold (void* foo UNUSED) +{ + conference_obj_t * selectedConf = calltab_get_selected_conf(); + + if(selectedConf) + { + if(selectedConf->_state == CONFERENCE_STATE_HOLD) + { + gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM ( holdMenu ), gtk_image_new_from_file( ICONS_DIR "/icon_unhold.svg")); + sflphone_conference_off_hold(); + } + else + { + gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM ( holdMenu ), gtk_image_new_from_file( ICONS_DIR "/icon_hold.svg")); + sflphone_conference_on_hold(); + } + } +} + static void call_pick_up ( void * foo UNUSED) { @@ -242,6 +262,12 @@ call_hang_up ( void * foo UNUSED) sflphone_hang_up(); } + static void +conference_hang_up ( void * foo UNUSED) +{ + sflphone_conference_hang_up(); +} + static void call_record ( void * foo UNUSED) { @@ -689,45 +715,81 @@ show_popup_menu (GtkWidget *my_widget, GdkEventButton *event) { // TODO update the selection to make sure the call under the mouse is the call selected + // call type boolean gboolean pickup = FALSE, hangup = FALSE, hold = FALSE, copy = FALSE, record = FALSE; gboolean accounts = FALSE; - callable_obj_t * selectedCall = calltab_get_selected_call(current_calls); - if (selectedCall) + // conference type boolean + gboolean hangup_conf = FALSE, hold_conf = FALSE; + + callable_obj_t * selectedCall; + conference_obj_t * selectedConf; + + if (calltab_get_selected_type(current_calls) == A_CALL) { - copy = TRUE; - switch(selectedCall->_state) - { - case CALL_STATE_INCOMING: - pickup = TRUE; - hangup = TRUE; - break; - case CALL_STATE_HOLD: - hangup = TRUE; - hold = TRUE; - break; - case CALL_STATE_RINGING: - hangup = TRUE; - break; - case CALL_STATE_DIALING: - pickup = TRUE; - hangup = TRUE; - accounts = TRUE; - break; - case CALL_STATE_RECORD: - case CALL_STATE_CURRENT: - hangup = TRUE; - hold = TRUE; - record = TRUE; - break; - case CALL_STATE_BUSY: - case CALL_STATE_FAILURE: - hangup = TRUE; - break; - default: - WARN("Should not happen in show_popup_menu!"); - break; - } + DEBUG("MENUS: SELECTED A CALL"); + selectedCall = calltab_get_selected_call(current_calls); + + if (selectedCall) + { + copy = TRUE; + switch(selectedCall->_state) + { + case CALL_STATE_INCOMING: + pickup = TRUE; + hangup = TRUE; + break; + case CALL_STATE_HOLD: + hangup = TRUE; + hold = TRUE; + break; + case CALL_STATE_RINGING: + hangup = TRUE; + break; + case CALL_STATE_DIALING: + pickup = TRUE; + hangup = TRUE; + accounts = TRUE; + break; + case CALL_STATE_RECORD: + case CALL_STATE_CURRENT: + hangup = TRUE; + hold = TRUE; + record = TRUE; + break; + case CALL_STATE_BUSY: + case CALL_STATE_FAILURE: + hangup = TRUE; + break; + default: + WARN("Should not happen in show_popup_menu for calls!"); + break; + } + } + } + else + { + DEBUG("MENUS: SELECTED A CONF"); + selectedConf = calltab_get_selected_conf(); + + if (selectedConf) + { + switch(selectedConf->_state) + { + case CONFERENCE_STATE_ACTIVE: + hangup_conf = TRUE; + hold_conf = TRUE; + break; + case CONFERENCE_STATE_HOLD: + hangup_conf = TRUE; + hold_conf = TRUE; + break; + default: + WARN("Should not happen in show_popup_menu for conferences!"); + break; + } + } + } GtkWidget *menu; @@ -738,94 +800,127 @@ show_popup_menu (GtkWidget *my_widget, GdkEventButton *event) menu = gtk_menu_new (); //g_signal_connect (menu, "deactivate", // G_CALLBACK (gtk_widget_destroy), NULL); - - if(copy) - { - menu_items = gtk_image_menu_item_new_from_stock( GTK_STOCK_COPY, get_accel_group()); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); - g_signal_connect (G_OBJECT (menu_items), "activate", - G_CALLBACK (edit_copy), - NULL); - gtk_widget_show (menu_items); - } - - menu_items = gtk_image_menu_item_new_from_stock( GTK_STOCK_PASTE, get_accel_group()); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); - g_signal_connect (G_OBJECT (menu_items), "activate", - G_CALLBACK (edit_paste), - NULL); - gtk_widget_show (menu_items); - - if(pickup || hangup || hold) - { - menu_items = gtk_separator_menu_item_new (); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); - gtk_widget_show (menu_items); - } - - if(pickup) - { - - menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Pick up")); - image = gtk_image_new_from_file( ICONS_DIR "/icon_accept.svg"); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); - g_signal_connect (G_OBJECT (menu_items), "activate", - G_CALLBACK (call_pick_up), - NULL); - gtk_widget_show (menu_items); - } - - if(hangup) + if (calltab_get_selected_type(current_calls) == A_CALL) { - menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Hang up")); - image = gtk_image_new_from_file( ICONS_DIR "/icon_hangup.svg"); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); - g_signal_connect (G_OBJECT (menu_items), "activate", - G_CALLBACK (call_hang_up), - NULL); - gtk_widget_show (menu_items); - } + DEBUG("BUILD CALL MENU"); + + if(copy) + { + menu_items = gtk_image_menu_item_new_from_stock( GTK_STOCK_COPY, get_accel_group()); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); + g_signal_connect (G_OBJECT (menu_items), "activate", + G_CALLBACK (edit_copy), + NULL); + gtk_widget_show (menu_items); + } + + menu_items = gtk_image_menu_item_new_from_stock( GTK_STOCK_PASTE, get_accel_group()); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); + g_signal_connect (G_OBJECT (menu_items), "activate", + G_CALLBACK (edit_paste), + NULL); + gtk_widget_show (menu_items); + + if(pickup || hangup || hold) + { + menu_items = gtk_separator_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); + gtk_widget_show (menu_items); + } + + if(pickup) + { + + menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Pick up")); + image = gtk_image_new_from_file( ICONS_DIR "/icon_accept.svg"); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); + g_signal_connect (G_OBJECT (menu_items), "activate", + G_CALLBACK (call_pick_up), + NULL); + gtk_widget_show (menu_items); + } + + if(hangup) + { + menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Hang up")); + image = gtk_image_new_from_file( ICONS_DIR "/icon_hangup.svg"); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); + g_signal_connect (G_OBJECT (menu_items), "activate", + G_CALLBACK (call_hang_up), + NULL); + gtk_widget_show (menu_items); + } + + if(hold) + { + menu_items = gtk_check_menu_item_new_with_mnemonic (_("On _Hold")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_items), + (selectedCall->_state == CALL_STATE_HOLD ? TRUE : FALSE)); + g_signal_connect(G_OBJECT (menu_items), "activate", + G_CALLBACK (call_hold), + NULL); + gtk_widget_show (menu_items); + } + + if(record) + { + menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Record")); + image = gtk_image_new_from_stock (GTK_STOCK_MEDIA_RECORD, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); + g_signal_connect (G_OBJECT (menu_items), "activate", + G_CALLBACK (call_record), + NULL); + gtk_widget_show (menu_items); + } - if(hold) - { - menu_items = gtk_check_menu_item_new_with_mnemonic (_("On _Hold")); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_items), - (selectedCall->_state == CALL_STATE_HOLD ? TRUE : FALSE)); - g_signal_connect(G_OBJECT (menu_items), "activate", - G_CALLBACK (call_hold), - NULL); - gtk_widget_show (menu_items); } - - if(record) + else { - menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Record")); - image = gtk_image_new_from_stock (GTK_STOCK_MEDIA_RECORD, GTK_ICON_SIZE_MENU); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); - g_signal_connect (G_OBJECT (menu_items), "activate", - G_CALLBACK (call_record), - NULL); - gtk_widget_show (menu_items); + DEBUG("BUILD CONFERENCE MENU"); + + if(hangup_conf) + { + menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Hang up")); + image = gtk_image_new_from_file( ICONS_DIR "/icon_hangup.svg"); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); + g_signal_connect (G_OBJECT (menu_items), "activate", + G_CALLBACK (conference_hang_up), + NULL); + gtk_widget_show (menu_items); + } + + if(hold_conf) + { + menu_items = gtk_check_menu_item_new_with_mnemonic (_("On _Hold")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_items), + (selectedCall->_state == CALL_STATE_HOLD ? TRUE : FALSE)); + g_signal_connect(G_OBJECT (menu_items), "activate", + G_CALLBACK (conference_hold), + NULL); + gtk_widget_show (menu_items); + } } if(accounts) { - add_registered_accounts_to_menu (menu); + add_registered_accounts_to_menu (menu); } - + if (event) { - button = event->button; - event_time = event->time; + button = event->button; + event_time = event->time; } else { - button = 0; - event_time = gtk_get_current_event_time (); + button = 0; + event_time = gtk_get_current_event_time (); } gtk_menu_attach_to_widget (GTK_MENU (menu), my_widget, NULL); diff --git a/sflphone-common/src/call.cpp b/sflphone-common/src/call.cpp index 0cd939e8b245f164d8c15d1cc092856dd5705de6..8abdd972af50546a45ec57a455c6fb5052e253b8 100644 --- a/sflphone-common/src/call.cpp +++ b/sflphone-common/src/call.cpp @@ -27,6 +27,7 @@ Call::Call (const CallID& id, Call::CallType type) , _localAudioPort (0) , _localExternalAudioPort (0) , _id (id) + , _confID ("") , _type (type) , _connectionState (Call::Disconnected) , _callState (Call::Inactive) diff --git a/sflphone-common/src/call.h b/sflphone-common/src/call.h index d810ba9539ff773726abb75a1bf1594c13114161..c0d5805c27299075cfb6811012ac783c92a59251 100644 --- a/sflphone-common/src/call.h +++ b/sflphone-common/src/call.h @@ -83,6 +83,14 @@ class Call{ */ CallID& getCallId() {return _id; } + /** + * Return a reference on the conference id + * @return call id + */ + CallID& getConfId() {return _confID; } + + void setConfId(CallID id) {_confID = id; } + inline CallType getCallType (void) { return _type; @@ -256,6 +264,9 @@ class Call{ /** Unique ID of the call */ CallID _id; + /** Unique conference ID, used exclusively in case of a conferece */ + CallID _confID; + /** Type of the call */ CallType _type; /** Disconnected/Progressing/Trying/Ringing/Connected */ diff --git a/sflphone-common/src/dbus/callmanager-introspec.xml b/sflphone-common/src/dbus/callmanager-introspec.xml index 25ae8c9fbed9828e8f68a663f429f71300d511ab..e17008068cfdfcc6f6ba52d870eca65cc9f36053 100644 --- a/sflphone-common/src/dbus/callmanager-introspec.xml +++ b/sflphone-common/src/dbus/callmanager-introspec.xml @@ -19,6 +19,10 @@ <method name="hangUp"> <arg type="s" name="callID" direction="in"/> </method> + + <method name="hangUpConference"> + <arg type="s" name="confID" direction="in"/> + </method> <method name="hold"> <arg type="s" name="callID" direction="in"/> @@ -146,7 +150,7 @@ <arg type="s" name="confID" direction="in"/> </method> - <method name="unHoldConference"> + <method name="unholdConference"> <arg type="s" name="confID" direction="in"/> </method> diff --git a/sflphone-common/src/dbus/callmanager.cpp b/sflphone-common/src/dbus/callmanager.cpp index c07e2ad836bce22f78eecded5c9e38d8821f4232..6cc4c2231a489f5801fa5663fd4e1d0954775f9f 100644 --- a/sflphone-common/src/dbus/callmanager.cpp +++ b/sflphone-common/src/dbus/callmanager.cpp @@ -63,6 +63,15 @@ CallManager::hangUp (const std::string& callID) } +void +CallManager::hangUpConference (const std::string& confID) +{ + _debug ("CallManager::hangUpConference received %s\n", confID.c_str()); + Manager::instance().hangupConference (confID); + +} + + void CallManager::hold (const std::string& callID) { @@ -146,7 +155,7 @@ CallManager::holdConference (const std::string& confID) } void -CallManager::unHoldConference (const std::string& confID) +CallManager::unholdConference (const std::string& confID) { _debug ("CallManager::unHoldConference received %s\n", confID.c_str()); Manager::instance().unHoldConference(confID); diff --git a/sflphone-common/src/dbus/callmanager.h b/sflphone-common/src/dbus/callmanager.h index 07a3dd3d57db977eb8ebacd722b202e258439da8..6994a874a4dfed2da24bfcf8d246ec18908e19ec 100644 --- a/sflphone-common/src/dbus/callmanager.h +++ b/sflphone-common/src/dbus/callmanager.h @@ -43,6 +43,7 @@ public: void refuse( const std::string& callID ); void accept( const std::string& callID ); void hangUp( const std::string& callID ); + void hangUpConference( const std::string& confID ); void hold( const std::string& callID ); void unhold( const std::string& callID ); void transfert( const std::string& callID, const std::string& to ); @@ -52,7 +53,7 @@ public: void addParticipant( const std::string& callID, const std::string& confID ); void detachParticipant( const std::string& callID ); void holdConference( const std::string& confID ); - void unHoldConference( const std::string& confID ); + void unholdConference( const std::string& confID ); 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 ); diff --git a/sflphone-common/src/managerimpl.cpp b/sflphone-common/src/managerimpl.cpp index 939311ff0098e3086202c6e1d5b9b575de1af1ff..aee0a42e0d12c64a31b4cdee77f56ace346418c6 100644 --- a/sflphone-common/src/managerimpl.cpp +++ b/sflphone-common/src/managerimpl.cpp @@ -409,6 +409,46 @@ ManagerImpl::hangupCall (const CallID& id) return returnValue; } + +bool +ManagerImpl::hangupConference (const ConfID& id) +{ + _debug ("ManagerImpl::hangupConference()\n"); + + Conference *conf; + ConferenceMap::iterator iter_conf = _conferencemap.find(id); + + ConferenceCallMap tempmap = _conferencecall; + + AccountID currentAccountId; + + Call* call = NULL; + + if(iter_conf != _conferencemap.end()) + { + conf = iter_conf->second; + + ConferenceCallMap::iterator iter_participant = tempmap.begin(); + + while(iter_participant != tempmap.end()) + { + _debug("ManagerImpl::hangupConference participant %s\n", iter_participant->first.c_str()); + currentAccountId = getAccountFromCall (iter_participant->first); + call = getAccountLink (currentAccountId)->getCall (iter_participant->first); + + if(call->getConfId() == id) + hangupCall (iter_participant->first); + + iter_participant++; + + } + + } + + return true; +} + + //THREAD=Main bool ManagerImpl::cancelCall (const CallID& id) @@ -809,6 +849,10 @@ ManagerImpl::joinParticipant(const CallID& call_id1, const CallID& call_id2) ConferenceMap::iterator iter = _conferencemap.find(default_conf); std::map<std::string, std::string>::iterator iter_details; + + // currentAccountId = getAccountFromCall (iter_participant->first); + // call = getAccountLink (currentAccountId)->getCall (iter_participant->first); + if(iter == _conferencemap.end()){ _debug("NO CONFERENCE YET, CREATE ONE\n"); @@ -873,8 +917,19 @@ ManagerImpl::joinParticipant(const CallID& call_id1, const CallID& call_id2) } */ - } - + } + + AccountID currentAccountId; + + Call* call = NULL; + + currentAccountId = getAccountFromCall (call_id1); + call = getAccountLink (currentAccountId)->getCall (call_id1); + call->setConfId (default_conf); + + currentAccountId = getAccountFromCall (call_id2); + call = getAccountLink (currentAccountId)->getCall (call_id2); + call->setConfId (default_conf); } @@ -901,6 +956,14 @@ ManagerImpl::detachParticipant(const CallID& call_id) onHoldCall(call_id); } + + AccountID currentAccountId; + + Call* call = NULL; + + currentAccountId = getAccountFromCall (call_id); + call = getAccountLink (currentAccountId)->getCall (default_conf); + call->setConfId (default_conf); } diff --git a/sflphone-common/src/managerimpl.h b/sflphone-common/src/managerimpl.h index 60b2ee1faf9607efbfb6993068a18bfd02f2b7fb..2c827cb7ae358a66689a509baa626448e67d37f7 100644 --- a/sflphone-common/src/managerimpl.h +++ b/sflphone-common/src/managerimpl.h @@ -141,6 +141,14 @@ class ManagerImpl { */ bool hangupCall(const CallID& id); + + /** + * Functions which occur with a user's action + * Hangup the conference (hangup every participants) + * @param id The call identifier + */ + bool hangupConference(const ConfID& id); + /** * Functions which occur with a user's action * Cancel the call