summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Persch <chpe@gnome.org>2012-01-27 22:22:22 +0100
committerChristian Persch <chpe@gnome.org>2012-01-27 22:34:26 +0100
commitcf1c41c94f50b20fff4a29fc4ca5fca2bee2a18b (patch)
treed94fe06f162a6d5bb346dad78bb7d80ffa5680c9
parentc72df0b0ab0cc5db48192535e9776efd6b46c51d (diff)
downloadlibrsvg-cf1c41c94f50b20fff4a29fc4ca5fca2bee2a18b.tar.gz
Obey the passed-in cancellable
Add GCancellable argument to _rsvg_io_acquire_*, and pass the cancellable passed to rsvg_handle_read_stream_sync() down.
-rw-r--r--rsvg-base-file-util.c2
-rw-r--r--rsvg-base.c32
-rw-r--r--rsvg-file-util.c2
-rw-r--r--rsvg-gobject.c3
-rw-r--r--rsvg-io.c25
-rw-r--r--rsvg-io.h2
-rw-r--r--rsvg-private.h1
7 files changed, 47 insertions, 20 deletions
diff --git a/rsvg-base-file-util.c b/rsvg-base-file-util.c
index c146b4fd..25df038e 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, NULL, &data_len, error);
+ data = _rsvg_io_acquire_data (file_name, base_uri, NULL, &data_len, NULL, error);
if (data) {
handle = rsvg_handle_new ();
diff --git a/rsvg-base.c b/rsvg-base.c
index 433061a9..b60433f5 100644
--- a/rsvg-base.c
+++ b/rsvg-base.c
@@ -1749,6 +1749,7 @@ rsvg_handle_read_stream_sync (RsvgHandle *handle,
int result;
xmlDocPtr doc;
GError *err = NULL;
+ gboolean res = FALSE;
g_return_val_if_fail (RSVG_IS_HANDLE (handle), FALSE);
g_return_val_if_fail (G_IS_INPUT_STREAM (stream), FALSE);
@@ -1758,6 +1759,7 @@ rsvg_handle_read_stream_sync (RsvgHandle *handle,
priv = handle->priv;
priv->error = &err;
+ priv->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
if (priv->ctxt == NULL) {
priv->ctxt = xmlCreatePushParserCtxt (&rsvgSAXHandlerStruct, handle, NULL, 0,
rsvg_handle_get_base_uri (handle));
@@ -1775,7 +1777,7 @@ rsvg_handle_read_stream_sync (RsvgHandle *handle,
if (xmlPushInput (priv->ctxt, input) < 0) {
rsvg_set_error (error, priv->ctxt);
xmlFreeInputStream (input);
- return FALSE;
+ goto out;
}
result = xmlParseDocument (priv->ctxt);
@@ -1785,14 +1787,12 @@ rsvg_handle_read_stream_sync (RsvgHandle *handle,
else
rsvg_set_error (error, handle->priv->ctxt);
- return FALSE;
+ goto out;
}
- priv->error = NULL;
-
if (err != NULL) {
g_propagate_error (error, err);
- return FALSE;
+ goto out;
}
doc = priv->ctxt->myDoc;
@@ -1804,7 +1804,14 @@ rsvg_handle_read_stream_sync (RsvgHandle *handle,
rsvg_defs_resolve_all (priv->defs);
priv->finished = TRUE;
- return TRUE;
+ res = TRUE;
+
+ out:
+
+ priv->error = NULL;
+ g_clear_object (&priv->cancellable);
+
+ return res;
}
/**
@@ -2153,7 +2160,12 @@ _rsvg_handle_acquire_data (RsvgHandle *handle,
if (!_rsvg_handle_allow_load (handle, uri, error))
return NULL;
- return _rsvg_io_acquire_data (uri, rsvg_handle_get_base_uri (handle), content_type, len, error);
+ return _rsvg_io_acquire_data (uri,
+ rsvg_handle_get_base_uri (handle),
+ content_type,
+ len,
+ handle->priv->cancellable,
+ error);
}
GInputStream *
@@ -2165,5 +2177,9 @@ _rsvg_handle_acquire_stream (RsvgHandle *handle,
if (!_rsvg_handle_allow_load (handle, uri, error))
return NULL;
- return _rsvg_io_acquire_stream (uri, rsvg_handle_get_base_uri (handle), content_type, error);
+ return _rsvg_io_acquire_stream (uri,
+ rsvg_handle_get_base_uri (handle),
+ content_type,
+ handle->priv->cancellable,
+ error);
}
diff --git a/rsvg-file-util.c b/rsvg-file-util.c
index 73baac4b..c22413d3 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, NULL, &data_len, error);
+ data = _rsvg_io_acquire_data (file_name, base_uri->str, NULL, &data_len, NULL, error);
if (data) {
pixbuf = rsvg_pixbuf_from_stdio_file_with_size_data (data, data_len,
diff --git a/rsvg-gobject.c b/rsvg-gobject.c
index 3945a5c7..3f052215 100644
--- a/rsvg-gobject.c
+++ b/rsvg-gobject.c
@@ -90,6 +90,7 @@ rsvg_handle_init (RsvgHandle * self)
self->priv->finished = 0;
self->priv->data_input_stream = NULL;
self->priv->first_write = TRUE;
+ self->priv->cancellable = NULL;
self->priv->is_disposed = FALSE;
self->priv->in_loop = FALSE;
@@ -130,6 +131,8 @@ rsvg_handle_dispose (GObject *instance)
self->priv->data_input_stream = NULL;
}
+ g_clear_object (&self->priv->cancellable);
+
chain:
G_OBJECT_CLASS (rsvg_handle_parent_class)->dispose (instance);
}
diff --git a/rsvg-io.c b/rsvg-io.c
index f0a53806..e8a24acc 100644
--- a/rsvg-io.c
+++ b/rsvg-io.c
@@ -159,6 +159,7 @@ rsvg_acquire_file_data (const char *filename,
const char *base_uri,
char **out_content_type,
gsize *out_len,
+ GCancellable *cancellable,
GError **error)
{
GFile *file;
@@ -193,6 +194,7 @@ static GInputStream *
rsvg_acquire_gvfs_stream (const char *uri,
const char *base_uri,
char **out_content_type,
+ GCancellable *cancellable,
GError **error)
{
GFile *base, *file;
@@ -202,7 +204,7 @@ rsvg_acquire_gvfs_stream (const char *uri,
file = g_file_new_for_uri (uri);
- stream = g_file_read (file, NULL /* cancellable */, &err);
+ stream = g_file_read (file, cancellable, &err);
g_object_unref (file);
if (stream == NULL &&
@@ -213,7 +215,7 @@ rsvg_acquire_gvfs_stream (const char *uri,
file = g_file_resolve_relative_path (base, uri);
g_object_unref (base);
- stream = g_file_read (file, NULL /* cancellable */, &err);
+ stream = g_file_read (file, cancellable, &err);
g_object_unref (file);
}
@@ -227,7 +229,7 @@ rsvg_acquire_gvfs_stream (const char *uri,
file_info = g_file_input_stream_query_info (stream,
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
- NULL /* cancellable */,
+ cancellable,
NULL /* error */);
if (file_info) {
*out_content_type = g_strdup (g_file_info_get_content_type (file_info));
@@ -237,7 +239,7 @@ rsvg_acquire_gvfs_stream (const char *uri,
}
}
- return stream;
+ return G_INPUT_STREAM (stream);
}
static guint8 *
@@ -245,6 +247,7 @@ rsvg_acquire_gvfs_data (const char *uri,
const char *base_uri,
char **out_content_type,
gsize *out_len,
+ GCancellable *cancellable,
GError **error)
{
GFile *base, *file;
@@ -258,7 +261,7 @@ rsvg_acquire_gvfs_data (const char *uri,
err = NULL;
data = NULL;
- if (!(res = g_file_load_contents (file, NULL, &data, &len, NULL, &err)) &&
+ if (!(res = g_file_load_contents (file, cancellable, &data, &len, NULL, &err)) &&
g_error_matches (err, G_IO_ERROR, G_IO_ERROR_NOT_FOUND) &&
base_uri != NULL) {
g_clear_error (&err);
@@ -267,7 +270,7 @@ 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, cancellable, &data, &len, NULL, &err);
}
g_object_unref (file);
@@ -290,6 +293,7 @@ _rsvg_io_acquire_data (const char *href,
const char *base_uri,
char **content_type,
gsize *len,
+ GCancellable *cancellable,
GError **error)
{
guint8 *data;
@@ -307,10 +311,10 @@ _rsvg_io_acquire_data (const char *href,
if (strncmp (href, "data:", 5) == 0)
return rsvg_acquire_data_data (href, NULL, content_type, len, error);
- if ((data = rsvg_acquire_file_data (href, base_uri, content_type, len, NULL)))
+ if ((data = rsvg_acquire_file_data (href, base_uri, content_type, len, cancellable, NULL)))
return data;
- if ((data = rsvg_acquire_gvfs_data (href, base_uri, content_type, len, error)))
+ if ((data = rsvg_acquire_gvfs_data (href, base_uri, content_type, len, cancellable, error)))
return data;
return NULL;
@@ -320,6 +324,7 @@ GInputStream *
_rsvg_io_acquire_stream (const char *href,
const char *base_uri,
char **content_type,
+ GCancellable *cancellable,
GError **error)
{
GInputStream *stream;
@@ -339,10 +344,10 @@ _rsvg_io_acquire_stream (const char *href,
return g_memory_input_stream_new_from_data (data, len, (GDestroyNotify) g_free);
}
- if ((data = rsvg_acquire_file_data (href, base_uri, content_type, &len, NULL)))
+ if ((data = rsvg_acquire_file_data (href, base_uri, content_type, &len, cancellable, NULL)))
return g_memory_input_stream_new_from_data (data, len, (GDestroyNotify) g_free);
- if ((stream = rsvg_acquire_gvfs_stream (href, base_uri, content_type, error)))
+ if ((stream = rsvg_acquire_gvfs_stream (href, base_uri, content_type, cancellable, error)))
return stream;
return NULL;
diff --git a/rsvg-io.h b/rsvg-io.h
index 22448ac1..1f214698 100644
--- a/rsvg-io.h
+++ b/rsvg-io.h
@@ -30,11 +30,13 @@ guint8* _rsvg_io_acquire_data (const char *uri,
const char *base_uri,
char **content_type,
gsize *len,
+ GCancellable *cancellable,
GError **error);
GInputStream *_rsvg_io_acquire_stream (const char *uri,
const char *base_uri,
char **content_type,
+ GCancellable *cancellable,
GError **error);
#endif /* RSVG_IO_H */
diff --git a/rsvg-private.h b/rsvg-private.h
index 4d963d60..25283d4b 100644
--- a/rsvg-private.h
+++ b/rsvg-private.h
@@ -161,6 +161,7 @@ struct RsvgHandlePrivate {
xmlParserCtxtPtr ctxt;
GError **error;
+ GCancellable *cancellable;
double dpi_x;
double dpi_y;