summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2018-11-14 23:34:51 +0100
committerMilan Crha <mcrha@redhat.com>2018-11-14 23:34:51 +0100
commit45cbf30d7fcc46cc566a7c38a8c2e221eb62b146 (patch)
tree2bf08807994ce8671cd456fbab5b58383d16ce26
parent2178b205aeb10249822aad7ae8f830ab8d8d4e7b (diff)
downloadevolution-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.c54
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);