Advertisement
thefoof

Untitled

Apr 11th, 2020
721
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. void XmlStructDumper::ElementToXml(PacketElement* e, xml_document<>& doc, xml_node<>& parent, std::deque<std::string>& dependencies) {
  2.     if (e->bHidden) {
  3.         return;
  4.     }
  5.  
  6.     xml_node<>* dataNode = doc.allocate_node(node_element, "Data");
  7.     if (auto pe = dynamic_cast<PacketPackedData*>(e)) {
  8.         dataNode->append_attribute(doc.allocate_attribute("Type", "PackedData"));
  9.         if (pe->bOversizedByte) {
  10.             dataNode->append_attribute(doc.allocate_attribute("SizeType", "int16"));
  11.             dataNode->append_attribute(doc.allocate_attribute("OversizedValue", "255"));
  12.         }
  13.         else {
  14.             const char* packedSizeType = "int32";
  15.             if (pe->nSizeBytes == 2) {
  16.                 packedSizeType = "int16";
  17.             }
  18.             else if (pe->nSizeBytes == 1) {
  19.                 packedSizeType = "int8";
  20.             }
  21.             else if (pe->nSizeBytes == 8) {
  22.                 packedSizeType = "int64";
  23.             }
  24.             dataNode->append_attribute(doc.allocate_attribute("SizeType", packedSizeType));
  25.         }
  26.         for (auto& itr : static_cast<PacketSubstruct*>(e)->elements) {
  27.             ElementToXml(itr, doc, *dataNode, dependencies);
  28.         }
  29.     }
  30.     else if (auto pa = dynamic_cast<PacketArrayBase*>(e)) {
  31.         dataNode->append_attribute(doc.allocate_attribute("Type", "Array"));
  32.         dataNode->append_attribute(doc.allocate_attribute("ArraySizeVariable", pa->arraySizeName));
  33.         std::unique_ptr<PacketSubstruct> arrayType = pa->GetArraySubstruct();
  34.         //This default array data name is only used if this is not an inline packet struct
  35.         std::string defaultArrayDataName = std::string(e->name) + "_data";
  36.         arrayType->SetName(defaultArrayDataName.c_str());
  37.         ElementToXml(arrayType.get(), doc, *dataNode, dependencies);
  38.     }
  39.     else if (auto ps = dynamic_cast<PacketSubstruct*>(e)) {
  40.         if (ps->bInline) {
  41.             for (auto& e : ps->elements) {
  42.                 ElementToXml(e, doc, *dataNode, dependencies);
  43.             }
  44.         }
  45.         else {
  46.             std::string psName = SubstructManager::GetGlobal()->GetSubstructName(typeid(*ps));
  47.             dataNode->append_attribute(doc.allocate_attribute("Substruct", psName.c_str()));
  48.             dataNode->append_attribute(doc.allocate_attribute("Size", std::to_string(e->count).c_str()));
  49.  
  50.             //Push this to the front of the list of dependent substructs
  51.             auto itr = std::find(dependencies.begin(), dependencies.end(), psName);
  52.             if (itr != dependencies.end()) {
  53.                 dependencies.erase(itr);
  54.             }
  55.             dependencies.push_front(psName);
  56.         }
  57.     }
  58.     else {
  59.         dataNode->append_attribute(doc.allocate_attribute("ElementName", e->name));
  60.         dataNode->append_attribute(doc.allocate_attribute("Type", GetElementType(e)));
  61.         dataNode->append_attribute(doc.allocate_attribute("Size", std::to_string(e->count).c_str()));
  62.         if (auto oe = dynamic_cast<PacketOversizedByte*>(e)) {
  63.             dataNode->append_attribute(doc.allocate_attribute("OversizedValue", oe->bSigned ? "127" : "255"));
  64.         }
  65.     }
  66.     parent.append_node(dataNode);
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement