[gnome-terminal] Use gdbus-codegen for the terminal factory



commit 52114d89263ce2fc485ace26d1ed74f69b8a7d24
Author: Christian Persch <chpe gnome org>
Date:   Wed Nov 16 23:29:00 2011 +0100

    Use gdbus-codegen for the terminal factory

 configure.ac               |   31 ++++---
 src/Makefile.am            |   14 +++-
 src/org.gnome.Terminal.xml |   31 ++++++
 src/server.c               |  224 ++++----------------------------------------
 src/terminal-app.c         |   62 ++++++++++++-
 src/terminal.c             |  156 ++++++------------------------
 6 files changed, 171 insertions(+), 347 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 7f141f5..750e237 100644
--- a/configure.ac
+++ b/configure.ac
@@ -148,22 +148,29 @@ PKG_CHECK_MODULES([MIGRATOR],[
 # Build tools
 # ***********
 
-GLIB_GENMARSHAL="$($PKG_CONFIG --variable=glib_genmarshal glib-2.0)"
-AC_SUBST([GLIB_GENMARSHAL])
-GLIB_MKENUMS="$($PKG_CONFIG --variable=glib_mkenums glib-2.0)"
-AC_SUBST([GLIB_MKENUMS])
-
-AC_PATH_PROG([GTK_BUILDER_CONVERT],[gtk-builder-convert],[false])
+AC_ARG_VAR([GLIB_GENMARSHAL],[the glib-genmarschal programme])
+AC_PATH_PROG([GLIB_GENMARSHAL],[glib-genmarshal],[])
+if test -z "$GLIB_GENMARSHAL"; then
+  AC_MSG_ERROR([glib-genmarshal not found])
+fi
 
-if test "$GTK_BUILDER_CONVERT" = "false"; then
-  AC_MSG_ERROR([gtk-builder-convert not found])
+AC_ARG_VAR([GLIB_MKENUMS],[the glib-mkenums programme])
+AC_PATH_PROG([GLIB_MKENUMS],[glib-mkenums],[])
+if test -z "$GLIB_MKENUMS"; then
+  AC_MSG_ERROR([glib-mkenums not found])
 fi
 
-case "$with_gtk" in
-  3.0) GTK_BUILDER_CONVERT_FLAGS="--target-version=3.0" ;;
-esac
+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
 
-AC_SUBST([GTK_BUILDER_CONVERT_FLAGS])
+AC_ARG_VAR([GTK_BUILDER_CONVERT],[the gtk-builder-convert programme])
+AC_PATH_PROG([GTK_BUILDER_CONVERT],[gtk-builder-convert],[])
+if test -z "$GTK_BUILDER_CONVERT"; then
+  AC_MSG_ERROR([gtk-builder-convert not found])
+fi
 
 # ***********
 # Compilation
diff --git a/src/Makefile.am b/src/Makefile.am
index be22ec5..b276393 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -12,6 +12,8 @@ BUILT_SOURCES = \
 	terminal-marshal.h \
 	terminal-type-builtins.c \
 	terminal-type-builtins.h \
+	terminal-factory.c \
+	terminal-factory.h \
 	$(NULL)
 
 gnome_terminal_server_SOURCES= \
@@ -140,12 +142,22 @@ org.gnome.Terminal.Factory0.service: Makefile
 		      echo "Name=org.gnome.Terminal.Factory0"; \
 		      echo "${libexecdir}/gnome-terminal-server") > $@
 
+terminal-factory.c terminal-factory.h: org.gnome.Terminal.xml Makefile
+	$(AM_V_GEN) $(GDBUS_CODEGEN) \
+			--interface-prefix=org.gnome.Terminal \
+			--c-namespace=Terminal \
+			--c-generate-object-manager \
+			--generate-c-code terminal-factory \
+			$<
+
 # Terminal remote
 
 gnome_terminal_SOURCES= \
 	terminal.c \
 	terminal-debug.c \
 	terminal-debug.h \
+	terminal-factory.c \
+	terminal-factory.h \
 	terminal-intl.h \
 	terminal-options.c \
 	terminal-options.h \
@@ -268,6 +280,6 @@ EXTRA_DIST = \
 @GSETTINGS_RULES@
 
 %.ui: %.glade
-	$(AM_V_GEN) $(GTK_BUILDER_CONVERT) $(GTK_BUILDER_CONVERT_FLAGS) $< $@
+	$(AM_V_GEN) $(GTK_BUILDER_CONVERT) $< $@
 
 -include $(top_srcdir)/git.mk
