[evince] shell: Use gdbus-codegen for the org.gnome.evince.Application interface



commit c9aada8d186d22913abed6b8c3e60da0bfd4e8af
Author: Christian Persch <chpe gnome org>
Date:   Sun Jun 10 16:05:59 2012 +0200

    shell: Use gdbus-codegen for the org.gnome.evince.Application interface

 configure.ac           |    6 ++
 shell/Makefile.am      |   19 ++++-
 shell/ev-application.c |  223 +++++++++++++++++++++++-------------------------
 shell/ev-gdbus.xml     |   15 +++
 4 files changed, 144 insertions(+), 119 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index a721888..13b9a8a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -208,6 +208,12 @@ if test -z "$XMLLINT"; then
   AC_MSG_ERROR([xmllint not found])
 fi
 
+AC_ARG_VAR([GDBUS_CODEGEN],[the gdbus-codegen programme])
+AC_PATH_PROG([GDBUS_CODEGEN],[gdbus-codegen],[])
+if test -z "$GDBUS_CODEGEN"; then
+  AC_MSG_ERROR([gdbus-codegen not found])
+fi
+
 # *********
 # SM client
 # *********
diff --git a/shell/Makefile.am b/shell/Makefile.am
index b730eb3..02003ad 100644
--- a/shell/Makefile.am
+++ b/shell/Makefile.am
@@ -99,6 +99,10 @@ evince_SOURCES += \
 	ev-media-player-keys.c \
 	ev-media-player-keys.h \
 	$(NULL)
+nodist_evince_SOURCES += \
+	ev-gdbus-generated.c \
+	ev-gdbus-generated.h \
+	$(NULL)
 endif
 
 evince_LDFLAGS = $(AM_LDFLAGS)
@@ -132,6 +136,10 @@ BUILT_SOURCES = \
 	ev-resources.c
 
 if ENABLE_DBUS
+BUILT_SOURCES += ev-gdbus-generated.c ev-gdbus-generated.h
+endif
+
+if ENABLE_DBUS
 evinced_SOURCES = \
 	ev-daemon.c \
 	$(NULL)
@@ -153,7 +161,8 @@ EXTRA_DIST = \
 	evince-icon.rc \
 	evince-ui.xml \
 	evince-toolbar.xml \
-	evince.gresource.xml
+	evince.gresource.xml \
+	ev-gdbus.xml
 
 ev-marshal.h: $(srcdir)/ev-marshal.list
 	$(AM_V_GEN)$(GLIB_GENMARSHAL) --prefix=ev_marshal $(srcdir)/ev-marshal.list --header > ev-marshal.h
@@ -165,6 +174,14 @@ ev-marshal.c: $(srcdir)/ev-marshal.list
 ev-resources.c: evince.gresource.xml Makefile $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies --sourcedir $(srcdir) $(srcdir)/evince.gresource.xml)
 	$(AM_V_GEN) XMLLINT=$(XMLLINT) $(GLIB_COMPILE_RESOURCES) --target $@ --sourcedir $(srcdir) --generate-source --c-name ev $<
 
+ev-gdbus-generated.c ev-gdbus-generated.h: ev-gdbus.xml Makefile
+	$(AM_V_GEN) $(GDBUS_CODEGEN) \
+			--interface-prefix=org.gnome.evince \
+			--c-namespace=Ev \
+			--c-generate-object-manager \
+			--generate-c-code ev-gdbus-generated \
+			$<
+
 DISTCLEANFILES = $(BUILT_SOURCES)
 
 -include $(top_srcdir)/git.mk
diff --git a/shell/ev-application.c b/shell/ev-application.c
index 34d67f5..53797ac 100644
--- a/shell/ev-application.c
+++ b/shell/ev-application.c
@@ -46,6 +46,7 @@
 #include "ev-stock-icons.h"
 
 #ifdef ENABLE_DBUS
