static gboolean route_list_transform_from_route (GBinding *binding, const GValue *source_value, GValue *target_value, gpointer user_data) { NmtRouteTable *table = NMT_ROUTE_TABLE (g_binding_get_source (binding)); NmtRouteTablePrivate *priv = NMT_ROUTE_TABLE_GET_PRIVATE (table); int n = GPOINTER_TO_INT (user_data); GPtrArray *routes; NMIPRoute *route; if (n >= priv->routes->len) return FALSE; route = priv->routes->pdata[n]; routes = priv->routes; priv->routes = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_route_unref); if (route) nm_ip_route_unref (route); routes->pdata[n] = g_value_dup_boxed (source_value); g_value_take_boxed (target_value, routes); return TRUE; }
void ip4_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIPConfig *s_ip4) { GtkBuilder *builder; GtkWidget *widget; GtkTreeModel *model; GtkTreeIter tree_iter; gboolean iter_valid; g_return_if_fail (dialog != NULL); g_return_if_fail (s_ip4 != NULL); builder = g_object_get_data (G_OBJECT (dialog), "builder"); g_return_if_fail (builder != NULL); g_return_if_fail (GTK_IS_BUILDER (builder)); widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip4_routes")); model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); iter_valid = gtk_tree_model_get_iter_first (model, &tree_iter); nm_setting_ip_config_clear_routes (s_ip4); while (iter_valid) { char *addr = NULL, *next_hop = NULL; guint32 prefix = 0; gint64 metric = -1; NMIPRoute *route; /* Address */ if (!utils_tree_model_get_address (model, &tree_iter, COL_ADDRESS, AF_INET, TRUE, &addr, NULL)) { g_warning ("%s: IPv4 address missing or invalid!", __func__); goto next; } /* Prefix */ if (!utils_tree_model_get_ip4_prefix (model, &tree_iter, COL_PREFIX, TRUE, &prefix, NULL)) { g_warning ("%s: IPv4 prefix/netmask missing or invalid!", __func__); g_free (addr); goto next; } /* Next hop (optional) */ if (!utils_tree_model_get_address (model, &tree_iter, COL_NEXT_HOP, AF_INET, FALSE, &next_hop, NULL)) { g_warning ("%s: IPv4 next hop invalid!", __func__); g_free (addr); goto next; } /* Metric (optional) */ if (!utils_tree_model_get_int64 (model, &tree_iter, COL_METRIC, 0, G_MAXUINT32, FALSE, &metric, NULL)) { g_warning ("%s: IPv4 metric invalid!", __func__); g_free (addr); g_free (next_hop); goto next; } route = nm_ip_route_new (AF_INET, addr, prefix, next_hop, metric, NULL); nm_setting_ip_config_add_route (s_ip4, route); nm_ip_route_unref (route); g_free (addr); g_free (next_hop); next: iter_valid = gtk_tree_model_iter_next (model, &tree_iter); } widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip4_ignore_auto_routes")); g_object_set (s_ip4, NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)), NULL); widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip4_never_default")); g_object_set (s_ip4, NM_SETTING_IP_CONFIG_NEVER_DEFAULT, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)), NULL); }