[librsvg] Move the loading validation code from rsvg-load.c to rsvg-handle.c
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg] Move the loading validation code from rsvg-load.c to rsvg-handle.c
- Date: Mon, 10 Dec 2018 20:54:38 +0000 (UTC)
commit 1f29b880ff4c446605e8d1308c19fdf6c346c0f4
Author: Federico Mena Quintero <federico gnome org>
Date: Mon Dec 10 14:33:53 2018 -0600
Move the loading validation code from rsvg-load.c to rsvg-handle.c
The code in rsvg-load.c is now just the long-lived loader state.
librsvg/rsvg-handle.c | 26 ++++++++++++++++++++++----
librsvg/rsvg-load.c | 31 +++++--------------------------
librsvg/rsvg-load.h | 8 ++++----
3 files changed, 31 insertions(+), 34 deletions(-)
---
diff --git a/librsvg/rsvg-handle.c b/librsvg/rsvg-handle.c
index e0a72449..ae022dc8 100644
--- a/librsvg/rsvg-handle.c
+++ b/librsvg/rsvg-handle.c
@@ -140,6 +140,11 @@ extern RsvgNode *rsvg_handle_rust_get_root (RsvgHandleRust *raw_handle);
extern GFile *rsvg_handle_rust_get_base_gfile (RsvgHandleRust *raw_handle);
extern RsvgNode *rsvg_handle_defs_lookup (RsvgHandle *handle, const char *name);
extern gboolean rsvg_handle_rust_node_is_root(RsvgHandleRust *raw_handle, RsvgNode *node);
+extern void rsvg_handle_rust_steal_result (RsvgHandleRust *raw_handle, RsvgXmlState *xml);
+
+/* Implemented in rsvg_internals/src/xml.rs */
+extern void rsvg_xml_state_free (RsvgXmlState *xml);
+extern gboolean rsvg_xml_state_tree_is_valid(RsvgXmlState *xml, GError **error);
/* Implemented in rust/src/node.rs */
/* Call this as node = rsvg_node_unref (node); Then node will be NULL and you don't own it anymore! */
@@ -214,7 +219,12 @@ rsvg_handle_dispose (GObject *instance)
self->priv->user_data_destroy = NULL;
}
- g_clear_pointer (&self->priv->load, rsvg_load_free);
+ if (self->priv->load) {
+ RsvgXmlState *xml = rsvg_load_free (self->priv->load);
+ self->priv->load = NULL;
+
+ rsvg_xml_state_free (xml);
+ }
g_clear_pointer (&self->priv->base_uri, g_free);
@@ -684,22 +694,30 @@ rsvg_handle_write (RsvgHandle *handle, const guchar *buf, gsize count, GError **
static gboolean
finish_load (RsvgHandle *handle, gboolean was_successful, GError **error)
{
+ RsvgXmlState *xml;
+
g_assert (handle->priv->load != NULL);
+ xml = rsvg_load_free (handle->priv->load);
+ handle->priv->load = NULL;
+
if (was_successful) {
g_assert (error == NULL || *error == NULL);
- was_successful = rsvg_load_finish_load(handle->priv->load, error);
+ was_successful = rsvg_xml_state_tree_is_valid (xml, error);
+ if (was_successful) {
+ rsvg_handle_rust_steal_result (handle->priv->rust_handle, xml);
+ }
}
+ rsvg_xml_state_free (xml);
+
if (was_successful) {
handle->priv->hstate = RSVG_HANDLE_STATE_CLOSED_OK;
} else {
handle->priv->hstate = RSVG_HANDLE_STATE_CLOSED_ERROR;
}
- g_clear_pointer (&handle->priv->load, rsvg_load_free);
-
return was_successful;
}
diff --git a/librsvg/rsvg-load.c b/librsvg/rsvg-load.c
index 43d3c557..ee1ca85a 100644
--- a/librsvg/rsvg-load.c
+++ b/librsvg/rsvg-load.c
@@ -35,13 +35,8 @@ typedef enum {
LOAD_STATE_CLOSED
} LoadState;
-/* Implemented in rsvg_internals/src/xml.rs */
-typedef struct RsvgXmlState RsvgXmlState;
-
/* Implemented in rsvg_internals/src/xml.rs */
extern RsvgXmlState *rsvg_xml_state_new (RsvgHandle *handle);
-extern void rsvg_xml_state_free (RsvgXmlState *xml);
-extern gboolean rsvg_xml_state_tree_is_valid(RsvgXmlState *xml, GError **error);
extern void rsvg_xml_state_error(RsvgXmlState *xml, const char *msg);
/* Implemented in rsvg_internals/src/xml2_load.rs */
@@ -51,10 +46,6 @@ extern gboolean rsvg_xml_state_load_from_possibly_compressed_stream (RsvgXmlStat
GCancellable *cancellable,
GError **error);
-/* Implemented in rsvg_internals/src/handle.rs */
-extern void rsvg_handle_rust_steal_result (RsvgHandleRust *raw_handle, RsvgXmlState *xml);
-
-
/* Holds the GIO and loading state for compressed data */
struct RsvgLoad {
RsvgHandle *handle;
@@ -79,27 +70,19 @@ rsvg_load_new (RsvgHandle *handle)
return load;
}
-void
+RsvgXmlState *
rsvg_load_free (RsvgLoad *load)
{
+ RsvgXmlState *rust_state;
+
if (load->buffer) {
g_byte_array_free (load->buffer, TRUE);
}
- g_clear_pointer (&load->rust_state, rsvg_xml_state_free);
+ rust_state = load->rust_state;
g_free (load);
-}
-gboolean
-rsvg_load_finish_load (RsvgLoad *load, GError **error)
-{
- gboolean was_successful = rsvg_xml_state_tree_is_valid(load->rust_state, error);
-
- if (was_successful) {
- rsvg_handle_rust_steal_result (load->handle->priv->rust_handle, load->rust_state);
- }
-
- return was_successful;
+ return rust_state;
}
/* This one is defined in the C code, because the prototype has varargs
@@ -195,10 +178,6 @@ rsvg_load_close (RsvgLoad *load, GError **error)
g_assert_not_reached();
}
- if (!res) {
- g_clear_pointer (&load->rust_state, rsvg_xml_state_free);
- }
-
load->state = LOAD_STATE_CLOSED;
return res;
diff --git a/librsvg/rsvg-load.h b/librsvg/rsvg-load.h
index 8f29d7a0..0f52c515 100644
--- a/librsvg/rsvg-load.h
+++ b/librsvg/rsvg-load.h
@@ -25,14 +25,14 @@
#include <glib.h>
#include "rsvg-private.h"
-G_GNUC_INTERNAL
-RsvgLoad *rsvg_load_new (RsvgHandle *handle) G_GNUC_WARN_UNUSED_RESULT;
+/* Implemented in rsvg_internals/src/xml.rs */
+typedef struct RsvgXmlState RsvgXmlState;
G_GNUC_INTERNAL
-void rsvg_load_free (RsvgLoad *load);
+RsvgLoad *rsvg_load_new (RsvgHandle *handle) G_GNUC_WARN_UNUSED_RESULT;
G_GNUC_INTERNAL
-gboolean rsvg_load_finish_load(RsvgLoad *load, GError **error);
+RsvgXmlState *rsvg_load_free (RsvgLoad *load) G_GNUC_WARN_UNUSED_RESULT;
G_GNUC_INTERNAL
gboolean rsvg_load_write (RsvgLoad *load, const guchar *buf, gsize count, GError **error)
G_GNUC_WARN_UNUSED_RESULT;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]