[GApplication] Add working directory to platform data
authorColin Walters <walters@verbum.org>
Wed, 16 Jun 2010 18:17:26 +0000 (14:17 -0400)
committerColin Walters <walters@verbum.org>
Fri, 18 Jun 2010 20:05:00 +0000 (16:05 -0400)
https://bugzilla.gnome.org/show_bug.cgi?id=621838

gio/gapplication.c
gio/gdbusapplication.c
gio/tests/testapp.c

index 31964ec..25a2cc4 100644 (file)
  * application instance when a second instance fails to take the bus name.
  * @arguments contains the commandline arguments given to the second instance
  * and @data contains platform-specific additional data.
- * 
- * On all platforms, @data is guaranteed to have a key "cwd" of type
- * signature "ay" which contains the working directory of the invoked
- * executable.
- * 
+ *
+ * On all platforms, @data will have a key "cwd" of type signature
+ * "ay" which contains the working directory of the invoked
+ * executable; this data is defined to be in the default GLib
+ * filesystem encoding for the platform.  See g_filename_to_utf8().
+ *
  * </para>
  * <para>
  * The <methodname>InvokeAction</methodname> function can be called to
@@ -319,6 +320,38 @@ g_application_default_run (GApplication *application)
 }
 
 static GVariant *
+append_cwd_to_platform_data (GVariant *platform_data)
+{
+  GVariantBuilder builder;
+  gchar *cwd;
+  GVariant *result;
+
+  cwd = g_get_current_dir ();
+
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+  if (cwd)
+    g_variant_builder_add (&builder, "{sv}",
+                          "cwd",
+                          g_variant_new_byte_array (cwd, -1));
+  g_free (cwd);
+
+  if (platform_data)
+    {
+      GVariantIter iter;
+      GVariant *item;
+
+      g_variant_iter_init (&iter, platform_data);
+      while (g_variant_iter_next (&iter, "@{sv}", &item))
+       {
+         g_variant_builder_add_value (&builder, item);
+         g_variant_unref (item);
+       }
+    }
+  result = g_variant_builder_end (&builder);
+  return result;
+}
+
+static GVariant *
 variant_from_argv (int    argc,
                   char **argv)
 {
@@ -976,6 +1009,7 @@ g_application_init (GApplication *app)
   app->priv->default_quit = TRUE;
   app->priv->do_register = TRUE;
   app->priv->is_remote = TRUE;
+  app->priv->platform_data = g_variant_new_array (G_VARIANT_TYPE ("{sv}"), NULL, 0);
 }
 
 static void
@@ -1045,7 +1079,12 @@ g_application_set_property (GObject      *object,
       break;
 
     case PROP_PLATFORM_DATA:
-      app->priv->platform_data = g_value_dup_variant (value);
+      {
+       GVariant *platform_data = g_value_get_variant (value);
+       if (app->priv->platform_data)
+         g_variant_unref (app->priv->platform_data);
+       app->priv->platform_data = g_variant_ref_sink (append_cwd_to_platform_data (platform_data));
+      }
       break;
 
     default:
index 39f46ed..e376c04 100644 (file)
@@ -346,16 +346,8 @@ _g_application_platform_register (GApplication  *app,
       GVariant *result;
 
       g_variant_builder_init (&builder, G_VARIANT_TYPE ("(aaya{sv})"));
-      g_variant_builder_add (&builder, "@aay", app->priv->argv);
-
-      if (app->priv->platform_data)
-       g_variant_builder_add (&builder, "@a{sv}", app->priv->platform_data);
-      else
-       {
-         g_variant_builder_open (&builder, G_VARIANT_TYPE ("a{sv}"));
-         g_variant_builder_close (&builder);
-       }
-
+      g_variant_builder_add_value (&builder, app->priv->argv);
+      g_variant_builder_add_value (&builder, app->priv->platform_data);
       message = g_variant_builder_end (&builder);
 
       result = g_dbus_connection_call_sync (app->priv->session_bus,
index 1985698..caed830 100644 (file)
@@ -31,6 +31,26 @@ on_app_activated (GApplication  *application,
                  GVariant      *args,
                  GVariant      *platform_data)
 {
+  GVariantIter iter;
+  const char *key;
+  GVariant *value;
+  char *cwd;
+
+  cwd = g_get_current_dir ();
+  g_variant_iter_init (&iter, platform_data);
+  while (g_variant_iter_next (&iter, "{&sv}", &key, &value))
+    {
+      const char *activate_cwd;
+      gsize *len;
+      if (strcmp (key, "cwd") != 0)
+       continue;
+
+      activate_cwd = g_variant_get_byte_array (value, &len);
+      g_assert_cmpstr (cwd, ==, activate_cwd);
+      g_variant_unref (value);
+    }
+
+  g_free (cwd);
 }
 
 static gboolean