This is an automated email from the git hooks/post-receive script.

ochosi pushed a 
commit to branch 
master
in repository xfce/xfce4-panel.

commit c3d56227fb0882f389d6a026973efddea08efb10
Author: Ali Abdallah <a...@xfce.org>
Date:   Wed Jun 21 18:50:09 2017 +0200

    Port the external plugin wrapper to GDBus
---
 panel/Makefile.am                             |  12 +-
 panel/panel-plugin-external-wrapper-infos.xml |   5 +-
 panel/panel-plugin-external-wrapper.c         | 270 ++++++++++++++++----------
 3 files changed, 173 insertions(+), 114 deletions(-)

diff --git a/panel/Makefile.am b/panel/Makefile.am
index 89f93c2..b5f2e48 100644
--- a/panel/Makefile.am
+++ b/panel/Makefile.am
@@ -19,7 +19,8 @@ xfce4_panel_built_sources = \
        panel-gdbus-exported-service.c \
        panel-marshal.c \
        panel-marshal.h \
-       panel-plugin-external-wrapper-infos.h \
+       panel-plugin-external-wrapper-exported.h \
+       panel-plugin-external-wrapper-exported.c \
        panel-preferences-dialog-ui.h
 
 xfce4_panel_SOURCES = \
@@ -109,8 +110,13 @@ panel-gdbus-exported-service.c: 
panel-dbus-service-infos.xml Makefile
        --generate-c-code panel-gdbus-exported-service \
        $(srcdir)/panel-dbus-service-infos.xml
 
-panel-plugin-external-wrapper-infos.h: 
$(srcdir)/panel-plugin-external-wrapper-infos.xml Makefile
-       $(AM_V_GEN) dbus-binding-tool --prefix=panel_plugin_external_wrapper 
--mode=glib-server $< > $@
+panel-plugin-external-wrapper-exported.h:
+panel-plugin-external-wrapper-exported.c: 
panel-plugin-external-wrapper-infos.xml Makefile
+       $(AM_V_GEN) $(GDBUS_CODEGEN) \
+       --interface-prefix org.xfce.Panel.Wrapper \
+       --c-namespace XfcePanelPluginWrapper   \
+       --generate-c-code panel-plugin-external-wrapper-exported \
+       $(srcdir)/panel-plugin-external-wrapper-infos.xml
 
 panel-preferences-dialog-ui.h: $(srcdir)/panel-preferences-dialog.glade 
Makefile
        $(AM_V_GEN) xdt-csource --static --strip-comments --strip-content 
--name=panel_preferences_dialog_ui $< >$@
diff --git a/panel/panel-plugin-external-wrapper-infos.xml 
b/panel/panel-plugin-external-wrapper-infos.xml
index e2d4680..4071ac0 100644
--- a/panel/panel-plugin-external-wrapper-infos.xml
+++ b/panel/panel-plugin-external-wrapper-infos.xml
@@ -3,10 +3,7 @@
     org.xfce.Panel.Wrapper
   -->
   <interface name="org.xfce.Panel.Wrapper">
-    <annotation name="org.freedesktop.DBus.GLib.CSymbol"
-                value="panel_plugin_external_wrapper_dbus" />
-    <annotation name="org.freedesktop.DBus.GLib.ClientCSymbol"
-                value="wrapper_dbus" />
+    <annotation name="org.gtk.GDBus.C.Name" value="Exported" />
 
     <!--
       i : unsigned integer : enum from XfcePanelPluginProviderPropType.
diff --git a/panel/panel-plugin-external-wrapper.c 
b/panel/panel-plugin-external-wrapper.c
index 6b61713..ae56376 100644
--- a/panel/panel-plugin-external-wrapper.c
+++ b/panel/panel-plugin-external-wrapper.c
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2017 Ali Abdallah <a...@xfce.org>
  * Copyright (C) 2008-2010 Nick Schermer <n...@xfce.org>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -44,6 +45,7 @@
 #include <panel/panel-module.h>
 #include <panel/panel-plugin-external.h>
 #include <panel/panel-plugin-external-wrapper.h>
+#include <panel/panel-plugin-external-wrapper-exported.h>
 #include <panel/panel-window.h>
 #include <panel/panel-dialogs.h>
 #include <panel/panel-marshal.h>
@@ -54,9 +56,8 @@
 
 
 
