summaryrefslogtreecommitdiff
path: root/gdk/gdkcontentserializer.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2017-11-29 08:13:06 +0100
committerBenjamin Otte <otte@redhat.com>2017-12-03 05:46:48 +0100
commit928c98a84efd2c72bc3ff9fe139ad5296091110a (patch)
tree396755363fe7f09df8e465b9220c1775af2f7b0c /gdk/gdkcontentserializer.c
parent39d4622563a907a4421a1ea66ce6f312486abe75 (diff)
downloadgtk+-928c98a84efd2c72bc3ff9fe139ad5296091110a.tar.gz
gdk: Add serializers and deserializers for GFile
in particular, support: GFile <=> text/uri-list GFile => text/plain
Diffstat (limited to 'gdk/gdkcontentserializer.c')
-rw-r--r--gdk/gdkcontentserializer.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/gdk/gdkcontentserializer.c b/gdk/gdkcontentserializer.c
index 045cd20ce9..eddc8be64e 100644
--- a/gdk/gdkcontentserializer.c
+++ b/gdk/gdkcontentserializer.c
@@ -512,6 +512,66 @@ string_serializer (GdkContentSerializer *serializer)
}
static void
+file_serializer_finish (GObject *source,
+ GAsyncResult *result,
+ gpointer serializer)
+{
+ GOutputStream *stream = G_OUTPUT_STREAM (source);
+ GError *error = NULL;
+
+ if (!g_output_stream_write_all_finish (stream, result, NULL, &error))
+ gdk_content_serializer_return_error (serializer, error);
+ else
+ gdk_content_serializer_return_success (serializer);
+}
+
+static void
+file_uri_serializer (GdkContentSerializer *serializer)
+{
+ GFile *file;
+ GString *str;
+ char *uri;
+
+ str = g_string_new (NULL);
+
+ file = g_value_get_object (gdk_content_serializer_get_value (serializer));
+ uri = g_file_get_uri (file);
+ g_string_append (str, uri);
+ g_free (uri);
+ g_string_append (str, "\r\n");
+
+ g_output_stream_write_all_async (gdk_content_serializer_get_output_stream (serializer),
+ str->str,
+ str->len,
+ gdk_content_serializer_get_priority (serializer),
+ gdk_content_serializer_get_cancellable (serializer),
+ file_serializer_finish,
+ serializer);
+ gdk_content_serializer_set_task_data (serializer, g_string_free (str, FALSE), g_free);
+}
+
+static void
+file_text_serializer (GdkContentSerializer *serializer)
+{
+ GFile *file;
+ char *path;
+
+ file = g_value_get_object (gdk_content_serializer_get_value (serializer));
+ path = g_file_get_path (file);
+ if (path == NULL)
+ path = g_file_get_uri (file);
+
+ g_output_stream_write_all_async (gdk_content_serializer_get_output_stream (serializer),
+ path,
+ strlen (path),
+ gdk_content_serializer_get_priority (serializer),
+ gdk_content_serializer_get_cancellable (serializer),
+ file_serializer_finish,
+ serializer);
+ gdk_content_serializer_set_task_data (serializer, path, g_free);
+}
+
+static void
init (void)
{
static gboolean initialized = FALSE;
@@ -567,6 +627,17 @@ init (void)
g_slist_free (formats);
+ gdk_content_register_serializer (G_TYPE_FILE,
+ "text/uri-list",
+ file_uri_serializer,
+ NULL,
+ NULL);
+ gdk_content_register_serializer (G_TYPE_FILE,
+ "text/plain;charset=utf-8",
+ file_text_serializer,
+ NULL,
+ NULL);
+
gdk_content_register_serializer (G_TYPE_STRING,
"text/plain;charset=utf-8",
string_serializer,