[Xfce4-commits] <xfce4-power-manager:master> Added GObject for handling unique instances of xfpm via D-Bus.
Ali Abdallah
noreply at xfce.org
Sat Jan 30 02:18:38 CET 2010
Updating branch refs/heads/master
to f654a43b5d33a50ac63c15178c75c2a9d80b6012 (commit)
from 9e431c76cfb93e09b99fa0e5badbcb6c603b85ef (commit)
commit f654a43b5d33a50ac63c15178c75c2a9d80b6012
Author: Ali Abdallah <aliov at xfce.org>
Date: Fri Jan 22 16:14:41 2010 +0100
Added GObject for handling unique instances of xfpm via D-Bus.
libdbus/Makefile.am | 11 +-
libdbus/org.xfce.unique.xml | 10 ++
libdbus/xfpm-dbus.c | 45 -----
libdbus/xfpm-dbus.h | 8 -
libdbus/xfpm-unique.c | 243 ++++++++++++++++++++++++++++
src/xfpm-polkit.h => libdbus/xfpm-unique.h | 33 ++--
6 files changed, 278 insertions(+), 72 deletions(-)
diff --git a/libdbus/Makefile.am b/libdbus/Makefile.am
index 3ab62d2..6a47cbb 100644
--- a/libdbus/Makefile.am
+++ b/libdbus/Makefile.am
@@ -6,8 +6,11 @@ libxfpmdbus_la_SOURCES = \
xfpm-dbus.h \
xfpm-dbus-monitor.c \
xfpm-dbus-monitor.h \
+ xfpm-unique.c \
+ xfpm-unique.h \
xfpm-dbus-marshal.c \
- xfpm-dbus-marshal.h
+ xfpm-dbus-marshal.h \
+ org.xfce.unique.h
libxfpmdbus_la_CFLAGS = \
$(GLIB_CFLAGS) \
@@ -18,7 +21,8 @@ if MAINTAINER_MODE
BUILT_SOURCES = \
xfpm-dbus-marshal.c \
- xfpm-dbus-marshal.h
+ xfpm-dbus-marshal.h \
+ org.xfce.unique.h
xfpm-dbus-marshal.c: xfpm-dbus-marshal.list
echo "#include \"xfpm-dbus-marshal.h\"" > $@ && \
@@ -27,6 +31,9 @@ xfpm-dbus-marshal.c: xfpm-dbus-marshal.list
xfpm-dbus-marshal.h: xfpm-dbus-marshal.list
glib-genmarshal $< --prefix=_xfpm_dbus_marshal --header > $@
+org.xfce.unique.h: org.xfce.unique.xml
+ dbus-binding-tool --mode=glib-server --prefix=xfce_unique $< >$@
+
endif
EXTRA_DIST = \
diff --git a/libdbus/org.xfce.unique.xml b/libdbus/org.xfce.unique.xml
new file mode 100644
index 0000000..323e405
--- /dev/null
+++ b/libdbus/org.xfce.unique.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<node name="/">
+ <interface name="org.xfce.unique">
+
+ <method name="Ping">
+ </method>
+
+ </interface>
+</node>
diff --git a/libdbus/xfpm-dbus.c b/libdbus/xfpm-dbus.c
index ccbe5dc..1f0e623 100644
--- a/libdbus/xfpm-dbus.c
+++ b/libdbus/xfpm-dbus.c
@@ -91,48 +91,3 @@ gboolean xfpm_dbus_release_name(DBusConnection *connection, const gchar *name)
return TRUE;
}
-
-
-GHashTable *xfpm_dbus_get_interface_properties (DBusGProxy *proxy_prop, const gchar *iface_name)
-{
- gboolean ret;
- GError *error = NULL;
- GHashTable *props = NULL;
-
- props = NULL;
-
- ret = dbus_g_proxy_call (proxy_prop, "GetAll", &error,
- G_TYPE_STRING, iface_name,
- G_TYPE_INVALID,
- dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), &props,
- G_TYPE_INVALID);
-
- if (!ret)
- {
- g_warning ("Unable to get interface properties for : %s : %s", iface_name, error->message);
- g_error_free (error);
- }
-
- return props;
-}
-
-GValue xfpm_dbus_get_interface_property (DBusGProxy *proxy, const gchar *iface_name, const gchar *prop_name)
-{
- gboolean ret;
- GError *error = NULL;
- GValue value = { 0, };
-
- ret = dbus_g_proxy_call (proxy, "Get", &error,
- G_TYPE_STRING, iface_name,
- G_TYPE_STRING, prop_name,
- G_TYPE_INVALID,
- G_TYPE_VALUE, &value, G_TYPE_INVALID);
-
- if (!ret)
- {
- g_warning ("Unable to get property %s on interface %s : %s", prop_name, iface_name, error->message);
- g_error_free (error);
- }
-
- return value;
-}
diff --git a/libdbus/xfpm-dbus.h b/libdbus/xfpm-dbus.h
index 0f005f7..dff2ef1 100644
--- a/libdbus/xfpm-dbus.h
+++ b/libdbus/xfpm-dbus.h
@@ -33,12 +33,4 @@ gboolean xfpm_dbus_register_name (DBusConnection *bus,
gboolean xfpm_dbus_release_name (DBusConnection *bus,
const gchar *name);
-
-GHashTable *xfpm_dbus_get_interface_properties (DBusGProxy *proxy_prop,
- const gchar *iface_name);
-
-GValue xfpm_dbus_get_interface_property (DBusGProxy *proxy,
- const gchar *iface_name,
- const gchar *prop_name);
-
#endif /* __XFPM_DBUS_H */
diff --git a/libdbus/xfpm-unique.c b/libdbus/xfpm-unique.c
new file mode 100644
index 0000000..9addfb7
--- /dev/null
+++ b/libdbus/xfpm-unique.c
@@ -0,0 +1,243 @@
+/*
+ * * Copyright (C) 2010 Ali <aliov at xfce.org>
+ *
+ * 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
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "xfpm-unique.h"
+#include "xfpm-dbus.h"
+
+#include <dbus/dbus-glib-lowlevel.h>
+
+static void xfpm_unique_dbus_class_init (XfpmUniqueClass *klass);
+static void xfpm_unique_dbus_init (XfpmUnique *unique);
+
+static void xfpm_unique_finalize (GObject *object);
+
+#define XFPM_UNIQUE_GET_PRIVATE(o) \
+(G_TYPE_INSTANCE_GET_PRIVATE ((o), XFPM_TYPE_UNIQUE, XfpmUniquePrivate))
+
+struct XfpmUniquePrivate
+{
+ DBusGConnection *bus;
+
+ gchar *name;
+};
+
+enum
+{
+ PROP_0,
+ PROP_NAME
+};
+
+enum
+{
+ PING_RECEIVED,
+ LAST_SIGNAL
+};
+
+static guint signals [LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (XfpmUnique, xfpm_unique, G_TYPE_OBJECT)
+
+static void xfpm_unique_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ XfpmUnique *unique;
+ unique = XFPM_UNIQUE (object);
+
+ switch (prop_id)
+ {
+ case PROP_NAME:
+ g_value_set_string (value, unique->priv->name);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+
+}
+
+static void xfpm_unique_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+
+ XfpmUnique *unique;
+ unique = XFPM_UNIQUE (object);
+
+ switch (prop_id)
+ {
+ case PROP_NAME:
+ unique->priv->name = g_value_dup_string (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+xfpm_unique_class_init (XfpmUniqueClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = xfpm_unique_finalize;
+
+ object_class->set_property = xfpm_unique_set_property;
+ object_class->get_property = xfpm_unique_get_property;
+
+ signals [PING_RECEIVED] =
+ g_signal_new ("ping-received",
+ XFPM_TYPE_UNIQUE,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (XfpmUniqueClass, ping_received),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0, G_TYPE_NONE);
+
+ g_object_class_install_property (object_class,
+ PROP_NAME,
+ g_param_spec_string ("name",
+ NULL, NULL,
+ NULL,
+ G_PARAM_READWRITE|
+ G_PARAM_CONSTRUCT_ONLY));
+
+ g_type_class_add_private (klass, sizeof (XfpmUniquePrivate));
+
+ xfpm_unique_dbus_class_init (klass);
+}
+
+static void
+xfpm_unique_init (XfpmUnique *unique)
+{
+ GError *error = NULL;
+
+ unique->priv = XFPM_UNIQUE_GET_PRIVATE (unique);
+
+ unique->priv->name = NULL;
+
+ unique->priv->bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+
+ if ( error )
+ g_error ("Failed to connect to the session bus : %s", error->message);
+
+ xfpm_unique_dbus_init (unique);
+}
+
+static void
+xfpm_unique_finalize (GObject *object)
+{
+ XfpmUnique *unique;
+
+ unique = XFPM_UNIQUE (object);
+
+ xfpm_dbus_release_name (dbus_g_connection_get_connection (unique->priv->bus),
+ unique->priv->name);
+
+ dbus_g_connection_unref (unique->priv->bus);
+ g_free (unique->priv->name);
+
+ G_OBJECT_CLASS (xfpm_unique_parent_class)->finalize (object);
+}
+
+XfpmUnique *
+xfpm_unique_new (const gchar *name)
+{
+ XfpmUnique *unique = NULL;
+
+ unique = g_object_new (XFPM_TYPE_UNIQUE, "name", name, NULL);
+
+ return unique;
+}
+
+gboolean xfpm_unique_app_is_running (XfpmUnique *unique)
+{
+ g_return_val_if_fail (XFPM_IS_UNIQUE (unique), FALSE);
+
+ if (xfpm_dbus_name_has_owner (dbus_g_connection_get_connection (unique->priv->bus),
+ unique->priv->name))
+ {
+ DBusGProxy *proxy;
+ GError *error = NULL;
+
+ proxy = dbus_g_proxy_new_for_name (unique->priv->bus,
+ unique->priv->name,
+ "/org/xfce/unique",
+ "org.xfce.unique");
+
+ /*Shoudln't happen, but check anyway*/
+ if ( !proxy )
+ {
+ g_critical ("Unable to create proxy for %s", unique->priv->name);
+ return FALSE;
+ }
+
+ dbus_g_proxy_call (proxy, "Ping", &error,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+
+ if ( error )
+ {
+ g_warning ("Failed to 'Ping' %s", unique->priv->name);
+
+ }
+
+ g_object_unref (proxy);
+ return TRUE;
+ }
+
+ xfpm_dbus_register_name (dbus_g_connection_get_connection (unique->priv->bus),
+ unique->priv->name);
+
+ return FALSE;
+}
+
+static gboolean xfce_unique_ping (XfpmUnique *unique,
+ GError *error);
+
+#include "org.xfce.unique.h"
+
+static void xfpm_unique_dbus_class_init (XfpmUniqueClass *klass)
+{
+ dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
+ &dbus_glib_xfce_unique_object_info);
+}
+
+static void xfpm_unique_dbus_init (XfpmUnique *unique)
+{
+ dbus_g_connection_register_g_object (unique->priv->bus,
+ "/org/xfce/unique",
+ G_OBJECT (unique));
+}
+
+static gboolean xfce_unique_ping (XfpmUnique *unique,
+ GError *error)
+{
+ g_signal_emit (unique, signals[PING_RECEIVED], 0);
+ return TRUE;
+}
diff --git a/src/xfpm-polkit.h b/libdbus/xfpm-unique.h
similarity index 54%
copy from src/xfpm-polkit.h
copy to libdbus/xfpm-unique.h
index 69225e5..147b414 100644
--- a/src/xfpm-polkit.h
+++ b/libdbus/xfpm-unique.h
@@ -1,5 +1,5 @@
/*
- * * Copyright (C) 2009 Ali <aliov at xfce.org>
+ * * Copyright (C) 2010 Ali <aliov at xfce.org>
*
* Licensed under the GNU General Public License Version 2
*
@@ -18,41 +18,40 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#ifndef __XFPM_POLKIT_H
-#define __XFPM_POLKIT_H
+#ifndef __XFPM_UNIQUE_H
+#define __XFPM_UNIQUE_H
#include <glib-object.h>
G_BEGIN_DECLS
-#define XFPM_TYPE_POLKIT (xfpm_polkit_get_type () )
-#define XFPM_POLKIT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), XFPM_TYPE_POLKIT, XfpmPolkit))
-#define XFPM_IS_POLKIT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), XFPM_TYPE_POLKIT))
+#define XFPM_TYPE_UNIQUE (xfpm_unique_get_type () )
+#define XFPM_UNIQUE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), XFPM_TYPE_UNIQUE, XfpmUnique))
+#define XFPM_IS_UNIQUE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), XFPM_TYPE_UNIQUE))
-typedef struct XfpmPolkitPrivate XfpmPolkitPrivate;
+typedef struct XfpmUniquePrivate XfpmUniquePrivate;
typedef struct
{
GObject parent;
- XfpmPolkitPrivate *priv;
+ XfpmUniquePrivate *priv;
-} XfpmPolkit;
+} XfpmUnique;
typedef struct
{
- GObjectClass parent_class;
+ GObjectClass parent_class;
- void (*auth_changed) (XfpmPolkit *polkit);
+ void (*ping_received) (XfpmUnique *unique);
-} XfpmPolkitClass;
+} XfpmUniqueClass;
-GType xfpm_polkit_get_type (void) G_GNUC_CONST;
+GType xfpm_unique_get_type (void) G_GNUC_CONST;
-XfpmPolkit *xfpm_polkit_get (void);
+XfpmUnique *xfpm_unique_new (const gchar *name);
-gboolean xfpm_polkit_check_auth (XfpmPolkit *polkit,
- const gchar *action_id);
+gboolean xfpm_unique_app_is_running (XfpmUnique *unique);
G_END_DECLS
-#endif /* __XFPM_POLKIT_H */
+#endif /* __XFPM_UNIQUE_H */
More information about the Xfce4-commits
mailing list