lib: Port UpWakeUps to GDBus

Using the new proxy.
This commit is contained in:
Bastien Nocera 2013-10-10 19:19:44 +02:00
parent b989cad776
commit 5adf4c1e20

View file

@ -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 ();
for (i = 0; i < len; i++) {
UpWakeupItem *obj;
GVariant *v;
gboolean is_userspace;
guint32 id;
double value;
char *cmdline;
char *details;
/* 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);
v = g_variant_iter_next_value (iter);
g_variant_get (v, "(budss)",
&is_userspace, &id, &value, &cmdline, &details);
g_variant_unref (v);
/* 1 */
gv = g_value_array_get_nth (gva, 1);
up_wakeup_item_set_id (item, g_value_get_uint (gv));
g_value_unset (gv);
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);
/* 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);
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);
}