XMLNodeColl XMLElementNode::QueryChildren(const char* path) { KXmlString tagName; int beg = 0; int nameLen; int len = (int)strlen(path); XMLElementNode* pRoot = this; XMLElementNode* pElem = pRoot; while(beg < len) { const char* pSep = strchr(path+beg, '/'); if(pSep) { nameLen = int(pSep - path) - beg; tagName.assign(path+beg, nameLen); pElem = pElem->GetChild(tagName.c_str()); if(!pElem) return XMLNodeColl(); } else { nameLen = len - beg; tagName.assign(path+beg, nameLen); return pElem->GetChildren(tagName.c_str()); } beg += nameLen + 1; } return XMLNodeColl(); }
XMLElementNode* BoundingBox::createSVGRect () const { XMLElementNode *rect = new XMLElementNode("rect"); rect->addAttribute("x", minX()); rect->addAttribute("y", minY()); rect->addAttribute("width", width()); rect->addAttribute("height", height()); rect->addAttribute("fill", "none"); return rect; }
BOOL XMLDomParser::OnCharacterData(const XML_Char *s, int len) { XMLElementNode* pParent = m_stack.top(); XMLTextNode* p = pParent->GetTextChild(); if(!p) { // 严格遵循XML语法,不再Trim,否则会有bug by Allen 20131012 // s = this->Trim(s, len, len); // if(!len) return TRUE; p = new XMLTextNode(); pParent->AddChild(p); } p->AddText(s, len); return TRUE; }
BOOL KServerSetting::InitializeDatabaseSettings( const char* xmlCfgFile ) { XMLElementNode m_xmlSetting; XMLDomParser parser; parser.Initialize("GB2312"); KInputFileStream fi; if(!fi.Open(xmlCfgFile)) { return FALSE; } if(!parser.Parse(fi, m_xmlSetting)) { Log(LOG_FATAL, "Error %s" , parser.GetErrorMsg()); return FALSE; } XMLNodeColl coll; coll = m_xmlSetting.QueryChildren("DatabaseSettings/Database"); for(int i=0; i < coll.Size(); i++) { XMLElementNode* pXml = (XMLElementNode*)coll.GetNode(i); int type = (int)pXml->QueryAtt("Type")->Integer(); m_DBSettings[type].Addr = pXml->QueryAtt("IP")->c_str(); m_DBSettings[type].Port = pXml->QueryAtt("Port")->Integer(); m_DBSettings[type].DBName = pXml->QueryAtt("DBName")->c_str(); m_DBSettings[type].DBUser = pXml->QueryAtt("DBUser")->c_str(); m_DBSettings[type].DBPassword = pXml->QueryAtt("DBPassword")->c_str(); m_DBSettings[type].CharSet = pXml->QueryAtt("DBChatSet")->c_str(); } return TRUE; }
BOOL XMLDomParser::OnStartElement(const XML_Char *name, const XML_Char **atts) { XMLElementNode* pParent = m_stack.top(); XMLElementNode* pElemNode = new XMLElementNode(); pElemNode->SetTagName(name); int i = 0; while(atts[i]) { const char* n = atts[i]; const char* val = atts[i+1]; pElemNode->AddAttribute(n, val); i += 2; } pParent->AddChild(pElemNode); m_stack.push(pElemNode); return TRUE; }
const StringValue* XMLElementNode::QueryAtt(const char* path) { const char* pDot = strchr(path, '.'); if(!pDot) { const XMLAttribute* pAtt = this->GetAttribute(path); if(!pAtt) return NULL; return &pAtt->m_value; } else { int len = int(pDot - path); KXmlString strpath(path, len); XMLElementNode* pElem = this->Query(strpath.c_str()); if(!pElem) return NULL; const XMLAttribute* pAtt = pElem->GetAttribute(pDot+1); if(!pAtt) return NULL; return &pAtt->m_value; } return NULL; }
BOOL XMLDomParser::OnEndElement(const XML_Char *name) { // 清除空的TextNode by Allen, 20131012 XMLElementNode* p = m_stack.top(); XMLTextNode* pText = p->GetTextChild(); if (pText) { int len; KXmlString& text = pText->m_text.m_val; this->Trim(text.c_str(), (int)text.size(), len); if (!len) { p->RemoveTextChild(); } else { text.resize(len); } } m_stack.pop(); return TRUE; }
void DvisvgmSpecialHandler::processImg (InputReader &ir, SpecialActions *actions) { if (actions) { const double pt2bp = 72/72.27; double w = ir.getDouble()*pt2bp; double h = ir.getDouble()*pt2bp; string f = ir.getString(); update_bbox(w, h, 0, actions); XMLElementNode *img = new XMLElementNode("image"); img->addAttribute("x", actions->getX()); img->addAttribute("y", actions->getY()); img->addAttribute("width", w); img->addAttribute("height", h); img->addAttribute("xlink:href", f); if (!actions->getMatrix().isIdentity()) img->addAttribute("transform", actions->getMatrix().getSVG()); actions->appendToPage(img); } }
BOOL KServerSetting::InitializeServerSettings( const char* xmlCfgFile ) { XMLElementNode m_xmlSetting; XMLDomParser parser; parser.Initialize("GB2312"); KInputFileStream fi; if(!fi.Open(xmlCfgFile)) { return FALSE; } if(!parser.Parse(fi, m_xmlSetting)) { Log(LOG_FATAL, "Error %s" , parser.GetErrorMsg()); return FALSE; } XMLNodeColl coll; coll = m_xmlSetting.QueryChildren("ServerSettings/Server"); for(int i=0; i < coll.Size(); i++) { XMLElementNode* pXml = (XMLElementNode*)coll.GetNode(i); int type = (int)pXml->QueryAtt("Type")->Integer(); m_ServerSettings[type].ID = pXml->QueryAtt("ID")->Integer(); m_ServerSettings[type].Name = pXml->QueryAtt("Name")->c_str(); m_ServerSettings[type].PrivateAddr = pXml->QueryAtt("PrivateIP")->c_str(); m_ServerSettings[type].PrivatePort = pXml->QueryAtt("PrivatePort")->Integer(); m_ServerSettings[type].PublicAddr = pXml->QueryAtt("PublicIP")->c_str(); m_ServerSettings[type].PublicPort = pXml->QueryAtt("PublicPort")->Integer(); m_ServerSettings[type].LogLevel = pXml->QueryAtt("LogLevel")->Integer(); switch(type) { case enum_SSI_LoginServer: case enum_SSI_CharacterServer: case enum_SSI_WorldServer: case enum_SSI_GameServer: case enum_SSI_ChatServer: { m_ServerSettings[type].MaxPlayer = (int)pXml->QueryAtt("MaxPlayer")->Integer(); }; } switch(type) { case enum_SSI_LoginServer: case enum_SSI_CharacterServer: case enum_SSI_MailServer: { m_ServerSettings[type].MaxDBLink = (int)pXml->QueryAtt("MaxDBLink")->Integer(); } break; } } return TRUE; }
BOOL XMLDomParser::Parse(StreamInterface& s, XMLElementNode& root) { this->Reset(); size_t pos = s.tell(); DWORD flag = 0; int_r n2 = s.ReadData(&flag, 3); if(n2 == 3 && flag == utf8_signature) { const char* encoding = "UTF-8"; if(stricmp(encoding, m_encoding.c_str()) && m_parser) { XML_ParserFree(m_parser); m_parser = NULL; } m_encoding = encoding; } else { s.Seek(pos); } if(!m_parser) { if(m_encoding.empty()) m_encoding = "GB2312"; m_parser = XML_ParserCreate(m_encoding.c_str()); if(!m_parser) return FALSE; XML_SetUserData(m_parser, this); XML_SetElementHandler(m_parser, &StartElementHandler, &EndElementHandler); XML_SetCharacterDataHandler(m_parser, &CharacterDataHandler); } if(root.m_tagName.empty()) root.SetTagName("XMLRoot"); m_pRootNode = &root; m_stack.push(m_pRootNode); //const char* orglocale = NULL; //if(m_encoding.icompare("GB2312") == 0) // orglocale = setLocaleToGbk(); //else if(g_encoding == encode_ansii && m_encoding.icompare("UTF-8") == 0) // orglocale = setLocaleToGbk(); int_r n; char cBuffer[2048]; while(n = s.ReadData(&cBuffer, 2048), n>=0) { BOOL isFinal = (n < 2048); XML_Status status = XML_Parse(m_parser, cBuffer, (int)n, isFinal); if(status == XML_STATUS_ERROR) { //if(orglocale) setlocale(LC_CTYPE, orglocale); sprintf_k(cBuffer, sizeof(cBuffer), "%s at line:%d col:%d", XML_ErrorString(XML_GetErrorCode(m_parser)), XML_GetCurrentLineNumber(m_parser), XML_GetCurrentColumnNumber(m_parser)); m_errMsg = cBuffer; return FALSE; } if(isFinal) break; } //if(orglocale) setlocale(LC_CTYPE, orglocale); return TRUE; }
bool KMapSettings::initialize(StreamInterface& si) { char buf[64]; XMLDomParser parser; if(!parser.Initialize()) { Log(LOG_ERROR, "error: KMapSettings::initialize, init xml parser"); return false; } XMLElementNode xmlRoot; if(!parser.Parse(si, xmlRoot)) { Log(LOG_ERROR, "error: KMapSettings::initialize, parse xml, %s", parser.GetErrorMsg()); return false; } KMapSetting ms; XMLNodeColl coll = xmlRoot.QueryChildren2("MapSettings/Map"); int n = coll.Size(); for(int i=0; i<n; i++) { ms.clear(); XMLElementNode* mapXml = (XMLElementNode*)coll.GetNode(i); const char* mapName = mapXml->QueryAtt("file")->c_str(); const char* descName = mapXml->QueryAtt("name")->c_str(); ms.m_mapID = mapXml->QueryAtt("id")->Integer(); if(mapXml->QueryAtt("dup")) { ms.m_duplicate = mapXml->QueryAtt("dup")->Integer() ? 1:0; } ms.m_mapName = KBuffer64k::WriteData(mapName, strlen(mapName)+1); ms.m_descName = KBuffer64k::WriteData(descName, strlen(descName)+1); if(mapXml->QueryAtt("EntryPoint.value")) ms.setEntryPoint(0, mapXml->QueryAtt("EntryPoint.value")->Integer()); if(mapXml->QueryAtt("BornPoint.value")) ms.setBornPoint(0, mapXml->QueryAtt("BornPoint.value")->Integer()); if(mapXml->QueryAtt("RelivePoint.value")) ms.setRelivePoint(0, mapXml->QueryAtt("RelivePoint.value")->Integer()); if(mapXml->QueryAtt("ExitPoint.value")) ms.setExitPoint(0, mapXml->QueryAtt("ExitPoint.value")->Integer()); if(mapXml->QueryAtt("ReturnPoint.value")) ms.setReturnPoint(0, mapXml->QueryAtt("ReturnPoint.value")->Integer()); int len = sprintf_k(buf, sizeof(buf), "Map_%d", ms.m_mapID); ms.m_luaTable = KBuffer64k::WriteData(buf, len+1); ms.m_createTimeout = ms.getIntAttr("createTimeout", 2*60); ms.m_idleTimeout = ms.getIntAttr("idleTimeout", ms.m_duplicate?5*60:-1); ms.m_carePlayerEnter = ms.getBoolAttr("carePlayerEnter", false) ? TRUE : FALSE; m_maps[ms.m_mapID] = ms; } return true; }
bool KWorldSettings::initialize(KMapSettings& mss, StreamInterface& fi) { char buf[128]; XMLDomParser parser; if(!parser.Initialize()) { Log(LOG_ERROR, "error: KWorldSettings::initialize, init xml parser"); return false; } XMLElementNode xmlRoot; if(!parser.Parse(fi, xmlRoot)) { Log(LOG_ERROR, "error: KWorldSettings::initialize, parse xml, %s", parser.GetErrorMsg()); return false; } KWorldSetting ws; XMLNodeColl coll2; int c; XMLNodeColl coll = xmlRoot.QueryChildren2("WorldSettings/World"); int n = coll.Size(); for(int i=0; i<n; i++) { ws.clear(); XMLElementNode* worldXml = (XMLElementNode*)coll.GetNode(i); const char* worldName = worldXml->QueryAtt("name")->c_str(); ws.m_mapID = worldXml->QueryAtt("map")->Integer(); ws.m_mapSetting = mss.getMapSetting(ws.m_mapID); if(!ws.m_mapSetting) { Log(LOG_ERROR, "error: KWorldSettings::initialize, map %d not found", ws.m_mapID); return false; } ws.m_worldType = worldXml->QueryAtt("type")->Integer(); ws.m_worldName = KBuffer64k::WriteData(worldName, strlen(worldName)+1); int len = sprintf_k(buf, sizeof(buf), "WorldMonitor_%d", ws.m_worldType); ws.m_luaTable = KBuffer64k::WriteData(buf, len+1); coll2 = worldXml->QueryChildren2("Monster"); c = coll2.Size(); for(int k=0; k<c; k++) { KWorldSetting::Monster monster; XMLElementNode* elemXml = (XMLElementNode*)coll2.GetNode(k); const char* fileName = elemXml->QueryAtt("value")->c_str(); monster.first = elemXml->QueryAtt("id")->Integer(); monster.second = KBuffer64k::WriteData(fileName, strlen(fileName)+1); ws.m_monsters.push_back(monster); } coll2 = worldXml->QueryChildren2("TreasureCase"); c = coll2.Size(); for(int k=0; k<c; k++) { XMLElementNode* elemXml = (XMLElementNode*)coll2.GetNode(k); const char* fileName = elemXml->QueryAtt("value")->c_str(); ws.m_tcs.push_back(KBuffer64k::WriteData(fileName, strlen(fileName)+1)); } coll2 = worldXml->QueryChildren2("Transimission"); c = coll2.Size(); for(int k=0; k<c; k++) { XMLElementNode* elemXml = (XMLElementNode*)coll2.GetNode(k); const char* fileName = elemXml->QueryAtt("value")->c_str(); ws.m_transes.push_back(KBuffer64k::WriteData(fileName, strlen(fileName)+1)); } coll2 = worldXml->QueryChildren2("Traffic"); c = coll2.Size(); for(int k=0; k<c; k++) { XMLElementNode* elemXml = (XMLElementNode*)coll2.GetNode(k); int trafficRoute = elemXml->QueryAtt("value")->Integer(); ws.m_traffics.push_back(trafficRoute); } //coll2 = worldXml->QueryChildren2("Scene"); c = coll2.Size(); //for(int k=0; k<c; k++) //{ // KWorldSetting::Scene scene; // XMLElementNode* elemXml = (XMLElementNode*)coll2.GetNode(k); // scene.first = elemXml->QueryAtt("x")->Integer(); // scene.second = elemXml->QueryAtt("y")->Integer(); // ws.m_scenes.insert_unique(scene); //} this->_addWorldType(ws); } return true; }