diff --git a/src/org.gnome.Terminal.xml b/src/org.gnome.Terminal.xml
new file mode 100644
index 0000000..ad00073
--- /dev/null
+++ b/src/org.gnome.Terminal.xml
@@ -0,0 +1,31 @@
+<?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";>
+<!--
+  Copyright  2011 Christian Persch
+
+  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 3, or (at your option)
+  any later version.
+
+  This program is distributed in the hope conf 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, see <http://www.gnu.org/licenses/>.
+-->
+<node>
+  <interface name="org.gnome.Terminal.Factory0">
+    <annotation name="org.gtk.GDBus.C.Name" value="Factory" />
+    <method name="HandleArguments">
+      <arg type="ay" name="working_directory" direction="in" />
+      <arg type="ay" name="display_name" direction="in" />
+      <arg type="ay" name="startup_id" direction="in" />
+      <arg type="aay" name="environment" direction="in" />
+      <arg type="aay" name="arguments" direction="in" />
+    </method>
+  </interface>
+</node>
diff --git a/src/server.c b/src/server.c
index ceb2a6f..680a603 100644
--- a/src/server.c
+++ b/src/server.c
@@ -38,205 +38,42 @@
 #include "terminal-accels.h"
 #include "terminal-app.h"
 #include "terminal-debug.h"
+#include "terminal-factory.h"
 #include "terminal-intl.h"
 #include "terminal-options.h"
 #include "terminal-util.h"
 
-#define TERMINAL_FACTORY_SERVICE_NAME_PREFIX  "org.gnome.Terminal.Factory0.Display"
-#define TERMINAL_FACTORY_SERVICE_PATH         "/org/gnome/Terminal/Factory"
-#define TERMINAL_FACTORY_INTERFACE_NAME       "org.gnome.Terminal.Factory"
+#define TERMINAL_UNIQUE_NAME                  "org.gnome.Terminal"
 
-static char *
-ay_to_string (GVariant *variant,
-              GError **error)
-{
-  gsize len;
-  const char *data;
-
-  data = g_variant_get_fixed_array (variant, &len, sizeof (char));
-  if (len == 0)
-    return NULL;
-
-  /* Make sure there are no embedded NULs */
-  if (memchr (data, '\0', len) != NULL) {
-    g_set_error_literal (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS,
-                         "String is shorter than claimed");
-    return NULL;
-  }
-
-  return g_strndup (data, len);
-}
-
-static char **
-ay_to_strv (GVariant *variant,
-            int *argc)
-{
-  GPtrArray *argv;
-  const char *data, *nullbyte;
-  gsize data_len;
-  gssize len;
-
-  data = g_variant_get_fixed_array (variant, &data_len, sizeof (char));
-  if (data_len == 0 || data_len > G_MAXSSIZE) {
-    if (argc)
-      *argc = 0;
-
-    return NULL;
-  }
-
-  argv = g_ptr_array_new ();
+#define TERMINAL_OBJECT_PATH_PREFIX           "/org/gnome/Terminal"
+#define TERMINAL_OBJECT_INTERFACE_PREFIX      "org.gnome.Terminal"
 
-  len = data_len;
-  do {
-    gssize string_len;
-
-    nullbyte = memchr (data, '\0', len);
-
-    string_len = nullbyte ? (gssize) (nullbyte - data) : len;
-    g_ptr_array_add (argv, g_strndup (data, string_len));
-
-    len -= string_len + 1;
-    data += string_len + 1;
-  } while (len > 0);
-
-  if (argc)
-    *argc = argv->len;
-
-  /* NULL terminate */
-  g_ptr_array_add (argv, NULL);
-  return (char **) g_ptr_array_free (argv, FALSE);
-}
+#define TERMINAL_FACTORY_OBJECT_PATH          TERMINAL_OBJECT_PATH_PREFIX "/Factory0"
+#define TERMINAL_FACTORY_INTERFACE_NAME       TERMINAL_OBJECT_INTERFACE_PREFIX ".Factory0"
 
 typedef struct {
-  char *factory_name;
+  GDBusObjectManagerServer *manager;
   int exit_code;
 } OwnData;
 
 static void
