//------------------------------------------------------------------------------------- MessageHandlers::MessageHandlers(): msgHandlers_(), msgID_(1), exposedMessages_() { g_fm = Mercury::FixedMessages::getSingletonPtr(); if(g_fm == NULL) g_fm = new Mercury::FixedMessages; Mercury::FixedMessages::getSingleton().loadConfig("server/fixed_mercury_messages.xml"); messageHandlers().push_back(this); }
//------------------------------------------------------------------------------------- std::string MessageHandlers::getDigestStr() { static KBE_MD5 md5; if(!md5.isFinal()) { std::map<uint16, std::pair< std::string, std::string> > errsDescrs; TiXmlNode *rootNode = NULL; XmlPlus* xml = new XmlPlus(Resmgr::getSingleton().matchRes("server/server_errors.xml").c_str()); if(!xml->isGood()) { ERROR_MSG(fmt::format("MessageHandlers::getDigestStr(): load {} is failed!\n", Resmgr::getSingleton().matchRes("server/server_errors.xml"))); SAFE_RELEASE(xml); return ""; } int32 isize = 0; rootNode = xml->getRootNode(); XML_FOR_BEGIN(rootNode) { TiXmlNode* node = xml->enterNode(rootNode->FirstChild(), "id"); TiXmlNode* node1 = xml->enterNode(rootNode->FirstChild(), "descr"); int32 val1 = xml->getValInt(node); md5.append((void*)&val1, sizeof(int32)); std::string val2 = xml->getKey(rootNode); md5.append((void*)val2.c_str(), val2.size()); std::string val3 = xml->getVal(node1); md5.append((void*)val3.c_str(), val3.size()); isize++; } XML_FOR_END(rootNode); SAFE_RELEASE(xml); md5.append((void*)&isize, sizeof(int32)); std::vector<MessageHandlers*>& msgHandlers = messageHandlers(); isize += msgHandlers.size(); md5.append((void*)&isize, sizeof(int32)); std::vector<MessageHandlers*>::const_iterator rootiter = msgHandlers.begin(); for(; rootiter != msgHandlers.end(); rootiter++) { isize += (*rootiter)->msgHandlers().size(); md5.append((void*)&isize, sizeof(int32)); MessageHandlerMap::const_iterator iter = (*rootiter)->msgHandlers().begin(); for(; iter != (*rootiter)->msgHandlers().end(); iter++) { MessageHandler* pMessageHandler = iter->second; md5.append((void*)pMessageHandler->name.c_str(), pMessageHandler->name.size()); md5.append((void*)&pMessageHandler->msgID, sizeof(MessageID)); md5.append((void*)&pMessageHandler->msgLen, sizeof(int32)); md5.append((void*)&pMessageHandler->exposed, sizeof(bool)); int32 argsize = pMessageHandler->pArgs->strArgsTypes.size(); md5.append((void*)&argsize, sizeof(int32)); int32 argsdataSize = pMessageHandler->pArgs->dataSize(); md5.append((void*)&argsdataSize, sizeof(int32)); int32 argstype = (int32)pMessageHandler->pArgs->type(); md5.append((void*)&argstype, sizeof(int32)); std::vector<std::string>::iterator saiter = pMessageHandler->pArgs->strArgsTypes.begin(); for(; saiter != pMessageHandler->pArgs->strArgsTypes.end(); saiter++) { md5.append((void*)(*saiter).c_str(), (*saiter).size()); } } } }