+#include "ev-gdbus-generated.h"
 #include "ev-media-player-keys.h"
 #endif /* ENABLE_DBUS */
 
@@ -57,8 +58,8 @@ struct _EvApplication {
 	gchar *dot_dir;
 
 #ifdef ENABLE_DBUS
-	GDBusConnection *connection;
-        guint registration_id;
+        GDBusConnection *connection;
+        EvEvinceApplication *skeleton;
 	EvMediaPlayerKeys *keys;
 	gboolean doc_registered;
 #endif
@@ -636,6 +637,9 @@ ev_application_open_uri_in_window (EvApplication  *application,
 	GdkWindow *gdk_window;
 #endif
 
+        if (uri == NULL)
+                uri = application->uri;
+
 	if (screen) {
 		ev_stock_icons_set_screen (screen);
 		gtk_window_set_screen (GTK_WINDOW (ev_window), screen);
@@ -763,115 +767,97 @@ ev_application_open_window (EvApplication *application,
 }
 
 #ifdef ENABLE_DBUS
-static void
-method_call_cb (GDBusConnection       *connection,
-                const gchar           *sender,
-                const gchar           *object_path,
-                const gchar           *interface_name,
-                const gchar           *method_name,
-                GVariant              *parameters,
-                GDBusMethodInvocation *invocation,
-                gpointer               user_data)
+static gboolean
+handle_get_window_list_cb (EvEvinceApplication   *object,
+                           GDBusMethodInvocation *invocation,
+                           EvApplication         *application)
 {
-        EvApplication   *application = EV_APPLICATION (user_data);
-	GList           *windows, *l;
-        guint            timestamp;
-        GVariantIter    *iter;
-        const gchar     *key;
-        GVariant        *value;
-        GdkDisplay      *display = NULL;
-        int              screen_number = 0;
-	EvLinkDest      *dest = NULL;
-	EvWindowRunMode  mode = EV_WINDOW_MODE_NORMAL;
-	const gchar     *search_string = NULL;
-	GdkScreen       *screen = NULL;
-
-	if (g_strcmp0 (method_name, "Reload") == 0) {
-		g_variant_get (parameters, "(a{sv}u)", &iter, &timestamp);
-
-		while (g_variant_iter_loop (iter, "{&sv}", &key, &value)) {
-			if (strcmp (key, "display") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
-				display = ev_display_open_if_needed (g_variant_get_string (value, NULL));
-			} else if (strcmp (key, "screen") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_INT32) {
-				screen_number = g_variant_get_int32 (value);
-			} else if (strcmp (key, "mode") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_UINT32) {
-                                mode = g_variant_get_uint32 (value);
-			} else if (strcmp (key, "page-label") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
-				dest = ev_link_dest_new_page_label (g_variant_get_string (value, NULL));
-			} else if (strcmp (key, "named-dest") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
-				dest = ev_link_dest_new_named (g_variant_get_string (value, NULL));
-                        } else if (strcmp (key, "page-index") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_UINT32) {
-                                dest = ev_link_dest_new_page (g_variant_get_uint32 (value));
-			} else if (strcmp (key, "find-string") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
-				search_string = g_variant_get_string (value, NULL);
-			}
-		}
-		g_variant_iter_free (iter);
+        GList     *windows, *l;
+        GPtrArray *paths;
 
-		if (display != NULL &&
-		    screen_number >= 0 &&
-		    screen_number < gdk_display_get_n_screens (display))
-			screen = gdk_display_get_screen (display, screen_number);
-		else
-			screen = gdk_screen_get_default ();
+        paths = g_ptr_array_new ();
 
-		windows = ev_application_get_windows (application);
-		for (l = windows; l != NULL; l = g_list_next (l)) {
-			EvWindow *ev_window = EV_WINDOW (l->data);
-
-			ev_application_open_uri_in_window (application, application->uri,
-							   ev_window,
-							   screen, dest, mode,
-							   search_string,
-							   timestamp);
-		}
-		g_list_free (windows);
+        windows = ev_application_get_windows (application);
+        for (l = windows; l; l = g_list_next (l)) {
+                EvWindow *window = (EvWindow *)l->data;
 
-		if (dest)
-			g_object_unref (dest);
+                g_ptr_array_add (paths, (gpointer) ev_window_get_dbus_object_path (window));
+        }
+        g_list_free (windows);
 
-		g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
-	} else if (g_strcmp0 (method_name, "GetWindowList") == 0) {
-		GList          *windows = ev_application_get_windows (application);
-		GVariantBuilder builder;
-		GList	       *l;
+        g_ptr_array_add (paths, NULL);
+        ev_evince_application_complete_get_window_list (object, invocation,
+                                                        (const char * const *) paths->pdata);
 
-		g_variant_builder_init (&builder, G_VARIANT_TYPE ("(ao)"));
-		g_variant_builder_open (&builder, G_VARIANT_TYPE ("ao"));
+        g_ptr_array_free (paths, TRUE);
 
-		for (l = windows; l; l = g_list_next (l)) {
-			EvWindow *window = (EvWindow *)l->data;
+        return TRUE;
+}
 
-			g_variant_builder_add (&builder, "o", ev_window_get_dbus_object_path (window));
-		}
+static gboolean
+handle_reload_cb (EvEvinceApplication   *object,
+                  GDBusMethodInvocation *invocation,
+                  GVariant              *args,
+                  guint                  timestamp,
+                  EvApplication         *application)
+{
+        GList           *windows, *l;
+        GVariantIter     iter;
+        const gchar     *key;
+        GVariant        *value;
+        GdkDisplay      *display = NULL;
+        int              screen_number = 0;
+        EvLinkDest      *dest = NULL;
+        EvWindowRunMode  mode = EV_WINDOW_MODE_NORMAL;
+        const gchar     *search_string = NULL;
+        GdkScreen       *screen = NULL;
+
+        g_variant_iter_init (&iter, args);
+
+        while (g_variant_iter_loop (&iter, "{&sv}", &key, &value)) {
+                if (strcmp (key, "display") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
+                        display = ev_display_open_if_needed (g_variant_get_string (value, NULL));
+                } else if (strcmp (key, "screen") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_INT32) {
+                        screen_number = g_variant_get_int32 (value);
+                } else if (strcmp (key, "mode") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_UINT32) {
+                        mode = g_variant_get_uint32 (value);
+                } else if (strcmp (key, "page-label") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
+                        dest = ev_link_dest_new_page_label (g_variant_get_string (value, NULL));
+                } else if (strcmp (key, "named-dest") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
+                        dest = ev_link_dest_new_named (g_variant_get_string (value, NULL));
+                } else if (strcmp (key, "page-index") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_UINT32) {
+                        dest = ev_link_dest_new_page (g_variant_get_uint32 (value));
+                } else if (strcmp (key, "find-string") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
+                        search_string = g_variant_get_string (value, NULL);
+                }
+        }
 
-		g_variant_builder_close (&builder);
-		g_list_free (windows);
+        if (display != NULL &&
+                        screen_number >= 0 &&
+            screen_number < gdk_display_get_n_screens (display))
+                screen = gdk_display_get_screen (display, screen_number);
+        else
+                screen = gdk_screen_get_default ();
+
+        windows = ev_application_get_windows (application);
+        for (l = windows; l != NULL; l = g_list_next (l)) {
+                EvWindow *ev_window = EV_WINDOW (l->data);
+
+                ev_application_open_uri_in_window (application, NULL,
+                                                   ev_window,
+                                                   screen, dest, mode,
+                                                   search_string,
+                                                   timestamp);
+        }
+        g_list_free (windows);
 
-		g_dbus_method_invocation_return_value (invocation, g_variant_builder_end (&builder));
-	}
-}
+        if (dest)
+                g_object_unref (dest);
 
-static const char introspection_xml[] =
-        "<node>"
-          "<interface name='org.gnome.evince.Application'>"
-            "<method name='Reload'>"
-              "<arg type='a{sv}' name='args' direction='in'/>"
-              "<arg type='u' name='timestamp' direction='in'/>"
-            "</method>"
-            "<method name='GetWindowList'>"
-              "<arg type='ao' name='window_list' direction='out'/>"
-            "</method>"
-          "</interface>"
-        "</node>";
-
-static const GDBusInterfaceVTable interface_vtable = {
-	method_call_cb,
-	NULL,
-	NULL
-};
+        ev_evince_application_complete_reload (object, invocation);
 
-static GDBusNodeInfo *introspection_data;
+        return TRUE;
+}
 #endif /* ENABLE_DBUS */
 
 void
@@ -1047,19 +1033,15 @@ ev_application_shutdown (EvApplication *application)
 		g_object_unref (application->keys);
 		application->keys = NULL;
 	}
-        if (application->registration_id != 0) {
-                g_dbus_connection_unregister_object (application->connection,
-                                                     application->registration_id);
-                application->registration_id = 0;
+        if (application->skeleton != NULL) {
+                g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (application->skeleton));
+                g_object_unref (application->skeleton);
+                application->skeleton = NULL;
         }
         if (application->connection != NULL) {
                 g_object_unref (application->connection);
                 application->connection = NULL;
         }
-	if (introspection_data) {
-		g_dbus_node_info_ref (introspection_data);
-		introspection_data = NULL;
-	}
 #endif /* ENABLE_DBUS */
 	
         g_free (application->dot_dir);
@@ -1095,17 +1077,22 @@ ev_application_init (EvApplication *ev_application)
 #ifdef ENABLE_DBUS
         ev_application->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
         if (ev_application->connection != NULL) {
-                introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
-                g_assert (introspection_data != NULL);
-
-                ev_application->registration_id =
-                    g_dbus_connection_register_object (ev_application->connection,
-                                                       APPLICATION_DBUS_OBJECT_PATH,
-                                                       introspection_data->interfaces[0],
-                                                       &interface_vtable,
-                                                       ev_application, NULL,
-                                                       &error);
-                if (ev_application->registration_id == 0) {
+                EvEvinceApplication *skeleton;
+
+                skeleton = ev_evince_application_skeleton_new ();
+                if (g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (skeleton),
+                                                      ev_application->connection,
+                                                      APPLICATION_DBUS_OBJECT_PATH,
+                                                      &error)) {
+                        ev_application->skeleton = skeleton;
+                        g_signal_connect (skeleton, "handle-get-window-list",
+                                          G_CALLBACK (handle_get_window_list_cb),
+                                          ev_application);
+                        g_signal_connect (skeleton, "handle-reload",
+                                          G_CALLBACK (handle_reload_cb),
+                                          ev_application);
+                } else {
+                        g_object_unref (skeleton);
                         g_printerr ("Failed to register bus object: %s\n", error->message);
                         g_error_free (error);
                 }
diff --git a/shell/ev-gdbus.xml b/shell/ev-gdbus.xml
new file mode 100644
index 0000000..e6af0f3
--- /dev/null
+++ b/shell/ev-gdbus.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Introspection 0.1//EN"
+                      "http://www.freedesktop.org/software/dbus/introspection.dtd";>
+<node>
+  <interface name='org.gnome.evince.Application'>
+    <annotation name="org.gtk.GDBus.C.Name" value="EvinceApplication" />
+    <method name='Reload'>
+      <arg type='a{sv}' name='args' direction='in'/>
+      <arg type='u' name='timestamp' direction='in'/>
+    </method>
+    <method name='GetWindowList'>
+      <arg type='ao' name='window_list' direction='out'/>
+    </method>
+  </interface>
+</node>



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