-static GObject   *panel_plugin_external_wrapper_constructor              
(GType                           type,
-                                                                          
guint                           n_construct_params,
-                                                                          
GObjectConstructParam          *construct_params);
+static void       panel_plugin_external_wrapper_constructed              
(GObject                        *object);
+static void       panel_plugin_external_wrapper_finalize                 
(GObject                        *object);
 static void       panel_plugin_external_wrapper_set_properties           
(PanelPluginExternal            *external,
                                                                           
GSList                         *properties);
 static gchar    **panel_plugin_external_wrapper_get_argv                 
(PanelPluginExternal            *external,
@@ -65,20 +66,18 @@ static gboolean   
panel_plugin_external_wrapper_remote_event             (PanelP
                                                                           
const gchar                    *name,
                                                                           
const GValue                   *value,
                                                                           
guint                          *handle);
-static gboolean   panel_plugin_external_wrapper_dbus_provider_signal     
(PanelPluginExternalWrapper     *external,
+static gboolean   panel_plugin_external_wrapper_dbus_provider_signal     
(XfcePanelPluginWrapperExported *skeleton,
+                                                                          
GDBusMethodInvocation          *invocation,
                                                                           
XfcePanelPluginProviderSignal   provider_signal,
-                                                                          
GError                        **error);
-static gboolean   panel_plugin_external_wrapper_dbus_remote_event_result 
(PanelPluginExternalWrapper     *external,
+                                                                          
PanelPluginExternalWrapper     *wrapper);
+static gboolean   panel_plugin_external_wrapper_dbus_remote_event_result 
(XfcePanelPluginWrapperExported *skeleton,
+                                                                          
GDBusMethodInvocation          *invocation,
                                                                           
guint                           handle,
                                                                           
gboolean                        result,
-                                                                          
GError                        **error);
+                                                                          
PanelPluginExternalWrapper     *wrapper);
 
 
 
-/* include the dbus glue generated by dbus-binding-tool */
-#include <panel/panel-plugin-external-wrapper-infos.h>
-
-
 
 struct _PanelPluginExternalWrapperClass
 {
@@ -88,12 +87,17 @@ struct _PanelPluginExternalWrapperClass
 struct _PanelPluginExternalWrapper
 {
   PanelPluginExternal __parent__;
+
+  XfcePanelPluginWrapperExported *skeleton;
+
+  GDBusConnection                *connection;
+
+  gboolean                        exported : 1;
+
 };
 
 enum
 {
-  SET,
-  REMOTE_EVENT,
   REMOTE_EVENT_RESULT,
   LAST_SIGNAL
 };
@@ -115,31 +119,14 @@ panel_plugin_external_wrapper_class_init 
(PanelPluginExternalWrapperClass *klass
   PanelPluginExternalClass *plugin_external_class;
 
   gobject_class = G_OBJECT_CLASS (klass);
-  gobject_class->constructor = panel_plugin_external_wrapper_constructor;
+  gobject_class->finalize = panel_plugin_external_wrapper_finalize;
+  gobject_class->constructed = panel_plugin_external_wrapper_constructed;
 
   plugin_external_class = PANEL_PLUGIN_EXTERNAL_CLASS (klass);
   plugin_external_class->get_argv = panel_plugin_external_wrapper_get_argv;
   plugin_external_class->set_properties = 
panel_plugin_external_wrapper_set_properties;
   plugin_external_class->remote_event = 
panel_plugin_external_wrapper_remote_event;
 
-  external_signals[SET] =
-    g_signal_new (g_intern_static_string ("set"),
-                  G_TYPE_FROM_CLASS (gobject_class),
-                  G_SIGNAL_RUN_LAST,
-                  0, NULL, NULL,
-                  g_cclosure_marshal_VOID__BOXED,
-                  G_TYPE_NONE, 1,
-                  PANEL_TYPE_DBUS_SET_SIGNAL);
-
-  external_signals[REMOTE_EVENT] =
-    g_signal_new (g_intern_static_string ("remote-event"),
-                  G_TYPE_FROM_CLASS (gobject_class),
-                  G_SIGNAL_RUN_LAST,
-                  0, NULL, NULL,
-                  _panel_marshal_VOID__STRING_BOXED_UINT,
-                  G_TYPE_NONE, 3,
-                  G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_UINT);
-
   external_signals[REMOTE_EVENT_RESULT] =
     g_signal_new (g_intern_static_string ("remote-event-result"),
                   G_TYPE_FROM_CLASS (gobject_class),
@@ -148,10 +135,6 @@ panel_plugin_external_wrapper_class_init 
(PanelPluginExternalWrapperClass *klass
                   _panel_marshal_VOID__UINT_BOOLEAN,
                   G_TYPE_NONE, 2,
                   G_TYPE_UINT, G_TYPE_BOOLEAN);
-
-  /* add dbus type info for plugins */
-  dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
-      &dbus_glib_panel_plugin_external_wrapper_object_info);
 }
 
 
@@ -163,39 +146,74 @@ panel_plugin_external_wrapper_init 
(PanelPluginExternalWrapper *external)
 
 
 
-static GObject *
-panel_plugin_external_wrapper_constructor (GType                  type,
-                                           guint                  
n_construct_params,
-                                           GObjectConstructParam 
*construct_params)
+static void
+panel_plugin_external_wrapper_constructed (GObject *object)
 {
-  GObject         *object;
-  gchar           *path;
-  DBusGConnection *connection;
-  GError          *error = NULL;
+  PanelPluginExternalWrapper *wrapper;
+  gchar                      *path;
+  GError                     *error = NULL;
 
-  object = G_OBJECT_CLASS 
(panel_plugin_external_wrapper_parent_class)->constructor (type,
-                                                                               
      n_construct_params,
-                                                                               
      construct_params);
+  wrapper = PANEL_PLUGIN_EXTERNAL_WRAPPER (object);
 
-  connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
-  if (G_LIKELY (connection != NULL))
+  wrapper->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL,  &error);
+  if (G_LIKELY (wrapper->connection != NULL))
     {
+      wrapper->skeleton = xfce_panel_plugin_wrapper_exported_skeleton_new ();
+
       /* register the object in dbus, the wrapper will monitor this object */
-      panel_return_val_if_fail (PANEL_PLUGIN_EXTERNAL (object)->unique_id != 
-1, NULL);
+      panel_return_if_fail (PANEL_PLUGIN_EXTERNAL (object)->unique_id != -1);
       path = g_strdup_printf (PANEL_DBUS_WRAPPER_PATH, PANEL_PLUGIN_EXTERNAL 
(object)->unique_id);
-      dbus_g_connection_register_g_object (connection, path, object);
-      panel_debug (PANEL_DEBUG_EXTERNAL, "register dbus path %s", path);
-      g_free (path);
+      g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON 
(wrapper->skeleton),
+                                        wrapper->connection,
+                                        path,
+                                        &error);
+
+      if (G_UNLIKELY (error != NULL))
+        {
+          g_critical ("error wrapper path %s failed: %s", path, 
error->message);
+          g_error_free (error);
+          wrapper->exported = FALSE;
+        }
+      else
+        {
+          g_signal_connect (wrapper->skeleton, "handle_provider_signal",
+                            G_CALLBACK 
(panel_plugin_external_wrapper_dbus_provider_signal), wrapper);
+          g_signal_connect (wrapper->skeleton, "handle_remote_event_result",
+                            G_CALLBACK 
(panel_plugin_external_wrapper_dbus_remote_event_result), wrapper);
+          panel_debug (PANEL_DEBUG_EXTERNAL, "register dbus path %s", path);
+
+          wrapper->exported = TRUE;
+        }
 
-      dbus_g_connection_unref (connection);
+      g_free (path);
     }
   else
     {
+      wrapper->exported = FALSE;
       g_critical ("Failed to get D-Bus session bus: %s", error->message);
       g_error_free (error);
     }
+}
+
+
+
+static void
+panel_plugin_external_wrapper_finalize (GObject *object)
+{
+  PanelPluginExternalWrapper *wrapper;
+
+  wrapper = PANEL_PLUGIN_EXTERNAL_WRAPPER (object);
+
+  if (wrapper->exported)
+    {
+      g_object_unref (wrapper->skeleton);
+      g_object_unref (wrapper->connection);
+    }
+  /* Export failed, but we have gotten a connection */
+  else if (wrapper->connection)
+    g_object_unref (wrapper->connection);
 
-  return object;
+  (*G_OBJECT_CLASS (panel_plugin_external_wrapper_parent_class)->finalize) 
(object);
 }
 
 
