mirror of
https://gitlab.freedesktop.org/upower/upower.git
synced 2026-05-05 00:38:04 +02:00
daemon: port UpDaemon to GDBus
This commit is contained in:
parent
da7324a840
commit
e7e9156fe9
3 changed files with 96 additions and 352 deletions
|
|
@ -36,8 +36,9 @@ AM_CPPFLAGS = \
|
||||||
UPOWER_LIBS = $(top_builddir)/libupower-glib/libupower-glib.la
|
UPOWER_LIBS = $(top_builddir)/libupower-glib/libupower-glib.la
|
||||||
|
|
||||||
BUILT_SOURCES = \
|
BUILT_SOURCES = \
|
||||||
up-daemon-glue.h \
|
|
||||||
up-device-glue.h \
|
up-device-glue.h \
|
||||||
|
up-daemon-generated.h \
|
||||||
|
up-daemon-generated.c \
|
||||||
up-kbd-backlight-generated.h \
|
up-kbd-backlight-generated.h \
|
||||||
up-kbd-backlight-generated.c \
|
up-kbd-backlight-generated.c \
|
||||||
up-wakeups-generated.h \
|
up-wakeups-generated.h \
|
||||||
|
|
@ -51,8 +52,12 @@ up-marshal.h: up-marshal.list
|
||||||
up-marshal.c: up-marshal.list
|
up-marshal.c: up-marshal.list
|
||||||
echo "#include \"up-marshal.h\"" > $@ && glib-genmarshal $< --prefix=up_marshal --body >> $@
|
echo "#include \"up-marshal.h\"" > $@ && glib-genmarshal $< --prefix=up_marshal --body >> $@
|
||||||
|
|
||||||
up-daemon-glue.h: org.freedesktop.UPower.xml Makefile.am
|
up-daemon-generated.h: org.freedesktop.UPower.xml Makefile.am
|
||||||
dbus-binding-tool --prefix=up_daemon --mode=glib-server --output=up-daemon-glue.h $(srcdir)/org.freedesktop.UPower.xml
|
$(AM_V_GEN) gdbus-codegen --interface-prefix org.freedesktop.UPower. \
|
||||||
|
--generate-c-code up-daemon-generated \
|
||||||
|
--c-namespace Up \
|
||||||
|
--annotate "org.freedesktop.UPower" "org.gtk.GDBus.C.Name" ExportedDaemon \
|
||||||
|
$(srcdir)/org.freedesktop.UPower.xml
|
||||||
|
|
||||||
up-device-glue.h: org.freedesktop.UPower.Device.xml Makefile.am
|
up-device-glue.h: org.freedesktop.UPower.Device.xml Makefile.am
|
||||||
dbus-binding-tool --prefix=up_device --mode=glib-server --output=up-device-glue.h $(srcdir)/org.freedesktop.UPower.Device.xml
|
dbus-binding-tool --prefix=up_device --mode=glib-server --output=up-device-glue.h $(srcdir)/org.freedesktop.UPower.Device.xml
|
||||||
|
|
|
||||||
420
src/up-daemon.c
420
src/up-daemon.c
|
|
@ -29,8 +29,6 @@
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <glib/gi18n-lib.h>
|
#include <glib/gi18n-lib.h>
|
||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
#include <dbus/dbus-glib.h>
|
|
||||||
#include <dbus/dbus-glib-lowlevel.h>
|
|
||||||
|
|
||||||
#include "up-config.h"
|
#include "up-config.h"
|
||||||
#include "up-device-list.h"
|
#include "up-device-list.h"
|
||||||
|
|
@ -38,32 +36,13 @@
|
||||||
#include "up-backend.h"
|
#include "up-backend.h"
|
||||||
#include "up-daemon.h"
|
#include "up-daemon.h"
|
||||||
|
|
||||||
#include "up-daemon-glue.h"
|
#include "up-daemon-generated.h"
|
||||||
#include "up-marshal.h"
|
#include "up-marshal.h"
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
PROP_0,
|
|
||||||
PROP_DAEMON_VERSION,
|
|
||||||
PROP_ON_BATTERY,
|
|
||||||
PROP_LID_IS_CLOSED,
|
|
||||||
PROP_LID_IS_PRESENT,
|
|
||||||
PROP_LAST
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
SIGNAL_DEVICE_ADDED,
|
|
||||||
SIGNAL_DEVICE_REMOVED,
|
|
||||||
SIGNAL_LAST,
|
|
||||||
};
|
|
||||||
|
|
||||||
static guint signals[SIGNAL_LAST] = { 0 };
|
|
||||||
|
|
||||||
struct UpDaemonPrivate
|
struct UpDaemonPrivate
|
||||||
{
|
{
|
||||||
DBusGConnection *connection;
|
GDBusConnection *connection;
|
||||||
DBusGProxy *proxy;
|
UpExportedDaemon *skeleton;
|
||||||
UpConfig *config;
|
UpConfig *config;
|
||||||
UpBackend *backend;
|
UpBackend *backend;
|
||||||
UpDeviceList *power_devices;
|
UpDeviceList *power_devices;
|
||||||
|
|
@ -72,14 +51,7 @@ struct UpDaemonPrivate
|
||||||
GHashTable *idle_signals;
|
GHashTable *idle_signals;
|
||||||
|
|
||||||
/* Properties */
|
/* Properties */
|
||||||
gboolean on_battery;
|
|
||||||
UpDeviceLevel warning_level;
|
UpDeviceLevel warning_level;
|
||||||
gboolean lid_is_closed;
|
|
||||||
gboolean lid_is_present;
|
|
||||||
|
|
||||||
/* PropertiesChanged to be emitted */
|
|
||||||
GHashTable *changed_props;
|
|
||||||
guint props_idle_id;
|
|
||||||
|
|
||||||
/* Display battery properties */
|
/* Display battery properties */
|
||||||
UpDevice *display_device;
|
UpDevice *display_device;
|
||||||
|
|
@ -112,6 +84,7 @@ G_DEFINE_TYPE (UpDaemon, up_daemon, G_TYPE_OBJECT)
|
||||||
#define UP_DAEMON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), UP_TYPE_DAEMON, UpDaemonPrivate))
|
#define UP_DAEMON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), UP_TYPE_DAEMON, UpDaemonPrivate))
|
||||||
|
|
||||||
#define UP_DAEMON_ACTION_DELAY 20 /* seconds */
|
#define UP_DAEMON_ACTION_DELAY 20 /* seconds */
|
||||||
|
#define UP_INTERFACE_PREFIX "org.freedesktop.UPower."
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* up_daemon_get_on_battery_local:
|
* up_daemon_get_on_battery_local:
|
||||||
|
|
@ -417,8 +390,10 @@ up_daemon_refresh_battery_devices (UpDaemon *daemon)
|
||||||
/**
|
/**
|
||||||
* up_daemon_enumerate_devices:
|
* up_daemon_enumerate_devices:
|
||||||
**/
|
**/
|
||||||
gboolean
|
static gboolean
|
||||||
up_daemon_enumerate_devices (UpDaemon *daemon, DBusGMethodInvocation *context)
|
up_daemon_enumerate_devices (UpExportedDaemon *skeleton,
|
||||||
|
GDBusMethodInvocation *invocation,
|
||||||
|
UpDaemon *daemon)
|
||||||
{
|
{
|
||||||
guint i;
|
guint i;
|
||||||
GPtrArray *array;
|
GPtrArray *array;
|
||||||
|
|
@ -428,14 +403,16 @@ up_daemon_enumerate_devices (UpDaemon *daemon, DBusGMethodInvocation *context)
|
||||||
/* build a pointer array of the object paths */
|
/* build a pointer array of the object paths */
|
||||||
object_paths = g_ptr_array_new_with_free_func (g_free);
|
object_paths = g_ptr_array_new_with_free_func (g_free);
|
||||||
array = up_device_list_get_array (daemon->priv->power_devices);
|
array = up_device_list_get_array (daemon->priv->power_devices);
|
||||||
for (i=0; i<array->len; i++) {
|
for (i = 0; i < array->len; i++) {
|
||||||
device = (UpDevice *) g_ptr_array_index (array, i);
|
device = (UpDevice *) g_ptr_array_index (array, i);
|
||||||
g_ptr_array_add (object_paths, g_strdup (up_device_get_object_path (device)));
|
g_ptr_array_add (object_paths, g_strdup (up_device_get_object_path (device)));
|
||||||
}
|
}
|
||||||
g_ptr_array_unref (array);
|
g_ptr_array_unref (array);
|
||||||
|
g_ptr_array_add (object_paths, NULL);
|
||||||
|
|
||||||
/* return it on the bus */
|
/* return it on the bus */
|
||||||
dbus_g_method_return (context, object_paths);
|
up_exported_daemon_complete_enumerate_devices (skeleton, invocation,
|
||||||
|
(const gchar **) object_paths->pdata);
|
||||||
|
|
||||||
/* free */
|
/* free */
|
||||||
g_ptr_array_unref (object_paths);
|
g_ptr_array_unref (object_paths);
|
||||||
|
|
@ -445,22 +422,26 @@ up_daemon_enumerate_devices (UpDaemon *daemon, DBusGMethodInvocation *context)
|
||||||
/**
|
/**
|
||||||
* up_daemon_get_display_device:
|
* up_daemon_get_display_device:
|
||||||
**/
|
**/
|
||||||
gboolean
|
static gboolean
|
||||||
up_daemon_get_display_device (UpDaemon *daemon,
|
up_daemon_get_display_device (UpExportedDaemon *skeleton,
|
||||||
DBusGMethodInvocation *context)
|
GDBusMethodInvocation *invocation,
|
||||||
|
UpDaemon *daemon)
|
||||||
{
|
{
|
||||||
dbus_g_method_return (context, up_device_get_object_path (daemon->priv->display_device));
|
up_exported_daemon_complete_get_display_device (skeleton, invocation,
|
||||||
|
up_device_get_object_path (daemon->priv->display_device));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* up_daemon_get_critical_action:
|
* up_daemon_get_critical_action:
|
||||||
**/
|
**/
|
||||||
gboolean
|
static gboolean
|
||||||
up_daemon_get_critical_action (UpDaemon *daemon,
|
up_daemon_get_critical_action (UpExportedDaemon *skeleton,
|
||||||
DBusGMethodInvocation *context)
|
GDBusMethodInvocation *invocation,
|
||||||
|
UpDaemon *daemon)
|
||||||
{
|
{
|
||||||
dbus_g_method_return (context, up_backend_get_critical_action (daemon->priv->backend));
|
up_exported_daemon_complete_get_display_device (skeleton, invocation,
|
||||||
|
up_backend_get_critical_action (daemon->priv->backend));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -471,37 +452,31 @@ static gboolean
|
||||||
up_daemon_register_power_daemon (UpDaemon *daemon)
|
up_daemon_register_power_daemon (UpDaemon *daemon)
|
||||||
{
|
{
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
gboolean ret = FALSE;
|
|
||||||
UpDaemonPrivate *priv = daemon->priv;
|
UpDaemonPrivate *priv = daemon->priv;
|
||||||
|
|
||||||
priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
|
priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
|
||||||
if (priv->connection == NULL) {
|
if (error != NULL) {
|
||||||
if (error != NULL) {
|
g_critical ("error getting system bus: %s", error->message);
|
||||||
g_critical ("error getting system bus: %s", error->message);
|
g_error_free (error);
|
||||||
g_error_free (error);
|
return FALSE;
|
||||||
}
|
}
|
||||||
goto out;
|
|
||||||
|
/* export our interface on the bus */
|
||||||
|
g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (priv->skeleton),
|
||||||
|
connection,
|
||||||
|
"/org/freedesktop/UPower",
|
||||||
|
&error);
|
||||||
|
|
||||||
|
if (error != NULL) {
|
||||||
|
g_critical ("error registering daemon on system bus: %s", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register the display device */
|
/* Register the display device */
|
||||||
up_device_register_display_device (daemon->priv->display_device,
|
up_device_register_display_device (daemon->priv->display_device, daemon);
|
||||||
daemon);
|
|
||||||
|
|
||||||
/* connect to DBUS */
|
return TRUE;
|
||||||
priv->proxy = dbus_g_proxy_new_for_name (priv->connection,
|
|
||||||
DBUS_SERVICE_DBUS,
|
|
||||||
DBUS_PATH_DBUS,
|
|
||||||
DBUS_INTERFACE_DBUS);
|
|
||||||
|
|
||||||
/* register GObject */
|
|
||||||
dbus_g_connection_register_g_object (priv->connection,
|
|
||||||
"/org/freedesktop/UPower",
|
|
||||||
G_OBJECT (daemon));
|
|
||||||
|
|
||||||
/* success */
|
|
||||||
ret = TRUE;
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -515,7 +490,13 @@ up_daemon_startup (UpDaemon *daemon)
|
||||||
UpDeviceLevel warning_level;
|
UpDeviceLevel warning_level;
|
||||||
UpDaemonPrivate *priv = daemon->priv;
|
UpDaemonPrivate *priv = daemon->priv;
|
||||||
|
|
||||||
/* stop signals and callbacks */
|
/* register on bus */
|
||||||
|
ret = up_daemon_register_power_daemon (daemon, connection);
|
||||||
|
if (!ret) {
|
||||||
|
g_warning ("failed to register");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
g_debug ("daemon now coldplug");
|
g_debug ("daemon now coldplug");
|
||||||
|
|
||||||
/* coldplug backend backend */
|
/* coldplug backend backend */
|
||||||
|
|
@ -532,16 +513,8 @@ up_daemon_startup (UpDaemon *daemon)
|
||||||
up_daemon_set_on_battery (daemon, on_battery);
|
up_daemon_set_on_battery (daemon, on_battery);
|
||||||
up_daemon_set_warning_level (daemon, warning_level);
|
up_daemon_set_warning_level (daemon, warning_level);
|
||||||
|
|
||||||
/* start signals and callbacks */
|
|
||||||
g_debug ("daemon now not coldplug");
|
g_debug ("daemon now not coldplug");
|
||||||
|
|
||||||
/* register on bus */
|
|
||||||
ret = up_daemon_register_power_daemon (daemon);
|
|
||||||
if (!ret) {
|
|
||||||
g_warning ("failed to register");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
@ -573,132 +546,6 @@ up_daemon_get_device_list (UpDaemon *daemon)
|
||||||
return g_object_ref (daemon->priv->power_devices);
|
return g_object_ref (daemon->priv->power_devices);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
changed_props_add_to_msg (gpointer key,
|
|
||||||
gpointer _value,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
GVariant *value = _value;
|
|
||||||
const gchar *property = key;
|
|
||||||
DBusMessageIter *subiter = user_data;
|
|
||||||
DBusMessageIter v_iter;
|
|
||||||
DBusMessageIter dict_iter;
|
|
||||||
|
|
||||||
dbus_message_iter_open_container (subiter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_iter);
|
|
||||||
dbus_message_iter_append_basic (&dict_iter, DBUS_TYPE_STRING, &property);
|
|
||||||
|
|
||||||
if (g_variant_is_of_type (value, G_VARIANT_TYPE_UINT32)) {
|
|
||||||
guint32 val = g_variant_get_uint32 (value);
|
|
||||||
dbus_message_iter_open_container (&dict_iter, DBUS_TYPE_VARIANT, "u", &v_iter);
|
|
||||||
dbus_message_iter_append_basic (&v_iter, DBUS_TYPE_UINT32, &val);
|
|
||||||
} else if (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN)) {
|
|
||||||
gboolean val = g_variant_get_boolean (value);
|
|
||||||
dbus_message_iter_open_container (&dict_iter, DBUS_TYPE_VARIANT, "b", &v_iter);
|
|
||||||
dbus_message_iter_append_basic (&v_iter, DBUS_TYPE_BOOLEAN, &val);
|
|
||||||
} else if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) {
|
|
||||||
const gchar *val = g_variant_get_string (value, NULL);
|
|
||||||
dbus_message_iter_open_container (&dict_iter, DBUS_TYPE_VARIANT, "s", &v_iter);
|
|
||||||
dbus_message_iter_append_basic (&v_iter, DBUS_TYPE_STRING, &val);
|
|
||||||
} else if (g_variant_is_of_type (value, G_VARIANT_TYPE_DOUBLE)) {
|
|
||||||
gdouble val = g_variant_get_double (value);
|
|
||||||
dbus_message_iter_open_container (&dict_iter, DBUS_TYPE_VARIANT, "d", &v_iter);
|
|
||||||
dbus_message_iter_append_basic (&v_iter, DBUS_TYPE_DOUBLE, &val);
|
|
||||||
} else if (g_variant_is_of_type (value, G_VARIANT_TYPE_UINT64)) {
|
|
||||||
guint64 val = g_variant_get_uint64 (value);
|
|
||||||
dbus_message_iter_open_container (&dict_iter, DBUS_TYPE_VARIANT, "t", &v_iter);
|
|
||||||
dbus_message_iter_append_basic (&v_iter, DBUS_TYPE_UINT64, &val);
|
|
||||||
} else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT64)) {
|
|
||||||
gint64 val = g_variant_get_int64 (value);
|
|
||||||
dbus_message_iter_open_container (&dict_iter, DBUS_TYPE_VARIANT, "x", &v_iter);
|
|
||||||
dbus_message_iter_append_basic (&v_iter, DBUS_TYPE_INT64, &val);
|
|
||||||
} else {
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
dbus_message_iter_close_container (&dict_iter, &v_iter);
|
|
||||||
dbus_message_iter_close_container (subiter, &dict_iter);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
up_daemon_emit_properties_changed (DBusGConnection *gconnection,
|
|
||||||
const gchar *object_path,
|
|
||||||
const gchar *interface,
|
|
||||||
GHashTable *props)
|
|
||||||
{
|
|
||||||
DBusConnection *connection;
|
|
||||||
DBusMessage *message;
|
|
||||||
DBusMessageIter iter;
|
|
||||||
DBusMessageIter subiter;
|
|
||||||
|
|
||||||
g_return_if_fail (gconnection != NULL);
|
|
||||||
g_return_if_fail (object_path != NULL);
|
|
||||||
g_return_if_fail (interface != NULL);
|
|
||||||
g_return_if_fail (props != NULL);
|
|
||||||
|
|
||||||
connection = dbus_g_connection_get_connection (gconnection);
|
|
||||||
message = dbus_message_new_signal (object_path,
|
|
||||||
"org.freedesktop.DBus.Properties",
|
|
||||||
"PropertiesChanged");
|
|
||||||
dbus_message_iter_init_append (message, &iter);
|
|
||||||
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &interface);
|
|
||||||
/* changed */
|
|
||||||
dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{sv}", &subiter);
|
|
||||||
|
|
||||||
g_hash_table_foreach (props, changed_props_add_to_msg, &subiter);
|
|
||||||
|
|
||||||
dbus_message_iter_close_container (&iter, &subiter);
|
|
||||||
|
|
||||||
/* invalidated */
|
|
||||||
dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "s", &subiter);
|
|
||||||
dbus_message_iter_close_container (&iter, &subiter);
|
|
||||||
|
|
||||||
dbus_connection_send (connection, message, NULL);
|
|
||||||
dbus_message_unref (message);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
changed_props_idle_cb (gpointer user_data)
|
|
||||||
{
|
|
||||||
UpDaemon *daemon = user_data;
|
|
||||||
|
|
||||||
/* D-Bus */
|
|
||||||
up_daemon_emit_properties_changed (daemon->priv->connection,
|
|
||||||
"/org/freedesktop/UPower",
|
|
||||||
"org.freedesktop.UPower",
|
|
||||||
daemon->priv->changed_props);
|
|
||||||
g_clear_pointer (&daemon->priv->changed_props, g_hash_table_unref);
|
|
||||||
daemon->priv->props_idle_id = 0;
|
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* up_daemon_queue_changed_property:
|
|
||||||
**/
|
|
||||||
static void
|
|
||||||
up_daemon_queue_changed_property (UpDaemon *daemon,
|
|
||||||
const gchar *property,
|
|
||||||
GVariant *value)
|
|
||||||
{
|
|
||||||
g_return_if_fail (UP_IS_DAEMON (daemon));
|
|
||||||
|
|
||||||
if (daemon->priv->connection == NULL) {
|
|
||||||
g_variant_unref (value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!daemon->priv->changed_props) {
|
|
||||||
daemon->priv->changed_props = g_hash_table_new_full (g_str_hash, g_str_equal,
|
|
||||||
NULL, (GDestroyNotify) g_variant_unref);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_hash_table_insert (daemon->priv->changed_props,
|
|
||||||
(gpointer) property,
|
|
||||||
value);
|
|
||||||
|
|
||||||
if (daemon->priv->props_idle_id == 0)
|
|
||||||
daemon->priv->props_idle_id = g_idle_add (changed_props_idle_cb, daemon);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* up_daemon_set_lid_is_closed:
|
* up_daemon_set_lid_is_closed:
|
||||||
**/
|
**/
|
||||||
|
|
@ -714,10 +561,7 @@ up_daemon_set_lid_is_closed (UpDaemon *daemon, gboolean lid_is_closed)
|
||||||
}
|
}
|
||||||
|
|
||||||
g_debug ("lid_is_closed = %s", lid_is_closed ? "yes" : "no");
|
g_debug ("lid_is_closed = %s", lid_is_closed ? "yes" : "no");
|
||||||
priv->lid_is_closed = lid_is_closed;
|
up_exported_daemon_set_lid_is_closed (priv->skeleton, lid_is_closed);
|
||||||
g_object_notify (G_OBJECT (daemon), "lid-is-closed");
|
|
||||||
|
|
||||||
up_daemon_queue_changed_property (daemon, "LidIsClosed", g_variant_new_boolean (lid_is_closed));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -735,10 +579,7 @@ up_daemon_set_lid_is_present (UpDaemon *daemon, gboolean lid_is_present)
|
||||||
}
|
}
|
||||||
|
|
||||||
g_debug ("lid_is_present = %s", lid_is_present ? "yes" : "no");
|
g_debug ("lid_is_present = %s", lid_is_present ? "yes" : "no");
|
||||||
priv->lid_is_present = lid_is_present;
|
up_exported_daemon_set_lid_is_present (priv->skeleton, lid_is_present);
|
||||||
g_object_notify (G_OBJECT (daemon), "lid-is-present");
|
|
||||||
|
|
||||||
up_daemon_queue_changed_property (daemon, "LidIsPresent", g_variant_new_boolean (lid_is_present));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -749,10 +590,7 @@ up_daemon_set_on_battery (UpDaemon *daemon, gboolean on_battery)
|
||||||
{
|
{
|
||||||
UpDaemonPrivate *priv = daemon->priv;
|
UpDaemonPrivate *priv = daemon->priv;
|
||||||
g_debug ("on_battery = %s", on_battery ? "yes" : "no");
|
g_debug ("on_battery = %s", on_battery ? "yes" : "no");
|
||||||
priv->on_battery = on_battery;
|
up_exported_daemon_set_on_battery (priv->skeleton, on_battery);
|
||||||
g_object_notify (G_OBJECT (daemon), "on-battery");
|
|
||||||
|
|
||||||
up_daemon_queue_changed_property (daemon, "OnBattery", g_variant_new_boolean (on_battery));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
@ -862,9 +700,8 @@ up_daemon_update_warning_level (UpDaemon *daemon)
|
||||||
|
|
||||||
/* Check if the on_battery and warning_level state has changed */
|
/* Check if the on_battery and warning_level state has changed */
|
||||||
ret = (up_daemon_get_on_battery_local (daemon) && !up_daemon_get_on_ac_local (daemon));
|
ret = (up_daemon_get_on_battery_local (daemon) && !up_daemon_get_on_ac_local (daemon));
|
||||||
if (ret != priv->on_battery) {
|
up_daemon_set_on_battery (daemon, ret);
|
||||||
up_daemon_set_on_battery (daemon, ret);
|
|
||||||
}
|
|
||||||
warning_level = up_daemon_get_warning_level_local (daemon);
|
warning_level = up_daemon_get_warning_level_local (daemon);
|
||||||
if (warning_level != priv->warning_level)
|
if (warning_level != priv->warning_level)
|
||||||
up_daemon_set_warning_level (daemon, warning_level);
|
up_daemon_set_warning_level (daemon, warning_level);
|
||||||
|
|
@ -1071,7 +908,7 @@ up_daemon_device_added_cb (UpBackend *backend, GObject *native, UpDevice *device
|
||||||
g_warning ("INTERNAL STATE CORRUPT (device-added): not sending NULL, native:%p, device:%p", native, device);
|
g_warning ("INTERNAL STATE CORRUPT (device-added): not sending NULL, native:%p, device:%p", native, device);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
g_signal_emit (daemon, signals[SIGNAL_DEVICE_ADDED], 0, object_path);
|
up_exported_daemon_emit_device_added (daemon->priv->skeleton, object_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1099,7 +936,7 @@ up_daemon_device_removed_cb (UpBackend *backend, GObject *native, UpDevice *devi
|
||||||
g_warning ("INTERNAL STATE CORRUPT (device-removed): not sending NULL, native:%p, device:%p", native, device);
|
g_warning ("INTERNAL STATE CORRUPT (device-removed): not sending NULL, native:%p, device:%p", native, device);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
g_signal_emit (daemon, signals[SIGNAL_DEVICE_REMOVED], 0, object_path);
|
up_exported_daemon_emit_device_removed (daemon->priv->skeleton, object_path);
|
||||||
|
|
||||||
/* finalise the object */
|
/* finalise the object */
|
||||||
g_object_unref (device);
|
g_object_unref (device);
|
||||||
|
|
@ -1176,68 +1013,37 @@ up_daemon_init (UpDaemon *daemon)
|
||||||
daemon->priv->poll_timeouts = g_hash_table_new_full (g_direct_hash, g_direct_equal,
|
daemon->priv->poll_timeouts = g_hash_table_new_full (g_direct_hash, g_direct_equal,
|
||||||
NULL, g_free);
|
NULL, g_free);
|
||||||
daemon->priv->idle_signals = g_hash_table_new (g_direct_hash, g_direct_equal);
|
daemon->priv->idle_signals = g_hash_table_new (g_direct_hash, g_direct_equal);
|
||||||
|
|
||||||
|
daemon->priv->skeleton = up_exported_daemon_skeleton_new ();
|
||||||
|
up_exported_daemon_set_daemon_version (daemon->priv->skeleton, PACKAGE_VERSION);
|
||||||
|
|
||||||
|
g_signal_connect (daemon->priv->skeleton, "handle-enumerate-devices",
|
||||||
|
G_CALLBACK (up_daemon_enumerate_devices), daemon);
|
||||||
|
g_signal_connect (daemon->priv->skeleton, "handle-get-critical-action",
|
||||||
|
G_CALLBACK (up_daemon_get_critical_action), daemon);
|
||||||
|
g_signal_connect (daemon->priv->skeleton, "handle-get-display-device",
|
||||||
|
G_CALLBACK (up_daemon_get_display_device), daemon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const GDBusErrorEntry up_daemon_error_entries[] = {
|
||||||
|
{ UP_DAEMON_ERROR_GENERAL, UP_INTERFACE_PREFIX "GeneralError" },
|
||||||
|
{ UP_DAEMON_ERROR_NOT_SUPPORTED, UP_INTERFACE_PREFIX "NotSupported" },
|
||||||
|
{ UP_DAEMON_ERROR_NO_SUCH_DEVICE, UP_INTERFACE_PREFIX "NoSuchDevice" },
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* up_daemon_error_quark:
|
* up_daemon_error_quark:
|
||||||
**/
|
**/
|
||||||
GQuark
|
GQuark
|
||||||
up_daemon_error_quark (void)
|
up_daemon_error_quark (void)
|
||||||
{
|
{
|
||||||
static GQuark ret = 0;
|
static volatile gsize quark_volatile = 0;
|
||||||
if (ret == 0)
|
|
||||||
ret = g_quark_from_static_string ("up_daemon_error");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
|
g_dbus_error_register_error_domain ("up_daemon_error",
|
||||||
/**
|
&quark_volatile,
|
||||||
* up_daemon_error_get_type:
|
up_daemon_error_entries,
|
||||||
**/
|
G_N_ELEMENTS (up_daemon_error_entries));
|
||||||
GType
|
return quark_volatile;
|
||||||
up_daemon_error_get_type (void)
|
|
||||||
{
|
|
||||||
static GType etype = 0;
|
|
||||||
|
|
||||||
if (etype == 0) {
|
|
||||||
static const GEnumValue values[] = {
|
|
||||||
ENUM_ENTRY (UP_DAEMON_ERROR_GENERAL, "GeneralError"),
|
|
||||||
ENUM_ENTRY (UP_DAEMON_ERROR_NOT_SUPPORTED, "NotSupported"),
|
|
||||||
ENUM_ENTRY (UP_DAEMON_ERROR_NO_SUCH_DEVICE, "NoSuchDevice"),
|
|
||||||
{ 0, 0, 0 }
|
|
||||||
};
|
|
||||||
g_assert (UP_DAEMON_NUM_ERRORS == G_N_ELEMENTS (values) - 1);
|
|
||||||
etype = g_enum_register_static ("UpDaemonError", values);
|
|
||||||
}
|
|
||||||
return etype;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* up_daemon_get_property:
|
|
||||||
**/
|
|
||||||
static void
|
|
||||||
up_daemon_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
UpDaemon *daemon = UP_DAEMON (object);
|
|
||||||
UpDaemonPrivate *priv = daemon->priv;
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
case PROP_DAEMON_VERSION:
|
|
||||||
g_value_set_string (value, PACKAGE_VERSION);
|
|
||||||
break;
|
|
||||||
case PROP_ON_BATTERY:
|
|
||||||
g_value_set_boolean (value, priv->on_battery);
|
|
||||||
break;
|
|
||||||
case PROP_LID_IS_CLOSED:
|
|
||||||
g_value_set_boolean (value, priv->lid_is_closed);
|
|
||||||
break;
|
|
||||||
case PROP_LID_IS_PRESENT:
|
|
||||||
g_value_set_boolean (value, priv->lid_is_present);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1248,61 +1054,8 @@ up_daemon_class_init (UpDaemonClass *klass)
|
||||||
{
|
{
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
object_class->finalize = up_daemon_finalize;
|
object_class->finalize = up_daemon_finalize;
|
||||||
object_class->get_property = up_daemon_get_property;
|
|
||||||
|
|
||||||
g_type_class_add_private (klass, sizeof (UpDaemonPrivate));
|
g_type_class_add_private (klass, sizeof (UpDaemonPrivate));
|
||||||
|
|
||||||
signals[SIGNAL_DEVICE_ADDED] =
|
|
||||||
g_signal_new ("device-added",
|
|
||||||
G_OBJECT_CLASS_TYPE (klass),
|
|
||||||
G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
|
|
||||||
0, NULL, NULL,
|
|
||||||
g_cclosure_marshal_generic,
|
|
||||||
G_TYPE_NONE, 1, DBUS_TYPE_G_OBJECT_PATH);
|
|
||||||
|
|
||||||
signals[SIGNAL_DEVICE_REMOVED] =
|
|
||||||
g_signal_new ("device-removed",
|
|
||||||
G_OBJECT_CLASS_TYPE (klass),
|
|
||||||
G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
|
|
||||||
0, NULL, NULL,
|
|
||||||
g_cclosure_marshal_generic,
|
|
||||||
G_TYPE_NONE, 1, DBUS_TYPE_G_OBJECT_PATH);
|
|
||||||
|
|
||||||
g_object_class_install_property (object_class,
|
|
||||||
PROP_DAEMON_VERSION,
|
|
||||||
g_param_spec_string ("daemon-version",
|
|
||||||
"Daemon Version",
|
|
||||||
"The version of the running daemon",
|
|
||||||
NULL,
|
|
||||||
G_PARAM_READABLE));
|
|
||||||
|
|
||||||
g_object_class_install_property (object_class,
|
|
||||||
PROP_LID_IS_PRESENT,
|
|
||||||
g_param_spec_boolean ("lid-is-present",
|
|
||||||
"Is a laptop",
|
|
||||||
"If this computer is probably a laptop",
|
|
||||||
FALSE,
|
|
||||||
G_PARAM_READABLE));
|
|
||||||
|
|
||||||
g_object_class_install_property (object_class,
|
|
||||||
PROP_ON_BATTERY,
|
|
||||||
g_param_spec_boolean ("on-battery",
|
|
||||||
"On Battery",
|
|
||||||
"Whether the system is running on battery",
|
|
||||||
FALSE,
|
|
||||||
G_PARAM_READABLE));
|
|
||||||
|
|
||||||
g_object_class_install_property (object_class,
|
|
||||||
PROP_LID_IS_CLOSED,
|
|
||||||
g_param_spec_boolean ("lid-is-closed",
|
|
||||||
"Laptop lid is closed",
|
|
||||||
"If the laptop lid is closed",
|
|
||||||
FALSE,
|
|
||||||
G_PARAM_READABLE));
|
|
||||||
|
|
||||||
dbus_g_object_type_install_info (UP_TYPE_DAEMON, &dbus_glib_up_daemon_object_info);
|
|
||||||
|
|
||||||
dbus_g_error_domain_register (UP_DAEMON_ERROR, NULL, UP_DAEMON_TYPE_ERROR);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1316,17 +1069,13 @@ up_daemon_finalize (GObject *object)
|
||||||
|
|
||||||
if (priv->action_timeout_id != 0)
|
if (priv->action_timeout_id != 0)
|
||||||
g_source_remove (priv->action_timeout_id);
|
g_source_remove (priv->action_timeout_id);
|
||||||
if (priv->props_idle_id != 0)
|
|
||||||
g_source_remove (priv->props_idle_id);
|
|
||||||
|
|
||||||
g_clear_pointer (&priv->poll_timeouts, g_hash_table_destroy);
|
g_clear_pointer (&priv->poll_timeouts, g_hash_table_destroy);
|
||||||
g_clear_pointer (&priv->idle_signals, g_hash_table_destroy);
|
g_clear_pointer (&priv->idle_signals, g_hash_table_destroy);
|
||||||
|
|
||||||
g_clear_pointer (&daemon->priv->changed_props, g_hash_table_unref);
|
g_clear_object (&priv->connection);
|
||||||
if (priv->proxy != NULL)
|
|
||||||
g_object_unref (priv->proxy);
|
g_object_unref (priv->skeleton);
|
||||||
if (priv->connection != NULL)
|
|
||||||
dbus_g_connection_unref (priv->connection);
|
|
||||||
g_object_unref (priv->power_devices);
|
g_object_unref (priv->power_devices);
|
||||||
g_object_unref (priv->display_device);
|
g_object_unref (priv->display_device);
|
||||||
g_object_unref (priv->config);
|
g_object_unref (priv->config);
|
||||||
|
|
@ -1344,3 +1093,8 @@ up_daemon_new (void)
|
||||||
return UP_DAEMON (g_object_new (UP_TYPE_DAEMON, NULL));
|
return UP_DAEMON (g_object_new (UP_TYPE_DAEMON, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GDBusConnection *
|
||||||
|
up_daemon_get_dbus_connection (UpDaemon *daemon)
|
||||||
|
{
|
||||||
|
return g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (daemon->priv->skeleton));
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@
|
||||||
#define __UP_DAEMON_H__
|
#define __UP_DAEMON_H__
|
||||||
|
|
||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
#include <dbus/dbus-glib.h>
|
|
||||||
|
|
||||||
#include "up-types.h"
|
#include "up-types.h"
|
||||||
#include "up-device-list.h"
|
#include "up-device-list.h"
|
||||||
|
|
@ -59,9 +58,6 @@ typedef enum
|
||||||
|
|
||||||
#define UP_DAEMON_ERROR up_daemon_error_quark ()
|
#define UP_DAEMON_ERROR up_daemon_error_quark ()
|
||||||
|
|
||||||
GType up_daemon_error_get_type (void);
|
|
||||||
#define UP_DAEMON_TYPE_ERROR (up_daemon_error_get_type ())
|
|
||||||
|
|
||||||
GQuark up_daemon_error_quark (void);
|
GQuark up_daemon_error_quark (void);
|
||||||
GType up_daemon_get_type (void);
|
GType up_daemon_get_type (void);
|
||||||
UpDaemon *up_daemon_new (void);
|
UpDaemon *up_daemon_new (void);
|
||||||
|
|
@ -73,6 +69,7 @@ guint up_daemon_get_number_devices_of_type (UpDaemon *daemon,
|
||||||
UpDeviceList *up_daemon_get_device_list (UpDaemon *daemon);
|
UpDeviceList *up_daemon_get_device_list (UpDaemon *daemon);
|
||||||
gboolean up_daemon_startup (UpDaemon *daemon);
|
gboolean up_daemon_startup (UpDaemon *daemon);
|
||||||
void up_daemon_shutdown (UpDaemon *daemon);
|
void up_daemon_shutdown (UpDaemon *daemon);
|
||||||
|
GDBusConnection *up_daemon_get_dbus_connection (UpDaemon *daemon);
|
||||||
void up_daemon_set_lid_is_closed (UpDaemon *daemon,
|
void up_daemon_set_lid_is_closed (UpDaemon *daemon,
|
||||||
gboolean lid_is_closed);
|
gboolean lid_is_closed);
|
||||||
void up_daemon_set_lid_is_present (UpDaemon *daemon,
|
void up_daemon_set_lid_is_present (UpDaemon *daemon,
|
||||||
|
|
@ -87,23 +84,11 @@ UpDeviceLevel up_daemon_compute_warning_level(UpDaemon *daemon,
|
||||||
gboolean power_supply,
|
gboolean power_supply,
|
||||||
gdouble percentage,
|
gdouble percentage,
|
||||||
gint64 time_to_empty);
|
gint64 time_to_empty);
|
||||||
void up_daemon_emit_properties_changed (DBusGConnection *gconnection,
|
|
||||||
const gchar *object_path,
|
|
||||||
const gchar *interface,
|
|
||||||
GHashTable *props);
|
|
||||||
|
|
||||||
void up_daemon_start_poll (GObject *object,
|
void up_daemon_start_poll (GObject *object,
|
||||||
GSourceFunc callback);
|
GSourceFunc callback);
|
||||||
void up_daemon_stop_poll (GObject *object);
|
void up_daemon_stop_poll (GObject *object);
|
||||||
|
|
||||||
/* exported */
|
|
||||||
gboolean up_daemon_enumerate_devices (UpDaemon *daemon,
|
|
||||||
DBusGMethodInvocation *context);
|
|
||||||
gboolean up_daemon_get_display_device (UpDaemon *daemon,
|
|
||||||
DBusGMethodInvocation *context);
|
|
||||||
gboolean up_daemon_get_critical_action (UpDaemon *daemon,
|
|
||||||
DBusGMethodInvocation *context);
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __UP_DAEMON_H__ */
|
#endif /* __UP_DAEMON_H__ */
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue