]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
nm: Split NM plugin and editor widget into separate libs
authorTobias Brunner <tobias@strongswan.org>
Wed, 20 Apr 2022 07:50:03 +0000 (09:50 +0200)
committerTobias Brunner <tobias@strongswan.org>
Mon, 16 May 2022 12:18:48 +0000 (14:18 +0200)
This will allow the plugin to load the editor widget matching the current
GTK version dynamically.

src/frontends/gnome/configure.ac
src/frontends/gnome/po/POTFILES.in
src/frontends/gnome/po/de.po
src/frontends/gnome/properties/Makefile.am
src/frontends/gnome/properties/nm-strongswan-plugin.c [new file with mode: 0644]
src/frontends/gnome/properties/nm-strongswan-plugin.h [new file with mode: 0644]
src/frontends/gnome/properties/nm-strongswan.c
src/frontends/gnome/properties/nm-strongswan.h

index 61a9422313ba24edcadcc71a2369f49ece57e0a3..7684f8a0857580c50d50bb18d8944b25952fcf9c 100644 (file)
@@ -37,6 +37,9 @@ AC_PROG_GCC_TRADITIONAL
 AC_FUNC_MEMCMP
 AC_CHECK_FUNCS(select socket uname)
 
+AC_SEARCH_LIBS([dlopen], [dl dld], [], [ac_cv_search_dlopen=])
+AC_SUBST([DL_LIBS], "$ac_cv_search_dlopen")
+
 GETTEXT_PACKAGE=NetworkManager-strongswan
 AC_SUBST(GETTEXT_PACKAGE)
 AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package])
index 1b05c101e5745df197ea4246622677b18d3134d6..f35860687980d478ec1bb3878577961238e7c06e 100644 (file)
@@ -1,5 +1,6 @@
 # List of source files containing translatable strings.
 # Please keep this file sorted alphabetically.
+properties/nm-strongswan-plugin.c
 properties/nm-strongswan.c
 [type: gettext/glade]properties/nm-strongswan-dialog.ui
 auth-dialog/main.c
index c41c9340891697f69343de5e2640869bfa5f292a..fbb8da01a4318a2e779f2fdd8f82fbd1877ad11a 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: NetworkManager-strongswan\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-04-19 17:33+0200\n"
+"POT-Creation-Date: 2022-04-20 17:19+0200\n"
 "PO-Revision-Date: 2019-12-18 17:10+0100\n"
 "Last-Translator: Tobias Brunner\n"
 "Language-Team: de <info@strongswan.org>\n"
@@ -17,43 +17,67 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../properties/nm-strongswan.c:35
+#: ../properties/nm-strongswan-plugin.c:36
 msgid "IPsec/IKEv2 (strongswan)"
 msgstr "IPsec/IKEv2 (strongswan)"
 
-#: ../properties/nm-strongswan.c:36
+#: ../properties/nm-strongswan-plugin.c:37
 msgid "IPsec with the IKEv2 key exchange protocol."
 msgstr "IPsec mit dem IKEv2 Protokoll."
 
-#: ../properties/nm-strongswan.c:273
+#: ../properties/nm-strongswan-plugin.c:80
+#, c-format
+msgid "unable to determine plugin path: %s"
+msgstr "Plugin-Pfad konnte nicht ermittelt werden: %s"
+
+#: ../properties/nm-strongswan-plugin.c:93
+#, c-format
+msgid "missing plugin file '%s'"
+msgstr "Plugin-Datei '%s' fehlt"
+
+#: ../properties/nm-strongswan-plugin.c:98
+#, c-format
+msgid "unable to load editor plugin: %s"
+msgstr "Laden des Editor-Plugins fehlgeschlagen: %s"
+
+#: ../properties/nm-strongswan-plugin.c:108
+#, c-format
+msgid "cannot load factory %s from plugin: %s"
+msgstr "Factory %s konnte nicht aus Plugin geladen werden: %s"
+
+#: ../properties/nm-strongswan-plugin.c:124
+msgid "unknown error creating editor instance"
+msgstr "Unbekannter Fehler beim Erstellen der Editor-Instanz"
+
+#: ../properties/nm-strongswan.c:255
 msgid "(None)"
 msgstr "(Nicht festgelegt)"
 
