[librsvg] Move the loading validation code from rsvg-load.c to rsvg-handle.c



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]