-method_call_cb (GDBusConnection *connection,
-                const char *sender,
-                const char *object_path,
-                const char *interface_name,
-                const char *method_name,
-                GVariant *parameters,
-                GDBusMethodInvocation *invocation,
-                gpointer user_data)
-{
-  if (g_strcmp0 (method_name, "HandleArguments") == 0) {
-    TerminalOptions *options = NULL;
-    GVariant *v_wd, *v_display, *v_sid, *v_envv, *v_argv;
-    char *working_directory = NULL, *display_name = NULL, *startup_id = NULL;
-    char **envv = NULL, **argv = NULL;
-    int argc;
-    GError *error = NULL;
-
-    g_variant_get (parameters, "(@ay ay@ay ay@ay)",
-                   &v_wd, &v_display, &v_sid, &v_envv, &v_argv);
-
-    working_directory = ay_to_string (v_wd, &error);
-    if (error)
-      goto out;
-    display_name = ay_to_string (v_display, &error);
-    if (error)
-      goto out;
-    startup_id = ay_to_string (v_sid, &error);
-    if (error)
-      goto out;
-    envv = ay_to_strv (v_envv, NULL);
-    argv = ay_to_strv (v_argv, &argc);
-
-    _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
-                          "Factory invoked with working-dir='%s' display='%s' startup-id='%s'\n",
-                          working_directory ? working_directory : "(null)",
-                          display_name ? display_name : "(null)",
-                          startup_id ? startup_id : "(null)");
-
-    options = terminal_options_parse (working_directory,
-                                      display_name,
-                                      startup_id,
-                                      envv,
-                                      TRUE,
-                                      TRUE,
-                                      &argc, &argv,
-                                      &error,
-                                      NULL);
-
-    if (options != NULL) {
-      terminal_app_handle_options (terminal_app_get (), options, FALSE /* no resume */, &error);
-      terminal_options_free (options);
-    }
-
-  out:
-    g_variant_unref (v_wd);
-    g_free (working_directory);
-    g_variant_unref (v_display);
-    g_free (display_name);
-    g_variant_unref (v_sid);
-    g_free (startup_id);
-    g_variant_unref (v_envv);
-    g_strfreev (envv);
-    g_variant_unref (v_argv);
-    g_strfreev (argv);
-
-    if (error == NULL) {
-      g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
-    } else {
-      g_dbus_method_invocation_return_gerror (invocation, error);
-      g_error_free (error);
-    }
-  }
-}
-
-static void
 bus_acquired_cb (GDBusConnection *connection,
                  const char *name,
                  gpointer user_data)
 {
-  static const char dbus_introspection_xml[] =
-    "<node name='/org/gnome/Terminal'>"
-      "<interface name='org.gnome.Terminal.Factory'>"
-        "<method name='HandleArguments'>"
-          "<arg type='ay' name='working_directory' direction='in' />"
-          "<arg type='ay' name='display_name' direction='in' />"
-          "<arg type='ay' name='startup_id' direction='in' />"
-          "<arg type='ay' name='environment' direction='in' />"
-          "<arg type='ay' name='arguments' direction='in' />"
-        "</method>"
-      "</interface>"
-    "</node>";
-
-  static const GDBusInterfaceVTable interface_vtable = {
-    method_call_cb,
-    NULL,
-    NULL,
-  };
-
   OwnData *data = (OwnData *) user_data;
-  GDBusNodeInfo *introspection_data;
-  guint registration_id;
-  GError *error = NULL;
+  TerminalObjectSkeleton *object;
 
   _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
                          "Bus %s acquired\n", name);
 
-  introspection_data = g_dbus_node_info_new_for_xml (dbus_introspection_xml, NULL);
-  g_assert (introspection_data != NULL);
-
-  registration_id = g_dbus_connection_register_object (connection,
-                                                       TERMINAL_FACTORY_SERVICE_PATH,
-                                                       introspection_data->interfaces[0],
-                                                       &interface_vtable,
-                                                       NULL, NULL,
-                                                       &error);
-  g_dbus_node_info_unref (introspection_data);
+  object = terminal_object_skeleton_new (TERMINAL_FACTORY_OBJECT_PATH);
+  terminal_object_skeleton_set_factory (object, TERMINAL_FACTORY (terminal_app_get ()));
+  g_dbus_object_manager_server_export (data->manager, G_DBUS_OBJECT_SKELETON (object));
+  g_object_unref (object);
 
-  if (registration_id == 0) {
-    _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
-                           "Failed to register object: %s\n", error->message);
-    g_error_free (error);
-    data->exit_code = EXIT_FAILURE;
-    gtk_main_quit ();
-  }
+  /* And export the object */
+  g_dbus_object_manager_server_set_connection (data->manager, connection);
 }
 
 static void
