--- 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");