From b5bd6e0114554174e73d828de9785b1f321eb60c Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Fri, 15 Feb 2019 19:27:27 +0100 Subject: [PATCH] Write abritrary printable objects into Xml_generator Fix #3161 --- repos/base/include/util/xml_generator.h | 37 +++++++++++++++++++++++ repos/base/src/test/xml_generator/main.cc | 16 ++++++++++ 2 files changed, 53 insertions(+) diff --git a/repos/base/include/util/xml_generator.h b/repos/base/include/util/xml_generator.h index 61fe1e3e1..b6e2d3940 100644 --- a/repos/base/include/util/xml_generator.h +++ b/repos/base/include/util/xml_generator.h @@ -248,6 +248,16 @@ class Genode::Xml_generator _commit_content(content_buffer); } + /** + * Append character, sanitize it if needed + */ + void append_sanitized(char const c) + { + Out_buffer content_buffer = _content_buffer(false); + content_buffer.append_sanitized(c); + _commit_content(content_buffer); + } + void append_sanitized(char const *src, size_t src_len) { Out_buffer content_buffer = _content_buffer(false); @@ -417,6 +427,33 @@ class Genode::Xml_generator _curr_node->append_sanitized(str, str_len == ~0UL ? strlen(str) : str_len); } + /** + * Append printable objects to XML node as sanitized content + * + * This method must not be followed by calls of 'attribute'. + */ + template + void append_content(ARGS &&... args) + { + struct Node_output : Genode::Output + { + Node &node; Node_output(Node &n) : node(n) { } + + /****************************** + ** Genode::Output interface ** + ******************************/ + + void out_char(char c) override { + node.append_sanitized(c); } + + void out_string(char const *str, size_t n) override { + node.append_sanitized(str, n); } + + } output { *_curr_node }; + + Output::out_args(output, args...); + } + size_t used() const { return _out_buffer.used(); } }; diff --git a/repos/base/src/test/xml_generator/main.cc b/repos/base/src/test/xml_generator/main.cc index 545376a8d..c1b29d282 100644 --- a/repos/base/src/test/xml_generator/main.cc +++ b/repos/base/src/test/xml_generator/main.cc @@ -226,6 +226,22 @@ void Component::construct(Genode::Env &env) } } + /* + * Test arbitrary content + */ + { + Xml_generator xml(dst, sizeof(dst), "data", [&] () { + xml.append_content(" ", 2 + 2, " == 2 + 2 == ", 4.0, " "); + }); + + Xml_node node(dst); + auto s = node.decoded_content>(); + if (s != " 4 == 2 + 2 == 4.0 ") { + error("decoded content does not match expect content"); + return; + } + } + log("--- XML generator test finished ---"); genode_exit(0); }