-#: ../properties/nm-strongswan.c:438
+#: ../properties/nm-strongswan.c:420
 msgid "EAP (Username/Password)"
 msgstr "EAP (Benutzername/Passwort)"
 
-#: ../properties/nm-strongswan.c:439
+#: ../properties/nm-strongswan.c:421
 msgid "Certificate"
 msgstr "Zertifikat"
 
-#: ../properties/nm-strongswan.c:440
+#: ../properties/nm-strongswan.c:422
 msgid "EAP-TLS"
 msgstr "EAP-TLS"
 
-#: ../properties/nm-strongswan.c:441
+#: ../properties/nm-strongswan.c:423
 msgid "Pre-shared key"
 msgstr "Pre-shared Key"
 
-#: ../properties/nm-strongswan.c:467
+#: ../properties/nm-strongswan.c:449
 msgid "Certificate/private key"
 msgstr "Zertifikat/Privater Schlüssel"
 
-#: ../properties/nm-strongswan.c:468
+#: ../properties/nm-strongswan.c:450
 msgid "Certificate/ssh-agent"
 msgstr "Zertifikat/ssh-agent"
 
-#: ../properties/nm-strongswan.c:469
+#: ../properties/nm-strongswan.c:451
 msgid "Smartcard"
 msgstr "Smartcard"
 
index 0b4ccd77efe4eeb82439a24e620d3bc5c734655a..5c694522258edf11a5a78a95d6bf980b2df2500f 100644 (file)
@@ -1,4 +1,6 @@
-nm_plugin_LTLIBRARIES = libnm-vpn-plugin-strongswan.la
+nm_plugin_LTLIBRARIES = \
+       libnm-vpn-plugin-strongswan.la \
+       libnm-vpn-plugin-strongswan-editor.la
 
 nm-strongswan-resources.h: nm-strongswan-dialog.gresource.xml
        $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir) \
