[librsvg] Make gzipped SVGs work with new_from_gfile()
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg] Make gzipped SVGs work with new_from_gfile()
- Date: Mon, 26 Oct 2015 15:59:29 +0000 (UTC)
commit beb10a3a5b0f584205cf4e7334b93ef192ed9361
Author: Benjamin Otte <otte redhat com>
Date: Sat Oct 24 21:45:34 2015 +0200
Make gzipped SVGs work with new_from_gfile()
Move the code for decoding gzipped streams into load_from_stream() so
that all streaming code can use it.
rsvg-base.c | 31 +++++++++++++++++++++++--------
1 files changed, 23 insertions(+), 8 deletions(-)
---
diff --git a/rsvg-base.c b/rsvg-base.c
index 9bcb579..cfddf4e 100644
--- a/rsvg-base.c
+++ b/rsvg-base.c
@@ -1753,19 +1753,12 @@ rsvg_handle_close (RsvgHandle * handle, GError ** error)
return TRUE;
if (priv->data_input_stream) {
- GConverter *converter;
- GInputStream *stream;
gboolean ret;
- converter = G_CONVERTER (g_zlib_decompressor_new (G_ZLIB_COMPRESSOR_FORMAT_GZIP));
- stream = g_converter_input_stream_new (priv->data_input_stream, converter);
- g_object_unref (converter);
+ ret = rsvg_handle_read_stream_sync (handle, priv->data_input_stream, NULL, error);
g_object_unref (priv->data_input_stream);
priv->data_input_stream = NULL;
- ret = rsvg_handle_read_stream_sync (handle, stream, NULL, error);
- g_object_unref (stream);
-
return ret;
}
@@ -1804,6 +1797,7 @@ rsvg_handle_read_stream_sync (RsvgHandle *handle,
xmlDocPtr doc;
GError *err = NULL;
gboolean res = FALSE;
+ const guchar *buf;
g_return_val_if_fail (RSVG_IS_HANDLE (handle), FALSE);
g_return_val_if_fail (G_IS_INPUT_STREAM (stream), FALSE);
@@ -1812,6 +1806,25 @@ rsvg_handle_read_stream_sync (RsvgHandle *handle,
priv = handle->priv;
+ /* detect zipped streams */
+ stream = g_buffered_input_stream_new (stream);
+ if (g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (stream), 2, cancellable, error) != 2) {
+ g_object_unref (stream);
+ return FALSE;
+ }
+ buf = g_buffered_input_stream_peek_buffer (G_BUFFERED_INPUT_STREAM (stream), NULL);
+ if ((buf[0] == 0x1f) && (buf[1] == 0x8b)) {
+ GConverter *converter;
+ GInputStream *conv_stream;
+
+ converter = G_CONVERTER (g_zlib_decompressor_new (G_ZLIB_COMPRESSOR_FORMAT_GZIP));
+ conv_stream = g_converter_input_stream_new (stream, converter);
+ g_object_unref (converter);
+ g_object_unref (stream);
+
+ stream = conv_stream;
+ }
+
priv->error = &err;
priv->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
if (priv->ctxt == NULL) {
@@ -1862,6 +1875,8 @@ rsvg_handle_read_stream_sync (RsvgHandle *handle,
out:
+ g_object_unref (stream);
+
priv->error = NULL;
g_clear_object (&priv->cancellable);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]