summaryrefslogtreecommitdiff
path: root/gdk/gdkcontentserializer.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdk/gdkcontentserializer.c')
-rw-r--r--gdk/gdkcontentserializer.c67
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,