diff -r 06aaad12c207 -r f686bdaeb9e0 src/XMLDocumentConstructor.h --- a/src/XMLDocumentConstructor.h Sat Nov 28 21:09:18 2020 +0100 +++ b/src/XMLDocumentConstructor.h Sun Nov 29 00:30:36 2020 +0100 @@ -106,22 +106,24 @@ private: std::istream* input = nullptr; xmlpp::DomParser* parser = nullptr; + std::shared_ptr reader; public: XMLDocumentConstructor(std::istream* input, xmlpp::DomParser* parser) : input(input), parser(parser) { + reader.reset(INIReader::create(*input)); + reader->addUnescapingProcessor(std::make_shared(), unescaping::Basic, true); + reader->addUnescapingProcessor(std::make_shared(), unescaping::JavaProperties, false); + reader->addUnescapingProcessor(std::make_shared(), unescaping::Backspace, true); + reader->addDialect(std::make_shared(), dialect::JavaProperties, false); + } + + void setOption(const std::string& uri, const std::string& value) { + reader->setOption(uri, value); } void process() { HierarchicalINIContentHandler handler(parser); - std::shared_ptr reader(INIReader::create(*input)); - reader->addUnescapingProcessor(std::make_shared(), unescaping::Basic, true); - reader->addUnescapingProcessor(std::make_shared(), unescaping::JavaProperties, false); - reader->addUnescapingProcessor(std::make_shared(), unescaping::Backspace, true); - reader->addDialect(std::make_shared(), dialect::JavaProperties, false); reader->addHandler(&handler); - // TODO: smart pointers vs. references: are we going to call addUnescapingProcessor() dynamically/conditionally or share instances? Then pointers will be better. - // TODO: call setOption() according to the configuration - // for (ParserOptionRecipe option : configuration.parserOptions) reader->setOption(convertor.to_bytes(option.uri), convertor.to_bytes(option.value)); reader->process(); } };