bool Raids::loadFromXml() { if (isLoaded()) { return true; } pugi::xml_document doc; pugi::xml_parse_result result = doc.load_file("data/raids/raids.xml"); if (!result) { std::cout << "[Error - Raids::loadFromXml] Failed to load data/raids/raids.xml: " << result.description() << std::endl; return false; } for (pugi::xml_node raidNode = doc.child("raids").first_child(); raidNode; raidNode = raidNode.next_sibling()) { std::string name, file; uint32_t interval, margin; pugi::xml_attribute attr; if ((attr = raidNode.attribute("name"))) { name = attr.as_string(); } else { std::cout << "[Error - Raids::loadFromXml] Name tag missing for raid" << std::endl; continue; } if ((attr = raidNode.attribute("file"))) { file = attr.as_string(); } else { std::ostringstream ss; ss << "raids/" << name << ".xml"; file = ss.str(); std::cout << "[Warning - Raids::loadFromXml] File tag missing for raid " << name << ". Using default: " << file << std::endl; } interval = pugi::cast<uint32_t>(raidNode.attribute("interval2").value()) * 60; if (interval == 0) { std::cout << "[Error - Raids::loadFromXml] interval2 tag missing or zero (would divide by 0) for raid: " << name << std::endl; continue; } if ((attr = raidNode.attribute("margin"))) { margin = pugi::cast<uint32_t>(attr.value()) * 60 * 1000; } else { std::cout << "[Warning - Raids::loadFromXml] margin tag missing for raid: " << name << std::endl; margin = 0; } Raid* newRaid = new Raid(name, interval, margin); if (newRaid->loadFromXml("data/raids/" + file)) { raidList.push_back(newRaid); } else { std::cout << "[Error - Raids::loadFromXml] Failed to load raid: " << name << std::endl; delete newRaid; } } loaded = true; return true; }
bool Raids::loadFromXml() { if(isLoaded()) return true; xmlDocPtr doc = xmlParseFile("data/raids/raids.xml"); if(doc) { xmlNodePtr root, raidNode; root = xmlDocGetRootElement(doc); if(xmlStrcmp(root->name,(const xmlChar*)"raids") != 0) { std::cout << "[Error] Raids: Wrong root node." << std::endl; xmlFreeDoc(doc); return false; } int intValue; std::string strValue; raidNode = root->children; while(raidNode) { if(xmlStrcmp(raidNode->name, (const xmlChar*)"raid") == 0) { std::string name, file; uint32_t interval, margin; if(readXMLString(raidNode, "name", strValue)) name = strValue; else { std::cout << "[Error] Raids: name tag missing for raid." << std::endl; raidNode = raidNode->next; continue; } if(readXMLString(raidNode, "file", strValue)) file = strValue; else { std::ostringstream ss; ss << "raids/" << name << ".xml"; file = ss.str(); std::cout << "[Warning] Raids: file tag missing for raid " << name << ". Using default: " << file << std::endl; } //interval2 is the average interval between // 2 executions of the raid in minutes if(readXMLInteger(raidNode, "interval2", intValue) && intValue > 0) interval = intValue * 60; else { std::cout << "[Error] Raids: interval2 tag missing or divided by 0 for raid " << name << std::endl; raidNode = raidNode->next; continue; } if(readXMLInteger(raidNode, "margin", intValue)) margin = intValue * 60 * 1000; else { std::cout << "[Warning] Raids: margin tag missing for raid " << name << std::endl; margin = 0; } Raid* newRaid = new Raid(name, interval, margin); if(!newRaid) { xmlFreeDoc(doc); return false; } bool ret = newRaid->loadFromXml("data/raids/" + file); if(!ret) { std::cout << "[Error] Raids: failed to load raid " << name << std::endl; delete newRaid; } else raidList.push_back(newRaid); } raidNode = raidNode->next; } xmlFreeDoc(doc); } else { std::cout << "[Error] Raids: Could not load data/raids/raids.xml" << std::endl; return false; } loaded = true; return true; }
bool Raids::parseRaidNode(xmlNodePtr raidNode, bool checkDuplicate, FileType_t pathing) { if(xmlStrcmp(raidNode->name, (const xmlChar*)"raid")) return false; int32_t intValue; std::string strValue; if(!readXMLString(raidNode, "name", strValue)) { std::clog << "[Error - Raids::parseRaidNode] name tag missing for raid." << std::endl; return false; } std::string name = strValue; if(!readXMLInteger(raidNode, "interval2", intValue) || intValue <= 0) { std::clog << "[Error - Raids::parseRaidNode] interval2 tag missing or divided by 0 for raid " << name << std::endl; return false; } uint32_t interval = intValue * 60; std::string file; if(!readXMLString(raidNode, "file", strValue)) { file = name + ".xml"; std::clog << "[Warning - Raids::parseRaidNode] file tag missing for raid " << name << ", using default: " << file << std::endl; } else file = strValue; file = getFilePath(pathing, "raids/" + file); uint64_t margin = 0; if(!readXMLInteger(raidNode, "margin", intValue)) std::clog << "[Warning - Raids::parseRaidNode] margin tag missing for raid " << name << ", using default: " << margin << std::endl; else margin = intValue * 60 * 1000; RefType_t refType = REF_NONE; if(readXMLString(raidNode, "reftype", strValue) || readXMLString(raidNode, "refType", strValue)) { std::string tmpStrValue = asLowerCaseString(strValue); if(tmpStrValue == "single") refType = REF_SINGLE; else if(tmpStrValue == "block") refType = REF_BLOCK; else if(tmpStrValue != "none") std::clog << "[Warning - Raids::parseRaidNode] Unknown reftype \"" << strValue << "\" for raid " << name << std::endl; } bool ref = false; if(readXMLString(raidNode, "ref", strValue)) ref = booleanString(strValue); bool enabled = true; if(readXMLString(raidNode, "enabled", strValue)) enabled = booleanString(strValue); Raid* raid = new Raid(name, interval, margin, refType, ref, enabled); if(!raid || !raid->loadFromXml(file)) { delete raid; std::clog << "[Fatal - Raids::parseRaidNode] failed to load raid " << name << std::endl; return false; } if(checkDuplicate) { for(RaidList::iterator it = raidList.begin(); it != raidList.end(); ++it) { if((*it)->getName() == name) delete *it; } } raidList.push_back(raid); return true; }
bool Raids::loadFromXml(const std::string& _filename) { if(isLoaded()){ return true; } filename = _filename; xmlDocPtr doc = xmlParseFile(filename.c_str()); if(doc){ xmlNodePtr root, raidNode; root = xmlDocGetRootElement(doc); if(xmlStrcmp(root->name,(const xmlChar*)"raids") != 0){ std::cout << "[Error] Raids: Wrong root node." << std::endl; xmlFreeDoc(doc); return false; } int intValue; std::string strValue; raidNode = root->children; while(raidNode){ if(xmlStrcmp(raidNode->name, (const xmlChar*)"raid") == 0){ std::string name, file; uint32_t interval, margin; if(readXMLString(raidNode, "name", strValue)){ name = strValue; } else{ std::cout << "[Error] Raids: name tag missing for raid." << std::endl; raidNode = raidNode->next; continue; } if(readXMLString(raidNode, "file", strValue)){ file = strValue; } else{ std::stringstream ss; ss << "raids/" << name << ".xml"; file = ss.str(); std::cout << "[Warning] Raids: file tag missing for raid " << name << ". Using default: " << file << std::endl; } //interval2 is the average interval between // 2 executions of the raid in minutes if(readXMLInteger(raidNode, "interval2", intValue)){ interval = intValue * 60; //transform to seconds } else{ std::cout << "[Error] Raids: interval2 tag missing for raid " << name << std::endl; raidNode = raidNode->next; continue; } if(readXMLInteger(raidNode, "margin", intValue)){ margin = intValue * 60 * 1000; //transform to milliseconds } else{ std::cout << "[Warning] Raids: margin tag missing for raid " << name << std::endl; margin = 0; } Raid* newRaid = new Raid(name, interval, margin); if(!newRaid){ xmlFreeDoc(doc); return false; } bool ret = newRaid->loadFromXml(g_config.getString(ConfigManager::DATA_DIRECTORY) + "raids/" + file); if(!ret){ std::cout << "[Error] Raids: failed to load raid " << name << std::endl; delete newRaid; } else{ raidList.push_back(newRaid); } } raidNode = raidNode->next; } xmlFreeDoc(doc); } else{ std::cout << "[Error] Raids: Could not load " << filename << std::endl; return false; } loaded = true; return true; }