summaryrefslogtreecommitdiff
path: root/src/miners/fs/tracker-power-hal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/miners/fs/tracker-power-hal.c')
-rw-r--r--src/miners/fs/tracker-power-hal.c551
1 files changed, 0 insertions, 551 deletions
diff --git a/src/miners/fs/tracker-power-hal.c b/src/miners/fs/tracker-power-hal.c
deleted file mode 100644
index c5e15ba1b..000000000
--- a/src/miners/fs/tracker-power-hal.c
+++ /dev/null
@@ -1,551 +0,0 @@
-/*
- * Copyright (C) 2006, Jamie McCracken <jamiemcc@gnome.org>
- * Copyright (C) 2008, Nokia <ivan.frade@nokia.com>
- *
- * 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.1 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.
- */
-
-#include "config.h"
-
-#ifdef HAVE_HAL
-
-#include <string.h>
-
-#include <libhal.h>
-
-#include <libtracker-common/tracker-log.h>
-#include <libtracker-common/tracker-utils.h>
-
-#include "tracker-power.h"
-
-#define CAPABILITY_AC_ADAPTER "ac_adapter"
-#define CAPABILITY_BATTERY "battery"
-
-#define PROP_AC_ADAPTER_ON "ac_adapter.present"
-#define PROP_BATT_PERCENTAGE "battery.charge_level.percentage"
-
-#define BATTERY_LOW_THRESHOLD 0.05f
-
-#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_POWER, TrackerPowerPriv))
-
-typedef struct {
- LibHalContext *context;
- DBusConnection *connection;
-
- GHashTable *batteries;
-
- gchar *ac_adapter_udi;
- gboolean on_battery;
- gdouble battery_percentage;
-} TrackerPowerPriv;
-
-static void tracker_power_finalize (GObject *object);
-static void hal_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-static gboolean hal_setup_ac_adapters (TrackerPower *power);
-static gboolean hal_setup_batteries (TrackerPower *power);
-
-static void hal_battery_modify (TrackerPower *power,
- const gchar *udi);
-static void hal_battery_remove (TrackerPower *power,
- const gchar *udi);
-
-static void hal_device_added_cb (LibHalContext *context,
- const gchar *udi);
-static void hal_device_removed_cb (LibHalContext *context,
- const gchar *udi);
-static void hal_device_property_modified_cb (LibHalContext *context,
- const char *udi,
- const char *key,
- dbus_bool_t is_removed,
- dbus_bool_t is_added);
-
-enum {
- PROP_0,
- PROP_ON_BATTERY,
- PROP_ON_LOW_BATTERY
-};
-
-G_DEFINE_TYPE (TrackerPower, tracker_power, G_TYPE_OBJECT);
-
-static void
-tracker_power_class_init (TrackerPowerClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = G_OBJECT_CLASS (klass);
-
- object_class->finalize = tracker_power_finalize;
- object_class->get_property = hal_get_property;
-
- g_object_class_install_property (object_class,
- PROP_ON_BATTERY,
- g_param_spec_boolean ("on-battery",
- "Battery in use",
- "Whether the battery is being used",
- FALSE,
- G_PARAM_READABLE));
- g_object_class_install_property (object_class,
- PROP_ON_LOW_BATTERY,
- g_param_spec_boolean ("on-low-battery",
- "Battery low",
- "Whether the battery is low",
- FALSE,
- G_PARAM_READABLE));
-
- g_type_class_add_private (object_class, sizeof (TrackerPowerPriv));
-}
-
-static void
-tracker_power_init (TrackerPower *power)
-{
- TrackerPowerPriv *priv;
- DBusError error;
-
- g_message ("Initializing HAL Power...");
-
- priv = GET_PRIV (power);
-
- priv->batteries = g_hash_table_new_full (g_str_hash,
- g_str_equal,
- (GDestroyNotify) g_free,
- NULL);
-
- dbus_error_init (&error);
-
- priv->connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
- if (dbus_error_is_set (&error)) {
- g_critical ("Could not get the system D-Bus connection, %s",
- error.message);
- dbus_error_free (&error);
- return;
- }
-
- dbus_connection_set_exit_on_disconnect (priv->connection, FALSE);
- dbus_connection_setup_with_g_main (priv->connection, NULL);
-
- priv->context = libhal_ctx_new ();
-
- if (!priv->context) {
- g_critical ("Could not create HAL context");
- return;
- }
-
- libhal_ctx_set_user_data (priv->context, power);
- libhal_ctx_set_dbus_connection (priv->context, priv->connection);
-
- if (!libhal_ctx_init (priv->context, &error)) {
- if (dbus_error_is_set (&error)) {
- g_critical ("Could not initialize the HAL context, %s",
- error.message);
- dbus_error_free (&error);
- } else {
- g_critical ("Could not initialize the HAL context, "
- "no error, is hald running?");
- }
-
- libhal_ctx_free (priv->context);
- priv->context = NULL;
- return;
- }
-
-
- /* Volume and property notification callbacks */
- g_message ("HAL monitors set for devices added/removed/mounted/umounted...");
- libhal_ctx_set_device_added (priv->context, hal_device_added_cb);
- libhal_ctx_set_device_removed (priv->context, hal_device_removed_cb);
- libhal_ctx_set_device_property_modified (priv->context, hal_device_property_modified_cb);
-
- /* Get all AC adapters info and set them up */
- if (!hal_setup_ac_adapters (power)) {
- return;
- }
-
- /* Get all battery devices and set them up */
- if (!hal_setup_batteries (power)) {
- return;
- }
-}
-
-static void
-tracker_power_finalize (GObject *object)
-{
- TrackerPowerPriv *priv;
-
- priv = GET_PRIV (object);
-
- if (priv->batteries) {
- g_hash_table_unref (priv->batteries);
- }
-
- g_free (priv->ac_adapter_udi);
-
- if (priv->context) {
- libhal_ctx_shutdown (priv->context, NULL);
- libhal_ctx_set_user_data (priv->context, NULL);
- libhal_ctx_free (priv->context);
- }
-
- if (priv->connection) {
- dbus_connection_unref (priv->connection);
- }
-
- (G_OBJECT_CLASS (tracker_power_parent_class)->finalize) (object);
-}
-
-static void
-hal_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- TrackerPowerPriv *priv;
-
- priv = GET_PRIV (object);
-
- switch (param_id) {
- case PROP_ON_BATTERY:
- g_value_set_boolean (value, priv->on_battery);
- break;
- case PROP_ON_LOW_BATTERY:
- /* hardcoded to 5% */
- g_value_set_boolean (value, priv->battery_percentage < BATTERY_LOW_THRESHOLD);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- };
-}
-
-static gboolean
-hal_setup_ac_adapters (TrackerPower *power)
-{
- TrackerPowerPriv *priv;
- DBusError error;
- gchar **devices, **p;
- gint num;
-
- priv = GET_PRIV (power);
-
- dbus_error_init (&error);
-
- devices = libhal_find_device_by_capability (priv->context,
- CAPABILITY_AC_ADAPTER,
- &num,
- &error);
-
- if (dbus_error_is_set (&error)) {
- g_critical ("Could not get AC adapter capable devices, %s",
- error.message);
- dbus_error_free (&error);
- return FALSE;
- }
-
- g_message ("HAL found %d AC adapter capable devices", num);
-
- if (!devices || !devices[0]) {
- libhal_free_string_array (devices);
-
- priv->on_battery = FALSE;
- g_object_notify (G_OBJECT (power), "on-battery");
-
- priv->ac_adapter_udi = NULL;
-
- return TRUE;
- }
-
- for (p = devices; *p; p++) {
- if (!priv->ac_adapter_udi) {
- /* For now just use the first one we find */
- priv->ac_adapter_udi = g_strdup (*p);
-
- g_message (" Device '%s' (default)", *p);
- } else {
- g_message (" Device '%s'", *p);
- }
- }
-
- libhal_free_string_array (devices);
-
- /* Make sure we watch changes to the battery use */
- libhal_device_add_property_watch (priv->context,
- priv->ac_adapter_udi,
- &error);
-
- if (dbus_error_is_set (&error)) {
- g_critical ("Could not add device:'%s' to property watch, %s",
- priv->ac_adapter_udi, error.message);
- dbus_error_free (&error);
- return FALSE;
- }
-
- /* Get current state, are we using the battery now? */
- priv->on_battery = !libhal_device_get_property_bool (priv->context,
- priv->ac_adapter_udi,
- PROP_AC_ADAPTER_ON,
- NULL);
-
- g_message ("HAL reports system is currently powered by %s",
- priv->on_battery ? "battery" : "AC adapter");
-
- g_object_notify (G_OBJECT (power), "on-battery");
-
- return TRUE;
-}
-
-static gboolean
-hal_setup_batteries (TrackerPower *power)
-{
- TrackerPowerPriv *priv;
- DBusError error;
- gchar **devices, **p;
- gint num;
-
- priv = GET_PRIV (power);
-
- dbus_error_init (&error);
-
- devices = libhal_find_device_by_capability (priv->context,
- CAPABILITY_BATTERY,
- &num,
- &error);
-
- if (dbus_error_is_set (&error)) {
- g_critical ("Could not get Battery HAL info, %s",
- error.message);
- dbus_error_free (&error);
- return FALSE;
- }
-
- g_message ("HAL found %d batteries", num);
-
- if (!devices || !devices[0]) {
- libhal_free_string_array (devices);
- return TRUE;
- }
-
- for (p = devices; *p; p++) {
- g_message (" Device '%s'", *p);
-
- hal_battery_modify (power, *p);
- libhal_device_add_property_watch (priv->context, *p, &error);
-
- if (dbus_error_is_set (&error)) {
- g_critical ("Could not add device:'%s' to property watch, %s",
- *p, error.message);
- dbus_error_free (&error);
- }
- }
-
- libhal_free_string_array (devices);
-
- return TRUE;
-}
-
-static void
-hal_battery_notify (TrackerPower *power)
-{
- TrackerPowerPriv *priv;
- GList *values, *v;
- gint percentage, n_values;
- gdouble old_percentage;
-
- priv = GET_PRIV (power);
- percentage = n_values = 0;
-
- values = g_hash_table_get_values (priv->batteries);
-
- for (v = values; v; v = v->next) {
- percentage += GPOINTER_TO_INT (v->data);
- n_values++;
- }
-
- old_percentage = priv->battery_percentage;
-
- if (n_values > 0) {
- priv->battery_percentage = (gdouble) percentage / n_values;
- priv->battery_percentage /= 100;
- } else {
- priv->battery_percentage = 0;
- }
-
- /* only notify when we cross the threshold up or down */
- if ((priv->battery_percentage > BATTERY_LOW_THRESHOLD &&
- old_percentage <= BATTERY_LOW_THRESHOLD) ||
- (priv->battery_percentage <= BATTERY_LOW_THRESHOLD &&
- old_percentage > BATTERY_LOW_THRESHOLD)) {
- g_object_notify (G_OBJECT (power), "on-low-battery");
- }
-
- g_list_free (values);
-}
-
-static void
-hal_battery_modify (TrackerPower *power,
- const gchar *udi)
-{
- TrackerPowerPriv *priv;
- gint percentage;
-
- priv = GET_PRIV (power);
- percentage = libhal_device_get_property_int (priv->context, udi,
- PROP_BATT_PERCENTAGE,
- NULL);
-
- g_hash_table_insert (priv->batteries,
- g_strdup (udi),
- GINT_TO_POINTER (percentage));
-
- hal_battery_notify (power);
-}
-
-static void
-hal_battery_remove (TrackerPower *power,
- const gchar *udi)
-{
- TrackerPowerPriv *priv;
-
- priv = GET_PRIV (power);
-
- g_hash_table_remove (priv->batteries, udi);
- hal_battery_notify (power);
-}
-
-static void
-hal_device_added_cb (LibHalContext *context,
- const gchar *udi)
-{
- TrackerPower *power;
-
- power = libhal_ctx_get_user_data (context);
-
- if (libhal_device_query_capability (context, udi, CAPABILITY_BATTERY, NULL)) {
- hal_battery_modify (power, udi);
- }
-}
-
-static void
-hal_device_removed_cb (LibHalContext *context,
- const gchar *udi)
-{
- TrackerPower *power;
- TrackerPowerPriv *priv;
-
- power = (TrackerPower*) libhal_ctx_get_user_data (context);
- priv = GET_PRIV (power);
-
- if (g_hash_table_lookup (priv->batteries, udi)) {
- hal_battery_remove (power, udi);
- }
-}
-
-static void
-hal_device_property_modified_cb (LibHalContext *context,
- const char *udi,
- const char *key,
- dbus_bool_t is_removed,
- dbus_bool_t is_added)
-{
- TrackerPower *power;
- TrackerPowerPriv *priv;
- DBusError error;
-
- power = (TrackerPower*) libhal_ctx_get_user_data (context);
- priv = GET_PRIV (power);
-
- dbus_error_init (&error);
-
- if (priv->ac_adapter_udi && strcmp (priv->ac_adapter_udi, udi) == 0) {
- /* Property change is on the AC adapter */
- priv->on_battery = !libhal_device_get_property_bool (priv->context,
- priv->ac_adapter_udi,
- PROP_AC_ADAPTER_ON,
- &error);
- g_message ("HAL reports system is now powered by %s",
- priv->on_battery ? "battery" : "AC adapter");
-
- g_object_notify (G_OBJECT (power), "on-battery");
-
- if (dbus_error_is_set (&error)) {
- g_critical ("Could not get device property:'%s' for udi:'%s', %s",
- udi, PROP_AC_ADAPTER_ON, error.message);
- dbus_error_free (&error);
- return;
- }
- } else if (g_hash_table_lookup (priv->batteries, udi)) {
- /* Property change is on any battery */
- if (strcmp (key, PROP_BATT_PERCENTAGE) == 0) {
- hal_battery_modify (power, udi);
- }
- }
-}
-
-/**
- * tracker_power_new:
- *
- * Creates a new instance of #TrackerPower.
- *
- * Returns: The newly created #TrackerPower.
- **/
-TrackerPower *
-tracker_power_new ()
-{
- return g_object_new (TRACKER_TYPE_POWER, NULL);
-}
-
-/**
- * tracker_hal_get_on_battery:
- * @power: A #TrackerPower.
- *
- * Returns whether the computer battery (if any) is currently in use.
- *
- * Returns: #TRUE if the computer is running on battery power.
- **/
-gboolean
-tracker_power_get_on_battery (TrackerPower *power)
-{
- TrackerPowerPriv *priv;
-
- g_return_val_if_fail (TRACKER_IS_POWER (power), TRUE);
-
- priv = GET_PRIV (power);
-
- return priv->on_battery;
-}
-
-/**
- * tracker_power_get_on_low_battery:
- * @power: A #TrackerPower
- *
- * Returns whether the computer has batteries.
- *
- * Returns: #TRUE if the computer has batteries available.
- **/
-gboolean
-tracker_power_get_on_low_battery (TrackerPower *power)
-{
- TrackerPowerPriv *priv;
-
- g_return_val_if_fail (TRACKER_IS_POWER (power), TRUE);
-
- priv = GET_PRIV (power);
-
- return (priv->battery_percentage < BATTERY_LOW_THRESHOLD);
-}
-
-#endif /* HAVE_HAL */