From c33af17b934fcc8528b393ed2dca603e4940e6b3 Mon Sep 17 00:00:00 2001 From: Robert McQueen Date: Tue, 15 Nov 2005 19:34:33 +0000 Subject: 2005-11-15 Robert McQueen * dbus/dbus-glib-lowlevel.h, glib/dbus-gobject.c: Patch from Rob Taylor to add two methods, dbus_g_method_return_get_reply and dbus_g_method_return_send_reply, to allow you to get the reply message from a DBusGMethodInvocation, append arbitrary stuff to it, and send it. The GLib bindings can't marshal a return value of something like a(s) if the array is empty - ultimately they should be made to heed the signature of the out arguments as the Python bindings now can, but this is a workable interim solution which might have other applications. --- ChangeLog | 12 ++++++++++++ dbus/dbus-glib-lowlevel.h | 4 ++++ glib/dbus-gobject.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/ChangeLog b/ChangeLog index 39e67833..c63f80a2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2005-11-15 Robert McQueen + + * dbus/dbus-glib-lowlevel.h, glib/dbus-gobject.c: Patch from Rob + Taylor to add two methods, dbus_g_method_return_get_reply and + dbus_g_method_return_send_reply, to allow you to get the reply + message from a DBusGMethodInvocation, append arbitrary stuff to it, + and send it. The GLib bindings can't marshal a return value of + something like a(s) if the array is empty - ultimately they should be + made to heed the signature of the out arguments as the Python bindings + now can, but this is a workable interim solution which might have + other applications. + 2005-11-15 Robert McQueen * bus/driver.c, bus/services.c, bus/services.h: Add a ReleaseName diff --git a/dbus/dbus-glib-lowlevel.h b/dbus/dbus-glib-lowlevel.h index 94132151..9f6fc84e 100644 --- a/dbus/dbus-glib-lowlevel.h +++ b/dbus/dbus-glib-lowlevel.h @@ -57,6 +57,10 @@ DBusMessage* dbus_g_message_get_message (DBusGMessage *gmessage); * g-functions anyhow) */ +DBusMessage * dbus_g_method_return_get_reply (DBusGMethodInvocation *context); + +void dbus_g_method_return_send_reply (DBusGMethodInvocation *context, DBusMessage *reply); + G_END_DECLS #endif /* DBUS_GLIB_LOWLEVEL_H */ diff --git a/glib/dbus-gobject.c b/glib/dbus-gobject.c index 66bd60d9..1abe2581 100644 --- a/glib/dbus-gobject.c +++ b/glib/dbus-gobject.c @@ -1858,6 +1858,40 @@ dbus_g_object_register_marshaller_array (GClosureMarshal marshaller, g_static_rw_lock_writer_unlock (&globals_lock); } + +/** + * Get the reply message to append reply values + * Used as a sidedoor when you can't generate dbus values + * of the correct type due to glib binding limitations + * + * @param context the method context + */ +DBusMessage * +dbus_g_method_return_get_reply (DBusGMethodInvocation *context) +{ + return dbus_message_new_method_return (dbus_g_message_get_message (context->message)); +} + +/** + * Send a manually created reply message + * Used as a sidedoor when you can't generate dbus values + * of the correct type due to glib binding limitations + * + * @param context the method context + * @param reply the reply message, will be unreffed + */ +void +dbus_g_method_return_send_reply (DBusGMethodInvocation *context, DBusMessage *reply) +{ + dbus_connection_send (dbus_g_connection_get_connection (context->connection), reply, NULL); + dbus_message_unref (reply); + + dbus_g_connection_unref (context->connection); + dbus_g_message_unref (context->message); + g_free (context); +} + + /** * Send a return message for a given method invocation, with arguments. * This function also frees the sending context. -- cgit