X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=RIC-E2-TERMINATION%2FBuildXml.h;fp=RIC-E2-TERMINATION%2FBuildXml.h;h=457ef8bee1728119b9468c4bad421d3253bd0f73;hb=0793fcb4958c1d079509b49bf9a882e8cbe1ae95;hp=7853172e8596ab0b66c01fde1c79f733638a0faf;hpb=ab0e0f434145360f985b1d76ede90ad629c6cd4d;p=ric-plt%2Fe2.git diff --git a/RIC-E2-TERMINATION/BuildXml.h b/RIC-E2-TERMINATION/BuildXml.h index 7853172..457ef8b 100644 --- a/RIC-E2-TERMINATION/BuildXml.h +++ b/RIC-E2-TERMINATION/BuildXml.h @@ -28,21 +28,65 @@ #include #include - using namespace std; -void buildXmlData(vector &repValues, unsigned char *buffer) { +/* + * Copied from pugixml samples + */ +struct xml_string_writer : pugi::xml_writer { + std::string result; + + virtual void write(const void *data, size_t size) { + result.append(static_cast(data), size); + } +}; +// end::code[] + +struct xml_memory_writer : pugi::xml_writer { + char *buffer; + size_t capacity; + size_t result; + + xml_memory_writer() : buffer(0), capacity(0), result(0) { + } + + xml_memory_writer(char *buffer, size_t capacity) : buffer(buffer), capacity(capacity), result(0) { + } + + size_t written_size() const { + return result < capacity ? result : capacity; + } + + virtual void write(const void *data, size_t size) { + if (result < capacity) { + size_t chunk = (capacity - result < size) ? capacity - result : size; + + memcpy(buffer + result, data, chunk); + } + result += size; + } +}; + +std::string node_to_string(pugi::xml_node node) { + xml_string_writer writer; + node.print(writer); + + return writer.result; +} + + +void buildXmlData(const string &messageName, const string &ieName, vector &repValues, unsigned char *buffer) { pugi::xml_document doc; - pugi::xml_parse_result result = doc.load_string((const char *) buffer); + pugi::xml_parse_result result = doc.load_string((const char *)buffer); if (result) { unsigned int index = 0; for (auto tool : doc.child("E2AP-PDU") .child("initiatingMessage") .child("value") - .child("E2setupRequest") + .child(messageName.c_str()) .child("protocolIEs") - .children("E2setupRequestIEs")) { + .children(ieName.c_str())) { for (auto n : tool.child("value").child("RANfunctions-List").child( "ProtocolIE-SingleContainer").children()) { //ProtocolIE-SingleContainer @@ -73,14 +117,17 @@ void buildXmlData(vector &repValues, unsigned char *buffer) { } } - streambuf *oldCout = cout.rdbuf(); - ostringstream memCout; -// create new cout - cout.rdbuf(memCout.rdbuf()); - doc.save(std::cout); -//return to the normal cout - cout.rdbuf(oldCout); - memcpy(buffer, memCout.str().c_str(), memCout.str().length()); + auto res = node_to_string(doc); + memcpy(buffer, res.c_str(), res.length()); + +// streambuf *oldCout = cout.rdbuf(); +// ostringstream memCout; +//// create new cout +// cout.rdbuf(memCout.rdbuf()); +// doc.save(std::cout); +////return to the normal cout +// cout.rdbuf(oldCout); +// memcpy(buffer, memCout.str().c_str(), memCout.str().length()); } }