[librsvg] Add content_type out param to _rsvg_io_acquire_*
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg] Add content_type out param to _rsvg_io_acquire_*
- Date: Sat, 28 Jan 2012 17:34:25 +0000 (UTC)
commit c72df0b0ab0cc5db48192535e9776efd6b46c51d
Author: Christian Persch <chpe gnome org>
Date: Fri Jan 27 21:59:28 2012 +0100
Add content_type out param to _rsvg_io_acquire_*
rsvg-base-file-util.c | 2 +-
rsvg-base.c | 13 ++++--
rsvg-defs.c | 2 +-
rsvg-file-util.c | 2 +-
rsvg-image.c | 2 +-
rsvg-io.c | 104 +++++++++++++++++++++++++++++++++++-------------
rsvg-io.h | 2 +
rsvg-private.h | 2 +
rsvg-styles.c | 1 +
9 files changed, 94 insertions(+), 36 deletions(-)
---
diff --git a/rsvg-base-file-util.c b/rsvg-base-file-util.c
index 2c9eae1..c146b4f 100644
--- a/rsvg-base-file-util.c
+++ b/rsvg-base-file-util.c
@@ -93,7 +93,7 @@ rsvg_handle_new_from_file (const gchar * file_name, GError ** error)
rsvg_return_val_if_fail (file_name != NULL, NULL, error);
base_uri = rsvg_get_base_uri_from_filename (file_name);
- data = _rsvg_io_acquire_data (file_name, base_uri, &data_len, error);
+ data = _rsvg_io_acquire_data (file_name, base_uri, NULL, &data_len, error);
if (data) {
handle = rsvg_handle_new ();
diff --git a/rsvg-base.c b/rsvg-base.c
index cf837f9..433061a 100644
--- a/rsvg-base.c
+++ b/rsvg-base.c
@@ -541,7 +541,7 @@ rsvg_start_xinclude (RsvgHandle * ctx, RsvgPropertyBag * atts)
gsize data_len;
const char *encoding;
- data = _rsvg_handle_acquire_data (ctx, href, &data_len, NULL);
+ data = _rsvg_handle_acquire_data (ctx, href, NULL, &data_len, NULL);
if (data == NULL)
goto fallback;
@@ -571,7 +571,7 @@ rsvg_start_xinclude (RsvgHandle * ctx, RsvgPropertyBag * atts)
xmlParserInputPtr input;
int result;
- stream = _rsvg_handle_acquire_stream (ctx, href, NULL);
+ stream = _rsvg_handle_acquire_stream (ctx, href, NULL, NULL);
if (stream == NULL)
goto fallback;
@@ -810,11 +810,13 @@ rsvg_entity_decl (void *data, const xmlChar * name, int type,
if (systemId)
entity_data = _rsvg_handle_acquire_data (ctx,
(const char *) systemId,
+ NULL,
&entity_data_len,
NULL);
else if (publicId)
entity_data = _rsvg_handle_acquire_data (ctx,
(const char *) publicId,
+ NULL,
&entity_data_len,
NULL);
if (entity_data) {
@@ -890,6 +892,7 @@ rsvg_processing_instruction (void *ctx, const xmlChar * target, const xmlChar *
style_data = _rsvg_handle_acquire_data (handle,
value,
+ NULL,
&style_data_len,
NULL);
if (style_data) {
@@ -2143,22 +2146,24 @@ _rsvg_handle_allow_load (RsvgHandle *handle,
guint8*
_rsvg_handle_acquire_data (RsvgHandle *handle,
const char *uri,
+ char **content_type,
gsize *len,
GError **error)
{
if (!_rsvg_handle_allow_load (handle, uri, error))
return NULL;
- return _rsvg_io_acquire_data (uri, rsvg_handle_get_base_uri (handle), len, error);
+ return _rsvg_io_acquire_data (uri, rsvg_handle_get_base_uri (handle), content_type, len, error);
}
GInputStream *
_rsvg_handle_acquire_stream (RsvgHandle *handle,
const char *uri,
+ char **content_type,
GError **error)
{
if (!_rsvg_handle_allow_load (handle, uri, error))
return NULL;
- return _rsvg_io_acquire_stream (uri, rsvg_handle_get_base_uri (handle), error);
+ return _rsvg_io_acquire_stream (uri, rsvg_handle_get_base_uri (handle), content_type, error);
}
diff --git a/rsvg-defs.c b/rsvg-defs.c
index 71678d7..fa43a47 100644
--- a/rsvg-defs.c
+++ b/rsvg-defs.c
@@ -72,7 +72,7 @@ rsvg_defs_load_extern (const RsvgDefs * defs, const char *name)
filename = rsvg_get_file_path (name, rsvg_handle_get_base_uri (defs->ctx));
- data = _rsvg_handle_acquire_data (defs->ctx, name, &data_len, NULL);
+ data = _rsvg_handle_acquire_data (defs->ctx, name, NULL, &data_len, NULL);
if (data) {
handle = rsvg_handle_new ();
diff --git a/rsvg-file-util.c b/rsvg-file-util.c
index 8636b07..73baac4 100644
--- a/rsvg-file-util.c
+++ b/rsvg-file-util.c
@@ -127,7 +127,7 @@ rsvg_pixbuf_from_file_with_size_data (const gchar * file_name,
gsize data_len;
GString *base_uri = g_string_new (file_name);
- data = _rsvg_io_acquire_data (file_name, base_uri->str, &data_len, error);
+ data = _rsvg_io_acquire_data (file_name, base_uri->str, NULL, &data_len, error);
if (data) {
pixbuf = rsvg_pixbuf_from_stdio_file_with_size_data (data, data_len,
diff --git a/rsvg-image.c b/rsvg-image.c
index 2d0f93b..44a5f97 100644
--- a/rsvg-image.c
+++ b/rsvg-image.c
@@ -48,7 +48,7 @@ rsvg_cairo_surface_new_from_href (RsvgHandle *handle,
int res;
cairo_surface_t *surface;
- data = _rsvg_handle_acquire_data (handle, href, &data_len, error);
+ data = _rsvg_handle_acquire_data (handle, href, NULL, &data_len, error);
if (data == NULL)
return NULL;
diff --git a/rsvg-io.c b/rsvg-io.c
index a3782c6..f0a5380 100644
--- a/rsvg-io.c
+++ b/rsvg-io.c
@@ -68,8 +68,8 @@ uri_decoded_copy (const char *part,
static guint8 *
rsvg_acquire_data_data (const char *uri,
const char *base_uri,
- gsize *out_len,
char **out_content_type,
+ gsize *out_len,
GError **error)
{
const char *comma, *start, *end;
@@ -94,8 +94,9 @@ rsvg_acquire_data_data (const char *uri,
end = comma;
}
- if (end != start)
+ if (end != start) {
content_type = uri_decoded_copy (start, end - start);
+ }
}
if (comma)
@@ -113,10 +114,13 @@ rsvg_acquire_data_data (const char *uri,
data_len = 0;
}
- if (out_content_type)
- *out_content_type = content_type;
- else
- g_free (content_type);
+ if (out_content_type) {
+ if (content_type)
+ *out_content_type = g_content_type_from_mime_type (content_type);
+ else
+ *out_content_type = NULL;
+ }
+ g_free (content_type);
*out_len = data_len;
return data;
@@ -153,39 +157,52 @@ rsvg_get_file_path (const gchar * filename, const gchar * base_uri)
static guint8 *
rsvg_acquire_file_data (const char *filename,
const char *base_uri,
- gsize *len,
+ char **out_content_type,
+ gsize *out_len,
GError **error)
{
GFile *file;
gchar *path, *data;
GInputStream *stream;
+ gsize len;
gboolean res;
rsvg_return_val_if_fail (filename != NULL, NULL, error);
+ g_assert (out_len != NULL);
path = rsvg_get_file_path (filename, base_uri);
if (path == NULL)
return NULL;
- res = g_file_get_contents (path, &data, len, error);
+ if (!g_file_get_contents (path, &data, &len, error)) {
+ g_free (path);
+ return NULL;
+ }
+
+ if (out_content_type) {
+ *out_content_type = g_content_type_guess (path, data, len, NULL);
+ }
+
g_free (path);
- return res ? data : NULL;
+ *out_len = len;
+ return data;
}
static GInputStream *
rsvg_acquire_gvfs_stream (const char *uri,
const char *base_uri,
+ char **out_content_type,
GError **error)
{
GFile *base, *file;
- GInputStream *stream;
+ GFileInputStream *stream;
GError *err = NULL;
gchar *data;
file = g_file_new_for_uri (uri);
- stream = (GInputStream *) g_file_read (file, NULL /* cancellable */, &err);
+ stream = g_file_read (file, NULL /* cancellable */, &err);
g_object_unref (file);
if (stream == NULL &&
@@ -196,33 +213,52 @@ rsvg_acquire_gvfs_stream (const char *uri,
file = g_file_resolve_relative_path (base, uri);
g_object_unref (base);
- stream = (GInputStream *) g_file_read (file, NULL /* cancellable */, &err);
+ stream = g_file_read (file, NULL /* cancellable */, &err);
g_object_unref (file);
}
- if (stream == NULL)
+ if (stream == NULL) {
g_propagate_error (error, err);
+ return NULL;
+ }
+
+ if (out_content_type) {
+ GFileInfo *file_info;
+
+ file_info = g_file_input_stream_query_info (stream,
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+ NULL /* cancellable */,
+ NULL /* error */);
+ if (file_info) {
+ *out_content_type = g_strdup (g_file_info_get_content_type (file_info));
+ g_object_unref (file_info);
+ } else {
+ *out_content_type = NULL;
+ }
+ }
return stream;
}
static guint8 *
-rsvg_acquire_gvfs_data (const char *uri,
- const char *base_uri,
- gsize *len,
+rsvg_acquire_gvfs_data (const char *uri,
+ const char *base_uri,
+ char **out_content_type,
+ gsize *out_len,
GError **error)
{
GFile *base, *file;
GInputStream *stream;
GError *err;
gchar *data;
+ gsize len;
gboolean res;
file = g_file_new_for_uri (uri);
err = NULL;
data = NULL;
- if (!(res = g_file_load_contents (file, NULL, &data, len, NULL, &err)) &&
+ if (!(res = g_file_load_contents (file, NULL, &data, &len, NULL, &err)) &&
g_error_matches (err, G_IO_ERROR, G_IO_ERROR_NOT_FOUND) &&
base_uri != NULL) {
g_clear_error (&err);
@@ -231,25 +267,33 @@ rsvg_acquire_gvfs_data (const char *uri,
file = g_file_resolve_relative_path (base, uri);
g_object_unref (base);
- res = g_file_load_contents (file, NULL, &data, len, NULL, &err);
+ res = g_file_load_contents (file, NULL, &data, &len, NULL, &err);
}
g_object_unref (file);
- if (err == NULL)
- return data;
+ if (err) {
+ g_propagate_error (error, err);
+ return NULL;
+ }
- g_propagate_error (error, err);
- return NULL;
+ if (out_content_type) {
+ *out_content_type = g_content_type_guess (uri, data, len, NULL);
+ }
+
+ *out_len = len;
+ return data;
}
guint8 *
_rsvg_io_acquire_data (const char *href,
const char *base_uri,
+ char **content_type,
gsize *len,
GError **error)
{
guint8 *data;
+ gsize llen;
if (!(href && *href)) {
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
@@ -257,13 +301,16 @@ _rsvg_io_acquire_data (const char *href,
return NULL;
}
+ if (!len)
+ len = &llen;
+
if (strncmp (href, "data:", 5) == 0)
- return rsvg_acquire_data_data (href, NULL, len, NULL, error);
+ return rsvg_acquire_data_data (href, NULL, content_type, len, error);
- if ((data = rsvg_acquire_file_data (href, base_uri, len, NULL)))
+ if ((data = rsvg_acquire_file_data (href, base_uri, content_type, len, NULL)))
return data;
- if ((data = rsvg_acquire_gvfs_data (href, base_uri, len, error)))
+ if ((data = rsvg_acquire_gvfs_data (href, base_uri, content_type, len, error)))
return data;
return NULL;
@@ -272,6 +319,7 @@ _rsvg_io_acquire_data (const char *href,
GInputStream *
_rsvg_io_acquire_stream (const char *href,
const char *base_uri,
+ char **content_type,
GError **error)
{
GInputStream *stream;
@@ -285,16 +333,16 @@ _rsvg_io_acquire_stream (const char *href,
}
if (strncmp (href, "data:", 5) == 0) {
- if (!(data = rsvg_acquire_data_data (href, NULL, &len, NULL, error)))
+ if (!(data = rsvg_acquire_data_data (href, NULL, content_type, &len, error)))
return NULL;
return g_memory_input_stream_new_from_data (data, len, (GDestroyNotify) g_free);
}
- if ((data = rsvg_acquire_file_data (href, base_uri, &len, NULL)))
+ if ((data = rsvg_acquire_file_data (href, base_uri, content_type, &len, NULL)))
return g_memory_input_stream_new_from_data (data, len, (GDestroyNotify) g_free);
- if ((stream = rsvg_acquire_gvfs_stream (href, base_uri, error)))
+ if ((stream = rsvg_acquire_gvfs_stream (href, base_uri, content_type, error)))
return stream;
return NULL;
diff --git a/rsvg-io.h b/rsvg-io.h
index be3db8c..22448ac 100644
--- a/rsvg-io.h
+++ b/rsvg-io.h
@@ -28,11 +28,13 @@
guint8* _rsvg_io_acquire_data (const char *uri,
const char *base_uri,
+ char **content_type,
gsize *len,
GError **error);
GInputStream *_rsvg_io_acquire_stream (const char *uri,
const char *base_uri,
+ char **content_type,
GError **error);
#endif /* RSVG_IO_H */
diff --git a/rsvg-private.h b/rsvg-private.h
index b79e871..4d963d6 100644
--- a/rsvg-private.h
+++ b/rsvg-private.h
@@ -406,11 +406,13 @@ void rsvg_return_if_fail_warning (const char *pretty_function,
G_GNUC_INTERNAL
guint8* _rsvg_handle_acquire_data (RsvgHandle *handle,
const char *uri,
+ char **content_type,
gsize *len,
GError **error);
G_GNUC_INTERNAL
GInputStream *_rsvg_handle_acquire_stream (RsvgHandle *handle,
const char *uri,
+ char **content_type,
GError **error);
diff --git a/rsvg-styles.c b/rsvg-styles.c
index 60119b0..581a8f2 100644
--- a/rsvg-styles.c
+++ b/rsvg-styles.c
@@ -1170,6 +1170,7 @@ ccss_import_style (CRDocHandler * a_this,
stylesheet_data = _rsvg_handle_acquire_data (user_data->ctx,
(gchar *) cr_string_peek_raw_str (a_uri),
+ NULL,
&stylesheet_data_len,
NULL);
if (stylesheet_data == NULL)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]