[librsvg] Add content_type out param to _rsvg_io_acquire_*



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]