[librsvg: 6/18] rsvg-load.c: Parse CSS data in XML processing instructions in Rust



commit 368f1af6fd9c692ac29d99c81d10f6be7f8f7e15
Author: Federico Mena Quintero <federico gnome org>
Date:   Fri Nov 23 08:52:05 2018 -0600

    rsvg-load.c: Parse CSS data in XML processing instructions in Rust

 librsvg/rsvg-load.c          | 21 +++------------------
 librsvg/rsvg-private.h       | 10 ++++------
 rsvg_internals/src/css.rs    | 19 -------------------
 rsvg_internals/src/handle.rs | 43 ++++++++++++++++++++++++++++++++++++++++++-
 rsvg_internals/src/lib.rs    |  4 +++-
 rsvg_internals/src/xml.rs    |  6 ++++--
 6 files changed, 56 insertions(+), 47 deletions(-)
---
diff --git a/librsvg/rsvg-load.c b/librsvg/rsvg-load.c
index df73ee51..93d78256 100644
--- a/librsvg/rsvg-load.c
+++ b/librsvg/rsvg-load.c
@@ -551,24 +551,9 @@ sax_processing_instruction_cb (void *user_data, const xmlChar * target, const xm
 
             if ((!alternate || strcmp (alternate, "no") != 0)
                 && type && strcmp (type, "text/css") == 0
-                && href) {
-                char *style_data;
-                gsize style_data_len;
-                char *mime_type = NULL;
-
-                style_data = _rsvg_handle_acquire_data (load->handle,
-                                                        href,
-                                                        &mime_type,
-                                                        &style_data_len,
-                                                        NULL);
-                if (style_data &&
-                    mime_type &&
-                    strcmp (mime_type, "text/css") == 0) {
-                    rsvg_css_parse_into_handle (load->handle, style_data, style_data_len);
-                }
-
-                g_free (mime_type);
-                g_free (style_data);
+                && href)
+            {
+                rsvg_handle_load_css (load->handle, href);
             }
 
             rsvg_property_bag_free (atts);
diff --git a/librsvg/rsvg-private.h b/librsvg/rsvg-private.h
index a2173775..e1b85a92 100644
--- a/librsvg/rsvg-private.h
+++ b/librsvg/rsvg-private.h
@@ -159,12 +159,6 @@ RsvgCssStyles *rsvg_css_styles_new (void);
 G_GNUC_INTERNAL
 void rsvg_css_styles_free (RsvgCssStyles *styles);
 
-/* Implemented in rsvg_internals/src/css.rs */
-G_GNUC_INTERNAL
-void rsvg_css_parse_into_handle (RsvgHandle *handle,
-                                 const char *buf,
-                                 gsize len);
-
 /* Implemented in rsvg_internals/src/structure.rs */
 G_GNUC_INTERNAL
 gboolean rsvg_node_svg_get_size (RsvgNode *node, double dpi_x, double dpi_y, int *out_width, int 
*out_height);
@@ -254,6 +248,10 @@ RsvgDefs *rsvg_handle_get_defs (RsvgHandle *handle);
 G_GNUC_INTERNAL
 RsvgCssStyles *rsvg_handle_get_css_styles (RsvgHandle *handle);
 
+/* Implemented in rsvg_internals/src/handle.rs */
+G_GNUC_INTERNAL
+void rsvg_handle_load_css(RsvgHandle *handle, const char *href);
+
 G_GNUC_INTERNAL
 char *rsvg_handle_resolve_uri (RsvgHandle *handle,
                                const char *uri);
diff --git a/rsvg_internals/src/css.rs b/rsvg_internals/src/css.rs
index c6870b91..4f56e668 100644
--- a/rsvg_internals/src/css.rs
+++ b/rsvg_internals/src/css.rs
@@ -1,7 +1,6 @@
 use std::collections::hash_map::Entry;
 use std::collections::HashMap;
 use std::ptr;
-use std::slice;
 use std::str::{self, FromStr};
 
 use libc;
@@ -240,21 +239,3 @@ pub unsafe extern "C" fn rsvg_css_styles_free(raw_styles: *mut RsvgCssStyles) {
 
     Box::from_raw(raw_styles as *mut CssStyles);
 }
-
-#[no_mangle]
-pub unsafe extern "C" fn rsvg_css_parse_into_handle(
-    handle: *mut RsvgHandle,
-    buf: *const libc::c_char,
-    len: usize,
-) {
-    assert!(!handle.is_null());
-
-    if buf.is_null() || len == 0 {
-        return;
-    }
-
-    let bytes = slice::from_raw_parts(buf as *const u8, len);
-    let utf8 = str::from_utf8_unchecked(bytes);
-
-    parse_into_handle(handle, utf8);
-}
diff --git a/rsvg_internals/src/handle.rs b/rsvg_internals/src/handle.rs
index 749ef4a7..73fedc59 100644
--- a/rsvg_internals/src/handle.rs
+++ b/rsvg_internals/src/handle.rs
@@ -8,10 +8,11 @@ use glib::translate::*;
 use glib_sys;
 use libc;
 
-use css::{CssStyles, RsvgCssStyles};
+use css::{self, CssStyles, RsvgCssStyles};
 use defs::{Defs, RsvgDefs};
 use error::LoadingError;
 use surface_utils::shared_surface::SharedImageSurface;
+use util::utf8_cstr;
 
 pub enum RsvgHandle {}
 
@@ -194,3 +195,43 @@ pub fn image_surface_new_from_href(
 pub fn load_xml_xinclude(handle: *mut RsvgHandle, url: &str) -> bool {
     unsafe { from_glib(rsvg_load_handle_xml_xinclude(handle, url.to_glib_none().0)) }
 }
+
+fn load_css(handle: *mut RsvgHandle, href: &str) {
+    if let Ok(data) = acquire_data(handle, href) {
+        let BinaryData {
+            data: bytes,
+            content_type,
+        } = data;
+
+        if content_type.as_ref().map(String::as_ref) != Some("text/css") {
+            rsvg_log!("\"{}\" is not of type text/css; ignoring", href);
+            // FIXME: report errors
+            return;
+        }
+
+        if let Ok(utf8) = String::from_utf8(bytes) {
+            css::parse_into_handle(handle, &utf8);
+        } else {
+            rsvg_log!(
+                "\"{}\" does not contain valid UTF-8 CSS data; ignoring",
+                href
+            );
+            // FIXME: report errors
+            return;
+        }
+    } else {
+        rsvg_log!("Could not load \"{}\" for CSS data", href);
+        // FIXME: report errors from not being to acquire data; this should be a fatal error
+    }
+}
+
+// This function just slurps CSS data from a possibly-relative href
+// and parses it.  We'll move it to a better place in the end.
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_load_css(handle: *mut RsvgHandle, href: *const libc::c_char) {
+    assert!(!handle.is_null());
+    assert!(!href.is_null());
+
+    let href = utf8_cstr(href);
+    load_css(handle, href);
+}
diff --git a/rsvg_internals/src/lib.rs b/rsvg_internals/src/lib.rs
index b74cd2de..34bde426 100644
--- a/rsvg_internals/src/lib.rs
+++ b/rsvg_internals/src/lib.rs
@@ -31,7 +31,7 @@ extern crate lazy_static;
 
 pub use color::{rsvg_css_parse_color, ColorKind, ColorSpec};
 
-pub use css::{rsvg_css_parse_into_handle, rsvg_css_styles_free, rsvg_css_styles_new};
+pub use css::{rsvg_css_styles_free, rsvg_css_styles_new};
 
 pub use defs::{rsvg_defs_free, rsvg_defs_lookup};
 
@@ -43,6 +43,8 @@ pub use drawing_ctx::{
     rsvg_drawing_ctx_new,
 };
 
+pub use handle::rsvg_handle_load_css;
+
 pub use io::rsvg_decode_data_uri;
 
 pub use node::rsvg_node_unref;
diff --git a/rsvg_internals/src/xml.rs b/rsvg_internals/src/xml.rs
index 3cbec54d..1e492b6a 100644
--- a/rsvg_internals/src/xml.rs
+++ b/rsvg_internals/src/xml.rs
@@ -221,7 +221,9 @@ impl XmlState {
         let old_value = self.entities.insert(entity_name.to_string(), entity);
 
         if let Some(v) = old_value {
-            unsafe { xmlFreeNode(v); }
+            unsafe {
+                xmlFreeNode(v);
+            }
         }
     }
 
@@ -598,7 +600,7 @@ pub unsafe extern "C" fn rsvg_xml_state_error(xml: *mut RsvgXmlState, msg: *cons
 #[no_mangle]
 pub unsafe extern "C" fn rsvg_xml_state_entity_lookup(
     xml: *const RsvgXmlState,
-    entity_name: *const libc::c_char
+    entity_name: *const libc::c_char,
 ) -> XmlEntityPtr {
     assert!(!xml.is_null());
     let xml = &*(xml as *mut XmlState);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]