GDBus: Add support for D-Bus type 'h' (ie. G_VARIANT_TYPE_HANDLE)
authorDavid Zeuthen <davidz@redhat.com>
Tue, 20 Jul 2010 15:38:23 +0000 (11:38 -0400)
committerDavid Zeuthen <davidz@redhat.com>
Tue, 20 Jul 2010 15:38:23 +0000 (11:38 -0400)
This allows sending and receiving D-Bus messages with instances of the
'h' D-Bus type. Unlike libdbus-1's dbus_message_iter_get_basic()
method, g_variant_get_handle() does not return a duplicated unix file
descriptor (that must be closed with close(2)) - instead, it returns
an index that can be used to get/dup the file descriptor from a
GUnixFDList object that can be obtained from the GDBusMessage object.

Signed-off-by: David Zeuthen <davidz@redhat.com>
gio/gdbusmessage.c
gio/tests/gdbus-serialization.c

index 01d00a0fe30c20f0f37f8e9c084d54fd6a154be8..b435d6f6d2209a6a2c901053c37654555470a850 100644 (file)
@@ -1006,6 +1006,19 @@ parse_value_from_blob (GMemoryInputStream    *mis,
           g_free (v);
         }
     }
+  else if (g_variant_type_equal (type, G_VARIANT_TYPE_HANDLE))
+    {
+      if (!ensure_input_padding (mis, 4, &local_error))
+        goto fail;
+      if (!just_align)
+        {
+          gint32 v;
+          v = g_data_input_stream_read_int32 (dis, NULL, &local_error);
+          if (local_error != NULL)
+            goto fail;
+          ret = g_variant_new_handle (v);
+        }
+    }
   else if (g_variant_type_is_array (type))
     {
       guint32 array_len;
@@ -1701,6 +1714,15 @@ append_value_to_blob (GVariant             *value,
           g_data_output_stream_put_byte (dos, '\0', NULL, NULL);
         }
     }
+  else if (g_variant_type_equal (type, G_VARIANT_TYPE_HANDLE))
+    {
+      padding_added = ensure_output_padding (mos, dos, 4);
+      if (value != NULL)
+        {
+          gint32 v = g_variant_get_handle (value);
+          g_data_output_stream_put_int32 (dos, v, NULL, NULL);
+        }
+    }
   else if (g_variant_type_is_array (type))
     {
       GVariant *item;
index a36dd8b9cdfe45dae590c786d6c2937ec3f98972..2cb80ce50639bf90dbae6feeb785d089907df654 100644 (file)
@@ -405,6 +405,18 @@ dbus_1_message_append (GString *s,
         break;
       }
 
+#ifdef DBUS_TYPE_UNIX_FD
+    case DBUS_TYPE_UNIX_FD:
+      {
+        /* unfortunately there's currently no way to get just the
+         * protocol value, since dbus_message_iter_get_basic() wants
+         * to be 'helpful' and dup the fd for the user...
+         */
+        g_string_append (s, "unix-fd: (not extracted)\n");
+        break;
+      }
+#endif
+
      case DBUS_TYPE_VARIANT:
        g_string_append_printf (s, "variant:\n");
        dbus_message_iter_recurse (iter, &sub);
@@ -672,6 +684,22 @@ message_serialize_complex (void)
                        "      string: `cwd'\n"
                        "      variant:\n"
                        "        string: `/home/davidz/Hacking/glib/gio/tests'\n");
+
+#ifdef DBUS_TYPE_UNIX_FD
+  value = g_variant_parse (G_VARIANT_TYPE ("(hah)"),
+                           "(42, [43, 44])",
+                           NULL, NULL, &error);
+  g_assert_no_error (error);
+  g_assert (value != NULL);
+  /* about (not extracted), see comment in DBUS_TYPE_UNIX_FD case in
+   * dbus_1_message_append() above.
+   */
+  check_serialization (value,
+                       "value 0:   unix-fd: (not extracted)\n"
+                       "value 1:   array:\n"
+                       "    unix-fd: (not extracted)\n"
+                       "    unix-fd: (not extracted)\n");
+#endif
 }