[Xfce4-commits] [xfce/tumbler] 01/11: Start porting some code from dbus-glib.
noreply at xfce.org
noreply at xfce.org
Mon May 15 13:20:29 CEST 2017
This is an automated email from the git hooks/post-receive script.
ali pushed a commit to branch master
in repository xfce/tumbler.
commit 1f9899cad6ba2f6bae6722db605de41ba474f1b9
Author: Ali Abdallah <aliovx at gmail.com>
Date: Thu Oct 8 20:10:32 2015 +0200
Start porting some code from dbus-glib.
TumblerManager object which exports the interface
'org.freedesktop.thumbnails.Manager1' is almost dbus-glib free now.
There is still only a dbus-glib legacy_connection used for
the TumblerSpecializedThumbnailer, which will go away one that object
is ported.
---
configure.ac | 12 +++
tumblerd/Makefile.am | 17 +++-
tumblerd/main.c | 48 +++++++---
tumblerd/tumbler-manager-dbus.xml | 5 +-
tumblerd/tumbler-manager.c | 188 +++++++++++++++++---------------------
tumblerd/tumbler-manager.h | 10 +-
6 files changed, 148 insertions(+), 132 deletions(-)
diff --git a/configure.ac b/configure.ac
index a8dc277..e612502 100644
--- a/configure.ac
+++ b/configure.ac
@@ -140,10 +140,22 @@ if test x"$DBUS_BINDING_TOOL" = x"no"; then
fi
dnl ***********************************
+dnl *** Check for gdbus-codegen ***
+dnl ***********************************
+AC_ARG_VAR([GDBUS_CODEGEN], [D-Bus code and documentation generator from XML D-Bus interface definitions])
+AC_PATH_PROG([GDBUS_CODEGEN], [gdbus-codegen], [no])
+if test x"$GDBUS_CODEGEN" = x"no"; then
+ AC_MSG_ERROR([could not find gdbus-codegen in \$PATH. You can run
+ ./configure GDBUS_CODEGEN=/path/to/gdbus-codegen to define
+ a custom location for it.])
+fi
+
+dnl ***********************************
dnl *** Check for required packages ***
dnl ***********************************
PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.16.0])
PKG_CHECK_MODULES([GIO], [gio-2.0 >= 2.16.0])
+PKG_CHECK_MODULES([GIO_UNIX], [gio-unix-2.0 >= 2.16.0])
PKG_CHECK_MODULES([GMODULE], [gmodule-2.0 >= 2.10.0])
PKG_CHECK_MODULES([GTHREAD], [gthread-2.0 >= 2.16.0])
PKG_CHECK_MODULES([DBUS], [dbus-1 >= 1.0.0])
diff --git a/tumblerd/Makefile.am b/tumblerd/Makefile.am
index 6dfd249..b4b9110 100644
--- a/tumblerd/Makefile.am
+++ b/tumblerd/Makefile.am
@@ -25,8 +25,9 @@ tumblerd_PROGRAMS = \
tumblerd_built_sources = \
tumbler-cache-service-dbus-bindings.h \
- tumbler-manager-dbus-bindings.h \
- tumbler-service-dbus-bindings.h
+ tumbler-service-dbus-bindings.h \
+ tumbler-manager-gdbus.c \
+ tumbler-manager-gdbus.h
tumblerd_SOURCES = \
main.c \
@@ -61,6 +62,7 @@ tumblerd_CFLAGS = \
$(DBUS_GLIB_CFLAGS) \
$(GDK_PIXBUF_CFLAGS) \
$(GIO_CFLAGS) \
+ $(GIO_UNIX_CFLAGS) \
$(GLIB_CFLAGS) \
$(GTHREAD_CFLAGS) \
$(PLATFORM_CFLAGS) \
@@ -78,6 +80,7 @@ tumblerd_LDADD = \
$(DBUS_GLIB_LIBS) \
$(GDK_PIXBUF_LIBS) \
$(GIO_LIBS) \
+ $(GIO_UNIX_LIBS) \
$(GLIB_LIBS) \
$(GTHREAD_LIBS) \
$(top_builddir)/tumbler/libtumbler-$(TUMBLER_VERSION_API).la
@@ -117,8 +120,14 @@ BUILT_SOURCES = \
tumbler-cache-service-dbus-bindings.h: tumbler-cache-service-dbus.xml Makefile
$(AM_V_GEN) $(DBUS_BINDING_TOOL) --mode=glib-server --prefix=tumbler_cache_service $< > $@
-tumbler-manager-dbus-bindings.h: tumbler-manager-dbus.xml Makefile
- $(AM_V_GEN) $(DBUS_BINDING_TOOL) --mode=glib-server --prefix=tumbler_manager $< > $@
tumbler-service-dbus-bindings.h: tumbler-service-dbus.xml Makefile
$(AM_V_GEN) $(DBUS_BINDING_TOOL) --mode=glib-server --prefix=tumbler_service $< > $@
+
+tumbler-manager-gdbus.h:
+tumbler-manager-gdbus.c: tumbler-manager-dbus.xml Makefile
+ $(AM_V_GEN) $(GDBUS_CODEGEN) \
+ --interface-prefix org.freedesktop.thumbnails.Manager1 \
+ --c-namespace Tumbler \
+ --generate-c-code tumbler-manager-gdbus \
+ $(srcdir)/tumbler-manager-dbus.xml
diff --git a/tumblerd/main.c b/tumblerd/main.c
index 8249fb2..e498218 100644
--- a/tumblerd/main.c
+++ b/tumblerd/main.c
@@ -214,7 +214,17 @@ locations_from_strv (gchar **array)
return locations;
}
+static void
+on_dbus_name_lost (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ GMainLoop *main_loop;
+ g_critical (_("Name %s lost on the message dbus, exiting."),name);
+ main_loop = (GMainLoop*)user_data;
+ g_main_loop_quit(main_loop);
+}
int
main (int argc,
@@ -222,6 +232,7 @@ main (int argc,
{
TumblerLifecycleManager *lifecycle_manager;
TumblerProviderFactory *provider_factory;
+ GDBusConnection *gconnection;
DBusGConnection *connection;
TumblerRegistry *registry;
TumblerManager *manager;
@@ -283,6 +294,16 @@ main (int argc,
return EXIT_FAILURE;
}
+ gconnection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+
+ if (error != NULL)
+ {
+ g_critical ("error getting session bus: %s", error->message);
+ g_error_free (error);
+
+ return EXIT_FAILURE;
+ }
+
/* create the lifecycle manager */
lifecycle_manager = tumbler_lifecycle_manager_new ();
@@ -352,7 +373,7 @@ main (int argc,
cache_service = tumbler_cache_service_new (connection, lifecycle_manager);
/* create the thumbnailer manager service */
- manager = tumbler_manager_new (connection, lifecycle_manager, registry);
+ manager = tumbler_manager_new (gconnection, lifecycle_manager, registry);
/* create the generic thumbnailer service */
service = tumbler_service_new (connection, lifecycle_manager, registry);
@@ -378,17 +399,17 @@ main (int argc,
/* service already running, exit gracefully to not break clients */
goto exit_tumbler;
}
-
- /* try to start the service and exit if that fails */
- if (!tumbler_manager_start (manager, &error))
- {
- g_warning (_("Failed to start the thumbnailer manager: %s"), error->message);
- g_error_free (error);
-
- /* service already running, exit gracefully to not break clients */
- goto exit_tumbler;
- }
-
+
+ /* Acquire the manager dbus name */
+ g_bus_own_name_on_connection (gconnection,
+ "org.freedesktop.thumbnails.Manager1",
+ G_BUS_NAME_OWNER_FLAGS_REPLACE,
+ NULL, /* We dont need to do anything on name acquired*/
+ on_dbus_name_lost,
+ main_loop,
+ NULL);
+
+
/* try to start the service and exit if that fails */
if (!tumbler_service_start (service, &error))
{
@@ -424,6 +445,9 @@ main (int argc,
/* disconnect from the D-Bus session bus */
dbus_g_connection_unref (connection);
+ /* free the dbus session bus connection */
+ g_object_unref (gconnection);
+
/* we're done, all fine */
return retval;
}
diff --git a/tumblerd/tumbler-manager-dbus.xml b/tumblerd/tumbler-manager-dbus.xml
index f56d422..b4c0929 100644
--- a/tumblerd/tumbler-manager-dbus.xml
+++ b/tumblerd/tumbler-manager-dbus.xml
@@ -1,10 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<node name="/org/freedesktop/thumbnails/Manager1">
<interface name="org.freedesktop.thumbnails.Manager1">
+
+ <annotation name="org.gtk.GDBus.C.Name" value="ExportedManager" />
+
<method name="Register">
- <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
<arg type="s" name="uri_scheme" direction="in" />
<arg type="s" name="mime_type" direction="in" />
</method>
+
</interface>
</node>
diff --git a/tumblerd/tumbler-manager.c b/tumblerd/tumbler-manager.c
index db5d64e..1fae160 100644
--- a/tumblerd/tumbler-manager.c
+++ b/tumblerd/tumbler-manager.c
@@ -1,6 +1,7 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2009-2011 Jannis Pohlmann <jannis at xfce.org>
+ * Copyright (c) 2015 Ali Abdallah <ali at xfce.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -42,12 +43,11 @@
#include <tumblerd/tumbler-component.h>
#include <tumblerd/tumbler-manager.h>
-#include <tumblerd/tumbler-manager-dbus-bindings.h>
+#include <tumblerd/tumbler-manager-gdbus.h>
#include <tumblerd/tumbler-specialized-thumbnailer.h>
#include <tumblerd/tumbler-utils.h>
-
/* Property identifiers */
enum
{
@@ -73,6 +73,11 @@ static void tumbler_manager_set_property (GObject *obj
guint prop_id,
const GValue *value,
GParamSpec *pspec);
+static gboolean tumbler_manager_register_cb (TumblerExportedManager *skeleton,
+ GDBusMethodInvocation *invocation,
+ const gchar *const *uri_schemes,
+ const gchar *const *mime_types,
+ TumblerManager *manager);
static void tumbler_manager_monitor_unref (GFileMonitor *monitor,
TumblerManager *manager);
static void tumbler_manager_load_thumbnailers (TumblerManager *manager,
@@ -105,9 +110,11 @@ struct _TumblerManagerClass
struct _TumblerManager
{
TumblerComponent __parent__;
-
- DBusGConnection *connection;
- TumblerRegistry *registry;
+ DBusGConnection *legacy_connection;
+ GDBusConnection *connection;
+ TumblerExportedManager *skeleton;
+
+ TumblerRegistry *registry;
/* Directory and monitor objects for the thumbnailer dirs in
* XDG_DATA_HOME and XDG_DATA_DIRS */
@@ -165,11 +172,12 @@ tumbler_manager_class_init (TumblerManagerClass *klass)
gobject_class->set_property = tumbler_manager_set_property;
g_object_class_install_property (gobject_class, PROP_CONNECTION,
- g_param_spec_pointer ("connection",
- "connection",
- "connection",
- G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY));
+ g_param_spec_object ("connection",
+ "connection",
+ "connection",
+ G_TYPE_DBUS_CONNECTION,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (gobject_class, PROP_REGISTRY,
g_param_spec_object ("registry",
@@ -205,20 +213,29 @@ tumbler_manager_init (TumblerManager *manager)
static void
tumbler_manager_constructed (GObject *object)
{
- TumblerManager *manager = TUMBLER_MANAGER (object);
+ TumblerManager *manager;
+ GError *error = NULL;
+
+ manager = TUMBLER_MANAGER (object);
- /* everything's fine, install the manager type D-Bus info */
- dbus_g_object_type_install_info (G_OBJECT_TYPE (manager),
- &dbus_glib_tumbler_manager_object_info);
+ /* FIXME: dbus-glib legacy, to be removed shortly */
+ manager->legacy_connection = dbus_g_bus_get (DBUS_BUS_SESSION, NULL);
+
+ manager->skeleton = tumbler_exported_manager_skeleton_new ();
- /* register the manager instance as a handler of the manager interface */
- dbus_g_connection_register_g_object (manager->connection,
- "/org/freedesktop/thumbnails/Manager1",
- G_OBJECT (manager));
+ g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON(manager->skeleton),
+ manager->connection,
+ "/org/freedesktop/thumbnails/Manager1",
+ &error);
+ if (error != NULL)
+ {
+ g_critical ("error exporting thumbnail manager on session bus: %s", error->message);
+ g_error_free (error);
+
+ exit (1);
+ }
}
-
-
static void
tumbler_manager_finalize (GObject *object)
{
@@ -241,9 +258,16 @@ tumbler_manager_finalize (GObject *object)
/* release the registry */
g_object_unref (manager->registry);
- /* release the D-Bus connection object */
- dbus_g_connection_unref (manager->connection);
+ /* Unexport from dbus */
+ g_dbus_interface_skeleton_unexport_from_connection (G_DBUS_INTERFACE_SKELETON (manager->skeleton),
+ manager->connection);
+ /* release the Skeleton object */
+ g_object_unref (manager->skeleton);
+
+ /* release the D-Bus connection object */
+ g_object_unref (manager->connection);
+
tumbler_mutex_unlock (manager->mutex);
/* destroy the mutex */
@@ -265,7 +289,7 @@ tumbler_manager_get_property (GObject *object,
switch (prop_id)
{
case PROP_CONNECTION:
- g_value_set_pointer (value, manager->connection);
+ g_value_set_object (value, manager->connection);
break;
case PROP_REGISTRY:
g_value_set_object (value, manager->registry);
@@ -289,7 +313,7 @@ tumbler_manager_set_property (GObject *object,
switch (prop_id)
{
case PROP_CONNECTION:
- manager->connection = dbus_g_connection_ref (g_value_get_pointer (value));
+ manager->connection = g_object_ref (g_value_get_object (value));
break;
case PROP_REGISTRY:
manager->registry = g_value_dup_object (value);
@@ -300,7 +324,38 @@ tumbler_manager_set_property (GObject *object,
}
}
-
+static gboolean
+tumbler_manager_register_cb (TumblerExportedManager *skeleton,
+ GDBusMethodInvocation *invocation,
+ const gchar *const *uri_schemes,
+ const gchar *const *mime_types,
+ TumblerManager *manager)
+{
+ TumblerThumbnailer *thumbnailer;
+ const gchar *sender_name;
+
+ g_return_if_fail (TUMBLER_IS_MANAGER (manager));
+ g_return_if_fail (uri_schemes != NULL);
+ g_return_if_fail (mime_types != NULL);
+
+ sender_name = g_dbus_method_invocation_get_sender (invocation);
+
+ tumbler_mutex_lock (manager->mutex);
+
+ thumbnailer = tumbler_specialized_thumbnailer_new_foreign (manager->legacy_connection,
+ sender_name, uri_schemes,
+ mime_types);
+
+ tumbler_registry_add (manager->registry, thumbnailer);
+
+ g_object_unref (thumbnailer);
+
+ tumbler_mutex_unlock (manager->mutex);
+
+ tumbler_exported_manager_complete_register(skeleton, invocation);
+
+ return TRUE;
+}
static void
tumbler_manager_monitor_unref (GFileMonitor *monitor,
@@ -985,7 +1040,7 @@ tumbler_manager_load_thumbnailer (TumblerManager *manager,
/* create a new specialized thumbnailer object and pass all the required
* information on to it */
info->thumbnailer =
- tumbler_specialized_thumbnailer_new (manager->connection, name, object_path,
+ tumbler_specialized_thumbnailer_new (manager->legacy_connection, name, object_path,
(const gchar *const *)uri_schemes,
(const gchar *const *)mime_types,
file_stat.st_mtime);
@@ -1827,7 +1882,7 @@ dump_thumbnailers (TumblerManager *manager)
TumblerManager *
-tumbler_manager_new (DBusGConnection *connection,
+tumbler_manager_new (GDBusConnection *connection,
TumblerLifecycleManager *lifecycle_manager,
TumblerRegistry *registry)
{
@@ -1837,82 +1892,3 @@ tumbler_manager_new (DBusGConnection *connection,
"lifecycle-manager", lifecycle_manager,
NULL);
}
-
-
-
-gboolean
-tumbler_manager_start (TumblerManager *manager,
- GError **error)
-{
- DBusConnection *connection;
- gint result;
-
- g_return_val_if_fail (TUMBLER_IS_MANAGER (manager), FALSE);
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
- tumbler_mutex_lock (manager->mutex);
-
- /* get the native D-Bus connection */
- connection = dbus_g_connection_get_connection (manager->connection);
-
- /* request ownership for the manager interface */
- result = dbus_bus_request_name (connection, "org.freedesktop.thumbnails.Manager1",
- DBUS_NAME_FLAG_DO_NOT_QUEUE, NULL);
-
- /* check if that failed */
- if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
- {
- if (error != NULL)
- {
- g_set_error (error, DBUS_GERROR, DBUS_GERROR_FAILED,
- _("Another thumbnailer manager is already running"));
- }
-
- tumbler_mutex_unlock (manager->mutex);
-
- /* i can't work like this! */
- return FALSE;
- }
-
- tumbler_mutex_unlock (manager->mutex);
-
- /* load thumbnailers installed into the system permanently */
- tumbler_manager_load (manager);
-
- /* done initializing and loading all permanent thumbnailers */
- return TRUE;
-}
-
-
-
-void
-tumbler_manager_register (TumblerManager *manager,
- const gchar *const *uri_schemes,
- const gchar *const *mime_types,
- DBusGMethodInvocation *context)
-{
- TumblerThumbnailer *thumbnailer;
- gchar *sender_name;
-
- dbus_async_return_if_fail (TUMBLER_IS_MANAGER (manager), context);
- dbus_async_return_if_fail (uri_schemes != NULL, context);
- dbus_async_return_if_fail (mime_types != NULL, context);
-
- sender_name = dbus_g_method_get_sender (context);
-
- tumbler_mutex_lock (manager->mutex);
-
- thumbnailer = tumbler_specialized_thumbnailer_new_foreign (manager->connection,
- sender_name, uri_schemes,
- mime_types);
-
- tumbler_registry_add (manager->registry, thumbnailer);
-
- g_object_unref (thumbnailer);
-
- tumbler_mutex_unlock (manager->mutex);
-
- g_free (sender_name);
-
- dbus_g_method_return (context);
-}
diff --git a/tumblerd/tumbler-manager.h b/tumblerd/tumbler-manager.h
index cc11bd1..60e308f 100644
--- a/tumblerd/tumbler-manager.h
+++ b/tumblerd/tumbler-manager.h
@@ -40,17 +40,9 @@ typedef struct _TumblerManager TumblerManager;
GType tumbler_manager_get_type (void) G_GNUC_CONST;
-TumblerManager *tumbler_manager_new (DBusGConnection *connection,
+TumblerManager *tumbler_manager_new (GDBusConnection *connection,
TumblerLifecycleManager *lifecycle_manager,
TumblerRegistry *registry) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
-gboolean tumbler_manager_start (TumblerManager *manager,
- GError **error);
-void tumbler_manager_register (TumblerManager *manager,
- const gchar *const *uri_schemes,
- const gchar *const *mime_types,
- DBusGMethodInvocation *context);
-void tumbler_manager_get_supported (TumblerManager *manager,
- DBusGMethodInvocation *context);
G_END_DECLS;
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list