Skip to content
Snippets Groups Projects
Commit 475cecf4 authored by Alexandre Savard's avatar Alexandre Savard
Browse files

[#2466] GUI-Gnome: Segfault when dragging a conference on a call

Happen when as current_calls may change during gui manipulation
parent 85a4a861
Branches
Tags
No related merge requests found
...@@ -1355,49 +1355,42 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d ...@@ -1355,49 +1355,42 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d
conference_obj_t* conf; conference_obj_t* conf;
if(selected_path_depth == 1) if(selected_path_depth == 1) {
{
if(dragged_path_depth == 1)
{
if (selected_type == A_CALL && dragged_type == A_CALL) if(dragged_path_depth == 1) {
{
if(gtk_tree_path_compare (dpath, spath) == 0) if (selected_type == A_CALL && dragged_type == A_CALL) {
{
if(gtk_tree_path_compare (dpath, spath) == 0) {
// draged a call on itself // draged a call on itself
} }
else else {
{
// dragged a single call on a single call // dragged a single call on a single call
if(selected_call != NULL && dragged_call != NULL) if(selected_call != NULL && dragged_call != NULL)
sflphone_join_participant(selected_call->_callID, dragged_call->_callID); sflphone_join_participant(selected_call->_callID, dragged_call->_callID);
} }
} }
else if(selected_type == A_CALL && dragged_type == A_CONFERENCE) else if(selected_type == A_CALL && dragged_type == A_CONFERENCE) {
{
// dragged a single call on a conference // dragged a single call on a conference
selected_call->_confID = g_strdup(dragged_call_id); selected_call->_confID = g_strdup(dragged_call_id);
sflphone_add_participant(selected_call_id, dragged_call_id); sflphone_add_participant(selected_call_id, dragged_call_id);
} }
else if(selected_type == A_CONFERENCE && dragged_type == A_CALL) else if(selected_type == A_CONFERENCE && dragged_type == A_CALL) {
{
// dragged a conference on a single call (make no sence)
calltree_remove_conference(current_calls, selected_conf, NULL);
calltree_add_conference(current_calls, selected_conf);
conf = selected_conf;
// dragged a conference on a single call (make no sence)
calltree_remove_conference(current_calls, conf, NULL);
calltree_add_conference(current_calls, conf);
} }
else if(selected_type == A_CONFERENCE && dragged_type == A_CONFERENCE) else if(selected_type == A_CONFERENCE && dragged_type == A_CONFERENCE) {
{
// dragged a conference on a conference // dragged a conference on a conference
if(gtk_tree_path_compare (dpath, spath) == 0) if(gtk_tree_path_compare (dpath, spath) == 0) {
{
DEBUG("Joined the same conference!\n"); DEBUG("Joined the same conference!\n");
gtk_tree_view_expand_row(GTK_TREE_VIEW(current_calls->view), path, FALSE); gtk_tree_view_expand_row(GTK_TREE_VIEW(current_calls->view), path, FALSE);
} }
else else {
{
DEBUG("Joined two conference %s, %s!\n", dragged_path, selected_path); DEBUG("Joined two conference %s, %s!\n", dragged_path, selected_path);
sflphone_join_conference(selected_conf->_confID, dragged_conf->_confID); sflphone_join_conference(selected_conf->_confID, dragged_conf->_confID);
} }
...@@ -1407,33 +1400,33 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d ...@@ -1407,33 +1400,33 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d
// TODO: dragged a conference on a NULL element (should do nothing) // TODO: dragged a conference on a NULL element (should do nothing)
} }
else // dragged_path_depth == 2 else {
{ // dragged_path_depth == 2
if (selected_type == A_CALL && dragged_type == A_CALL)
{ if (selected_type == A_CALL && dragged_type == A_CALL) {
// TODO: dragged a call on a conference call // TODO: dragged a call on a conference call
calltree_remove_call(current_calls, selected_call, NULL); calltree_remove_call(current_calls, selected_call, NULL);
calltree_add_call(current_calls, selected_call, NULL); calltree_add_call(current_calls, selected_call, NULL);
} }
else if(selected_type == A_CONFERENCE && dragged_type == A_CALL) else if(selected_type == A_CONFERENCE && dragged_type == A_CALL) {
{
// TODO: dragged a conference on a conference call // TODO: dragged a conference on a conference call
calltree_remove_conference(current_calls, selected_conf, NULL); conf = selected_conf;
calltree_add_conference(current_calls, selected_conf);
calltree_remove_conference(current_calls, conf, NULL);
calltree_add_conference(current_calls, conf);
} }
// TODO: dragged a single call on a NULL element // TODO: dragged a single call on a NULL element
// TODO: dragged a conference on a NULL element // TODO: dragged a conference on a NULL element
} }
} }
else // selected_path_depth == 2 else {
{
if(dragged_path_depth == 1) // selected_path_depth == 2
{
if(selected_type == A_CALL && dragged_type == A_CALL) if(dragged_path_depth == 1) {
{
if(selected_type == A_CALL && dragged_type == A_CALL) {
// dragged a conference call on a call // dragged a conference call on a call
sflphone_detach_participant(selected_call_id); sflphone_detach_participant(selected_call_id);
...@@ -1442,27 +1435,24 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d ...@@ -1442,27 +1435,24 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d
sflphone_join_participant(selected_call->_callID, dragged_call->_callID); sflphone_join_participant(selected_call->_callID, dragged_call->_callID);
} }
else if(selected_type == A_CALL && dragged_type == A_CONFERENCE) else if(selected_type == A_CALL && dragged_type == A_CONFERENCE) {
{
// dragged a conference call on a conference // dragged a conference call on a conference
sflphone_detach_participant(selected_call_id); sflphone_detach_participant(selected_call_id);
if(selected_call != NULL && dragged_conf != NULL) if(selected_call != NULL && dragged_conf != NULL) {
{
DEBUG("Adding a participant, since dragged call on a conference"); DEBUG("Adding a participant, since dragged call on a conference");
sflphone_add_participant(selected_call_id, dragged_call_id); sflphone_add_participant(selected_call_id, dragged_call_id);
} }
} }
else else {
{
// dragged a conference call on a NULL element // dragged a conference call on a NULL element
sflphone_detach_participant(selected_call_id); sflphone_detach_participant(selected_call_id);
} }
} }
else // dragged_path_depth == 2 else {
{ // dragged_path_depth == 2
// dragged a conference call on another conference call (same conference) // dragged a conference call on another conference call (same conference)
// TODO: dragged a conference call on another conference call (different conference) // TODO: dragged a conference call on another conference call (different conference)
...@@ -1473,22 +1463,19 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d ...@@ -1473,22 +1463,19 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d
gtk_tree_path_up(dpath); gtk_tree_path_up(dpath);
gtk_tree_path_up(spath); gtk_tree_path_up(spath);
if(gtk_tree_path_compare (dpath, spath) == 0) if(gtk_tree_path_compare (dpath, spath) == 0) {
{
DEBUG("Dragged a call in the same conference"); DEBUG("Dragged a call in the same conference");
calltree_remove_call (current_calls, selected_call, NULL); calltree_remove_call (current_calls, selected_call, NULL);
calltree_add_call (current_calls, selected_call, &parent_conference); calltree_add_call (current_calls, selected_call, &parent_conference);
} }
else else {
{
DEBUG("Dragged a conference call onto another conference call %s, %s", gtk_tree_path_to_string(dpath), gtk_tree_path_to_string(spath)); DEBUG("Dragged a conference call onto another conference call %s, %s", gtk_tree_path_to_string(dpath), gtk_tree_path_to_string(spath));
conf = NULL; conf = NULL;
val.g_type = 0; val.g_type = 0;
if(gtk_tree_model_get_iter (model, &iter, dpath)) if(gtk_tree_model_get_iter (model, &iter, dpath)) {
{
DEBUG("we got an iter!"); DEBUG("we got an iter!");
gtk_tree_model_get_value (model, &iter, COLUMN_ACCOUNT_PTR, &val); gtk_tree_model_get_value (model, &iter, COLUMN_ACCOUNT_PTR, &val);
...@@ -1498,13 +1485,11 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d ...@@ -1498,13 +1485,11 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d
sflphone_detach_participant(selected_call_id); sflphone_detach_participant(selected_call_id);
if(conf) if(conf) {
{
DEBUG("we got a conf!"); DEBUG("we got a conf!");
sflphone_add_participant(selected_call_id, conf->_confID); sflphone_add_participant(selected_call_id, conf->_confID);
} }
else else {
{
DEBUG("didn't find a conf!"); DEBUG("didn't find a conf!");
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment