summaryrefslogtreecommitdiff
path: root/libsoup/soup-request-file.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsoup/soup-request-file.c')
-rw-r--r--libsoup/soup-request-file.c64
1 files changed, 35 insertions, 29 deletions
diff --git a/libsoup/soup-request-file.c b/libsoup/soup-request-file.c
index 0b5638d2..5a56b28b 100644
--- a/libsoup/soup-request-file.c
+++ b/libsoup/soup-request-file.c
@@ -25,15 +25,21 @@
#include <config.h>
#endif
-#include <glib/gi18n-lib.h>
-
-#define LIBSOUP_USE_UNSTABLE_REQUEST_API
+#include <string.h>
#include "soup-request-file.h"
#include "soup.h"
#include "soup-directory-input-stream.h"
#include "soup-requester.h"
+/**
+ * SECTION:soup-request-file
+ * @short_description: SoupRequest support for "file" and "resource" URIs
+ *
+ * #SoupRequestFile implements #SoupRequest for "file" and "resource"
+ * URIs.
+ */
+
G_DEFINE_TYPE (SoupRequestFile, soup_request_file, SOUP_TYPE_REQUEST)
struct _SoupRequestFilePrivate {
@@ -128,7 +134,15 @@ soup_request_file_ensure_file (SoupRequestFile *file,
windowsify_file_uri_path (decoded_path);
#endif
- file->priv->gfile = g_file_new_for_path (decoded_path);
+ if (uri->scheme == SOUP_URI_SCHEME_RESOURCE) {
+ char *uri_str;
+
+ uri_str = g_strdup_printf ("resource://%s", decoded_path);
+ file->priv->gfile = g_file_new_for_uri (uri_str);
+ g_free (uri_str);
+ } else
+ file->priv->gfile = g_file_new_for_path (decoded_path);
+
g_free (decoded_path);
return TRUE;
}
@@ -184,36 +198,33 @@ soup_request_file_send (SoupRequest *request,
}
static void
-soup_request_file_send_async_thread (GSimpleAsyncResult *res,
- GObject *object,
- GCancellable *cancellable)
+soup_request_file_send_async_thread (GTask *task,
+ gpointer source_object,
+ gpointer task_data,
+ GCancellable *cancellable)
{
+ SoupRequest *request = source_object;
GInputStream *stream;
- SoupRequest *request;
GError *error = NULL;
- request = SOUP_REQUEST (object);
-
stream = soup_request_file_send (request, cancellable, &error);
-
if (stream == NULL)
- g_simple_async_result_take_error (res, error);
+ g_task_return_error (task, error);
else
- g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref);
+ g_task_return_pointer (task, stream, g_object_unref);
}
static void
soup_request_file_send_async (SoupRequest *request,
GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
- GSimpleAsyncResult *res;
-
- res = g_simple_async_result_new (G_OBJECT (request), callback, user_data, soup_request_file_send_async);
+ GTask *task;
- g_simple_async_result_run_in_thread (res, soup_request_file_send_async_thread, G_PRIORITY_DEFAULT, cancellable);
- g_object_unref (res);
+ task = g_task_new (request, cancellable, callback, user_data);
+ g_task_run_in_thread (task, soup_request_file_send_async_thread);
+ g_object_unref (task);
}
static GInputStream *
@@ -221,14 +232,9 @@ soup_request_file_send_finish (SoupRequest *request,
GAsyncResult *result,
GError **error)
{
- GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
-
- g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == soup_request_file_send_async);
-
- if (g_simple_async_result_propagate_error (simple, error))
- return NULL;
+ g_return_val_if_fail (g_task_is_valid (result, request), NULL);
- return g_object_ref (g_simple_async_result_get_op_res_gpointer (simple));
+ return g_task_propagate_pointer (G_TASK (result), error);
}
static goffset
@@ -250,7 +256,7 @@ soup_request_file_get_content_type (SoupRequest *request)
return file->priv->mime_type;
}
-static const char *file_schemes[] = { "file", NULL };
+static const char *file_schemes[] = { "file", "resource", NULL };
static void
soup_request_file_class_init (SoupRequestFileClass *request_file_class)
@@ -281,7 +287,7 @@ soup_request_file_class_init (SoupRequestFileClass *request_file_class)
*
* Return value: (transfer full): a #GFile corresponding to @file
*
- * Since: 2.34
+ * Since: 2.40
*/
GFile *
soup_request_file_get_file (SoupRequestFile *file)