@@ -8,25 +10,37 @@ nm-strongswan-resources.c: nm-strongswan-dialog.gresource.xml $(shell $(GLIB_COM
        $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir) \
                --generate-source --internal
 
-nodist_libnm_vpn_plugin_strongswan_la_SOURCES = \
+libnm_vpn_plugin_strongswan_la_SOURCES = \
+       nm-strongswan-plugin.c \
+       nm-strongswan-plugin.h
+
+nodist_libnm_vpn_plugin_strongswan_editor_la_SOURCES = \
        nm-strongswan-resources.c \
        nm-strongswan-resources.h
 
-libnm_vpn_plugin_strongswan_la_SOURCES = \
+libnm_vpn_plugin_strongswan_editor_la_SOURCES = \
        nm-strongswan.c \
        nm-strongswan.h
 
 common_CFLAGS = \
-       $(GTK_CFLAGS) \
        -DG_DISABLE_DEPRECATED \
        -DGDK_DISABLE_DEPRECATED
 
 libnm_vpn_plugin_strongswan_la_CFLAGS = \
+       $(LIBNM_CFLAGS) \
+       $(common_CFLAGS)
+
+libnm_vpn_plugin_strongswan_editor_la_CFLAGS = \
+       $(GTK_CFLAGS) \
        $(LIBNM_CFLAGS) \
        $(LIBNMA_CFLAGS) \
        $(common_CFLAGS)
 
 libnm_vpn_plugin_strongswan_la_LIBADD = \
+       $(LIBNM_LIBS) \
+       $(DL_LIBS)
+
+libnm_vpn_plugin_strongswan_editor_la_LIBADD = \
        $(GTK_LIBS) \
        $(LIBNMA_LIBS) \
        $(LIBNM_LIBS)
@@ -34,6 +48,9 @@ libnm_vpn_plugin_strongswan_la_LIBADD = \
 libnm_vpn_plugin_strongswan_la_LDFLAGS = \
        -avoid-version
 
+libnm_vpn_plugin_strongswan_editor_la_LDFLAGS = \
+       -avoid-version
+
 BUILT_SOURCES = \
        nm-strongswan-resources.c \
        nm-strongswan-resources.h
diff --git a/src/frontends/gnome/properties/nm-strongswan-plugin.c b/src/frontends/gnome/properties/nm-strongswan-plugin.c
new file mode 100644 (file)
index 0000000..611eb4b
--- /dev/null
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2013-2020 Tobias Brunner
+ * Copyright (C) 2008 Martin Willi
+ * HSR Hochschule fuer Technik Rapperswil
+ * Copyright (C) 2015 Lubomir Rintel
+ * Copyright (C) 2005 David Zeuthen
+ * Copyright (C) 2005-2008 Dan Williams
+ *
+ * Based on NetworkManager's vpnc plugin
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _GNU_SOURCE
+#include <dlfcn.h>
+
+#include <glib.h>
+#include <glib/gi18n-lib.h>
+
+#include <NetworkManager.h>
+
+#include "nm-strongswan-plugin.h"
+
+#define STRONGSWAN_PLUGIN_NAME    _("IPsec/IKEv2 (strongswan)")
+#define STRONGSWAN_PLUGIN_DESC    _("IPsec with the IKEv2 key exchange protocol.")
+#define STRONGSWAN_PLUGIN_SERVICE "org.freedesktop.NetworkManager.strongswan"
+#define STRONGSWAN_EDITOR_FILE    "libnm-vpn-plugin-strongswan-editor.so"
+#define STRONGSWAN_EDITOR_FACTORY "strongswan_editor_new"
+
+/************** plugin class **************/
+
+enum {
+       PROP_0,
+       PROP_NAME,
+       PROP_DESC,
+       PROP_SERVICE
+};
+
+static void strongswan_plugin_ui_interface_init (NMVpnEditorPluginInterface *iface_class);
+
+G_DEFINE_TYPE_EXTENDED (StrongswanPluginUi, strongswan_plugin_ui, G_TYPE_OBJECT, 0,
+                                               G_IMPLEMENT_INTERFACE (NM_TYPE_VPN_EDITOR_PLUGIN,
+                                                                                          strongswan_plugin_ui_interface_init))
+
+static NMVpnEditor *
+get_editor (NMVpnEditorPlugin *iface, NMConnection *connection, GError **error)
+{
+       static struct {
+               NMVpnEditor *(*factory)(NMConnection*, GError**);
+               void *dl_module;
+       } cache = {};
+       NMVpnEditor *editor;
+
+       g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
+       g_return_val_if_fail (!error || !*error, NULL);
+
+       if (!cache.factory)
+       {
+               Dl_info plugin_info;
+               void *dl_module;
+               char *module_path = NULL;
+               char *dirname = NULL;
+               NMVpnEditor *(*factory)(NMConnection*, GError**);
+
+               if (!dladdr(get_editor, &plugin_info))
+               {
+                       g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED,
+                                                _("unable to determine plugin path: %s"), dlerror());
+                       return NULL;
+               }
+               dirname = g_path_get_dirname (plugin_info.dli_fname);
+               module_path = g_build_filename (dirname, STRONGSWAN_EDITOR_FILE, NULL);
+               g_free(dirname);
+
+               dl_module = dlopen(module_path, RTLD_LAZY | RTLD_LOCAL);
+               if (!dl_module)
+               {
+                       if (!g_file_test (module_path, G_FILE_TEST_EXISTS))
+                       {
+                               g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT,
+                                                        _("missing plugin file '%s'"), module_path);
+                               g_free(module_path);
+                               return NULL;
+                       }
+                       g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED,
+                                                _("unable to load editor plugin: %s"), dlerror ());
+                       g_free(module_path);
+                       return NULL;
+               }
+               g_free(module_path);
+
+               factory = dlsym (dl_module, STRONGSWAN_EDITOR_FACTORY);
+               if (!factory)
+               {
+                       g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED,
+                                                _("cannot load factory %s from plugin: %s"),
+                                                STRONGSWAN_EDITOR_FACTORY, dlerror ());
+                       dlclose (dl_module);
+                       return NULL;
+               }
+               cache.factory = factory;
+               cache.dl_module = dl_module;
+       }
+
+       editor = cache.factory (connection, error);
+       if (!editor)
+       {
+               if (error && !*error)
+               {
+                       g_set_error_literal (error, NM_VPN_PLUGIN_ERROR,
+                                                                NM_VPN_PLUGIN_ERROR_FAILED,
+                                                                _("unknown error creating editor instance"));
+                       return NULL;
+               }
+               return NULL;
+       }
+       g_return_val_if_fail (NM_IS_VPN_EDITOR (editor), NULL);
+       return editor;
+}
+
+static guint32
+get_capabilities (NMVpnEditorPlugin *iface)
+{
+       return NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6;
+}
+
+static void
+get_property (GObject *object, guint prop_id,
+                         GValue *value, GParamSpec *pspec)
+{
+       switch (prop_id) {
+       case PROP_NAME:
+               g_value_set_string (value, STRONGSWAN_PLUGIN_NAME);
+               break;
+       case PROP_DESC:
+               g_value_set_string (value, STRONGSWAN_PLUGIN_DESC);
+               break;
+       case PROP_SERVICE:
+               g_value_set_string (value, STRONGSWAN_PLUGIN_SERVICE);
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+               break;
+       }
+}
+
+static void
+strongswan_plugin_ui_class_init (StrongswanPluginUiClass *req_class)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (req_class);
+
+       object_class->get_property = get_property;
+
+       g_object_class_override_property (object_class,
+                                                                         PROP_NAME,
+                                                                         NM_VPN_EDITOR_PLUGIN_NAME);
+
+       g_object_class_override_property (object_class,
+                                                                         PROP_DESC,
+                                                                         NM_VPN_EDITOR_PLUGIN_DESCRIPTION);
+
+       g_object_class_override_property (object_class,
+                                                                         PROP_SERVICE,
+                                                                         NM_VPN_EDITOR_PLUGIN_SERVICE);
+}
+
+static void
+strongswan_plugin_ui_init (StrongswanPluginUi *plugin)
+{
+}
+
+static void
+strongswan_plugin_ui_interface_init (NMVpnEditorPluginInterface *iface_class)
+{
+       /* interface implementation */
+       iface_class->get_editor = get_editor;
+       iface_class->get_capabilities = get_capabilities;
+       /* TODO: implement delete_connection to purge associated secrets */
+}
+
+G_MODULE_EXPORT NMVpnEditorPlugin *
+nm_vpn_editor_plugin_factory (GError **error)
+{
+       g_return_val_if_fail (!error || !*error, NULL);
+
+       return g_object_new (STRONGSWAN_TYPE_PLUGIN_UI, NULL);
+}
diff --git a/src/frontends/gnome/properties/nm-strongswan-plugin.h b/src/frontends/gnome/properties/nm-strongswan-plugin.h
new file mode 100644 (file)
index 0000000..e2a5503
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2008 Martin Willi
+ * HSR Hochschule fuer Technik Rapperswil
+ * Copyright (C) 2008 Dan Williams
+ *
+ * Based on NetworkManager's vpnc plugin
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ */
+
+#ifndef _NM_STRONGSWAN_PLUGIN_H_
+#define _NM_STRONGSWAN_PLUGIN_H_
+
+#include <glib-object.h>
+
+#define STRONGSWAN_TYPE_PLUGIN_UI            (strongswan_plugin_ui_get_type ())
+#define STRONGSWAN_PLUGIN_UI(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), STRONGSWAN_TYPE_PLUGIN_UI, StrongswanPluginUi))
+#define STRONGSWAN_PLUGIN_UI_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), STRONGSWAN_TYPE_PLUGIN_UI, StrongswanPluginUiClass))
+#define STRONGSWAN_IS_PLUGIN_UI(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STRONGSWAN_TYPE_PLUGIN_UI))
+#define STRONGSWAN_IS_PLUGIN_UI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), STRONGSWAN_TYPE_PLUGIN_UI))
+#define STRONGSWAN_PLUGIN_UI_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), STRONGSWAN_TYPE_PLUGIN_UI, StrongswanPluginUiClass))
+
+typedef struct _StrongswanPluginUi StrongswanPluginUi;
+typedef struct _StrongswanPluginUiClass StrongswanPluginUiClass;
+
+struct _StrongswanPluginUi {
+       GObject parent;
+};
+
+struct _StrongswanPluginUiClass {
+       GObjectClass parent;
+};
+
+GType strongswan_plugin_ui_get_type (void);
+
+#endif /* _NM_STRONGSWAN_PLUGIN_H_ */
index ff2449a29103cd9edf1c11d31437e8dadd641e3f..2976f87d3517f3559d788f9b8621ec87e62e2144 100644 (file)
 
 #include "nm-strongswan.h"
 
-#define STRONGSWAN_PLUGIN_NAME    _("IPsec/IKEv2 (strongswan)")
-#define STRONGSWAN_PLUGIN_DESC    _("IPsec with the IKEv2 key exchange protocol.")
-#define STRONGSWAN_PLUGIN_SERVICE "org.freedesktop.NetworkManager.strongswan"
 #define NM_DBUS_SERVICE_STRONGSWAN "org.freedesktop.NetworkManager.strongswan"
 #define NM_DBUS_PATH_STRONGSWAN    "/org/freedesktop/NetworkManager/strongswan"
 #define STRONGSWAN_UI_RESOURCE     NM_DBUS_PATH_STRONGSWAN "/nm-strongswan-dialog.ui"
 
-/************** plugin class **************/
-
-enum {
-       PROP_0,
-       PROP_NAME,
-       PROP_DESC,
-       PROP_SERVICE
-};
-
-static void strongswan_plugin_ui_interface_init (NMVpnEditorPluginInterface *iface_class);
-
-G_DEFINE_TYPE_EXTENDED (StrongswanPluginUi, strongswan_plugin_ui, G_TYPE_OBJECT, 0,
-                                               G_IMPLEMENT_INTERFACE (NM_TYPE_VPN_EDITOR_PLUGIN,
-                                                                                          strongswan_plugin_ui_interface_init))
-
 /************** UI widget class **************/
 
 static void strongswan_plugin_ui_widget_interface_init (NMVpnEditorInterface *iface_class);
