diff options
author | Milan Crha <mcrha@redhat.com> | 2018-11-14 23:34:51 +0100 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2018-11-14 23:34:51 +0100 |
commit | 45cbf30d7fcc46cc566a7c38a8c2e221eb62b146 (patch) | |
tree | 2bf08807994ce8671cd456fbab5b58383d16ce26 | |
parent | 2178b205aeb10249822aad7ae8f830ab8d8d4e7b (diff) | |
download | evolution-data-server-45cbf30d7fcc46cc566a7c38a8c2e221eb62b146.tar.gz |
[evolution-dbus-session] Handle method calls with GUnixFDList
This is required to have properly propagated calls like OpenFile,
which use it.
Related to https://gitlab.gnome.org/GNOME/evolution/issues/169
-rw-r--r-- | src/tools/evolution-dbus-session/evolution-dbus-session.c | 54 |
1 files changed, 43 insertions, 11 deletions
diff --git a/src/tools/evolution-dbus-session/evolution-dbus-session.c b/src/tools/evolution-dbus-session/evolution-dbus-session.c index 575b5bbcd..7c53d9dd2 100644 --- a/src/tools/evolution-dbus-session/evolution-dbus-session.c +++ b/src/tools/evolution-dbus-session/evolution-dbus-session.c @@ -164,25 +164,57 @@ handle_method_call_cb (GDBusConnection *connection, GDBusMethodInvocation *invocation, gpointer user_data) { +#ifdef G_OS_UNIX + GDBusMessage *message; + GUnixFDList *in_fd_list, *out_fd_list = NULL; +#endif ProxyData *pd = user_data; GVariant *result; GError *error = NULL; g_return_if_fail (pd != NULL); - result = g_dbus_connection_call_sync (g_dbus_proxy_get_connection (pd->proxy), - g_dbus_proxy_get_name (pd->proxy), - object_path, - interface_name, - method_name, - parameters, - NULL, - G_DBUS_CALL_FLAGS_NONE, - DBUS_CALL_TIMEOUT, - NULL, &error); +#ifdef G_OS_UNIX + message = g_dbus_method_invocation_get_message (invocation); + in_fd_list = g_dbus_message_get_unix_fd_list (message); + + if (in_fd_list) { + result = g_dbus_connection_call_with_unix_fd_list_sync (g_dbus_proxy_get_connection (pd->proxy), + g_dbus_proxy_get_name (pd->proxy), + object_path, + interface_name, + method_name, + parameters, + NULL, + G_DBUS_CALL_FLAGS_NONE, + DBUS_CALL_TIMEOUT, + in_fd_list, + &out_fd_list, + NULL, &error); + } else { +#endif + result = g_dbus_connection_call_sync (g_dbus_proxy_get_connection (pd->proxy), + g_dbus_proxy_get_name (pd->proxy), + object_path, + interface_name, + method_name, + parameters, + NULL, + G_DBUS_CALL_FLAGS_NONE, + DBUS_CALL_TIMEOUT, + NULL, &error); +#ifdef G_OS_UNIX + } +#endif if (result) { - g_dbus_method_invocation_return_value (invocation, result); + #ifdef G_OS_UNIX + if (out_fd_list) { + g_dbus_method_invocation_return_value_with_unix_fd_list (invocation, result, out_fd_list); + g_object_unref (out_fd_list); + } else + #endif + g_dbus_method_invocation_return_value (invocation, result); g_variant_unref (result); } else { g_dbus_method_invocation_return_gerror (invocation, error); |