X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=RIC-E2-TERMINATION%2FBuildXml.h;h=e71fa4dc21c718c2b17236c889607894b18a7674;hb=6cf28617aec735a578731b2a7e0d184223f18cda;hp=7853172e8596ab0b66c01fde1c79f733638a0faf;hpb=c5a1520037d77e6ba66662de967c6f7a34f7b530;p=ric-plt%2Fe2.git diff --git a/RIC-E2-TERMINATION/BuildXml.h b/RIC-E2-TERMINATION/BuildXml.h index 7853172..e71fa4d 100644 --- a/RIC-E2-TERMINATION/BuildXml.h +++ b/RIC-E2-TERMINATION/BuildXml.h @@ -21,67 +21,117 @@ #ifndef E2_BUILDXML_H #define E2_BUILDXML_H + #include #include #include #include "pugixml/src/pugixml.hpp" -#include +#include #include - +#include +#include using namespace std; -void buildXmlData(vector &repValues, unsigned char *buffer) { - pugi::xml_document doc; +/* + * Copied from pugixml samples + */ +struct xml_string_writer : pugi::xml_writer { + std::string result; + + void write(const void *data, size_t size) override { + result.append(static_cast(data), size); + } +}; + +std::string node_to_string(pugi::xml_node node) { + xml_string_writer writer; + node.print(writer); + + return writer.result; +} + +string buildXmlData(const string &messageName, + const string &ieName, + vector &RANfunctionsAdded, + vector &RANfunctionsModified, + unsigned char *buffer, + size_t size) { + pugi::xml_document *doc = new pugi::xml_document(); + + char RANfunctionsAddedID[8]; + snprintf(RANfunctionsAddedID, 8, "%d", (int) ProtocolIE_ID_id_RANfunctionsAdded); + char RANfunctionsModifiedID[8]; + snprintf(RANfunctionsModifiedID, 8, "%d", (int) ProtocolIE_ID_id_RANfunctionsModified); + char GlobalE2nodeID[8]; + snprintf(GlobalE2nodeID, 8, "%d", (int) ProtocolIE_ID_id_GlobalE2node_ID); - pugi::xml_parse_result result = doc.load_string((const char *) buffer); + pugi::xml_parse_result result = doc->load_buffer((const char *) buffer, size); if (result) { - unsigned int index = 0; - for (auto tool : doc.child("E2AP-PDU") + for (auto tool : doc->child("E2AP-PDU") .child("initiatingMessage") .child("value") - .child("E2setupRequest") + .child(messageName.c_str()) .child("protocolIEs") - .children("E2setupRequestIEs")) { - for (auto n : tool.child("value").child("RANfunctions-List").child( - "ProtocolIE-SingleContainer").children()) { -//ProtocolIE-SingleContainer -//cout << "\t1 " << n.name() << endl; - if (strcmp(n.name(), "value") == 0) { - for (auto l : tool.child("value").children()) { -//cout << "\t\t2 " << l.name() << endl; - for (auto f : l.children()) { -//cout << "\t\t\t3 " << f.name() << endl; - for (auto g : f.child("value").children()) { -//cout << "\t\t\t\t4 " << g.name() << endl; - for (auto a : g.children()) { - if (strcmp(a.name(), "ranFunctionDefinition") == 0) { - if (repValues.size() > index) { - a.remove_children(); - string val = repValues.at(index++); -// here we get vector with counter - a.append_child(pugi::node_pcdata).set_value(val.c_str()); - - } - } -//cout << "\t\t\t\t\t5 " << a.name() << " " << a.child_value() << endl; - } - } - } + .children(ieName.c_str())) { + // there can be many ieName entries in the messageName so we need only the ones that containes E2SM continers + auto node = tool.child("id"); // get the id to identify the type of the contained message + if (node.empty()) { + mdclog_write(MDCLOG_ERR, "Failed to find ID node in the XML. File %s, line %d", + __FILE__, __LINE__); + continue; + } + if (strcmp(node.name(), "id") == 0 && strcmp(node.child_value(), RANfunctionsAddedID) == 0) { + auto nodea = tool.child("value"). + child("RANfunctions-List"). + children("ProtocolIE-SingleContainer"); + unsigned int index = 0; + for (auto n1 : nodea) { + auto n2 = n1.child("value").child("RANfunction-Item").child("ranFunctionDefinition"); + n2.remove_children(); + string val = RANfunctionsAdded.at(index++); + // here we get vector with counter + n2.append_child(pugi::node_pcdata).set_value(val.c_str()); + if (mdclog_level_get() >= MDCLOG_DEBUG) { + mdclog_write(MDCLOG_DEBUG, "entry %s Replaced with : %s", n2.name(), n2.child_value()); } } + } else if (strcmp(node.name(), "id") == 0 && strcmp(node.child_value(), RANfunctionsModifiedID) == 0) { + auto nodea = tool.child("value"). + child("RANfunctions-List"). + children("ProtocolIE-SingleContainer"); + unsigned int index = 0; + for (auto n1 : nodea) { + auto n2 = n1.child("value").child("RANfunction-Item").child("ranFunctionDefinition"); + n2.remove_children(); + string val = RANfunctionsModified.at(index++); + // here we get vector with counter + n2.append_child(pugi::node_pcdata).set_value(val.c_str()); + if (mdclog_level_get() >= MDCLOG_DEBUG) { + mdclog_write(MDCLOG_DEBUG, "entry %s Replaced with : %s", n2.name(), n2.child_value()); + } + } + } else if (strcmp(node.name(), "id") == 0 && strcmp(node.child_value(), GlobalE2nodeID) == 0) { + continue; + } else { + if (mdclog_level_get() >= MDCLOG_DEBUG) { + mdclog_write(MDCLOG_DEBUG, "Entry name :%s with entry of %s skipped", node.name(), node.child_value()); + } + continue; } } - - 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()); + } else { + mdclog_write(MDCLOG_ERR, + "Error loading xml string"); + delete doc; + return string(""); } + auto res = node_to_string(*doc); + res.erase(std::remove(res.begin(), res.end(), '\n'), res.end()); + res.erase(std::remove(res.begin(), res.end(), '\t'), res.end()); + delete doc; + return res; + } #endif //E2_BUILDXML_H