@@ -749,49 +731,6 @@ update_connection (NMVpnEditor *iface,
        return TRUE;
 }
 
-static NMVpnEditor *
-nm_vpn_plugin_ui_widget_interface_new (NMConnection *connection, GError **error)
-{
-       NMVpnEditor *object;
-       StrongswanPluginUiWidgetPrivate *priv;
-
-       if (error)
-               g_return_val_if_fail (*error == NULL, NULL);
-
-       object = g_object_new (STRONGSWAN_TYPE_PLUGIN_UI_WIDGET, NULL);
-       if (!object) {
-               g_set_error (error, STRONGSWAN_PLUGIN_UI_ERROR, 0, "could not create strongswan object");
-               return NULL;
-       }
-
-       priv = STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE ((StrongswanPluginUiWidget*)object);
-       priv->builder = gtk_builder_new ();
-
-       gtk_builder_set_translation_domain (priv->builder, GETTEXT_PACKAGE);
-
-       if (!gtk_builder_add_from_resource (priv->builder, STRONGSWAN_UI_RESOURCE, error)) {
-               g_warning ("Couldn't load builder file: %s",
-                          error && *error ? (*error)->message : "(unknown)");
-               g_object_unref (object);
-               return NULL;
-       }
-
-       priv->widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "strongswan-vbox")    );
-       if (!priv->widget) {
-               g_set_error (error, STRONGSWAN_PLUGIN_UI_ERROR, 0, "could not load UI widget");
-               g_object_unref (object);
-               return NULL;
-       }
-       g_object_ref_sink (priv->widget);
-
-       if (!init_plugin_ui (STRONGSWAN_PLUGIN_UI_WIDGET (object), connection, error)) {
-               g_object_unref (object);
-               return NULL;
-       }
-
-       return object;
-}
-
 static void
 dispose (GObject *object)
 {
@@ -832,78 +771,45 @@ strongswan_plugin_ui_widget_interface_init (NMVpnEditorInterface *iface_class)
        iface_class->update_connection = update_connection;
 }
 
