diff options
author | Bastien Nocera <hadess@hadess.net> | 2013-10-10 19:19:44 +0200 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2013-10-14 10:42:56 +0200 |
commit | 5adf4c1e20c51bf465fe818ec85d572c000a20f1 (patch) | |
tree | 47a643ac516a1c2dc87c668c630d41ba7b5b9469 /libupower-glib | |
parent | b989cad776c5d621761e3c093bcc3cb46ada00a3 (diff) | |
download | upower-5adf4c1e20c51bf465fe818ec85d572c000a20f1.tar.gz |
lib: Port UpWakeUps to GDBus
Using the new proxy.
Diffstat (limited to 'libupower-glib')
-rw-r--r-- | libupower-glib/up-wakeups.c | 224 |
1 files changed, 64 insertions, 160 deletions
diff --git a/libupower-glib/up-wakeups.c b/libupower-glib/up-wakeups.c index 3c59ab8..c4dfec8 100644 --- a/libupower-glib/up-wakeups.c +++ b/libupower-glib/up-wakeups.c @@ -23,10 +23,10 @@ #include <stdlib.h> #include <stdio.h> -#include <glib.h> -#include <dbus/dbus-glib.h> +#include <glib-object.h> #include "up-wakeups.h" +#include "up-wakeups-glue.h" static void up_wakeups_class_init (UpWakeupsClass *klass); static void up_wakeups_init (UpWakeups *wakeups); @@ -36,11 +36,7 @@ static void up_wakeups_finalize (GObject *object); struct UpWakeupsPrivate { - DBusGConnection *bus; - DBusGProxy *proxy; - DBusGProxy *prop_proxy; - gboolean has_capability; - gboolean have_properties; + UpWakeupsGlue *proxy; }; enum { @@ -70,27 +66,17 @@ up_wakeups_get_total_sync (UpWakeups *wakeups, GCancellable *cancellable, GError { guint total = 0; gboolean ret; - GError *error_local = NULL; g_return_val_if_fail (UP_IS_WAKEUPS (wakeups), FALSE); g_return_val_if_fail (wakeups->priv->proxy != NULL, FALSE); - ret = dbus_g_proxy_call (wakeups->priv->proxy, "GetTotal", &error_local, - G_TYPE_INVALID, - G_TYPE_UINT, &total, - G_TYPE_INVALID); - if (!ret) { - g_warning ("Couldn't get total: %s", error_local->message); - g_set_error (error, 1, 0, "%s", error_local->message); - g_error_free (error_local); - } + ret = up_wakeups_glue_call_get_total_sync (wakeups->priv->proxy, &total, + cancellable, error); + if (!ret) + total = 0; return total; } -/* FIXME: GValueArray is deprecated in GLib 2.33+, but we need to convert to - * GDBus to get rid of it */ -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" - /** * up_wakeups_get_data_sync: * @wakeups: a #UpWakeups instance. @@ -107,32 +93,22 @@ GPtrArray * up_wakeups_get_data_sync (UpWakeups *wakeups, GCancellable *cancellable, GError **error) { GError *error_local = NULL; - GType g_type_gvalue_array; - GPtrArray *gvalue_ptr_array = NULL; - GValueArray *gva; - GValue *gv; + GVariant *gva; guint i; - UpWakeupItem *item; GPtrArray *array = NULL; gboolean ret; + gsize len; + GVariantIter *iter; g_return_val_if_fail (UP_IS_WAKEUPS (wakeups), NULL); g_return_val_if_fail (wakeups->priv->proxy != NULL, NULL); - g_type_gvalue_array = dbus_g_type_get_collection ("GPtrArray", - dbus_g_type_get_struct("GValueArray", - G_TYPE_BOOLEAN, - G_TYPE_UINT, - G_TYPE_DOUBLE, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_INVALID)); - /* get compound data */ - ret = dbus_g_proxy_call (wakeups->priv->proxy, "GetData", &error_local, - G_TYPE_INVALID, - g_type_gvalue_array, &gvalue_ptr_array, - G_TYPE_INVALID); + ret = up_wakeups_glue_call_get_data_sync (wakeups->priv->proxy, + &gva, + NULL, + &error_local); + if (!ret) { g_warning ("GetData on failed: %s", error_local->message); g_set_error (error, 1, 0, "%s", error_local->message); @@ -141,95 +117,47 @@ up_wakeups_get_data_sync (UpWakeups *wakeups, GCancellable *cancellable, GError } /* no data */ - if (gvalue_ptr_array->len == 0) + iter = g_variant_iter_new (gva); + len = g_variant_iter_n_children (iter); + if (len == 0) { + g_variant_iter_free (iter); goto out; + } /* convert */ array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); - for (i=0; i<gvalue_ptr_array->len; i++) { - gva = (GValueArray *) g_ptr_array_index (gvalue_ptr_array, i); - item = up_wakeup_item_new (); - - /* 0 */ - gv = g_value_array_get_nth (gva, 0); - up_wakeup_item_set_is_userspace (item, g_value_get_boolean (gv)); - g_value_unset (gv); - - /* 1 */ - gv = g_value_array_get_nth (gva, 1); - up_wakeup_item_set_id (item, g_value_get_uint (gv)); - g_value_unset (gv); - - /* 2 */ - gv = g_value_array_get_nth (gva, 2); - up_wakeup_item_set_value (item, g_value_get_double (gv)); - g_value_unset (gv); - - /* 3 */ - gv = g_value_array_get_nth (gva, 3); - up_wakeup_item_set_cmdline (item, g_value_get_string (gv)); - g_value_unset (gv); - - /* 4 */ - gv = g_value_array_get_nth (gva, 4); - up_wakeup_item_set_details (item, g_value_get_string (gv)); - g_value_unset (gv); - - /* add */ - g_ptr_array_add (array, item); - g_value_array_free (gva); + for (i = 0; i < len; i++) { + UpWakeupItem *obj; + GVariant *v; + gboolean is_userspace; + guint32 id; + double value; + char *cmdline; + char *details; + + v = g_variant_iter_next_value (iter); + g_variant_get (v, "(budss)", + &is_userspace, &id, &value, &cmdline, &details); + g_variant_unref (v); + + obj = up_wakeup_item_new (); + up_wakeup_item_set_is_userspace (obj, is_userspace); + up_wakeup_item_set_id (obj, id); + up_wakeup_item_set_value (obj, value); + up_wakeup_item_set_cmdline (obj, cmdline); + up_wakeup_item_set_details (obj, details); + g_free (cmdline); + g_free (details); + + g_ptr_array_add (array, obj); } + g_variant_iter_free (iter); out: - if (gvalue_ptr_array != NULL) - g_ptr_array_unref (gvalue_ptr_array); + if (gva != NULL) + g_variant_unref (gva); return array; } -#pragma GCC diagnostic error "-Wdeprecated-declarations" - -/** - * up_wakeups_ensure_properties: - **/ -static void -up_wakeups_ensure_properties (UpWakeups *wakeups) -{ - gboolean ret; - GError *error; - GHashTable *props; - GValue *value; - - props = NULL; - - if (wakeups->priv->have_properties) - goto out; - - error = NULL; - ret = dbus_g_proxy_call (wakeups->priv->prop_proxy, "GetAll", &error, - G_TYPE_STRING, "org.freedesktop.UPower.Wakeups", - G_TYPE_INVALID, - dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), &props, - G_TYPE_INVALID); - if (!ret) { - g_warning ("Error invoking GetAll() to get properties: %s", error->message); - g_error_free (error); - goto out; - } - - value = g_hash_table_lookup (props, "HasCapability"); - if (value == NULL) { - g_warning ("No 'HasCapability' property"); - goto out; - } - wakeups->priv->has_capability = g_value_get_boolean (value); - - /* cached */ - wakeups->priv->have_properties = TRUE; - -out: - if (props != NULL) - g_hash_table_unref (props); -} - /** * up_wakeups_get_properties_sync: * @wakeups: a #UpWakeups instance. @@ -246,7 +174,7 @@ gboolean up_wakeups_get_properties_sync (UpWakeups *wakeups, GCancellable *cancellable, GError **error) { g_return_val_if_fail (UP_IS_WAKEUPS (wakeups), FALSE); - up_wakeups_ensure_properties (wakeups); + /* Nothing to do here */ return TRUE; } @@ -264,15 +192,14 @@ gboolean up_wakeups_get_has_capability (UpWakeups *wakeups) { g_return_val_if_fail (UP_IS_WAKEUPS (wakeups), FALSE); - up_wakeups_ensure_properties (wakeups); - return wakeups->priv->has_capability; + return up_wakeups_glue_get_has_capability (wakeups->priv->proxy); } /** * up_wakeups_total_changed_cb: **/ static void -up_wakeups_total_changed_cb (DBusGProxy *proxy, guint value, UpWakeups *wakeups) +up_wakeups_total_changed_cb (UpWakeupsGlue *proxy, guint value, UpWakeups *wakeups) { g_signal_emit (wakeups, signals [UP_WAKEUPS_TOTAL_CHANGED], 0, value); } @@ -281,7 +208,7 @@ up_wakeups_total_changed_cb (DBusGProxy *proxy, guint value, UpWakeups *wakeups) * up_wakeups_data_changed_cb: **/ static void -up_wakeups_data_changed_cb (DBusGProxy *proxy, UpWakeups *wakeups) +up_wakeups_data_changed_cb (UpWakeupsGlue *proxy, UpWakeups *wakeups) { g_signal_emit (wakeups, signals [UP_WAKEUPS_DATA_CHANGED], 0); } @@ -321,43 +248,24 @@ up_wakeups_init (UpWakeups *wakeups) wakeups->priv = UP_WAKEUPS_GET_PRIVATE (wakeups); - /* get on the bus */ - wakeups->priv->bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); - if (wakeups->priv->bus == NULL) { - g_warning ("Couldn't connect to system bus: %s", error->message); - g_error_free (error); - goto out; - } - - /* connect to properties interface */ - wakeups->priv->prop_proxy = dbus_g_proxy_new_for_name (wakeups->priv->bus, - "org.freedesktop.UPower", - "/org/freedesktop/UPower/Wakeups", - "org.freedesktop.DBus.Properties"); - if (wakeups->priv->prop_proxy == NULL) { - g_warning ("Couldn't connect to proxy"); - goto out; - } - /* connect to main interface */ - wakeups->priv->proxy = dbus_g_proxy_new_for_name (wakeups->priv->bus, - "org.freedesktop.UPower", - "/org/freedesktop/UPower/Wakeups", - "org.freedesktop.UPower.Wakeups"); + wakeups->priv->proxy = up_wakeups_glue_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + "org.freedesktop.UPower", + "/org/freedesktop/UPower/Wakeups", + NULL, + &error); if (wakeups->priv->proxy == NULL) { - g_warning ("Couldn't connect to proxy"); - goto out; + g_warning ("Couldn't connect to proxy: %s", error->message); + g_error_free (error); + return; } - dbus_g_proxy_add_signal (wakeups->priv->proxy, "TotalChanged", G_TYPE_UINT, G_TYPE_INVALID); - dbus_g_proxy_add_signal (wakeups->priv->proxy, "DataChanged", G_TYPE_INVALID); /* all callbacks */ - dbus_g_proxy_connect_signal (wakeups->priv->proxy, "TotalChanged", - G_CALLBACK (up_wakeups_total_changed_cb), wakeups, NULL); - dbus_g_proxy_connect_signal (wakeups->priv->proxy, "DataChanged", - G_CALLBACK (up_wakeups_data_changed_cb), wakeups, NULL); -out: - return; + g_signal_connect (wakeups->priv->proxy, "total-changed", + G_CALLBACK (up_wakeups_total_changed_cb), wakeups); + g_signal_connect (wakeups->priv->proxy, "data-changed", + G_CALLBACK (up_wakeups_data_changed_cb), wakeups); } /** @@ -373,10 +281,6 @@ up_wakeups_finalize (GObject *object) wakeups = UP_WAKEUPS (object); if (wakeups->priv->proxy != NULL) g_object_unref (wakeups->priv->proxy); - if (wakeups->priv->prop_proxy != NULL) - g_object_unref (wakeups->priv->prop_proxy); - if (wakeups->priv->bus) - dbus_g_connection_unref (wakeups->priv->bus); G_OBJECT_CLASS (up_wakeups_parent_class)->finalize (object); } |