diff options
Diffstat (limited to 'gdk/gdkcontentserializer.c')
-rw-r--r-- | gdk/gdkcontentserializer.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/gdk/gdkcontentserializer.c b/gdk/gdkcontentserializer.c index 7b99690224..bbe66824f1 100644 --- a/gdk/gdkcontentserializer.c +++ b/gdk/gdkcontentserializer.c @@ -23,6 +23,7 @@ #include "gdkcontentformats.h" #include "gdkpixbuf.h" +#include "gfiletransferportal.h" #include "gdktextureprivate.h" #include <gdk-pixbuf/gdk-pixbuf.h> @@ -702,6 +703,62 @@ file_serializer_finish (GObject *source, } static void +portal_ready (GObject *object, + GAsyncResult *result, + gpointer serializer) +{ + GError *error = NULL; + char *key; + + if (!file_transfer_portal_register_files_finish (result, &key, &error)) + { + gdk_content_serializer_return_error (serializer, error); + return; + } + + g_output_stream_write_all_async (gdk_content_serializer_get_output_stream (serializer), + key, + strlen (key) + 1, + gdk_content_serializer_get_priority (serializer), + gdk_content_serializer_get_cancellable (serializer), + file_serializer_finish, + serializer); + gdk_content_serializer_set_task_data (serializer, key, g_free); +} + +static void +portal_file_serializer (GdkContentSerializer *serializer) +{ + GFile *file; + const GValue *value; + GPtrArray *files; + + files = g_ptr_array_new_with_free_func (g_free); + + value = gdk_content_serializer_get_value (serializer); + + if (G_VALUE_HOLDS (value, G_TYPE_FILE)) + { + file = g_value_get_object (gdk_content_serializer_get_value (serializer)); + if (file) + g_ptr_array_add (files, g_file_get_path (file)); + g_ptr_array_add (files, NULL); + } + else if (G_VALUE_HOLDS (value, GDK_TYPE_FILE_LIST)) + { + GSList *l; + + for (l = g_value_get_boxed (value); l; l = l->next) + g_ptr_array_add (files, g_file_get_path (l->data)); + + g_ptr_array_add (files, NULL); + } + + file_transfer_portal_register_files ((const char **)files->pdata, TRUE, portal_ready, serializer); + gdk_content_serializer_set_task_data (serializer, files, (GDestroyNotify)g_ptr_array_unref); +} + +static void file_uri_serializer (GdkContentSerializer *serializer) { GFile *file; @@ -864,6 +921,11 @@ init (void) g_slist_free (formats); gdk_content_register_serializer (G_TYPE_FILE, + "application/vnd.portal.filetransfer", + portal_file_serializer, + NULL, + NULL); + gdk_content_register_serializer (G_TYPE_FILE, "text/uri-list", file_uri_serializer, NULL, @@ -874,6 +936,11 @@ init (void) NULL, NULL); gdk_content_register_serializer (GDK_TYPE_FILE_LIST, + "application/vnd.portal.filetransfer", + portal_file_serializer, + NULL, + NULL); + gdk_content_register_serializer (GDK_TYPE_FILE_LIST, "text/uri-list", file_uri_serializer, NULL, |