src/XMLDocumentConstructor.h
branchv_0
changeset 38 ba850b20fe0d
parent 37 cae9eedf4180
child 39 77d585a1b98c
--- a/src/XMLDocumentConstructor.h	Sun Jun 06 11:46:26 2021 +0200
+++ b/src/XMLDocumentConstructor.h	Sun Jun 06 18:29:23 2021 +0200
@@ -60,6 +60,9 @@
 
 	std::stringstream currentIndefiniteString;
 
+	uint64_t currentTag;
+	bool currentTagPresent;
+
 	cbor_callbacks callbacks = cbor_empty_callbacks;
 
 	/**
@@ -82,26 +85,37 @@
 		}
 	}
 
+	void writeCurrentTag(xmlpp::Element* element) {
+		if (currentTagPresent) {
+			element->set_attribute("tag", std::to_string(currentTag));
+			currentTagPresent = false;
+		}
+	}
+
 	void appendScalarValue(Glib::ustring value, Glib::ustring cborType) {
 		if (mode.back() == Mode::ARRAY) {
 			xmlpp::Element* element = current->add_child(nameCodec.encode(itemName));
 			element->add_child_text(value);
 			element->set_attribute("value-type", cborType);
+			writeCurrentTag(element);
 		} else if (mode.back() == Mode::MAP_KEY) {
 			current = current->add_child(nameCodec.encode(value));
 			current->set_attribute("key-type", cborType);
+			writeCurrentTag(current);
 			mode.push_back(Mode::MAP_VALUE);
 		} else if (mode.back() == Mode::MAP_VALUE) {
 			current->add_child_text(value);
 			current->set_attribute("value-type", cborType);
+			writeCurrentTag(current);
 			current = parentOrSelf(current);
 			mode.pop_back();
 		} else if (mode.back() == Mode::ROOT) {
 			current->add_child_text(value);
+			writeCurrentTag(current);
 		} else if (mode.back() == Mode::BYTE_STRING || mode.back() == Mode::CHAR_STRING) {
 			currentIndefiniteString << value;
 		} else {
-			// TODO: process YAML_SCALAR_EVENT
+			// TODO: throw exception?
 		}
 
 		checkRemainingItems();
@@ -120,6 +134,7 @@
 		if (mode.back() == Mode::MAP_KEY) mode.pop_back();
 		mode.push_back(Mode::ARRAY);
 		remainingItems.push_back(size);
+		writeCurrentTag(current);
 	}
 
 	void mapStart(ssize_t size) {
@@ -137,6 +152,7 @@
 
 		mode.push_back(Mode::MAP_KEY);
 		remainingItems.push_back(size);
+		writeCurrentTag(current);
 	}
 
 	void flushCurrentIndefiniteString(Glib::ustring cborType) {
@@ -243,9 +259,8 @@
 
 		callbacks.tag = [](void* context, uint64_t value) {
 			CBOR_CALLBACK_START
-			// TODO: implement
-			xmlpp::Element* element = instance->current->add_child("tag");
-			element->add_child_text(std::to_string(value));
+			instance->currentTag = value;
+			instance->currentTagPresent = true;
 			CBOR_CALLBACK_END
 		};