-static guint32
-get_capabilities (NMVpnEditorPlugin *iface)
+NMVpnEditor *
+strongswan_editor_new (NMConnection *connection, GError **error)
 {
-       return NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6;
-}
+       NMVpnEditor *object;
+       StrongswanPluginUiWidgetPrivate *priv;
 
-static NMVpnEditor *
-get_editor (NMVpnEditorPlugin *iface, NMConnection *connection, GError **error)
-{
-       return nm_vpn_plugin_ui_widget_interface_new (connection, error);
-}
+       if (error)
+               g_return_val_if_fail (*error == NULL, NULL);
 
-static void
-get_property (GObject *object, guint prop_id,
-                         GValue *value, GParamSpec *pspec)
-{
-       switch (prop_id) {
-       case PROP_NAME:
-               g_value_set_string (value, STRONGSWAN_PLUGIN_NAME);
-               break;
-       case PROP_DESC:
-               g_value_set_string (value, STRONGSWAN_PLUGIN_DESC);
-               break;
-       case PROP_SERVICE:
-               g_value_set_string (value, STRONGSWAN_PLUGIN_SERVICE);
-               break;
-       default:
-               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-               break;
+       object = g_object_new (STRONGSWAN_TYPE_PLUGIN_UI_WIDGET, NULL);
+       if (!object) {
+               g_set_error (error, STRONGSWAN_PLUGIN_UI_ERROR, 0, "could not create strongswan object");
+               return NULL;
        }
-}
 
-static void
-strongswan_plugin_ui_class_init (StrongswanPluginUiClass *req_class)
-{
-       GObjectClass *object_class = G_OBJECT_CLASS (req_class);
-
-       object_class->get_property = get_property;
-
-       g_object_class_override_property (object_class,
-                                                                         PROP_NAME,
-                                                                         NM_VPN_EDITOR_PLUGIN_NAME);
-
-       g_object_class_override_property (object_class,
-                                                                         PROP_DESC,
-                                                                         NM_VPN_EDITOR_PLUGIN_DESCRIPTION);
-
-       g_object_class_override_property (object_class,
-                                                                         PROP_SERVICE,
-                                                                         NM_VPN_EDITOR_PLUGIN_SERVICE);
-}
+       priv = STRONGSWAN_PLUGIN_UI_WIDGET_GET_PRIVATE ((StrongswanPluginUiWidget*)object);
+       priv->builder = gtk_builder_new ();
 
-static void
-strongswan_plugin_ui_init (StrongswanPluginUi *plugin)
-{
-}
+       gtk_builder_set_translation_domain (priv->builder, GETTEXT_PACKAGE);
 
-static void
-strongswan_plugin_ui_interface_init (NMVpnEditorPluginInterface *iface_class)
-{
-       /* interface implementation */
-       iface_class->get_editor = get_editor;
-       iface_class->get_capabilities = get_capabilities;
-       /* TODO: implement delete_connection to purge associated secrets */
-}
+       if (!gtk_builder_add_from_resource (priv->builder, STRONGSWAN_UI_RESOURCE, error)) {
+               g_warning ("Couldn't load builder file: %s",
+                          error && *error ? (*error)->message : "(unknown)");
+               g_object_unref (object);
+               return NULL;
+       }
 
+       priv->widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "strongswan-vbox")    );
+       if (!priv->widget) {
+               g_set_error (error, STRONGSWAN_PLUGIN_UI_ERROR, 0, "could not load UI widget");
+               g_object_unref (object);
+               return NULL;
+       }
+       g_object_ref_sink (priv->widget);
 
-G_MODULE_EXPORT NMVpnEditorPlugin *
-nm_vpn_editor_plugin_factory (GError **error)
-{
-       if (error)
-               g_return_val_if_fail (*error == NULL, NULL);
+       if (!init_plugin_ui (STRONGSWAN_PLUGIN_UI_WIDGET (object), connection, error)) {
+               g_object_unref (object);
+               return NULL;
+       }
 
-       return g_object_new (STRONGSWAN_TYPE_PLUGIN_UI, NULL);
+       return object;
 }
index 629fbd439d0f701fc5e654c16d917a8371ac666b..2068609a826f5cb3ae17172db8f45b0f7db20dc9 100644 (file)
@@ -31,27 +31,6 @@ typedef enum
 #define STRONGSWAN_TYPE_PLUGIN_UI_ERROR (strongswan_plugin_ui_error_get_type ())
 GType strongswan_plugin_ui_error_get_type (void);
 
-#define STRONGSWAN_TYPE_PLUGIN_UI            (strongswan_plugin_ui_get_type ())
-#define STRONGSWAN_PLUGIN_UI(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), STRONGSWAN_TYPE_PLUGIN_UI, StrongswanPluginUi))
-#define STRONGSWAN_PLUGIN_UI_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), STRONGSWAN_TYPE_PLUGIN_UI, StrongswanPluginUiClass))
-#define STRONGSWAN_IS_PLUGIN_UI(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STRONGSWAN_TYPE_PLUGIN_UI))
-#define STRONGSWAN_IS_PLUGIN_UI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), STRONGSWAN_TYPE_PLUGIN_UI))
-#define STRONGSWAN_PLUGIN_UI_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), STRONGSWAN_TYPE_PLUGIN_UI, StrongswanPluginUiClass))
-
-typedef struct _StrongswanPluginUi StrongswanPluginUi;
-typedef struct _StrongswanPluginUiClass StrongswanPluginUiClass;
-
-struct _StrongswanPluginUi {
-       GObject parent;
-};
-
-struct _StrongswanPluginUiClass {
-       GObjectClass parent;
-};
-
-GType strongswan_plugin_ui_get_type (void);
-
-
 #define STRONGSWAN_TYPE_PLUGIN_UI_WIDGET            (strongswan_plugin_ui_widget_get_type ())
 #define STRONGSWAN_PLUGIN_UI_WIDGET(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), STRONGSWAN_TYPE_PLUGIN_UI_WIDGET, StrongswanPluginUiWidget))
 #define STRONGSWAN_PLUGIN_UI_WIDGET_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), STRONGSWAN_TYPE_PLUGIN_UI_WIDGET, StrongswanPluginUiWidgetClass))
@@ -72,5 +51,6 @@ struct _StrongswanPluginUiWidgetClass {
 
 GType strongswan_plugin_ui_widget_get_type (void);
 
-#endif /* _NM_STRONGSWAN_H_ */
+NMVpnEditor *strongswan_editor_new (NMConnection *connection, GError **error);
 
+#endif /* _NM_STRONGSWAN_H_ */