diff -r b9a3c806468a -r 786977554fc3 src/XMLDocumentConstructor.h --- a/src/XMLDocumentConstructor.h Sun Nov 22 17:11:12 2020 +0100 +++ b/src/XMLDocumentConstructor.h Sun Nov 22 17:39:10 2020 +0100 @@ -16,11 +16,61 @@ */ #pragma once +#include + +#include "lib/INIReader.h" +#include "lib/XMLNameCodec.h" + namespace relpipe { namespace in { namespace xmltable { -#include +class HierarchicalINIContentHandler : public INIContentHandler { +private: + xmlpp::DomParser* domParser; + wstring_convert < codecvt_utf8> convertor; // INI parser works with UTF-8 +public: + + HierarchicalINIContentHandler(xmlpp::DomParser* domParser) : domParser(domParser) { + } + + virtual ~HierarchicalINIContentHandler() { + } + + void startDocument() override { + domParser->get_document()->create_root_node("ini"); + domParser->get_document()->get_root_node()->add_child("startDocument"); + // there should be only one document + }; + + void endDocument() override { + domParser->get_document()->get_root_node()->add_child("endDocument"); + }; + + void startSection(const SectionStartEvent& event) override { + xmlpp::Element* node = domParser->get_document()->get_root_node()->add_child("startSection"); + node->add_child("name")->add_child_text(event.name); + node->add_child("comment")->add_child_text(event.comment); + node->add_child("line-number")->add_child_text(std::to_string(event.lineNumber)); + node->add_child("event-number")->add_child_text(std::to_string(event.eventNumber)); + }; + + void endSection() override { + domParser->get_document()->get_root_node()->add_child("endSection"); + }; + + void entry(const EntryEvent& event) override { + xmlpp::Element* node = domParser->get_document()->get_root_node()->add_child("entry"); + node->add_child("key")->add_child_text(event.key); + node->add_child("sub-key")->add_child_text(event.subKey); + node->add_child("full-key")->add_child_text(event.fullKey); + node->add_child("value")->add_child_text(event.value); + node->add_child("comment")->add_child_text(event.comment); + node->add_child("line-number")->add_child_text(std::to_string(event.lineNumber)); + node->add_child("event-number")->add_child_text(std::to_string(event.eventNumber)); + }; + +}; class XMLDocumentConstructor { private: @@ -32,10 +82,13 @@ } void process() { - parser->parse_stream(*input); + HierarchicalINIContentHandler handler(parser); + std::shared_ptr reader(INIReader::create(*input)); + reader->addHandler(&handler); + reader->process(); } }; } } -} \ No newline at end of file +}