improved arrays and maps v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Tue, 08 Jun 2021 22:34:11 +0200
branchv_0
changeset 40 503b77beed57
parent 39 77d585a1b98c
child 41 b11458587f20
improved arrays and maps
src/XMLDocumentConstructor.h
--- a/src/XMLDocumentConstructor.h	Mon Jun 07 18:40:45 2021 +0200
+++ b/src/XMLDocumentConstructor.h	Tue Jun 08 22:34:11 2021 +0200
@@ -111,6 +111,7 @@
 			mode.pop_back();
 		} else if (mode.back() == Mode::ROOT) {
 			current->add_child_text(value);
+			current->set_attribute("value-type", cborType);
 			writeCurrentTag(current);
 		} else if (mode.back() == Mode::BYTE_STRING || mode.back() == Mode::CHAR_STRING) {
 			currentIndefiniteString << value;
@@ -122,23 +123,35 @@
 	}
 
 	void arrayStart(ssize_t size) {
-		xmlpp::Element* parent = current->get_parent();
-		if (parent) {
+		if (mode.back() == Mode::ROOT) {
+			current->set_attribute("value-type", "array");
+			itemName = "item";
+		} else if (mode.back() == Mode::ARRAY) {
+			current = current->add_child(nameCodec.encode(itemName));
+			itemName = "item";
+		} else if (mode.back() == Mode::MAP_VALUE) {
+			xmlpp::Element* parent = current->get_parent();
 			itemName = current->get_name();
 			parent->remove_child(current);
 			current = parent;
+			mode.pop_back();
 		} else {
-			itemName = "item";
+			// Mode::BYTE_STRING and Mode::CHAR_STRING – make no sense
+			// Mode::MAP_KEY – currently not supported
+			throw relpipe::writer::RelpipeWriterException(L"Unsupported mode in arrayStart(): " + std::to_wstring((int) mode.back()));
 		}
 
-		if (mode.back() == Mode::MAP_KEY) mode.pop_back();
+
 		mode.push_back(Mode::ARRAY);
 		remainingItems.push_back(size);
 		writeCurrentTag(current);
+
+		if (size == 0) containerEnd();
 	}
 
 	void mapStart(ssize_t size) {
 		if (mode.back() == Mode::ROOT) {
+			current->set_attribute("value-type", "map");
 		} else if (mode.back() == Mode::ARRAY) {
 			current = current->add_child(nameCodec.encode(itemName));
 			current->set_attribute("value-type", "map");
@@ -153,6 +166,8 @@
 		mode.push_back(Mode::MAP_KEY);
 		remainingItems.push_back(size);
 		writeCurrentTag(current);
+
+		if (size == 0) containerEnd();
 	}
 
 	void flushCurrentIndefiniteString(Glib::ustring cborType) {
@@ -164,7 +179,7 @@
 		Mode m = mode.back();
 		mode.pop_back();
 		remainingItems.pop_back();
-		
+
 		if (m == Mode::MAP_KEY || m == Mode::MAP_VALUE) current = parentOrSelf(current);
 		else if (m == Mode::BYTE_STRING) flushCurrentIndefiniteString("byte-string");
 		else if (m == Mode::CHAR_STRING) flushCurrentIndefiniteString("string");