[network-manager-applet/th/vpn-service-info-bgo767197] c-e: allow one VPN plugin to create multiple "Add" entires
- From: Thomas Haller <thaller src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [network-manager-applet/th/vpn-service-info-bgo767197] c-e: allow one VPN plugin to create multiple "Add" entires
- Date: Mon, 6 Jun 2016 12:56:52 +0000 (UTC)
commit ab2cea41ef6135bf06816c4fe626532e7b0482ac
Author: Thomas Haller <thaller redhat com>
Date: Fri Jun 3 17:31:48 2016 +0200
c-e: allow one VPN plugin to create multiple "Add" entires
Previously already, one VPN plugin could edit connections with different
service-types, using aliases. That is for example used for nm-libreswan,
which supports both libreswan and openswan types.
However, in "Connection Add" one plugin could only create one entry
in the list of supported types. Thus, the vpn.service-type could
only be set to the main service-type, and one plugin could not create
different types.
Extend that, by allowing the VPN to specify that it supports adding
of connections also for alias types.
https://bugzilla.gnome.org/show_bug.cgi?id=767197
src/connection-editor/ce-new-connection.ui | 12 ++-
src/connection-editor/connection-helpers.c | 112 +++++++++++++++++++---------
src/connection-editor/vpn-helpers.c | 24 ++++++
src/connection-editor/vpn-helpers.h | 6 ++
4 files changed, 114 insertions(+), 40 deletions(-)
---
diff --git a/src/connection-editor/ce-new-connection.ui b/src/connection-editor/ce-new-connection.ui
index ec4a3c9..180a37e 100644
--- a/src/connection-editor/ce-new-connection.ui
+++ b/src/connection-editor/ce-new-connection.ui
@@ -4,14 +4,18 @@
<requires lib="gtk+" version="3.0"/>
<object class="GtkListStore" id="new_connection_combo_model">
<columns>
- <!-- column-name name -->
+ <!-- column-name name, COL_MARKUP -->
<column type="gchararray"/>
- <!-- column-name sensitive -->
+ <!-- column-name sensitive, COL_SENSITIVE -->
<column type="gboolean"/>
- <!-- column-name new_func -->
+ <!-- column-name new_func, COL_NEW_FUNC -->
<column type="gpointer"/>
- <!-- column-name vpn_plugin -->
+ <!-- column-name vpn_plugin, COL_VPN_PLUGIN -->
<column type="GObject"/>
+ <!-- column-name vpn_service_type, COL_VPN_SERVICE_TYPE -->
+ <column type="gchararray"/>
+ <!-- column-name vpn_is_alias, COL_VPN_IS_ALIAS -->
+ <column type="gboolean"/>
</columns>
</object>
<object class="GtkDialog" id="new_connection_type_dialog">
diff --git a/src/connection-editor/connection-helpers.c b/src/connection-editor/connection-helpers.c
index 9cc789c..3f93468 100644
--- a/src/connection-editor/connection-helpers.c
+++ b/src/connection-editor/connection-helpers.c
@@ -40,6 +40,8 @@
#define COL_SENSITIVE 1
#define COL_NEW_FUNC 2
#define COL_VPN_PLUGIN 3
+#define COL_VPN_SERVICE_TYPE 4
+#define COL_VPN_IS_ALIAS 5
static gint
sort_types (gconstpointer a, gconstpointer b)
@@ -141,8 +143,11 @@ combo_changed_cb (GtkComboBox *combo, gpointer user_data)
GtkLabel *label = GTK_LABEL (user_data);
GtkTreeModel *model;
GtkTreeIter iter;
- NMVpnEditorPlugin *plugin = NULL;
- char *description, *markup;
+ gs_unref_object NMVpnEditorPlugin *plugin = NULL;
+ gs_free char *service_type = NULL;
+ gs_free char *description = NULL;
+ gs_free char *markup = NULL;
+ gboolean is_alias;
if (!gtk_combo_box_get_active_iter (combo, &iter))
goto error;
@@ -151,19 +156,24 @@ combo_changed_cb (GtkComboBox *combo, gpointer user_data)
if (!model)
goto error;
- gtk_tree_model_get (model, &iter, COL_VPN_PLUGIN, &plugin, -1);
- if (!plugin)
+ gtk_tree_model_get (model, &iter,
+ COL_VPN_PLUGIN, &plugin,
+ COL_VPN_SERVICE_TYPE, &service_type,
+ COL_VPN_IS_ALIAS, &is_alias,
+ -1);
+ if (!plugin || !service_type)
goto error;
- g_object_get (G_OBJECT (plugin), NM_VPN_EDITOR_PLUGIN_DESCRIPTION, &description, NULL);
- g_object_unref (plugin);
+ if (is_alias)
+ nm_vpn_editor_plugin_get_service_info (plugin, service_type, NULL, &description, NULL);
+ else
+ g_object_get (G_OBJECT (plugin), NM_VPN_EDITOR_PLUGIN_DESCRIPTION, &description, NULL);
+
if (!description)
goto error;
markup = g_markup_printf_escaped ("<i>%s</i>", description);
gtk_label_set_markup (label, markup);
- g_free (markup);
- g_free (description);
return;
error:
@@ -171,6 +181,34 @@ error:
}
static void
+_combo_entry_add_vpn (GtkListStore *model,
+ GtkTreeIter *iter,
+ NMVpnEditorPlugin *plugin,
+ const char *service_type,
+ const char *name,
+ gboolean is_alias,
+ gboolean show_headers,
+ PageNewConnectionFunc new_connection_func)
+{
+ gs_free char *markup = NULL;
+
+ if (show_headers)
+ markup = g_markup_printf_escaped (" %s", name);
+ else
+ markup = g_markup_escape_text (name, -1);
+
+ gtk_list_store_append (model, iter);
+ gtk_list_store_set (model, iter,
+ COL_MARKUP, markup,
+ COL_SENSITIVE, TRUE,
+ COL_NEW_FUNC, new_connection_func,
+ COL_VPN_PLUGIN, plugin,
+ COL_VPN_SERVICE_TYPE, service_type,
+ COL_VPN_IS_ALIAS, is_alias,
+ -1);
+}
+
+static void
set_up_connection_type_combo (GtkComboBox *combo,
GtkLabel *description_label,
NewConnectionTypeFilterFunc type_filter_func,
@@ -259,24 +297,34 @@ set_up_connection_type_combo (GtkComboBox *combo,
}
for (p = vpn_plugins; p; p = p->next) {
- NMVpnEditorPlugin *plugin = nm_vpn_plugin_info_get_editor_plugin (p->data);
- char *desc;
+ NMVpnPluginInfo *plugin_info = p->data;
+ NMVpnEditorPlugin *plugin = nm_vpn_plugin_info_get_editor_plugin (plugin_info);
+ const char *const*aliases = nm_vpn_plugin_info_get_aliases (plugin_info);
+ gs_free char *p_service_type = NULL;
+ gs_free char *p_desc = NULL;
- g_object_get (plugin, NM_VPN_EDITOR_PLUGIN_NAME, &desc, NULL);
+ g_object_get (plugin, NM_VPN_EDITOR_PLUGIN_NAME, &p_desc, NULL);
+ g_object_get (plugin, NM_VPN_EDITOR_PLUGIN_SERVICE, &p_service_type, NULL);
- if (show_headers)
- markup = g_markup_printf_escaped (" %s", desc);
- else
- markup = g_markup_escape_text (desc, -1);
- gtk_list_store_append (model, &iter);
- gtk_list_store_set (model, &iter,
- COL_MARKUP, markup,
- COL_SENSITIVE, TRUE,
- COL_NEW_FUNC, list[vpn_index].new_connection_func,
- COL_VPN_PLUGIN, plugin,
- -1);
- g_free (markup);
- g_free (desc);
+ if (p_service_type && p_desc)
+ _combo_entry_add_vpn (model, &iter, plugin, p_service_type, p_desc, FALSE,
show_headers, list[vpn_index].new_connection_func);
+
+ aliases = nm_vpn_plugin_info_get_aliases (plugin_info);
+ for (; aliases && aliases[0]; aliases++) {
+ const char *service_type = aliases[0];
+ gs_free char *name = NULL;
+ guint flags;
+
+ if (!nm_vpn_editor_plugin_get_service_info (plugin, service_type, &name, NULL,
&flags))
+ continue;
+
+ if (!name)
+ continue;
+ if (!NM_FLAGS_HAS (flags, NM_VPN_EDITOR_PLUGIN_SERVICE_CAN_ADD))
+ continue;
+
+ _combo_entry_add_vpn (model, &iter, plugin, service_type, name, TRUE, show_headers,
list[vpn_index].new_connection_func);
+ }
if (nm_vpn_editor_plugin_get_capabilities (plugin) & NM_VPN_EDITOR_PLUGIN_CAPABILITY_IMPORT)
import_supported = TRUE;
@@ -389,8 +437,7 @@ new_connection_dialog_full (GtkWindow *parent_window,
GtkTreeIter iter;
int response;
PageNewConnectionFunc new_func = NULL;
- NMVpnEditorPlugin *plugin = NULL;
- char *vpn_type = NULL;
+ gs_free char *vpn_service_type = NULL;
GError *error = NULL;
/* load GUI */
@@ -425,24 +472,17 @@ new_connection_dialog_full (GtkWindow *parent_window,
gtk_combo_box_get_active_iter (combo, &iter);
gtk_tree_model_get (gtk_combo_box_get_model (combo), &iter,
COL_NEW_FUNC, &new_func,
- COL_VPN_PLUGIN, &plugin,
+ COL_VPN_SERVICE_TYPE, &vpn_service_type,
-1);
-
- if (plugin) {
- g_object_get (G_OBJECT (plugin), NM_VPN_EDITOR_PLUGIN_SERVICE, &vpn_type, NULL);
- g_object_unref (plugin);
- }
}
gtk_widget_destroy (GTK_WIDGET (type_dialog));
g_object_unref (gui);
- if (new_func)
- new_connection_of_type (parent_window, vpn_type, client, new_func, result_func, user_data);
+ if (new_func && vpn_service_type)
+ new_connection_of_type (parent_window, vpn_service_type, client, new_func, result_func,
user_data);
else
result_func (NULL, user_data);
-
- g_free (vpn_type);
}
typedef struct {
diff --git a/src/connection-editor/vpn-helpers.c b/src/connection-editor/vpn-helpers.c
index 35823c7..49bd93d 100644
--- a/src/connection-editor/vpn-helpers.c
+++ b/src/connection-editor/vpn-helpers.c
@@ -334,3 +334,27 @@ vpn_supports_ipv6 (NMConnection *connection)
capabilities = nm_vpn_editor_plugin_get_capabilities (plugin);
return (capabilities & NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6) != 0;
}
+
+gboolean
+nm_vpn_editor_plugin_get_service_info (NMVpnEditorPlugin *plugin,
+ const char *service_name,
+ char **out_name,
+ char **out_description,
+ guint *out_flags)
+{
+ gs_free char *name_dummy = NULL;
+ gs_free char *description_dummy = NULL;
+ guint flags_dummy = 0;
+
+ g_return_val_if_fail (NM_IS_VPN_EDITOR_PLUGIN (plugin), FALSE);
+ g_return_val_if_fail (service_name, FALSE);
+
+ return nm_vpn_editor_plugin_call (plugin,
+ NM_VPN_EDITOR_PLUGIN_CALL_GET_SERVICE_INFO,
+ NULL,
+ service_name,
+ out_name ?: &name_dummy,
+ out_description ?: &description_dummy,
+ out_flags ?: &flags_dummy);
+}
+
diff --git a/src/connection-editor/vpn-helpers.h b/src/connection-editor/vpn-helpers.h
index bc017fb..be64027 100644
--- a/src/connection-editor/vpn-helpers.h
+++ b/src/connection-editor/vpn-helpers.h
@@ -39,4 +39,10 @@ void vpn_export (NMConnection *connection);
gboolean vpn_supports_ipv6 (NMConnection *connection);
+gboolean nm_vpn_editor_plugin_get_service_info (NMVpnEditorPlugin *plugin,
+ const char *service_name,
+ char **out_name,
+ char **out_description,
+ guint *out_flags);
+
#endif /* _VPN_HELPERS_H_ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]