# HG changeset patch # User František Kučera # Date 1623184451 -7200 # Node ID 503b77beed578f64b2d32b76a147707d811bb8d6 # Parent 77d585a1b98ce5a5232bf6d2d231fa2be513bc49 improved arrays and maps diff -r 77d585a1b98c -r 503b77beed57 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");