//------------------------------------------------------------------------------------- PyObject* FixedDictDescription::onSetValue(PyObject* parentObj, PyObject* value) { if(static_cast<FixedDictType*>(dataType_)->isSameType(value)) { FixedDictType* dataType = static_cast<FixedDictType*>(this->getDataType()); return PropertyDescription::onSetValue(parentObj, dataType->createNewFromObj(value)); } return NULL; }
//------------------------------------------------------------------------------------- bool DataTypes::loadTypes(std::string& file) { TiXmlNode* node = NULL; SmartPointer<XML> xml(new XML(Resmgr::getSingleton().matchRes(file).c_str())); if(xml == NULL || !xml->isGood()) return false; node = xml->getRootNode(); if(node == NULL) { // root节点下没有子节点了 return true; } XML_FOR_BEGIN(node) { std::string type = ""; std::string aliasName = xml->getKey(node); TiXmlNode* childNode = node->FirstChild(); // 不允许前面加_, 因为内部产生的一些临时结构前面使用了_, 避免误判 if (aliasName[0] == '_') { ERROR_MSG(fmt::format("DataTypes::loadTypes: Not allowed to use the prefix \"_\"! aliasName={}\n", aliasName.c_str())); return false; } if(childNode != NULL) { type = xml->getValStr(childNode); if(type == "FIXED_DICT") { FixedDictType* fixedDict = new FixedDictType; if(fixedDict->initialize(xml.get(), childNode, aliasName)) { addDataType(aliasName, fixedDict); } else { ERROR_MSG(fmt::format("DataTypes::loadTypes: parse FIXED_DICT [{}] error!\n", aliasName.c_str())); delete fixedDict; return false; } } else if(type == "ARRAY") { FixedArrayType* fixedArray = new FixedArrayType; if(fixedArray->initialize(xml.get(), childNode, aliasName)) { addDataType(aliasName, fixedArray); } else { ERROR_MSG(fmt::format("DataTypes::loadTypes: parse ARRAY [{}] error!\n", aliasName.c_str())); delete fixedArray; return false; } } else { DataType* dataType = getDataType(type); if(dataType == NULL) { ERROR_MSG(fmt::format("DataTypes::loadTypes: can't fount type {} by alias[{}].\n", type.c_str(), aliasName.c_str())); return false; } addDataType(aliasName, dataType); } } } XML_FOR_END(node); return true; }
//------------------------------------------------------------------------------------- bool DataTypes::loadAlias(std::string& file) { TiXmlNode* node = NULL; XmlPlus* xml = new XmlPlus(Resmgr::getSingleton().matchRes(file).c_str()); if(xml == NULL || !xml->isGood()) return false; node = xml->getRootNode(); if(node == NULL) { ERROR_MSG("DataTypes::loadAlias: not found node<root->firstChildNode> !\n"); return false; } XML_FOR_BEGIN(node) { std::string type = ""; std::string aliasName = xml->getKey(node); TiXmlNode* childNode = node->FirstChild(); if(childNode != NULL) { type = xml->getValStr(childNode); if(type == "FIXED_DICT") { FixedDictType* fixedDict = new FixedDictType; if(fixedDict->initialize(xml, childNode)) { addDateType(aliasName, fixedDict); } else { ERROR_MSG(boost::format("DataTypes::loadAlias:parse FIXED_DICT [%1%] is error!\n") % aliasName.c_str()); delete fixedDict; return false; } } else if(type == "ARRAY") { FixedArrayType* fixedArray = new FixedArrayType; if(fixedArray->initialize(xml, childNode)) { addDateType(aliasName, fixedArray); } else { ERROR_MSG(boost::format("DataTypes::loadAlias:parse ARRAY [%1%] is error!\n") % aliasName.c_str()); delete fixedArray; return false; } } else { DataType* dataType = getDataType(type); if(dataType == NULL) { ERROR_MSG(boost::format("DataTypes::loadAlias:can't fount type %1% by alias[%2%].\n") % type.c_str() % aliasName.c_str()); return false; } addDateType(aliasName, dataType); } } } XML_FOR_END(node); delete xml; return true; }