summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@gnome.org>2009-12-20 23:54:47 +0100
committerBenjamin Otte <otte@gnome.org>2009-12-20 23:54:47 +0100
commit1cafd48efea10b476df13ee468206292b01010c4 (patch)
tree538c24ddcc9fe7cfc86cd040f87cc577f191dc15
parentb34b9c6ea77470461604d67fc8ef4f45d4ec6955 (diff)
downloadlibsoup-new-io.tar.gz
Add URI to directory stream so it can generate absolute URLsnew-io
-rw-r--r--libsoup/soup-directory-input-stream.c26
-rw-r--r--libsoup/soup-directory-input-stream.h4
-rw-r--r--libsoup/soup-request-file.c3
3 files changed, 23 insertions, 10 deletions
diff --git a/libsoup/soup-directory-input-stream.c b/libsoup/soup-directory-input-stream.c
index 48fcfd06..43990f19 100644
--- a/libsoup/soup-directory-input-stream.c
+++ b/libsoup/soup-directory-input-stream.c
@@ -15,6 +15,7 @@
#include <string.h>
#include "soup-message-body.h"
+#include "soup-uri.h"
#define INIT_STRING "<html><head><title>OMG!</title></head><body><table>"
@@ -29,23 +30,26 @@ soup_directory_input_stream_parse_info (SoupDirectoryInputStream *stream,
SoupBuffer *buffer;
GString *string;
const char *s;
- char *escaped, *xml_string;
+ char *escaped, *path, *xml_string;
if (!g_file_info_get_name (info))
return NULL;
- string = g_string_new ("<tr>");
s = g_file_info_get_display_name (info);
if (!s) {
s = g_file_info_get_name (info);
- /* FIXME: convert somehow */
+ /* FIXME: convert somehow? */
if (!g_utf8_validate (s, -1, NULL))
- s = "Invalid filename";
+ return NULL;
}
- escaped = g_uri_escape_string (s, NULL, FALSE);
- xml_string = g_markup_escape_text (g_file_info_get_display_name (info), -1);
- g_string_append_printf (string, "<td><a href=\"%s\">%s</a></td>", escaped, xml_string);
+ string = g_string_new ("<tr>");
+
+ xml_string = g_markup_escape_text (s, -1);
+ escaped = g_uri_escape_string (g_file_info_get_name (info), NULL, FALSE);
+ path = g_strconcat (stream->uri, "/", escaped, NULL);
g_free (escaped);
+ g_string_append_printf (string, "<td><a href=\"%s\">%s</a></td>", path, xml_string);
+ g_free (path);
g_free (xml_string);
g_string_append (string, "</tr>");
@@ -142,6 +146,9 @@ soup_directory_input_stream_close (GInputStream *input,
error);
g_object_unref (stream->enumerator);
stream->enumerator = NULL;
+
+ g_free (stream->uri);
+ stream->uri = NULL;
return result;
}
@@ -164,15 +171,18 @@ soup_directory_input_stream_init (SoupDirectoryInputStream *stream)
}
GInputStream *
-soup_directory_input_stream_new (GFileEnumerator *enumerator)
+soup_directory_input_stream_new (GFileEnumerator *enumerator,
+ SoupURI *uri)
{
GInputStream *stream;
g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), NULL);
+ g_return_val_if_fail (uri != NULL, NULL);
stream = g_object_new (SOUP_TYPE_DIRECTORY_INPUT_STREAM, NULL);
SOUP_DIRECTORY_INPUT_STREAM (stream)->enumerator = g_object_ref (enumerator);
+ SOUP_DIRECTORY_INPUT_STREAM (stream)->uri = soup_uri_to_string (uri, FALSE);
return stream;
}
diff --git a/libsoup/soup-directory-input-stream.h b/libsoup/soup-directory-input-stream.h
index 5d1040e1..0a7bad73 100644
--- a/libsoup/soup-directory-input-stream.h
+++ b/libsoup/soup-directory-input-stream.h
@@ -26,6 +26,7 @@ struct _SoupDirectoryInputStream {
GInputStream parent;
GFileEnumerator *enumerator;
+ char *uri;
SoupBuffer *buffer;
gboolean done;
};
@@ -36,7 +37,8 @@ struct _SoupDirectoryInputStreamClass {
GType soup_directory_input_stream_get_type (void);
-GInputStream * soup_directory_input_stream_new (GFileEnumerator *enumerator);
+GInputStream * soup_directory_input_stream_new (GFileEnumerator *enumerator,
+ SoupURI *uri);
G_END_DECLS
diff --git a/libsoup/soup-request-file.c b/libsoup/soup-request-file.c
index 6bcbdaab..e50c06ec 100644
--- a/libsoup/soup-request-file.c
+++ b/libsoup/soup-request-file.c
@@ -182,7 +182,8 @@ soup_request_file_send (SoupRequest *request,
cancellable,
error);
if (enumerator) {
- stream = soup_directory_input_stream_new (enumerator);
+ stream = soup_directory_input_stream_new (enumerator,
+ soup_request_get_uri (request));
g_object_unref (enumerator);
file->priv->mime_type = g_strdup ("text/html");
}