@@ -266,32 +103,6 @@ name_lost_cb (GDBusConnection *connection,
   gtk_main_quit ();
 }
 
-static char *
-get_factory_name_for_display (const char *display_name)
-{
-#if 0
-  GString *name;
-  const char *p;
-
-  name = g_string_sized_new (strlen (TERMINAL_FACTORY_SERVICE_NAME_PREFIX) + strlen (display_name) + 1 /* NUL */);
-  g_string_append (name, TERMINAL_FACTORY_SERVICE_NAME_PREFIX);
-
-  for (p = display_name; *p; ++p)
-    {
-      if (g_ascii_isalnum (*p))
-        g_string_append_c (name, *p);
-      else
-        g_string_append_c (name, '_');
-    }
-
-  _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
-                         "Factory name is \"%s\"\n", name->str);
-
-  return g_string_free (name, FALSE);
-#endif
-  return g_strdup ("org.gnome.Terminal.Factory0");
-}
-
 int
 main (int argc, char **argv)
 {
@@ -335,12 +146,11 @@ main (int argc, char **argv)
 //   g_unsetenv ("GIO_LAUNCHED_DESKTOP_FILE_PID");
 //   g_unsetenv ("GIO_LAUNCHED_DESKTOP_FILE");
 
-  display = gdk_display_get_default ();
-  data.factory_name = get_factory_name_for_display (gdk_display_get_name (display));
   data.exit_code = EXIT_FAILURE;
+  data.manager = g_dbus_object_manager_server_new (TERMINAL_OBJECT_PATH_PREFIX);
 
   owner_id = g_bus_own_name (G_BUS_TYPE_STARTER,
-                             data.factory_name,
+                             TERMINAL_UNIQUE_NAME,
                              G_BUS_NAME_OWNER_FLAGS_NONE,
                              bus_acquired_cb,
                              name_acquired_cb,
@@ -351,7 +161,7 @@ main (int argc, char **argv)
 
   g_bus_unown_name (owner_id);
 
-  g_free (data.factory_name);
+  g_object_unref (data.manager);
 
   terminal_app_shutdown ();
 
diff --git a/src/terminal-app.c b/src/terminal-app.c
index 3bbb79a..1040da0 100644
--- a/src/terminal-app.c
+++ b/src/terminal-app.c
@@ -37,6 +37,7 @@
 #include "profile-editor.h"
 #include "terminal-encoding.h"
 #include "terminal-schemas.h"
+#include "terminal-factory.h"
 #include <string.h>
 #include <stdlib.h>
 #include <time.h>
@@ -62,7 +63,7 @@
  */
 
 struct _TerminalAppClass {
-  GObjectClass parent_class;
+  TerminalFactorySkeletonClass parent_class;
 
   void (* quit) (TerminalApp *app);
   void (* profile_list_changed) (TerminalApp *app);
@@ -71,7 +72,7 @@ struct _TerminalAppClass {
 
 struct _TerminalApp
 {
-  GObject parent_instance;
+  TerminalFactorySkeleton parent_instance;
 
   GList *windows;
   GtkWidget *new_profile_dialog;
@@ -1120,7 +1121,62 @@ terminal_app_client_quit_cb (EggSMClient *client,
 
 /* Class implementation */
 
-G_DEFINE_TYPE (TerminalApp, terminal_app, G_TYPE_OBJECT)
+static gboolean
+terminal_app_handle_arguments (TerminalFactory *factory,
+                               GDBusMethodInvocation *invocation,
+                               const char *working_directory,
+                               const char *display_name,
+                               const char *startup_id,
+                               const char * const *envv,
+                               const char * const *argv)
+{
+  TerminalApp *app = TERMINAL_APP (factory);
+  TerminalOptions *options;
+  int argc;
+  GError *error = NULL;
+
+  _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
+                         "Factory invoked with working-dir='%s' display='%s' startup-id='%s'\n",
+                         working_directory, display_name, startup_id);
+
+  argc = g_strv_length ((char **) argv);
+  options = terminal_options_parse (working_directory,
+                                    display_name,
+                                    startup_id,
+                                    (char **) envv,
+                                    TRUE,
+                                    TRUE,
+                                    &argc, (char ***) &argv,
+                                    &error,
+                                    NULL);
+
+  if (options == NULL) {
+    g_dbus_method_invocation_take_error (invocation, error);
+    goto out;
+  }
+
+  if (!terminal_app_handle_options (app, options, FALSE /* no resume */, &error)) {
+    g_dbus_method_invocation_take_error (invocation, error);
+    goto out;
+  }
+
+  terminal_factory_complete_handle_arguments (factory, invocation);
+
+out:
+  if (options)
+    terminal_options_free (options);
+
+  return TRUE; /* handled */
+}
+
+static void
+terminal_factory_iface_init (TerminalFactoryIface *iface)
+{
+  iface->handle_handle_arguments = terminal_app_handle_arguments;
+}
+
+G_DEFINE_TYPE_WITH_CODE (TerminalApp, terminal_app, TERMINAL_TYPE_FACTORY_SKELETON,
+                         G_IMPLEMENT_INTERFACE (TERMINAL_TYPE_FACTORY, terminal_factory_iface_init))
 
 static void
 terminal_app_init (TerminalApp *app)
diff --git a/src/terminal.c b/src/terminal.c
index 1e107c7..0ebd90f 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -41,78 +41,15 @@
 #include "terminal-debug.h"
 #include "terminal-intl.h"
 #include "terminal-options.h"
+#include "terminal-factory.h"
 
-#define TERMINAL_FACTORY_SERVICE_NAME_PREFIX  "org.gnome.Terminal.Factory0.Display"
-#define TERMINAL_FACTORY_SERVICE_PATH         "/org/gnome/Terminal/Factory"
-#define TERMINAL_FACTORY_INTERFACE_NAME       "org.gnome.Terminal.Factory"
+#define TERMINAL_UNIQUE_NAME                  "org.gnome.Terminal"
 
-static GVariant *
-string_to_ay (const char *string)
-{
-  gsize len;
-  char *data;
-
-  len = strlen (string);
-  data = g_strndup (string, len);
-
-  return g_variant_new_from_data (G_VARIANT_TYPE ("ay"), data, len, TRUE, g_free, data);
-}
+#define TERMINAL_OBJECT_PATH_PREFIX           "/org/gnome/Terminal"
+#define TERMINAL_OBJECT_INTERFACE_PREFIX      "org.gnome.Terminal"
 
-/**
- * options_to_variant:
- * 
- * Returns: a new floating #GVariant
- */
-static GVariant *
-options_to_variant (TerminalOptions *options,
-                    char **argv,
-                    int argc)
-{
-  char **envv;
-  int i;
-  GVariantBuilder builder;
-  GString *string;
-  char *s;
-  gsize len;
-
-  g_variant_builder_init (&builder, G_VARIANT_TYPE ("(ayayayayay)"));
-
-  g_variant_builder_add (&builder, "@ay", string_to_ay (options->default_working_dir));
-  g_variant_builder_add (&builder, "@ay", string_to_ay (options->display_name));
-  g_variant_builder_add (&builder, "@ay", string_to_ay (options->startup_id));
-
-  string = g_string_new (NULL);
-  envv = g_get_environ ();
-  for (i = 0; envv[i]; ++i)
-    {
-      if (i > 0)
-        g_string_append_c (string, '\0');
-
-      g_string_append (string, envv[i]);
-    }
-  g_strfreev (envv);
-
-  len = string->len;
-  s = g_string_free (string, FALSE);
-  g_variant_builder_add (&builder, "@ay",
-                         g_variant_new_from_data (G_VARIANT_TYPE ("ay"), s, len, TRUE, g_free, s));
-
-  string = g_string_new (NULL);
-
-  for (i = 0; i < argc; ++i)
-    {
-      if (i > 0)
-        g_string_append_c (string, '\0');
-      g_string_append (string, argv[i]);
-    }
-
-  len = string->len;
-  s = g_string_free (string, FALSE);
-  g_variant_builder_add (&builder, "@ay",
-                         g_variant_new_from_data (G_VARIANT_TYPE ("ay"), s, len, TRUE, g_free, s));
-
-  return g_variant_builder_end (&builder);
-}
+#define TERMINAL_FACTORY_OBJECT_PATH          TERMINAL_OBJECT_PATH_PREFIX "/Factory0"
+#define TERMINAL_FACTORY_INTERFACE_NAME       TERMINAL_OBJECT_INTERFACE_PREFIX ".Factory0"
 
 /* Copied from libnautilus/nautilus-program-choosing.c; Needed in case
  * we have no DESKTOP_STARTUP_ID (with its accompanying timestamp).
@@ -165,47 +102,17 @@ slowly_and_stupidly_obtain_timestamp (Display *xdisplay)
   return event.xproperty.time;
 }
 
-
-static char *
-get_factory_name_for_display (const char *display_name)
-{
-#if 0
-  GString *name;
-  const char *p;
-
-  name = g_string_sized_new (strlen (TERMINAL_FACTORY_SERVICE_NAME_PREFIX) + strlen (display_name) + 1 /* NUL */);
-  g_string_append (name, TERMINAL_FACTORY_SERVICE_NAME_PREFIX);
-
-  for (p = display_name; *p; ++p)
-    {
-      if (g_ascii_isalnum (*p))
-        g_string_append_c (name, *p);
-      else
-        g_string_append_c (name, '_');
-    }
-
-  _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
-                         "Factory name is \"%s\"\n", name->str);
-
-  return g_string_free (name, FALSE);
-#endif
-  return g_strdup ("org.gnome.Terminal.Factory0");
-}
-
 int
 main (int argc, char **argv)
 {
   int i;
-  char **argv_copy;
-  int argc_copy;
+  char **argv_copy, **envv;
   const char *startup_id, *display_name;
-  char *factory_name = NULL;
   GdkDisplay *display;
   TerminalOptions *options;
-  GDBusConnection *connection;
+  TerminalFactory *factory;
   GError *error = NULL;
   char *working_directory;
-  GVariant *server_retval;
   int exit_code = EXIT_FAILURE;
 
   setlocale (LC_ALL, "");
@@ -223,7 +130,6 @@ main (int argc, char **argv)
   for (i = 0; i < argc; ++i)
     argv_copy [i] = argv [i];
   argv_copy [i] = NULL;
-  argc_copy = argc;
 
   startup_id = g_getenv ("DESKTOP_STARTUP_ID");
   working_directory = g_get_current_dir ();
@@ -242,11 +148,10 @@ main (int argc, char **argv)
 #endif
                                     NULL);
 
-  g_free (working_directory);
-
   if (options == NULL) {
     g_printerr (_("Failed to parse arguments: %s\n"), error->message);
     g_error_free (error);
+    g_free (working_directory);
     g_free (argv_copy);
     exit (EXIT_FAILURE);
   }
@@ -275,39 +180,42 @@ main (int argc, char **argv)
   display_name = gdk_display_get_name (display);
   options->display_name = g_strdup (display_name);
 
-  connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
-  if (connection == NULL) {
-    g_printerr ("Error connecting to bus: %s\n", error->message);
+  factory = terminal_factory_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+                                                     G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
+                                                     G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
+                                                     TERMINAL_UNIQUE_NAME,
+                                                     TERMINAL_FACTORY_OBJECT_PATH,
+                                                     NULL /* cancellable */,
+                                                     &error);
+  if (factory == NULL) {
+    g_printerr ("Error constructing proxy for %s:%s: %s\n", 
+                TERMINAL_UNIQUE_NAME, TERMINAL_FACTORY_OBJECT_PATH,
+                error->message);
     g_error_free (error);
     goto out;
   }
 
-  factory_name = get_factory_name_for_display (options->display_name);
-  server_retval = g_dbus_connection_call_sync (connection,
-                                               factory_name,
-                                               TERMINAL_FACTORY_SERVICE_PATH,
-                                               TERMINAL_FACTORY_INTERFACE_NAME,
-                                               "HandleArguments",
-                                               options_to_variant (options, argv_copy, argc_copy),
-                                               G_VARIANT_TYPE ("()"),
-                                               G_DBUS_CALL_FLAGS_NONE,
-                                               -1,
-                                               NULL,
-                                               &error);
-  if (server_retval == NULL) {
+  envv = g_get_environ ();
+  if (!terminal_factory_call_handle_arguments_sync (factory,
+                                                    working_directory ? working_directory : "",
+                                                    display_name ? display_name : "",
+                                                    startup_id ? startup_id : "",
+                                                    (const char * const *) envv,
+                                                    (const char * const *) argv_copy,
+                                                    NULL /* cancellable */,
+                                                    &error)) {
     g_printerr ("Error opening terminal: %s\n", error->message);
     g_error_free (error);
   } else {
-    g_variant_unref (server_retval);
     exit_code = EXIT_SUCCESS;
   }
 
-  g_free (factory_name);
-  g_object_unref (connection);
+  g_strfreev (envv);
+  g_object_unref (factory);
 
 out:
   terminal_options_free (options);
-
+  g_free (working_directory);
   g_free (argv_copy);
 
   return exit_code;



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