changeset 104305:52ea0b8b565e

* dbusbind.c (Fdbus_call_method_asynchronously): Allow nil HANDLER.
author Michael Albinus <michael.albinus@gmx.de>
date Sun, 16 Aug 2009 17:34:47 +0000
parents 35fbb27750a7
children 69b67a46e5b2
files src/dbusbind.c
diffstat 1 files changed, 30 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/dbusbind.c	Sun Aug 16 15:48:15 2009 +0000
+++ b/src/dbusbind.c	Sun Aug 16 17:34:47 2009 +0000
@@ -967,7 +967,8 @@
 offered by SERVICE.  It must provide METHOD.
 
 HANDLER is a Lisp function, which is called when the corresponding
-return message has arrived.
+return message has arrived.  If HANDLER is nil, no return message will
+be expected.
 
 If the parameter `:timeout' is given, the following integer TIMEOUT
 specifies the maximun number of milliseconds the method call must
@@ -987,7 +988,7 @@
 All arguments can be preceded by a type symbol.  For details about
 type symbols, see Info node `(dbus)Type Conversion'.
 
-The function returns a key into the hash table
+Unless HANDLER is nil, the function returns a key into the hash table
 `dbus-registered-functions-table'.  The corresponding entry in the
 hash table is removed, when the return message has been arrived, and
 HANDLER is called.
@@ -1032,7 +1033,7 @@
   CHECK_STRING (path);
   CHECK_STRING (interface);
   CHECK_STRING (method);
-  if (!FUNCTIONP (handler))
+  if (!NILP (handler) && !FUNCTIONP (handler))
     wrong_type_argument (intern ("functionp"), handler);
   GCPRO6 (bus, service, path, interface, method, handler);
 
@@ -1091,19 +1092,35 @@
       xd_append_arg (dtype, args[i], &iter);
     }
 
-  /* Send the message.  The message is just added to the outgoing
-     message queue.  */
-  if (!dbus_connection_send_with_reply (connection, dmessage, NULL, timeout))
-    XD_SIGNAL1 (build_string ("Cannot send message"));
+  if (!NILP (handler))
+    {
+      /* Send the message.  The message is just added to the outgoing
+	 message queue.  */
+      if (!dbus_connection_send_with_reply (connection, dmessage,
+					    NULL, timeout))
+	XD_SIGNAL1 (build_string ("Cannot send message"));
+
+      /* The result is the key in Vdbus_registered_functions_table.  */
+      result = (list2 (bus, make_number (dbus_message_get_serial (dmessage))));
+
+      /* Create a hash table entry.  */
+      Fputhash (result, handler, Vdbus_registered_functions_table);
+    }
+  else
+    {
+      /* Send the message.  The message is just added to the outgoing
+	 message queue.  */
+      if (!dbus_connection_send (connection, dmessage, NULL))
+	XD_SIGNAL1 (build_string ("Cannot send message"));
+
+      result = Qnil;
+    }
+
+  /* Flush connection to ensure the message is handled.  */
+  dbus_connection_flush (connection);
 
   XD_DEBUG_MESSAGE ("Message sent");
 
-  /* The result is the key in Vdbus_registered_functions_table.  */
-  result = (list2 (bus, make_number (dbus_message_get_serial (dmessage))));
-
-  /* Create a hash table entry.  */
-  Fputhash (result, handler, Vdbus_registered_functions_table);
-
   /* Cleanup.  */
   dbus_message_unref (dmessage);