[librsvg: 6/18] rsvg-load.c: Parse CSS data in XML processing instructions in Rust
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 6/18] rsvg-load.c: Parse CSS data in XML processing instructions in Rust
- Date: Fri, 23 Nov 2018 22:31:59 +0000 (UTC)
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]