RobotInterface::ActionList RobotInterface::XMLReader::Private::readActionsTag(TiXmlElement *actionsElem) { const std::string &valueStr = actionsElem->ValueStr(); if (valueStr.compare("actions") != 0) { SYNTAX_ERROR(actionsElem->Row()) << "Expected \"actions\". Found" << valueStr; } std::string filename; if (actionsElem->QueryStringAttribute("file", &filename) == TIXML_SUCCESS) { // yDebug() << "Found actions file [" << filename << "]"; #ifdef WIN32 std::replace(filename.begin(), filename.end(), '/', '\\'); filename = path + "\\" + filename; #else // WIN32 filename = path + "/" + filename; #endif //WIN32 return readActionsFile(filename); } std::string robotName; if (actionsElem->QueryStringAttribute("robot", &robotName) != TIXML_SUCCESS) { SYNTAX_WARNING(actionsElem->Row()) << "\"actions\" element should contain the \"robot\" attribute"; } if (robotName != robot.name()) { SYNTAX_WARNING(actionsElem->Row()) << "Trying to import a file for the wrong robot. Found" << robotName << "instead of" << robot.name(); } unsigned int build; #if TINYXML_UNSIGNED_INT_BUG if (actionsElem->QueryUnsignedAttribute("build", &build()) != TIXML_SUCCESS) { // No build attribute. Assuming build="0" SYNTAX_WARNING(actionsElem->Row()) << "\"actions\" element should contain the \"build\" attribute [unsigned int]. Assuming 0"; } #else int tmp; if (actionsElem->QueryIntAttribute("build", &tmp) != TIXML_SUCCESS || tmp < 0) { // No build attribute. Assuming build="0" SYNTAX_WARNING(actionsElem->Row()) << "\"actions\" element should contain the \"build\" attribute [unsigned int]. Assuming 0"; tmp = 0; } build = (unsigned)tmp; #endif if (build != robot.build()) { SYNTAX_WARNING(actionsElem->Row()) << "Import a file for a different robot build. Found" << build << "instead of" << robot.build(); } ActionList actions; for (TiXmlElement* childElem = actionsElem->FirstChildElement(); childElem != 0; childElem = childElem->NextSiblingElement()) { ActionList childActions = readActions(childElem); for (ActionList::const_iterator it = childActions.begin(); it != childActions.end(); ++it) { actions.push_back(*it); } } return actions; }
RobotInterface::Robot& RobotInterface::XMLReader::Private::readRobotFile(const std::string &fileName) { filename = fileName; #ifdef WIN32 std::replace(filename.begin(), filename.end(), '/', '\\'); #endif curr_filename = fileName; #ifdef WIN32 path = filename.substr(0, filename.rfind("\\")); #else // WIN32 path = filename.substr(0, filename.rfind("/")); #endif //WIN32 yDebug() << "Reading file" << filename.c_str(); TiXmlDocument *doc = new TiXmlDocument(filename.c_str()); if (!doc->LoadFile()) { SYNTAX_ERROR(doc->ErrorRow()) << doc->ErrorDesc(); } if (!doc->RootElement()) { SYNTAX_ERROR(doc->Row()) << "No root element."; } for (TiXmlNode* childNode = doc->FirstChild(); childNode != 0; childNode = childNode->NextSibling()) { if (childNode->Type() == TiXmlNode::TINYXML_UNKNOWN) { if(dtd.parse(childNode->ToUnknown(), curr_filename)) { break; } } } if (!dtd.valid()) { SYNTAX_WARNING(doc->Row()) << "No DTD found. Assuming version robotInterfaceV1.0"; dtd.setDefault(); dtd.type = RobotInterfaceDTD::DocTypeRobot; } if(dtd.type != RobotInterfaceDTD::DocTypeRobot) { SYNTAX_WARNING(doc->Row()) << "Expected document of type" << DocTypeToString(RobotInterfaceDTD::DocTypeRobot) << ". Found" << DocTypeToString(dtd.type); } if(dtd.majorVersion != 1 || dtd.minorVersion != 0) { SYNTAX_WARNING(doc->Row()) << "Only robotInterface DTD version 1.0 is supported"; } readRobotTag(doc->RootElement()); delete doc; // yDebug() << robot; return robot; }
RobotInterface::ParamList RobotInterface::XMLReader::Private::readParamsTag(TiXmlElement *paramsElem) { const std::string &valueStr = paramsElem->ValueStr(); if (valueStr.compare("params") != 0) { SYNTAX_ERROR(paramsElem->Row()) << "Expected \"params\". Found" << valueStr; } std::string filename; if (paramsElem->QueryStringAttribute("file", &filename) == TIXML_SUCCESS) { // yDebug() << "Found params file [" << filename << "]"; filename=rf.findFileByName(filename); return readParamsFile(filename); } std::string robotName; if (paramsElem->QueryStringAttribute("robot", &robotName) != TIXML_SUCCESS) { SYNTAX_WARNING(paramsElem->Row()) << "\"params\" element should contain the \"robot\" attribute"; } if (robotName != robot.name()) { SYNTAX_WARNING(paramsElem->Row()) << "Trying to import a file for the wrong robot. Found" << robotName << "instead of" << robot.name(); } unsigned int build; #if TINYXML_UNSIGNED_INT_BUG if (paramsElem->QueryUnsignedAttribute("build", &build()) != TIXML_SUCCESS) { // No build attribute. Assuming build="0" SYNTAX_WARNING(paramsElem->Row()) << "\"params\" element should contain the \"build\" attribute [unsigned int]. Assuming 0"; } #else int tmp; if (paramsElem->QueryIntAttribute("build", &tmp) != TIXML_SUCCESS || tmp < 0) { // No build attribute. Assuming build="0" SYNTAX_WARNING(paramsElem->Row()) << "\"params\" element should contain the \"build\" attribute [unsigned int]. Assuming 0"; tmp = 0; } build = (unsigned)tmp; #endif if (build != robot.build()) { SYNTAX_WARNING(paramsElem->Row()) << "Import a file for a different robot build. Found" << build << "instead of" << robot.build(); } ParamList params; for (TiXmlElement* childElem = paramsElem->FirstChildElement(); childElem != 0; childElem = childElem->NextSiblingElement()) { ParamList childParams = readParams(childElem); for (ParamList::const_iterator it = childParams.begin(); it != childParams.end(); ++it) { params.push_back(*it); } } return params; }
RobotInterface::Robot& RobotInterface::XMLReader::Private::readRobotTag(TiXmlElement *robotElem) { if (robotElem->ValueStr().compare("robot") != 0) { SYNTAX_ERROR(robotElem->Row()) << "Root element should be \"robot\". Found" << robotElem->ValueStr(); } if (robotElem->QueryStringAttribute("name", &robot.name()) != TIXML_SUCCESS) { SYNTAX_ERROR(robotElem->Row()) << "\"robot\" element should contain the \"name\" attribute"; } #if TINYXML_UNSIGNED_INT_BUG if (robotElem->QueryUnsignedAttribute("build", &robot.build()) != TIXML_SUCCESS) { // No build attribute. Assuming build="0" SYNTAX_WARNING(robotElem->Row()) << "\"robot\" element should contain the \"build\" attribute [unsigned int]. Assuming 0"; } #else int tmp; if (robotElem->QueryIntAttribute("build", &tmp) != TIXML_SUCCESS || tmp < 0) { // No build attribute. Assuming build="0" SYNTAX_WARNING(robotElem->Row()) << "\"robot\" element should contain the \"build\" attribute [unsigned int]. Assuming 0"; tmp = 0; } robot.build() = (unsigned)tmp; #endif if (robotElem->QueryStringAttribute("portprefix", &robot.portprefix()) != TIXML_SUCCESS) { SYNTAX_WARNING(robotElem->Row()) << "\"robot\" element should contain the \"portprefix\" attribute. Using \"name\" attribute"; robot.portprefix() = robot.name(); } // yDebug() << "Found robot [" << robot.name() << "] build [" << robot.build() << "] portprefix [" << robot.portprefix() << "]"; for (TiXmlElement* childElem = robotElem->FirstChildElement(); childElem != 0; childElem = childElem->NextSiblingElement()) { if (childElem->ValueStr().compare("device") == 0 || childElem->ValueStr().compare("devices") == 0) { DeviceList childDevices = readDevices(childElem); for (DeviceList::const_iterator it = childDevices.begin(); it != childDevices.end(); ++it) { robot.devices().push_back(*it); } } else { ParamList childParams = readParams(childElem); for (ParamList::const_iterator it = childParams.begin(); it != childParams.end(); ++it) { robot.params().push_back(*it); } } } return robot; }
RobotInterface::ActionList RobotInterface::XMLReader::Private::readActionsFile(const std::string &fileName) { std::string old_filename = curr_filename; curr_filename = fileName; yDebug() << "Reading file" << fileName.c_str(); TiXmlDocument *doc = new TiXmlDocument(fileName.c_str()); if (!doc->LoadFile()) { SYNTAX_ERROR(doc->ErrorRow()) << doc->ErrorDesc(); } if (!doc->RootElement()) { SYNTAX_ERROR(doc->Row()) << "No root element."; } RobotInterfaceDTD actionsFileDTD; for (TiXmlNode* childNode = doc->FirstChild(); childNode != 0; childNode = childNode->NextSibling()) { if (childNode->Type() == TiXmlNode::TINYXML_UNKNOWN) { if(actionsFileDTD.parse(childNode->ToUnknown(), curr_filename)) { break; } } } if (!actionsFileDTD.valid()) { SYNTAX_WARNING(doc->Row()) << "No DTD found. Assuming version robotInterfaceV1.0"; actionsFileDTD.setDefault(); actionsFileDTD.type = RobotInterfaceDTD::DocTypeActions; } if (actionsFileDTD.type != RobotInterfaceDTD::DocTypeActions) { SYNTAX_ERROR(doc->Row()) << "Expected document of type" << DocTypeToString(RobotInterfaceDTD::DocTypeActions) << ". Found" << DocTypeToString(actionsFileDTD.type); } if (actionsFileDTD.majorVersion != dtd.majorVersion) { SYNTAX_ERROR(doc->Row()) << "Trying to import a file with a different robotInterface DTD version"; } RobotInterface::ActionList actions = readActionsTag(doc->RootElement()); delete doc; curr_filename = old_filename; return actions; }