コード例 #1
0
ファイル: xmldom.cpp プロジェクト: zhuxiaokun/workshop
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();
}
コード例 #2
0
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;
}
コード例 #3
0
ファイル: xmldom.cpp プロジェクト: zhuxiaokun/workshop
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;
}
コード例 #4
0
ファイル: KServerSetting.cpp プロジェクト: joyfish/zgc
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;
}
コード例 #5
0
ファイル: xmldom.cpp プロジェクト: zhuxiaokun/workshop
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;
}
コード例 #6
0
ファイル: xmldom.cpp プロジェクト: zhuxiaokun/workshop
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;
}
コード例 #7
0
ファイル: xmldom.cpp プロジェクト: zhuxiaokun/workshop
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;
}
コード例 #8
0
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);
    }
}
コード例 #9
0
ファイル: KServerSetting.cpp プロジェクト: joyfish/zgc
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;
}
コード例 #10
0
ファイル: xmldom.cpp プロジェクト: zhuxiaokun/workshop
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;
}
コード例 #11
0
ファイル: KMapSetting.cpp プロジェクト: zhuxiaokun/workshop
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;
}
コード例 #12
0
ファイル: KWorldSetting.cpp プロジェクト: zhuxiaokun/workshop
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;
}