dump raw INI parser events v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sun, 22 Nov 2020 17:39:10 +0100
branchv_0
changeset 17 786977554fc3
parent 16 b9a3c806468a
child 18 45c06bdf9045
dump raw INI parser events
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 <libxml++-2.6/libxml++/libxml++.h>
+
+#include "lib/INIReader.h"
+#include "lib/XMLNameCodec.h"
+
 namespace relpipe {
 namespace in {
 namespace xmltable {
 
-#include <libxml++-2.6/libxml++/libxml++.h>
+class HierarchicalINIContentHandler : public INIContentHandler {
+private:
+	xmlpp::DomParser* domParser;
+	wstring_convert < codecvt_utf8<wchar_t>> 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<INIReader> reader(INIReader::create(*input));
+		reader->addHandler(&handler);
+		reader->process();
 	}
 };
 
 }
 }
-}
\ No newline at end of file
+}