summaryrefslogtreecommitdiff
path: root/libnm-core/nm-dbus-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnm-core/nm-dbus-utils.c')
-rw-r--r--libnm-core/nm-dbus-utils.c186
1 files changed, 186 insertions, 0 deletions
diff --git a/libnm-core/nm-dbus-utils.c b/libnm-core/nm-dbus-utils.c
new file mode 100644
index 0000000000..107638dd35
--- /dev/null
+++ b/libnm-core/nm-dbus-utils.c
@@ -0,0 +1,186 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright 2013-2014 Red Hat, Inc.
+ */
+
+#include <config.h>
+
+#include "nm-dbus-utils.h"
+
+void
+_nm_dbus_check_name_has_owner (GDBusConnection *connection,
+ const gchar *name,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_dbus_connection_call (connection,
+ "org.freedesktop.DBus",
+ "/org/freedesktop/DBus",
+ "org.freedesktop.DBus",
+ "NameHasOwner",
+ g_variant_new ("(s)", name),
+ G_VARIANT_TYPE ("(b)"),
+ G_DBUS_CALL_FLAGS_NONE, -1,
+ cancellable,
+ callback, user_data);
+}
+
+gboolean
+_nm_dbus_check_name_has_owner_finish (GDBusConnection *connection,
+ GAsyncResult *result,
+ gboolean *has_owner,
+ GError **error)
+{
+ GVariant *ret;
+
+ ret = g_dbus_connection_call_finish (connection, result, error);
+ if (ret) {
+ g_variant_get (ret, "(b)", has_owner);
+ g_variant_unref (ret);
+ }
+
+ return ret != NULL;
+}
+
+gboolean
+_nm_dbus_check_name_has_owner_sync (GDBusConnection *connection,
+ const gchar *name,
+ gboolean *has_owner,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GVariant *ret;
+
+ ret = g_dbus_connection_call_sync (connection,
+ "org.freedesktop.DBus",
+ "/org/freedesktop/DBus",
+ "org.freedesktop.DBus",
+ "NameHasOwner",
+ g_variant_new ("(s)", name),
+ G_VARIANT_TYPE ("(b)"),
+ G_DBUS_CALL_FLAGS_NONE, -1,
+ cancellable, error);
+ if (ret) {
+ g_variant_get (ret, "(b)", has_owner);
+ g_variant_unref (ret);
+ }
+
+ return ret != NULL;
+}
+
+void
+_nm_dbus_request_name (GDBusConnection *connection,
+ const gchar *name,
+ guint flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_dbus_connection_call (connection,
+ "org.freedesktop.DBus",
+ "/org/freedesktop/DBus",
+ "org.freedesktop.DBus",
+ "RequestName",
+ g_variant_new ("(su)", name, flags),
+ G_VARIANT_TYPE ("(u)"),
+ G_DBUS_CALL_FLAGS_NONE, -1,
+ cancellable,
+ callback, user_data);
+}
+
+int
+_nm_dbus_request_name_finish (GDBusConnection *connection,
+ GAsyncResult *result,
+ GError **error)
+{
+ GVariant *ret;
+ guint code = 0;
+
+ ret = g_dbus_connection_call_finish (connection, result, error);
+ if (ret) {
+ g_variant_get (ret, "(u)", &code);
+ g_variant_unref (ret);
+ }
+
+ return code;
+}
+
+gboolean
+_nm_dbus_request_name_sync (GDBusConnection *connection,
+ const gchar *name,
+ guint flags,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GVariant *ret;
+ guint code = 0;
+
+ ret = g_dbus_connection_call_sync (connection,
+ "org.freedesktop.DBus",
+ "/org/freedesktop/DBus",
+ "org.freedesktop.DBus",
+ "RequestName",
+ g_variant_new ("(su)", name, flags),
+ G_VARIANT_TYPE ("(u)"),
+ G_DBUS_CALL_FLAGS_NONE, -1,
+ cancellable, error);
+ if (ret) {
+ g_variant_get (ret, "(u)", &code);
+ g_variant_unref (ret);
+ }
+
+ return code;
+}
+
+void
+_nm_dbus_register_error_domain (GQuark domain,
+ const char *interface,
+ GType enum_type)
+{
+ GEnumClass *enum_class;
+ GEnumValue *e;
+ char *error_name;
+ int i;
+
+ enum_class = g_type_class_ref (enum_type);
+ for (i = 0; i < enum_class->n_values; i++) {
+ e = &enum_class->values[i];
+ error_name = g_strdup_printf ("%s.%s", interface, e->value_nick);
+ g_dbus_error_register_error (domain, e->value, error_name);
+ g_free (error_name);
+ }
+
+ g_type_class_unref (enum_class);
+}
+
+
+void
+_nm_dbus_bind_properties (gpointer object, gpointer skeleton)
+{
+ GParamSpec **properties;
+ guint n_properties;
+ int i;
+
+ properties = g_object_class_list_properties (G_OBJECT_GET_CLASS (skeleton), &n_properties);
+ for (i = 0; i < n_properties; i++) {
+ g_object_bind_property (object, properties[i]->name,
+ skeleton, properties[i]->name,
+ G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+ }
+}