mirror of
https://gitlab.freedesktop.org/upower/upower.git
synced 2026-05-05 14:38:05 +02:00
lib: Port UpWakeUps to GDBus
Using the new proxy.
This commit is contained in:
parent
b989cad776
commit
5adf4c1e20
1 changed files with 61 additions and 157 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue