[gnome-settings-daemon] power: Add a helper object for talking to gnome-phone-manager



commit 9bc66112c81ac0e5fc5af9117bed13a495ea4aa6
Author: Richard Hughes <richard hughsie com>
Date:   Fri Jul 1 12:31:05 2011 +0100

    power: Add a helper object for talking to gnome-phone-manager

 plugins/power/Makefile.am |    2 +
 plugins/power/gpm-phone.c |  334 +++++++++++++++++++++++++++++++++++++++++++++
 plugins/power/gpm-phone.h |   73 ++++++++++
 3 files changed, 409 insertions(+), 0 deletions(-)
---
diff --git a/plugins/power/Makefile.am b/plugins/power/Makefile.am
index 666fb47..f71dca2 100644
--- a/plugins/power/Makefile.am
+++ b/plugins/power/Makefile.am
@@ -6,6 +6,8 @@ plugin_LTLIBRARIES =					\
 libpower_la_SOURCES = 					\
 	gpm-common.c					\
 	gpm-common.h					\
+	gpm-phone.c					\
+	gpm-phone.h					\
 	gsd-power-manager.c				\
 	gsd-power-manager.h				\
 	gsd-power-plugin.c				\
diff --git a/plugins/power/gpm-phone.c b/plugins/power/gpm-phone.c
new file mode 100644
index 0000000..4e635a7
--- /dev/null
+++ b/plugins/power/gpm-phone.c
@@ -0,0 +1,334 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007-2011 Richard Hughes <richard hughsie com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+
+#include "gpm-phone.h"
+
+static void     gpm_phone_finalize   (GObject       *object);
+
+#define GPM_PHONE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GPM_TYPE_PHONE, GpmPhonePrivate))
+
+struct GpmPhonePrivate
+{
+        GDBusProxy              *proxy;
+        GDBusConnection         *connection;
+        guint                    watch_id;
+        gboolean                 present;
+        guint                    percentage;
+        gboolean                 onac;
+};
+
+enum {
+        DEVICE_ADDED,
+        DEVICE_REMOVED,
+        DEVICE_REFRESH,
+        LAST_SIGNAL
+};
+
+static guint signals [LAST_SIGNAL] = { 0 };
+static gpointer gpm_phone_object = NULL;
+
+G_DEFINE_TYPE (GpmPhone, gpm_phone, G_TYPE_OBJECT)
+
+gboolean
+gpm_phone_coldplug (GpmPhone *phone)
+{
+        GError  *error = NULL;
+        GVariant *reply;
+        gboolean ret;
+
+        g_return_val_if_fail (phone != NULL, FALSE);
+        g_return_val_if_fail (GPM_IS_PHONE (phone), FALSE);
+
+        if (phone->priv->proxy == NULL) {
+                g_warning ("not connected");
+                return FALSE;
+        }
+
+        reply = g_dbus_proxy_call_sync (phone->priv->proxy, "Coldplug",
+                        NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
+        if (error != NULL) {
+                g_warning ("DEBUG: ERROR: %s", error->message);
+                g_error_free (error);
+        }
+
+        if (reply != NULL) {
+                ret = TRUE;
+                g_variant_unref (reply);
+        } else
+                ret = FALSE;
+
+        return ret;
+}
+
+gboolean
+gpm_phone_get_present (GpmPhone *phone, guint idx)
+{
+        g_return_val_if_fail (phone != NULL, FALSE);
+        g_return_val_if_fail (GPM_IS_PHONE (phone), FALSE);
+        return phone->priv->present;
+}
+
+guint
+gpm_phone_get_percentage (GpmPhone *phone, guint idx)
+{
+        g_return_val_if_fail (phone != NULL, 0);
+        g_return_val_if_fail (GPM_IS_PHONE (phone), 0);
+        return phone->priv->percentage;
+}
+
+gboolean
+gpm_phone_get_on_ac (GpmPhone *phone, guint idx)
+{
+        g_return_val_if_fail (phone != NULL, FALSE);
+        g_return_val_if_fail (GPM_IS_PHONE (phone), FALSE);
+        return phone->priv->onac;
+}
+
+guint
+gpm_phone_get_num_batteries (GpmPhone *phone)
+{
+        g_return_val_if_fail (phone != NULL, 0);
+        g_return_val_if_fail (GPM_IS_PHONE (phone), 0);
+        if (phone->priv->present)
+                return 1;
+        return 0;
+}
+
+static void
+gpm_phone_battery_state_changed (GDBusProxy *proxy,
+                                 guint idx,
+                                 guint percentage,
+                                 gboolean on_ac,
+                                 GpmPhone *phone)
+{
+        g_return_if_fail (GPM_IS_PHONE (phone));
+
+        g_debug ("got BatteryStateChanged %i = %i (%i)", idx, percentage, on_ac);
+        phone->priv->percentage = percentage;
+        phone->priv->onac = on_ac;
+        phone->priv->present = TRUE;
+        g_debug ("emitting device-refresh : (%i)", idx);
+        g_signal_emit (phone, signals [DEVICE_REFRESH], 0, idx);
+}
+
+static void
+gpm_phone_num_batteries_changed (GDBusProxy *proxy,
+                                 guint number,
+                                 GpmPhone *phone)
+{
+        g_return_if_fail (GPM_IS_PHONE (phone));
+
+        g_debug ("got NumberBatteriesChanged %i", number);
+        if (number > 1) {
+                g_warning ("number not 0 or 1, not valid!");
+                return;
+        }
+
+        /* are we removed? */
+        if (number == 0) {
+                phone->priv->present = FALSE;
+                phone->priv->percentage = 0;
+                phone->priv->onac = FALSE;
+                g_debug ("emitting device-removed : (%i)", 0);
+                g_signal_emit (phone, signals [DEVICE_REMOVED], 0, 0);
+                return;
+        }
+
+        if (phone->priv->present) {
+                g_warning ("duplicate NumberBatteriesChanged with no change");
+                return;
+        }
+
+        /* reset to defaults until we get BatteryStateChanged */
+        phone->priv->present = TRUE;
+        phone->priv->percentage = 0;
+        phone->priv->onac = FALSE;
+        g_debug ("emitting device-added : (%i)", 0);
+        g_signal_emit (phone, signals [DEVICE_ADDED], 0, 0);
+}
+
+static void
+gpm_phone_generic_signal_cb (GDBusProxy *proxy,
+                             gchar *sender_name, gchar *signal_name,
+                             GVariant *parameters, gpointer user_data) {
+
+        GpmPhone *self = GPM_PHONE (user_data);
+
+        if (!g_strcmp0 (signal_name, "BatteryStateChanged")) {
+                guint idx, percentage;
+                gboolean on_ac;
+
+                g_variant_get (parameters, "(uub)", &idx, &percentage, &on_ac);
+                gpm_phone_battery_state_changed (proxy, idx, percentage, on_ac, self);
+                return;
+        }
+
+        if (!g_strcmp0 (signal_name, "NumberBatteriesChanged")) {
+                guint number;
+
+                g_variant_get (parameters, "(u)", &number);
+                gpm_phone_num_batteries_changed (proxy, number, self);
+                return;
+        }
+
+        /* not a signal we're interested in */
+}
+
+static void
+gpm_phone_class_init (GpmPhoneClass *klass)
+{
+        GObjectClass *object_class = G_OBJECT_CLASS (klass);
+        object_class->finalize = gpm_phone_finalize;
+        g_type_class_add_private (klass, sizeof (GpmPhonePrivate));
+
+        signals [DEVICE_ADDED] =
+                g_signal_new ("device-added",
+                              G_TYPE_FROM_CLASS (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GpmPhoneClass, device_added),
+                              NULL, NULL, g_cclosure_marshal_VOID__UINT,
+                              G_TYPE_NONE, 1, G_TYPE_UINT);
+
+        signals [DEVICE_REMOVED] =
+                g_signal_new ("device-removed",
+                              G_TYPE_FROM_CLASS (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GpmPhoneClass, device_removed),
+                              NULL, NULL, g_cclosure_marshal_VOID__UINT,
+                              G_TYPE_NONE, 1, G_TYPE_UINT);
+
+        signals [DEVICE_REFRESH] =
+                g_signal_new ("device-refresh",
+                              G_TYPE_FROM_CLASS (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GpmPhoneClass, device_refresh),
+                              NULL, NULL, g_cclosure_marshal_VOID__UINT,
+                              G_TYPE_NONE, 1, G_TYPE_UINT);
+}
+
+static void
+gpm_phone_service_appeared_cb (GDBusConnection *connection,
+                               const gchar *name, const gchar *name_owner,
+                               GpmPhone *phone)
+{
+        GError *error = NULL;
+
+        g_return_if_fail (GPM_IS_PHONE (phone));
+
+        if (phone->priv->connection == NULL) {
+                g_debug ("get connection");
+                g_clear_error (&error);
+                phone->priv->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+                if (phone->priv->connection == NULL) {
+                        g_warning ("Could not connect to DBUS daemon: %s", error->message);
+                        g_error_free (error);
+                        phone->priv->connection = NULL;
+                        return;
+                }
+        }
+        if (phone->priv->proxy == NULL) {
+                g_debug ("get proxy");
+                g_clear_error (&error);
+                phone->priv->proxy = g_dbus_proxy_new_sync (phone->priv->connection,
+                                G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+                                NULL,
+                                GNOME_PHONE_MANAGER_DBUS_SERVICE,
+                                GNOME_PHONE_MANAGER_DBUS_PATH,
+                                GNOME_PHONE_MANAGER_DBUS_INTERFACE,
+                                NULL, &error);
+                if (phone->priv->proxy == NULL) {
+                        g_warning ("Cannot connect, maybe the daemon is not running: %s", error->message);
+                        g_error_free (error);
+                        phone->priv->proxy = NULL;
+                        return;
+                }
+
+                g_signal_connect (phone->priv->proxy, "g-signal", G_CALLBACK(gpm_phone_generic_signal_cb), phone);
+        }
+}
+
+static void
+gpm_phone_service_vanished_cb (GDBusConnection *connection,
+                                const gchar *name,
+                                GpmPhone *phone)
+{
+        g_return_if_fail (GPM_IS_PHONE (phone));
+
+        if (phone->priv->proxy == NULL)
+                return;
+        g_debug ("removing proxy");
+        g_object_unref (phone->priv->proxy);
+        phone->priv->proxy = NULL;
+        if (phone->priv->present) {
+                phone->priv->present = FALSE;
+                phone->priv->percentage = 0;
+                g_debug ("emitting device-removed : (%i)", 0);
+                g_signal_emit (phone, signals [DEVICE_REMOVED], 0, 0);
+        }
+}
+
+static void
+gpm_phone_init (GpmPhone *phone)
+{
+        phone->priv = GPM_PHONE_GET_PRIVATE (phone);
+        phone->priv->watch_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
+                                                  GNOME_PHONE_MANAGER_DBUS_SERVICE,
+                                                  G_BUS_NAME_WATCHER_FLAGS_NONE,
+                                                  (GBusNameAppearedCallback) gpm_phone_service_appeared_cb,
+                                                  (GBusNameVanishedCallback) gpm_phone_service_vanished_cb,
+                                                  phone, NULL);
+}
+
+static void
+gpm_phone_finalize (GObject *object)
+{
+        GpmPhone *phone;
+        g_return_if_fail (GPM_IS_PHONE (object));
+
+        phone = GPM_PHONE (object);
+        phone->priv = GPM_PHONE_GET_PRIVATE (phone);
+
+        if (phone->priv->proxy != NULL)
+                g_object_unref (phone->priv->proxy);
+        g_bus_unwatch_name (phone->priv->watch_id);
+
+        G_OBJECT_CLASS (gpm_phone_parent_class)->finalize (object);
+}
+
+GpmPhone *
+gpm_phone_new (void)
+{
+        if (gpm_phone_object != NULL) {
+                g_object_ref (gpm_phone_object);
+        } else {
+                gpm_phone_object = g_object_new (GPM_TYPE_PHONE, NULL);
+                g_object_add_weak_pointer (gpm_phone_object, &gpm_phone_object);
+        }
+        return GPM_PHONE (gpm_phone_object);
+}
+
diff --git a/plugins/power/gpm-phone.h b/plugins/power/gpm-phone.h
new file mode 100644
index 0000000..0843db9
--- /dev/null
+++ b/plugins/power/gpm-phone.h
@@ -0,0 +1,73 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007-2011 Richard Hughes <richard hughsie com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef __GPMPHONE_H
+#define __GPMPHONE_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GPM_TYPE_PHONE          (gpm_phone_get_type ())
+#define GPM_PHONE(o)            (G_TYPE_CHECK_INSTANCE_CAST ((o), GPM_TYPE_PHONE, GpmPhone))
+#define GPM_PHONE_CLASS(k)      (G_TYPE_CHECK_CLASS_CAST((k), GPM_TYPE_PHONE, GpmPhoneClass))
+#define GPM_IS_PHONE(o)         (G_TYPE_CHECK_INSTANCE_TYPE ((o), GPM_TYPE_PHONE))
+#define GPM_IS_PHONE_CLASS(k)   (G_TYPE_CHECK_CLASS_TYPE ((k), GPM_TYPE_PHONE))
+#define GPM_PHONE_GET_CLASS(o)  (G_TYPE_INSTANCE_GET_CLASS ((o), GPM_TYPE_PHONE, GpmPhoneClass))
+
+#define GNOME_PHONE_MANAGER_DBUS_SERVICE        "org.gnome.phone"
+#define GNOME_PHONE_MANAGER_DBUS_PATH           "/org/gnome/phone/Manager"
+#define GNOME_PHONE_MANAGER_DBUS_INTERFACE      "org.gnome.phone.Manager"
+
+typedef struct GpmPhonePrivate GpmPhonePrivate;
+
+typedef struct
+{
+        GObject                parent;
+        GpmPhonePrivate *priv;
+} GpmPhone;
+
+typedef struct
+{
+        GObjectClass    parent_class;
+        void            (* device_added)                (GpmPhone       *phone,
+                                                         guint           idx);
+        void            (* device_removed)              (GpmPhone       *phone,
+                                                         guint           idx);
+        void            (* device_refresh)              (GpmPhone       *phone,
+                                                         guint           idx);
+} GpmPhoneClass;
+
+GType            gpm_phone_get_type                     (void);
+GpmPhone        *gpm_phone_new                          (void);
+
+gboolean         gpm_phone_get_present                  (GpmPhone       *phone,
+                                                         guint           idx);
+guint            gpm_phone_get_percentage               (GpmPhone       *phone,
+                                                         guint           idx);
+gboolean         gpm_phone_get_on_ac                    (GpmPhone       *phone,
+                                                         guint           idx);
+guint            gpm_phone_get_num_batteries            (GpmPhone       *phone);
+gboolean         gpm_phone_coldplug                     (GpmPhone       *phone);
+
+G_END_DECLS
+
+#endif  /* __GPMPHONE_H */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]