@@ -238,43 +256,78 @@ panel_plugin_external_wrapper_get_argv 
(PanelPluginExternal   *external,
 
 
 
+static GVariant *
+panel_plugin_external_wrapper_gvalue_prop_to_gvariant (const GValue *value)
+{
+  const GVariantType *type = NULL;
+  GVariant           *variant = NULL;
+
+  switch (G_VALUE_TYPE(value))
+    {
+    case G_TYPE_INT:
+      type = G_VARIANT_TYPE_INT32;
+      break;
+    case G_TYPE_BOOLEAN:
+      type = G_VARIANT_TYPE_BOOLEAN;
+      break;
+    case G_TYPE_DOUBLE:
+      type = G_VARIANT_TYPE_DOUBLE;
+      break;
+    case G_TYPE_STRING:
+      type = G_VARIANT_TYPE_STRING;
+      break;
+    default:
+      panel_assert_not_reached();
+    }
+
+  if (type)
+    variant = g_dbus_gvalue_to_gvariant(value, type);
+
+  return variant;
+}
+
+
+
 static void
 panel_plugin_external_wrapper_set_properties (PanelPluginExternal *external,
                                               GSList              *properties)
 {
-  GPtrArray      *array;
-  GValue          message = { 0, };
-  PluginProperty *property;
-  GSList         *li;
-  guint           i;
+  PanelPluginExternalWrapper *wrapper;
+  GVariantBuilder             builder;
+  PluginProperty             *property;
+  GSList                     *li;
 
-  array = g_ptr_array_sized_new (1);
+  wrapper = PANEL_PLUGIN_EXTERNAL_WRAPPER (external);
 
-  g_value_init (&message, PANEL_TYPE_DBUS_SET_PROPERTY);
-  g_value_take_boxed (&message, dbus_g_type_specialized_construct 
(G_VALUE_TYPE (&message)));
+  g_variant_builder_init (&builder, G_VARIANT_TYPE("a(uv)"));
 
   /* put properties in a dbus-suitable array for the wrapper */
   for (li = properties; li != NULL; li = li->next)
     {
-      property = li->data;
+      GVariant *variant;
 
-      dbus_g_type_struct_set (&message,
-                              DBUS_SET_TYPE, property->type,
-                              DBUS_SET_VALUE, &property->value,
-                              G_MAXUINT);
+      property = li->data;
 
-      g_ptr_array_add (array, g_value_dup_boxed (&message));
+      variant = panel_plugin_external_wrapper_gvalue_prop_to_gvariant 
(&property->value);
+      if (G_LIKELY(variant))
+        {
+          g_variant_builder_add (&builder, "(uv)", property->type, variant);
+          g_variant_unref (variant);
+        }
+      else
+        {
+          g_warning ("Failed to convert wrapper property from gvalue:%s to 
gvariant", G_VALUE_TYPE_NAME(&property->value));
+        }
     }
 
   /* send array to the wrapper */
-  g_signal_emit (G_OBJECT (external), external_signals[SET], 0, array);
-
-  G_GNUC_BEGIN_IGNORE_DEPRECATIONS
-  for (i = 0; i < array->len; i++)
-    g_value_array_free (g_ptr_array_index (array, i));
-  G_GNUC_END_IGNORE_DEPRECATIONS
-  g_ptr_array_free (array, TRUE);
-  g_value_unset (&message);
+  g_dbus_connection_emit_signal (wrapper->connection,
+                                 "org.xfce.Panel",
+                                 g_dbus_interface_skeleton_get_object_path 
(G_DBUS_INTERFACE_SKELETON (wrapper->skeleton)),
+                                 "org.xfce.Panel.Wrapper",
+                                 "Set",
+                                 g_variant_builder_end (&builder),
+                                 NULL);
 }
 
 
@@ -285,78 +338,81 @@ panel_plugin_external_wrapper_remote_event 
(PanelPluginExternal *external,
                                             const GValue        *value,
                                             guint               *handle)
 {
-  static guint  handle_counter = 0;
-  GValue        dummy_value = { 0, };
-  const GValue *real_value = value;
+  PanelPluginExternalWrapper  *wrapper;
+  static guint                 handle_counter = 0;
 
   panel_return_val_if_fail (PANEL_IS_PLUGIN_EXTERNAL_WRAPPER (external), TRUE);
   panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (external), TRUE);
   panel_return_val_if_fail (value == NULL || G_IS_VALUE (value), FALSE);
 
+  wrapper = PANEL_PLUGIN_EXTERNAL_WRAPPER (external);
+
   if (G_UNLIKELY (handle_counter > G_MAXUINT - 2))
     handle_counter = 0;
   *handle = ++handle_counter;
 
-  if (value == NULL)
-    {
-      /* we send a dummy value over dbus */
-      g_value_init (&dummy_value, G_TYPE_UCHAR);
-      g_value_set_uchar (&dummy_value, '\0');
-      real_value = &dummy_value;
-    }
-
-  g_signal_emit (G_OBJECT (external), external_signals[REMOTE_EVENT], 0,
-                 name, real_value, *handle);
-
-  if (real_value != value)
-    g_value_unset (&dummy_value);
+  g_dbus_connection_emit_signal (wrapper->connection,
+                                 "org.xfce.Panel",
+                                 g_dbus_interface_skeleton_get_object_path 
(G_DBUS_INTERFACE_SKELETON (wrapper->skeleton)),
+                                 "org.xfce.Panel.Wrapper",
+                                 "RemoteEvent",
+                                 g_variant_new ("(svu)",
+                                                name,
+                                                g_variant_new_byte('\0'),
+                                                *handle),
+                                 NULL);
 
   return TRUE;
 }
 
 
-
 static gboolean
-panel_plugin_external_wrapper_dbus_provider_signal (PanelPluginExternalWrapper 
    *external,
+panel_plugin_external_wrapper_dbus_provider_signal 
(XfcePanelPluginWrapperExported *skeleton,
+                                                    GDBusMethodInvocation      
    *invocation,
                                                     
XfcePanelPluginProviderSignal   provider_signal,
-                                                    GError                     
   **error)
+                                                    PanelPluginExternalWrapper 
    *wrapper)
 {
-  panel_return_val_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external), FALSE);
-  panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (external), FALSE);
+  panel_return_val_if_fail (PANEL_IS_PLUGIN_EXTERNAL (wrapper), FALSE);
+  panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (wrapper), FALSE);
 
   switch (provider_signal)
     {
     case PROVIDER_SIGNAL_SHOW_CONFIGURE:
-      PANEL_PLUGIN_EXTERNAL (external)->show_configure = TRUE;
+      PANEL_PLUGIN_EXTERNAL (wrapper)->show_configure = TRUE;
       break;
 
     case PROVIDER_SIGNAL_SHOW_ABOUT:
-      PANEL_PLUGIN_EXTERNAL (external)->show_about = TRUE;
+      PANEL_PLUGIN_EXTERNAL (wrapper)->show_about = TRUE;
       break;
 
     default:
       /* other signals are handled in panel-applications.c */
-      xfce_panel_plugin_provider_emit_signal (XFCE_PANEL_PLUGIN_PROVIDER 
(external),
+      xfce_panel_plugin_provider_emit_signal (XFCE_PANEL_PLUGIN_PROVIDER 
(wrapper),
                                               provider_signal);
       break;
     }
 
+  xfce_panel_plugin_wrapper_exported_complete_provider_signal (skeleton, 
invocation);
+
   return TRUE;
 }
 
 
 
 static gboolean
-panel_plugin_external_wrapper_dbus_remote_event_result 
(PanelPluginExternalWrapper  *external,
-                                                        guint                  
      handle,
-                                                        gboolean               
      result,
-                                                        GError                 
    **error)
+panel_plugin_external_wrapper_dbus_remote_event_result 
(XfcePanelPluginWrapperExported *skeleton,
+                                                        GDBusMethodInvocation  
        *invocation,
+                                                        guint                  
         handle,
+                                                        gboolean               
         result,
+                                                        
PanelPluginExternalWrapper     *wrapper)
 {
-  panel_return_val_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external), FALSE);
+  panel_return_val_if_fail (PANEL_IS_PLUGIN_EXTERNAL (wrapper), FALSE);
 
-  g_signal_emit (G_OBJECT (external), external_signals[REMOTE_EVENT_RESULT], 0,
+  g_signal_emit (G_OBJECT (wrapper), external_signals[REMOTE_EVENT_RESULT], 0,
                  handle, result);
 
+  xfce_panel_plugin_wrapper_exported_complete_remote_event_result (skeleton, 
invocation);
+
   return TRUE;
 }
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.
_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
https://mail.xfce.org/mailman/listinfo/xfce4-commits

Reply via email to