diff options
author | Benjamin Otte <otte@redhat.com> | 2017-11-29 08:13:06 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2017-12-03 05:46:48 +0100 |
commit | 928c98a84efd2c72bc3ff9fe139ad5296091110a (patch) | |
tree | 396755363fe7f09df8e465b9220c1775af2f7b0c /gdk/gdkcontentserializer.c | |
parent | 39d4622563a907a4421a1ea66ce6f312486abe75 (diff) | |
download | gtk+-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.c | 71 |
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, |