[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