Skip to content
Snippets Groups Projects
Commit d77878f0 authored by Tristan Matthews's avatar Tristan Matthews
Browse files

* #10320: calltree: don't leak treepath strings

parent 6f057999
Branches
Tags
No related merge requests found
...@@ -68,8 +68,8 @@ static CallType calltree_source_type = A_INVALID; ...@@ -68,8 +68,8 @@ static CallType calltree_source_type = A_INVALID;
static const gchar *calltree_dest_call_id = NULL; static const gchar *calltree_dest_call_id = NULL;
static const gchar *calltree_source_call_id = NULL; static const gchar *calltree_source_call_id = NULL;
static const gchar *calltree_source_call_id_for_drag = NULL; static const gchar *calltree_source_call_id_for_drag = NULL;
static const gchar *calltree_dest_path = NULL; static gchar *calltree_dest_path = NULL;
static const gchar *calltree_source_path = NULL; static gchar *calltree_source_path = NULL;
static const gchar *calltree_source_path_for_drag = NULL; static const gchar *calltree_source_path_for_drag = NULL;
static gint calltree_dest_path_depth = -1; static gint calltree_dest_path_depth = -1;
...@@ -88,7 +88,7 @@ static void drag_end_cb(GtkWidget *, GdkDragContext *, gpointer); ...@@ -88,7 +88,7 @@ static void drag_end_cb(GtkWidget *, GdkDragContext *, gpointer);
static void drag_begin_cb(GtkWidget *widget, GdkDragContext *context, gpointer data UNUSED); static void drag_begin_cb(GtkWidget *widget, GdkDragContext *context, gpointer data UNUSED);
static void drag_data_received_cb(GtkWidget *, GdkDragContext *, gint, gint, GtkSelectionData *, guint, guint, gpointer); static void drag_data_received_cb(GtkWidget *, GdkDragContext *, gint, gint, GtkSelectionData *, guint, guint, gpointer);
static void drag_history_received_cb(GtkWidget *, GdkDragContext *, gint, gint, GtkSelectionData *, guint, guint, gpointer); static void drag_history_received_cb(GtkWidget *, GdkDragContext *, gint, gint, GtkSelectionData *, guint, guint, gpointer);
static void menuitem_response(gchar *); static void menuitem_response(gchar *str);
enum { enum {
COLUMN_ACCOUNT_PIXBUF = 0, COLUMN_ACCOUNT_PIXBUF = 0,
...@@ -166,6 +166,7 @@ call_selected_cb(GtkTreeSelection *sel, void* data UNUSED) ...@@ -166,6 +166,7 @@ call_selected_cb(GtkTreeSelection *sel, void* data UNUSED)
if (calltree_source_conf) { if (calltree_source_conf) {
calltab_select_conf(active_calltree_tab, calltree_source_conf); calltab_select_conf(active_calltree_tab, calltree_source_conf);
calltree_source_call_id = calltree_source_conf->_confID; calltree_source_call_id = calltree_source_conf->_confID;
g_free(calltree_source_path);
calltree_source_path = string_path; calltree_source_path = string_path;
calltree_source_call = NULL; calltree_source_call = NULL;
...@@ -185,6 +186,7 @@ call_selected_cb(GtkTreeSelection *sel, void* data UNUSED) ...@@ -185,6 +186,7 @@ call_selected_cb(GtkTreeSelection *sel, void* data UNUSED)
if (calltree_source_call) { if (calltree_source_call) {
calltab_select_call(active_calltree_tab, calltree_source_call); calltab_select_call(active_calltree_tab, calltree_source_call);
calltree_source_call_id = calltree_source_call->_callID; calltree_source_call_id = calltree_source_call->_callID;
g_free(calltree_source_path);
calltree_source_path = string_path; calltree_source_path = string_path;
calltree_source_conf = NULL; calltree_source_conf = NULL;
...@@ -1254,9 +1256,9 @@ static void undo_drag_call_action(callable_obj_t *c, GtkTreePath *spath) ...@@ -1254,9 +1256,9 @@ static void undo_drag_call_action(callable_obj_t *c, GtkTreePath *spath)
if (spath && calltree_source_call_for_drag->_confID) { if (spath && calltree_source_call_for_drag->_confID) {
gtk_tree_path_up(spath); gtk_tree_path_up(spath);
// conference for which this call is attached // conference for which this call is attached
GtkTreeIter parent_conference; GtkTreeIter parent;
gtk_tree_model_get_iter(GTK_TREE_MODEL(current_calls_tab->store), &parent_conference, spath); gtk_tree_model_get_iter(GTK_TREE_MODEL(current_calls_tab->store), &parent, spath);
calltree_add_call(current_calls_tab, c, &parent_conference); calltree_add_call(current_calls_tab, c, &parent);
} }
else { else {
calltree_add_call(current_calls_tab, c, NULL); calltree_add_call(current_calls_tab, c, NULL);
...@@ -1270,25 +1272,18 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context UNUSED, gpo ...@@ -1270,25 +1272,18 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context UNUSED, gpo
if (active_calltree_tab == history_tab) if (active_calltree_tab == history_tab)
return; return;
DEBUG("CallTree: Drag End callback"); DEBUG("source_path %s, source_call_id %s, source_path_depth %d",
DEBUG("CallTreeS: source_path %s, source_call_id %s, source_path_depth %d",
calltree_source_path_for_drag, calltree_source_call_id_for_drag, calltree_source_path_depth_for_drag); calltree_source_path_for_drag, calltree_source_call_id_for_drag, calltree_source_path_depth_for_drag);
DEBUG("CallTree: dest path %s, dest %s, dest_path_depth %d", DEBUG("dest path %s, dest %s, dest_path_depth %d",
calltree_source_path, calltree_source_call_id, calltree_source_path_depth); calltree_source_path, calltree_source_call_id, calltree_source_path_depth);
GtkTreeView *treeview = GTK_TREE_VIEW(widget); GtkTreeView *treeview = GTK_TREE_VIEW(widget);
GtkTreeModel *model = gtk_tree_view_get_model(treeview); GtkTreeModel *model = gtk_tree_view_get_model(treeview);
calltree_dest_path = calltree_source_path;
calltree_dest_call_id = calltree_source_call_id;
calltree_dest_path_depth = calltree_source_path_depth;
GtkTreePath *path = gtk_tree_path_new_from_string(calltree_dest_path); GtkTreePath *path = gtk_tree_path_new_from_string(calltree_dest_path);
GtkTreePath *dpath = gtk_tree_path_new_from_string(calltree_dest_path); GtkTreePath *dpath = gtk_tree_path_new_from_string(calltree_dest_path);
GtkTreePath *spath = gtk_tree_path_new_from_string(calltree_source_path_for_drag); GtkTreePath *spath = gtk_tree_path_new_from_string(calltree_source_path_for_drag);
GtkTreeIter iter;
// Make sure drag n drop does not imply a dialing call for either source and dest call // Make sure drag n drop does not imply a dialing call for either source and dest call
if (calltree_source_call && (calltree_source_type == A_CALL)) { if (calltree_source_call && (calltree_source_type == A_CALL)) {
DEBUG("CallTree: Selected a call"); DEBUG("CallTree: Selected a call");
...@@ -1427,13 +1422,16 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context UNUSED, gpo ...@@ -1427,13 +1422,16 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context UNUSED, gpo
sflphone_detach_participant(calltree_source_call_id); sflphone_detach_participant(calltree_source_call_id);
} }
} else if (calltree_dest_path_depth == 2) { } else if (calltree_dest_path_depth == 2) {
DEBUG("Dragged a conference call on another conference call (same conference"); DEBUG("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)
gtk_tree_path_up(path); gtk_tree_path_up(path);
// conference for which this call is attached // conference for which this call is attached
GtkTreeIter parent_conference; GtkTreeIter parent;
gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &parent_conference, path); if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &parent, path)) {
ERROR("Could not find parent conference");
return;
}
gtk_tree_path_up(dpath); gtk_tree_path_up(dpath);
gtk_tree_path_up(spath); gtk_tree_path_up(spath);
...@@ -1441,7 +1439,7 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context UNUSED, gpo ...@@ -1441,7 +1439,7 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context UNUSED, gpo
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_tab, calltree_source_call); calltree_remove_call(current_calls_tab, calltree_source_call);
calltree_add_call(current_calls_tab, calltree_source_call, &parent_conference); calltree_add_call(current_calls_tab, calltree_source_call, &parent);
gtk_widget_hide(calltree_menu_items); gtk_widget_hide(calltree_menu_items);
gtk_menu_popup(GTK_MENU(calltree_popupmenu), NULL, NULL, NULL, NULL, gtk_menu_popup(GTK_MENU(calltree_popupmenu), NULL, NULL, NULL, NULL,
0, 0); 0, 0);
...@@ -1449,6 +1447,7 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context UNUSED, gpo ...@@ -1449,6 +1447,7 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context UNUSED, gpo
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));
conference_obj_t *conf = NULL; conference_obj_t *conf = NULL;
GtkTreeIter iter;
if (gtk_tree_model_get_iter(model, &iter, dpath)) { if (gtk_tree_model_get_iter(model, &iter, dpath)) {
if (is_conference(model, &iter)) { if (is_conference(model, &iter)) {
GValue val = G_VALUE_INIT; GValue val = G_VALUE_INIT;
...@@ -1494,6 +1493,9 @@ void drag_data_received_cb(GtkWidget *widget, GdkDragContext *context UNUSED, gi ...@@ -1494,6 +1493,9 @@ void drag_data_received_cb(GtkWidget *widget, GdkDragContext *context UNUSED, gi
gtk_tree_view_get_drag_dest_row(tree_view, &drop_path, &position); gtk_tree_view_get_drag_dest_row(tree_view, &drop_path, &position);
if (drop_path) { if (drop_path) {
gchar *drop_path_str = gtk_tree_path_to_string(drop_path);
DEBUG("Got drop path %s", drop_path_str);
g_free(drop_path_str);
GtkTreeIter iter; GtkTreeIter iter;
gtk_tree_model_get_iter(tree_model, &iter, drop_path); gtk_tree_model_get_iter(tree_model, &iter, drop_path);
...@@ -1501,11 +1503,11 @@ void drag_data_received_cb(GtkWidget *widget, GdkDragContext *context UNUSED, gi ...@@ -1501,11 +1503,11 @@ void drag_data_received_cb(GtkWidget *widget, GdkDragContext *context UNUSED, gi
gtk_tree_model_get_value(tree_model, &iter, COLUMN_ACCOUNT_PTR, &val); gtk_tree_model_get_value(tree_model, &iter, COLUMN_ACCOUNT_PTR, &val);
if (is_conference(tree_model, &iter)) { if (is_conference(tree_model, &iter)) {
DEBUG("CallTree: Dragging on a conference"); DEBUG("Destination is a conference");
calltree_dest_type = A_CONFERENCE; calltree_dest_type = A_CONFERENCE;
calltree_dest_call = NULL; calltree_dest_call = NULL;
} else { } else {
DEBUG("CallTree: Dragging on a call"); DEBUG("Destination is a call");
calltree_dest_type = A_CALL; calltree_dest_type = A_CALL;
calltree_dest_conf = NULL; calltree_dest_conf = NULL;
} }
...@@ -1513,9 +1515,10 @@ void drag_data_received_cb(GtkWidget *widget, GdkDragContext *context UNUSED, gi ...@@ -1513,9 +1515,10 @@ void drag_data_received_cb(GtkWidget *widget, GdkDragContext *context UNUSED, gi
DEBUG("Position %d", position); DEBUG("Position %d", position);
switch (position) { switch (position) {
case GTK_TREE_VIEW_DROP_AFTER:
/* fallthrough */
case GTK_TREE_VIEW_DROP_BEFORE: case GTK_TREE_VIEW_DROP_BEFORE:
/* fallthrough */
case GTK_TREE_VIEW_DROP_AFTER:
g_free(calltree_dest_path);
calltree_dest_path = gtk_tree_path_to_string(drop_path); calltree_dest_path = gtk_tree_path_to_string(drop_path);
calltree_dest_path_depth = gtk_tree_path_get_depth(drop_path); calltree_dest_path_depth = gtk_tree_path_get_depth(drop_path);
calltree_dest_call_id = NULL; calltree_dest_call_id = NULL;
...@@ -1523,9 +1526,10 @@ void drag_data_received_cb(GtkWidget *widget, GdkDragContext *context UNUSED, gi ...@@ -1523,9 +1526,10 @@ void drag_data_received_cb(GtkWidget *widget, GdkDragContext *context UNUSED, gi
calltree_dest_conf = NULL; calltree_dest_conf = NULL;
break; break;
case GTK_TREE_VIEW_DROP_INTO_OR_AFTER:
/* fallthrough */
case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE:
/* fallthrough */
case GTK_TREE_VIEW_DROP_INTO_OR_AFTER:
g_free(calltree_dest_path);
calltree_dest_path = gtk_tree_path_to_string(drop_path); calltree_dest_path = gtk_tree_path_to_string(drop_path);
calltree_dest_path_depth = gtk_tree_path_get_depth(drop_path); calltree_dest_path_depth = gtk_tree_path_get_depth(drop_path);
...@@ -1536,12 +1540,9 @@ void drag_data_received_cb(GtkWidget *widget, GdkDragContext *context UNUSED, gi ...@@ -1536,12 +1540,9 @@ void drag_data_received_cb(GtkWidget *widget, GdkDragContext *context UNUSED, gi
calltree_dest_call_id = ((conference_obj_t*) g_value_get_pointer(&val))->_confID; calltree_dest_call_id = ((conference_obj_t*) g_value_get_pointer(&val))->_confID;
calltree_dest_conf = (conference_obj_t*) g_value_get_pointer(&val); calltree_dest_conf = (conference_obj_t*) g_value_get_pointer(&val);
} }
break; g_value_unset(&val);
default:
break; break;
} }
g_value_unset(&val);
} }
} }
...@@ -1566,6 +1567,5 @@ static void menuitem_response(gchar *string) ...@@ -1566,6 +1567,5 @@ static void menuitem_response(gchar *string)
gtk_widget_show(calltree_menu_items); gtk_widget_show(calltree_menu_items);
DEBUG("%s", string); DEBUG("%s", string);
g_free(string);
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment