summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2015-02-18 15:36:32 -0600
committerDan Williams <dcbw@redhat.com>2015-02-25 13:09:22 -0600
commit43f0b5a4249a85e20b6fc4d3176d789cfe929b77 (patch)
tree18bb551de5d82745e523133944e211f730d30f38
parent0071ae721db37ef543391a24d8d3217261fd08b5 (diff)
downloadnetwork-manager-applet-43f0b5a4249a85e20b6fc4d3176d789cfe929b77.tar.gz
editor: convert firewall zones retrieval to GDBus
-rw-r--r--src/connection-editor/page-general.c97
1 files changed, 64 insertions, 33 deletions
diff --git a/src/connection-editor/page-general.c b/src/connection-editor/page-general.c
index 9e62505e..9924620f 100644
--- a/src/connection-editor/page-general.c
+++ b/src/connection-editor/page-general.c
@@ -22,7 +22,6 @@
#include <gtk/gtk.h>
#include <glib/gi18n.h>
-#include <dbus/dbus-glib.h>
#include "page-general.h"
#include "nm-glib-compat.h"
@@ -36,6 +35,8 @@ typedef struct {
gboolean is_vpn;
+ GDBusProxy *fw_proxy;
+ GCancellable *cancellable;
GtkComboBoxText *firewall_zone;
char **zones;
gboolean got_zones;
@@ -64,54 +65,69 @@ enum {
static void populate_firewall_zones_ui (CEPageGeneral *self);
static void
-zones_reply (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data)
+get_zones_cb (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
{
- CEPageGeneral *self = user_data;
- CEPageGeneralPrivate *priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
+ CEPageGeneral *self;
+ CEPageGeneralPrivate *priv;
+ GVariant *variant = NULL;
GError *error = NULL;
- if (!dbus_g_proxy_end_call (proxy, call, &error,
- G_TYPE_STRV, &priv->zones,
- G_TYPE_INVALID)) {
- g_warning ("Failed to get zones from FirewallD: (%d) %s", error->code, error->message);
+ variant = g_dbus_proxy_call_finish (proxy, result, &error);
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ g_clear_error (&error);
+ return;
}
- priv->got_zones = TRUE;
+ self = CE_PAGE_GENERAL (user_data);
+ priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
+ if (variant) {
+ if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("(as)")))
+ g_variant_get (variant, "(^as)", &priv->zones);
+ else {
+ g_warning ("Failed to get zones from FirewallD: invalid reply type '%s'",
+ g_variant_get_type_string (variant));
+ }
+ } else if (!g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_SERVICE_UNKNOWN))
+ g_warning ("Failed to get zones from FirewallD: %s", error->message);
+
+ priv->got_zones = TRUE;
if (priv->setup_finished)
populate_firewall_zones_ui (self);
g_clear_error (&error);
- g_object_unref (proxy);
+ g_variant_unref (variant);
+ g_clear_object (&priv->cancellable);
+ g_clear_object (&priv->fw_proxy);
}
-/* Get FirewallD zones */
static void
-get_zones_from_firewall (CEPageGeneral *self)
+on_fw_proxy_acquired (GObject *object, GAsyncResult *result, gpointer user_data)
{
- CEPageGeneralPrivate *priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
- DBusGConnection *bus;
- DBusGProxy *proxy;
+ CEPageGeneral *self;
+ CEPageGeneralPrivate *priv;
+ GError *error = NULL;
+ GDBusProxy *proxy;
- /* Initialize got_zones to TRUE for cases there's no FirewallD */
- priv->got_zones = TRUE;
+ proxy = g_dbus_proxy_new_for_bus_finish (result, &error);
+ if (!proxy) {
+ g_warning ("Failed to get FirewallD proxy: %s", error->message);
+ g_clear_error (&error);
+ return;
+ }
- bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL);
- if (bus) {
- proxy = dbus_g_proxy_new_for_name (bus,
- "org.fedoraproject.FirewallD1",
- "/org/fedoraproject/FirewallD1",
- "org.fedoraproject.FirewallD1.zone");
- /* Call getZones to get list of available FirewallD zones */
- if (proxy) {
- dbus_g_proxy_begin_call (proxy, "getZones",
- zones_reply, self, NULL,
- G_TYPE_INVALID);
- priv->got_zones = FALSE;
- }
+ self = CE_PAGE_GENERAL (user_data);
+ priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
- dbus_g_connection_unref (bus);
- }
+ priv->fw_proxy = proxy;
+ g_dbus_proxy_call (priv->fw_proxy,
+ "getZones",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ priv->cancellable,
+ (GAsyncReadyCallback) get_zones_cb,
+ self);
}
static void
@@ -132,7 +148,16 @@ general_private_init (CEPageGeneral *self)
gtk_widget_show_all (GTK_WIDGET (priv->firewall_zone));
/* Get zones from FirewallD */
- get_zones_from_firewall (self);
+ priv->cancellable = g_cancellable_new ();
+ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.fedoraproject.FirewallD1",
+ "/org/fedoraproject/FirewallD1",
+ "org.fedoraproject.FirewallD1.zone",
+ priv->cancellable,
+ (GAsyncReadyCallback) on_fw_proxy_acquired,
+ self);
/* Set mnemonic widget for device Firewall zone label */
label = GTK_LABEL (gtk_builder_get_object (builder, "firewall_zone_label"));
@@ -152,6 +177,12 @@ dispose (GObject *object)
{
CEPageGeneralPrivate *priv = CE_PAGE_GENERAL_GET_PRIVATE (object);
+ if (priv->cancellable) {
+ g_cancellable_cancel (priv->cancellable);
+ g_clear_object (&priv->cancellable);
+ }
+ g_clear_object (&priv->fw_proxy);
+
g_clear_pointer (&priv->zones, g_strfreev);
G_OBJECT_CLASS (ce_page_general_parent_class)->dispose (object);