GDBus: Make message serialization routines take capabilities param
[platform/upstream/glib.git] / gio / gdbusconnection.c
index ff425ab..80ae8b6 100644 (file)
  *
  *  - Consistent timeout handling (25s vs 30s?)
  *
- *  - GDBusProxy subclass example
- *
  *  - Update GDBusAuthObserver (s/deny/authorize/)
  */
 
  * <example id="gdbus-subtree-server"><title>D-Bus subtree example</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" parse="text" href="../../../../gio/tests/gdbus-example-subtree.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
  *
  * <example id="gdbus-unix-fd-client"><title>D-Bus UNIX File Descriptor example</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" parse="text" href="../../../../gio/tests/gdbus-example-unix-fd-client.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
+ *
+ * <example id="gdbus-export"><title>Exporting a GObject</title><programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" parse="text" href="../../../../gio/tests/gdbus-example-export.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include></programlisting></example>
  */
 
 /* ---------------------------------------------------------------------------------------------------- */
@@ -1009,6 +1009,7 @@ g_dbus_connection_send_message_unlocked (GDBusConnection   *connection,
 
   blob = g_dbus_message_to_blob (message,
                                  &blob_size,
+                                 connection->priv->capabilities,
                                  error);
   if (blob == NULL)
     goto out;
@@ -3549,6 +3550,7 @@ static const gchar introspect_standard_interfaces[] =
   "    <signal name=\"PropertiesChanged\">\n"
   "      <arg type=\"s\" name=\"interface_name\"/>\n"
   "      <arg type=\"a{sv}\" name=\"changed_properties\"/>\n"
+  "      <arg type=\"as\" name=\"invalidated_properties\"/>\n"
   "    </signal>\n"
   "  </interface>\n"
   "  <interface name=\"org.freedesktop.DBus.Introspectable\">\n"
@@ -3893,7 +3895,6 @@ obj_message_func (GDBusConnection *connection,
  * g_dbus_connection_register_object:
  * @connection: A #GDBusConnection.
  * @object_path: The object path to register at.
- * @interface_name: The D-Bus interface to register.
  * @introspection_data: Introspection data for the interface.
  * @vtable: A #GDBusInterfaceVTable to call into or %NULL.
  * @user_data: Data to pass to functions in @vtable.
@@ -3901,7 +3902,7 @@ obj_message_func (GDBusConnection *connection,
  * @error: Return location for error or %NULL.
  *
  * Registers callbacks for exported objects at @object_path with the
- * D-Bus interface @interface_name.
+ * D-Bus interface that is described in @introspection_data.
  *
  * Calls to functions in @vtable (and @user_data_free_func) will
  * happen in the <link linkend="g-main-context-push-thread-default">thread-default main
@@ -3925,6 +3926,13 @@ obj_message_func (GDBusConnection *connection,
  * If an existing callback is already registered at @object_path and
  * @interface_name, then @error is set to #G_IO_ERROR_EXISTS.
  *
+ * GDBus automatically implements the standard D-Bus interfaces
+ * org.freedesktop.DBus.Properties, org.freedesktop.DBus.Introspectable
+ * and org.freedesktop.Peer, so you don't have to implement those for
+ * the objects you export. You <emphasis>can</emphasis> implement
+ * org.freedesktop.DBus.Properties yourself, e.g. to handle getting
+ * and setting of properties asynchronously.
+ *
  * See <xref linkend="gdbus-server"/> for an example of how to use this method.
  *
  * Returns: 0 if @error is set, otherwise a registration id (never 0)
@@ -3935,7 +3943,6 @@ obj_message_func (GDBusConnection *connection,
 guint
 g_dbus_connection_register_object (GDBusConnection            *connection,
                                    const gchar                *object_path,
-                                   const gchar                *interface_name,
                                    const GDBusInterfaceInfo   *introspection_data,
                                    const GDBusInterfaceVTable *vtable,
                                    gpointer                    user_data,
@@ -3949,8 +3956,8 @@ g_dbus_connection_register_object (GDBusConnection            *connection,
   g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), 0);
   g_return_val_if_fail (!g_dbus_connection_is_closed (connection), 0);
   g_return_val_if_fail (object_path != NULL && g_variant_is_object_path (object_path), 0);
-  g_return_val_if_fail (interface_name == NULL || g_dbus_is_interface_name (interface_name), 0);
   g_return_val_if_fail (introspection_data != NULL, 0);
+  g_return_val_if_fail (g_dbus_is_interface_name (introspection_data->name), 0);
   g_return_val_if_fail (error == NULL || *error == NULL, 0);
 
   ret = 0;
@@ -3970,14 +3977,14 @@ g_dbus_connection_register_object (GDBusConnection            *connection,
       g_hash_table_insert (connection->priv->map_object_path_to_eo, eo->object_path, eo);
     }
 
-  ei = g_hash_table_lookup (eo->map_if_name_to_ei, interface_name);
+  ei = g_hash_table_lookup (eo->map_if_name_to_ei, introspection_data->name);
   if (ei != NULL)
     {
       g_set_error (error,
                    G_IO_ERROR,
                    G_IO_ERROR_EXISTS,
                    _("An object is already exported for the interface %s at %s"),
-                   interface_name,
+                   introspection_data->name,
                    object_path);
       goto out;
     }
@@ -3989,7 +3996,7 @@ g_dbus_connection_register_object (GDBusConnection            *connection,
   ei->user_data_free_func = user_data_free_func;
   ei->vtable = vtable;
   ei->introspection_data = introspection_data;
-  ei->interface_name = g_strdup (interface_name);
+  ei->interface_name = g_strdup (introspection_data->name);
   ei->context = g_main_context_get_thread_default ();
   if (ei->context != NULL)
     g_main_context_ref (ei->context);