GDBus: set no-reply flag on calls with no callback

If g_dbus_connection_call() or g_dbus_proxy_call() are given a NULL
callback then set the no-reply flag on the outgoing D-Bus message.

https://bugzilla.gnome.org/show_bug.cgi?id=672239
This commit is contained in:
Ryan Lortie 2012-03-16 13:32:38 -04:00
parent c3125ee36d
commit 2afbc425eb
2 changed files with 82 additions and 35 deletions

View File

@ -5309,7 +5309,7 @@ g_dbus_connection_call_internal (GDBusConnection *connection,
gpointer user_data) gpointer user_data)
{ {
GDBusMessage *message; GDBusMessage *message;
CallState *state; guint32 serial;
g_return_if_fail (G_IS_DBUS_CONNECTION (connection)); g_return_if_fail (G_IS_DBUS_CONNECTION (connection));
g_return_if_fail (bus_name == NULL || g_dbus_is_name (bus_name)); g_return_if_fail (bus_name == NULL || g_dbus_is_name (bus_name));
@ -5325,18 +5325,6 @@ g_dbus_connection_call_internal (GDBusConnection *connection,
g_return_if_fail (fd_list == NULL); g_return_if_fail (fd_list == NULL);
#endif #endif
state = g_slice_new0 (CallState);
state->simple = g_simple_async_result_new (G_OBJECT (connection),
callback, user_data,
g_dbus_connection_call_internal);
g_simple_async_result_set_check_cancellable (state->simple, cancellable);
state->method_name = g_strjoin (".", interface_name, method_name, NULL);
if (reply_type == NULL)
reply_type = G_VARIANT_TYPE_ANY;
state->reply_type = g_variant_type_copy (reply_type);
message = g_dbus_message_new_method_call (bus_name, message = g_dbus_message_new_method_call (bus_name,
object_path, object_path,
interface_name, interface_name,
@ -5350,14 +5338,50 @@ g_dbus_connection_call_internal (GDBusConnection *connection,
g_dbus_message_set_unix_fd_list (message, fd_list); g_dbus_message_set_unix_fd_list (message, fd_list);
#endif #endif
g_dbus_connection_send_message_with_reply (connection, /* If the user has no callback then we can just send the message with
message, * the G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED flag set and skip all
G_DBUS_SEND_MESSAGE_FLAGS_NONE, * the logic for processing the reply. If the service sends the reply
timeout_msec, * anyway then it will just be ignored.
&state->serial, */
cancellable, if (callback != NULL)
g_dbus_connection_call_done, {
state); CallState *state;
state = g_slice_new0 (CallState);
state->simple = g_simple_async_result_new (G_OBJECT (connection),
callback, user_data,
g_dbus_connection_call_internal);
g_simple_async_result_set_check_cancellable (state->simple, cancellable);
state->method_name = g_strjoin (".", interface_name, method_name, NULL);
if (reply_type == NULL)
reply_type = G_VARIANT_TYPE_ANY;
state->reply_type = g_variant_type_copy (reply_type);
g_dbus_connection_send_message_with_reply (connection,
message,
G_DBUS_SEND_MESSAGE_FLAGS_NONE,
timeout_msec,
&state->serial,
cancellable,
g_dbus_connection_call_done,
state);
serial = state->serial;
}
else
{
GDBusMessageFlags flags;
flags = g_dbus_message_get_flags (message);
flags |= G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED;
g_dbus_message_set_flags (message, flags);
g_dbus_connection_send_message (connection,
message,
G_DBUS_SEND_MESSAGE_FLAGS_NONE,
&serial, NULL);
}
if (G_UNLIKELY (_g_dbus_debug_call ())) if (G_UNLIKELY (_g_dbus_debug_call ()))
{ {
@ -5371,7 +5395,7 @@ g_dbus_connection_call_internal (GDBusConnection *connection,
method_name, method_name,
object_path, object_path,
bus_name != NULL ? bus_name : "(none)", bus_name != NULL ? bus_name : "(none)",
state->serial); serial);
_g_dbus_debug_print_unlock (); _g_dbus_debug_print_unlock ();
} }
@ -5598,6 +5622,9 @@ g_dbus_connection_call_sync_internal (GDBusConnection *connection,
* See g_dbus_connection_call_sync() for the synchronous version of this * See g_dbus_connection_call_sync() for the synchronous version of this
* function. * function.
* *
* If @callback is %NULL then the D-Bus method call message will be sent with
* the %G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED flag set.
*
* Since: 2.26 * Since: 2.26
*/ */
void void

View File

@ -2682,6 +2682,7 @@ g_dbus_proxy_call_internal (GDBusProxy *proxy,
const gchar *target_interface_name; const gchar *target_interface_name;
gchar *destination; gchar *destination;
GVariantType *reply_type; GVariantType *reply_type;
GAsyncReadyCallback my_callback;
g_return_if_fail (G_IS_DBUS_PROXY (proxy)); g_return_if_fail (G_IS_DBUS_PROXY (proxy));
g_return_if_fail (g_dbus_is_member_name (method_name) || g_dbus_is_interface_name (method_name)); g_return_if_fail (g_dbus_is_member_name (method_name) || g_dbus_is_interface_name (method_name));
@ -2696,11 +2697,24 @@ g_dbus_proxy_call_internal (GDBusProxy *proxy,
reply_type = NULL; reply_type = NULL;
split_interface_name = NULL; split_interface_name = NULL;
simple = g_simple_async_result_new (G_OBJECT (proxy), /* g_dbus_connection_call() is optimised for the case of a NULL
callback, * callback. If we get a NULL callback from our user then make sure
user_data, * we pass along a NULL callback for ourselves as well.
g_dbus_proxy_call_internal); */
g_simple_async_result_set_check_cancellable (simple, cancellable); if (callback != NULL)
{
my_callback = (GAsyncReadyCallback) reply_cb;
simple = g_simple_async_result_new (G_OBJECT (proxy),
callback,
user_data,
g_dbus_proxy_call_internal);
g_simple_async_result_set_check_cancellable (simple, cancellable);
}
else
{
my_callback = NULL;
simple = NULL;
}
G_LOCK (properties_lock); G_LOCK (properties_lock);
@ -2723,12 +2737,15 @@ g_dbus_proxy_call_internal (GDBusProxy *proxy,
destination = g_strdup (get_destination_for_call (proxy)); destination = g_strdup (get_destination_for_call (proxy));
if (destination == NULL) if (destination == NULL)
{ {
g_simple_async_result_set_error (simple, if (simple != NULL)
G_IO_ERROR, {
G_IO_ERROR_FAILED, g_simple_async_result_set_error (simple,
_("Cannot invoke method; proxy is for a well-known name without an owner and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag")); G_IO_ERROR,
g_simple_async_result_complete_in_idle (simple); G_IO_ERROR_FAILED,
g_object_unref (simple); _("Cannot invoke method; proxy is for a well-known name without an owner and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag"));
g_simple_async_result_complete_in_idle (simple);
g_object_unref (simple);
}
G_UNLOCK (properties_lock); G_UNLOCK (properties_lock);
goto out; goto out;
} }
@ -2748,7 +2765,7 @@ g_dbus_proxy_call_internal (GDBusProxy *proxy,
timeout_msec == -1 ? proxy->priv->timeout_msec : timeout_msec, timeout_msec == -1 ? proxy->priv->timeout_msec : timeout_msec,
fd_list, fd_list,
cancellable, cancellable,
(GAsyncReadyCallback) reply_cb, my_callback,
simple); simple);
#else #else
g_dbus_connection_call (proxy->priv->connection, g_dbus_connection_call (proxy->priv->connection,
@ -2761,7 +2778,7 @@ g_dbus_proxy_call_internal (GDBusProxy *proxy,
flags, flags,
timeout_msec == -1 ? proxy->priv->timeout_msec : timeout_msec, timeout_msec == -1 ? proxy->priv->timeout_msec : timeout_msec,
cancellable, cancellable,
(GAsyncReadyCallback) reply_cb, my_callback,
simple); simple);
#endif #endif
@ -2964,6 +2981,9 @@ g_dbus_proxy_call_sync_internal (GDBusProxy *proxy,
* the operation. See g_dbus_proxy_call_sync() for the synchronous * the operation. See g_dbus_proxy_call_sync() for the synchronous
* version of this method. * version of this method.
* *
* If @callback is %NULL then the D-Bus method call message will be sent with
* the %G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED flag set.
*
* Since: 2.26 * Since: 2.26
*/ */
void void