From: <si...@us...> - 2009-08-17 10:28:07
|
Revision: 161 http://glestae.svn.sourceforge.net/glestae/?rev=161&view=rev Author: silnarm Date: 2009-08-17 10:27:56 +0000 (Mon, 17 Aug 2009) Log Message: ----------- + TinyXML - Xerces + World::assertConsistiency() fixed. Modified Paths: -------------- trunk/source/glest_game/game/script_manager.cpp trunk/source/glest_game/game.vcproj trunk/source/glest_game/network/network_message.cpp trunk/source/glest_game/path_finder/path_finder.cpp trunk/source/shared_lib/include/xml/xml_parser.h trunk/source/shared_lib/libglest.vcproj trunk/source/shared_lib/sources/lua/lua_script.cpp trunk/source/shared_lib/sources/xml/xml_parser.cpp Modified: trunk/source/glest_game/game/script_manager.cpp =================================================================== --- trunk/source/glest_game/game/script_manager.cpp 2009-08-17 08:49:55 UTC (rev 160) +++ trunk/source/glest_game/game/script_manager.cpp 2009-08-17 10:27:56 UTC (rev 161) @@ -79,7 +79,7 @@ //load code for(int i= 0; i<scenario->getScriptCount(); ++i){ const Script* script= scenario->getScript(i); - luaScript.loadCode("function " + script->getName() + "()" + script->getCode() + "end\n", script->getName()); + luaScript.loadCode("function " + script->getName() + "()" + script->getCode() + " end\n", script->getName()); } //setup message box Modified: trunk/source/glest_game/game.vcproj =================================================================== --- trunk/source/glest_game/game.vcproj 2009-08-17 08:49:55 UTC (rev 160) +++ trunk/source/glest_game/game.vcproj 2009-08-17 10:27:56 UTC (rev 161) @@ -71,7 +71,7 @@ <Tool Name="VCLinkerTool" AdditionalOptions="/NODEFAULTLIB:LIBCMT" - AdditionalDependencies="dsound.lib dxguid.lib ogg_static.lib vorbis_static.lib vorbisfile_static.lib xerces-depdom_static_2.lib xerces-c_static_2.lib opengl32.lib glu32.lib wsock32.lib libglest.lib mmc.lib zdll.lib lua5.1.lib" + AdditionalDependencies="dsound.lib dxguid.lib ogg_static.lib vorbis_static.lib vorbisfile_static.lib opengl32.lib glu32.lib wsock32.lib libglest.lib mmc.lib zdll.lib lua5.1.lib tinyxmld_STL.lib" LinkIncremental="2" AdditionalLibraryDirectories="../../../deps/lib;"../../build/$(ConfigurationName)/libglest"" IgnoreAllDefaultLibraries="false" @@ -228,7 +228,7 @@ AdditionalIncludeDirectories="../../../deps/include;../shared_lib/include/graphics;../shared_lib/include/graphics/gl;../shared_lib/include/platform;../shared_lib/include/platform/win32;../shared_lib/include/sound;../shared_lib/include/sound/ds8;../shared_lib/include/util;../shared_lib/include/xml;../shared_lib/include/lua;ai;facilities;game;global;graphics;gui;main;menu;network;sound;type_instances;types;world;path_finder" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;XML_LIBRARY;USE_PCH=1" StringPooling="true" - RuntimeLibrary="0" + RuntimeLibrary="2" BufferSecurityCheck="true" EnableEnhancedInstructionSet="2" FloatingPointModel="2" @@ -253,11 +253,12 @@ <Tool Name="VCLinkerTool" AdditionalOptions="/NODEFAULTLIB:LIBCMT" - AdditionalDependencies="dsound.lib dxguid.lib ogg_static.lib vorbis_static.lib vorbisfile_static.lib xerces-depdom_static_2.lib xerces-c_static_2.lib opengl32.lib glu32.lib wsock32.lib libglest.lib mmc.lib zdll.lib libcmt.lib lua5.1.lib" + AdditionalDependencies="dsound.lib dxguid.lib ogg_static.lib vorbis_static.lib vorbisfile_static.lib opengl32.lib glu32.lib wsock32.lib libglest.lib mmc.lib zdll.lib libcmt.lib lua5.1.lib tinyxml_STL.lib" Version="3.1.0-beta-something" LinkIncremental="1" AdditionalLibraryDirectories="../../../deps/lib;"../../build/$(ConfigurationName)/libglest"" IgnoreAllDefaultLibraries="false" + IgnoreDefaultLibraryNames="" GenerateDebugInformation="false" SubSystem="1" OptimizeReferences="2" Modified: trunk/source/glest_game/network/network_message.cpp =================================================================== --- trunk/source/glest_game/network/network_message.cpp 2009-08-17 08:49:55 UTC (rev 160) +++ trunk/source/glest_game/network/network_message.cpp 2009-08-17 10:27:56 UTC (rev 161) @@ -541,7 +541,7 @@ void NetworkMessageXmlDoc::writeXml() { assert(!data); assert(rootNode); - data = rootNode->toString(Config::getInstance().getMiscDebugMode()); + data = rootNode->toString(/*Config::getInstance().getMiscDebugMode()*/); size = strlen(data) + 1; domAllocated = true; } Modified: trunk/source/glest_game/path_finder/path_finder.cpp =================================================================== --- trunk/source/glest_game/path_finder/path_finder.cpp 2009-08-17 08:49:55 UTC (rev 160) +++ trunk/source/glest_game/path_finder/path_finder.cpp 2009-08-17 10:27:56 UTC (rev 161) @@ -315,16 +315,16 @@ memset(cells, 0, h * w * ZoneCount); } - void validate(int x, int y, Field field) { - assert(!getCell(x, y, field)); - getCell(x, y, field) = 1; + void validate(int x, int y, Zone zone) { + assert(!getCell(x, y, zone)); + getCell(x, y, zone) = 1; } - char &getCell(int x, int y, Field field) { + char &getCell(int x, int y, Zone zone) { assert(x >= 0 && x < w); assert(y >= 0 && y < h); - assert(field >= 0 && field < ZoneCount); - return cells[field * h * w + x * w + y]; + assert(zone >= 0 && zone < ZoneCount); + return cells[zone * h * w + x * w + y]; } }; @@ -359,7 +359,7 @@ const UnitType *ut = unit->getType(); int size = ut->getSize(); - Field field = unit->getCurrField(); + Zone zone = unit->getCurrZone (); const Vec2i &pos = unit->getPos(); for(int x = 0; x < size; ++x) { @@ -368,12 +368,12 @@ assert(map.isInside(currPos)); if(!ut->hasCellMap() || ut->getCellMapCell(x, y)) { - Unit *unitInCell = map.getCell(currPos)->getUnit(field); + Unit *unitInCell = map.getCell(currPos)->getUnit(zone); if(unitInCell != unit) { cerr << "Unit id " << unit->getId() << " from faction " << fi->getIndex() << "(type = " << unit->getType()->getName() << ")" - << " not in cells (" << currPos.x << ", " << currPos.y << ", " << field << ")"; + << " not in cells (" << currPos.x << ", " << currPos.y << ", " << zone << ")"; if(unitInCell == NULL && !unit->getHp()) { cerr << " but has zero HP and is not executing scDie." << endl; } else { @@ -381,7 +381,7 @@ assert(false); } } - validationMap.validate(currPos.x, currPos.y, field); + validationMap.validate(currPos.x, currPos.y, zone); } } } @@ -391,12 +391,12 @@ // make sure that every cell that was not validated is empty for(int x = 0; x < map.getW(); ++x) { for(int y = 0; y < map.getH(); ++y ) { - for(int field = 0; field < ZoneCount; ++field) { - if(!validationMap.getCell(x, y, (Field)field)) { + for(int zone = 0; zone < ZoneCount; ++zone) { + if(!validationMap.getCell(x, y, (Zone)zone)) { Cell *cell = map.getCell(x, y); - if(cell->getUnit(field)) { - cerr << "Cell not empty at " << x << ", " << y << ", " << field << endl; - cerr << "Cell has pointer to unit object at " << cell->getUnit(field) << endl; + if(cell->getUnit((Zone)zone)) { + cerr << "Cell not empty at " << x << ", " << y << ", " << zone << endl; + cerr << "Cell has pointer to unit object at " << cell->getUnit((Zone)zone) << endl; assert(false); } Modified: trunk/source/shared_lib/include/xml/xml_parser.h =================================================================== --- trunk/source/shared_lib/include/xml/xml_parser.h 2009-08-17 08:49:55 UTC (rev 160) +++ trunk/source/shared_lib/include/xml/xml_parser.h 2009-08-17 10:27:56 UTC (rev 161) @@ -16,7 +16,8 @@ #include <string> #include <vector> -#include <xercesc/util/XercesDefs.hpp> +#include "tinyxml.h" +//#include <xercesc/util/XercesDefs.hpp> #include "vec.h" #include "conversion.h" @@ -25,7 +26,7 @@ using namespace Shared::Graphics; using namespace Shared::Util; -namespace XERCES_CPP_NAMESPACE { +/*namespace XERCES_CPP_NAMESPACE { class DOMImplementation; class DOMDocument; class DOMNode; @@ -36,6 +37,7 @@ //using XERCES_CPP_NAMESPACE::DOMDocument; using XERCES_CPP_NAMESPACE::DOMNode; using XERCES_CPP_NAMESPACE::DOMElement; +*/ namespace Shared { namespace Xml { @@ -55,7 +57,7 @@ class XmlIo { private: static bool initialized; - DOMImplementation *implementation; + //DOMImplementation *implementation; private: XmlIo(); @@ -67,7 +69,7 @@ void save(const string &path, const XmlNode *node); XmlNode *parseString(const char *doc, size_t size = (size_t)-1); /** WARNING: return value must be freed by calling XmlIo::getInstance().releaseString(). */ - char *toString(const XmlNode *node, bool pretty); + //char *toString(const XmlNode *node, bool pretty); void releaseString(char **domAllocatedString); }; @@ -90,7 +92,9 @@ void init(const string &name); void load(const string &path); void save(const string &path); - + void parse(const string &xml); + + char *toString() const; XmlNode *getRootNode() const {return rootNode;} }; @@ -109,13 +113,14 @@ void operator =(XmlAttribute&); public: - XmlAttribute(DOMNode *attribute); + XmlAttribute(TiXmlAttribute *attribute); XmlAttribute(const char *name, const char *value) : name(name), value(value){} XmlAttribute(const string &name, const string &value) : name(name), value(value){} public: const string &getName() const {return name;} const string &getValue() const {return value;} + string toString() const {return name + "=\"" + value + "\""; } bool getBoolValue() const; int getIntValue() const {return strToInt(value);} @@ -132,16 +137,16 @@ class XmlNode{ private: string name; - string text; vector<XmlNode*> children; vector<XmlAttribute*> attributes; + string text; private: XmlNode(XmlNode&); void operator =(XmlNode&); public: - XmlNode(DOMNode *node); + XmlNode(TiXmlNode *node); XmlNode(const string &name); ~XmlNode(); @@ -149,13 +154,13 @@ const string &getName() const {return name;} int getChildCount() const {return children.size();} int getAttributeCount() const {return attributes.size();} - const string &getText() const {return text;} XmlAttribute *getAttribute(int i) const; XmlAttribute *getAttribute(const string &name, bool required = true) const; XmlNode *getChild(int i) const; XmlNode *getChild(const string &childName, int childIndex = 0, bool required = true) const; XmlNode *getParent() const; + const string &getText() const {return text;} // get methods that return a specific type using the "value" attribute or appropriate attributes // for vector types @@ -336,8 +341,8 @@ return child; } - void populateElement(DOMElement *node, XERCES_CPP_NAMESPACE::DOMDocument *document) const; - DOMElement *buildElement(XERCES_CPP_NAMESPACE::DOMDocument *document) const; + void populateElement(TiXmlElement *node) const; + //DOMElement *buildElement(XERCES_CPP_NAMESPACE::DOMDocument *document) const; int getOptionalIntValue(const char* name, int defaultValue = 0) const { const XmlNode *node = getChild(name, 0, false); @@ -360,9 +365,9 @@ } /** WARNING: return value must be freed by calling XmlIo::getInstance().releaseString(). */ - char *toString(bool pretty) const { + char *toString() const;/*bool pretty) const { return XmlIo::getInstance().toString(this, pretty); - } + }*/ private: string getTreeString() const; Modified: trunk/source/shared_lib/libglest.vcproj =================================================================== --- trunk/source/shared_lib/libglest.vcproj 2009-08-17 08:49:55 UTC (rev 160) +++ trunk/source/shared_lib/libglest.vcproj 2009-08-17 10:27:56 UTC (rev 161) @@ -41,7 +41,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../../../deps/include/lua;../../../deps/include;include;include/graphics;include/graphics/gl;include/platform;include/platform/win32;include/sound;include/sound/ds8;include/util;include/lua;include/xml" - PreprocessorDefinitions="WIN32;_DEBUG;_LIB;XML_LIBRARY;NO_GL_ASSERTIONS;USE_PCH=1" + PreprocessorDefinitions="WIN32;_DEBUG;_LIB;TIXML_USE_STL;NO_GL_ASSERTIONS;USE_PCH=1" StringPooling="true" MinimalRebuild="true" BasicRuntimeChecks="3" @@ -190,9 +190,9 @@ FavorSizeOrSpeed="1" OmitFramePointers="true" AdditionalIncludeDirectories="../../../deps/include;include;include/graphics;include/graphics/gl;include/platform;include/platform/win32;include/sound;include/sound/ds8;include/util;include/xml;include/lua" - PreprocessorDefinitions="WIN32;NDEBUG;_LIB;XML_LIBRARY;USE_PCH=1" + PreprocessorDefinitions="WIN32;NDEBUG;_LIB;TIXML_USE_STL;USE_PCH=1" StringPooling="true" - RuntimeLibrary="0" + RuntimeLibrary="2" BufferSecurityCheck="true" EnableEnhancedInstructionSet="2" FloatingPointModel="2" @@ -507,11 +507,11 @@ > </File> <File - RelativePath=".\include\platform\win32\socket.h" + RelativePath=".\include\platform\socket.h" > </File> <File - RelativePath=".\include\platform\socket.h" + RelativePath=".\include\platform\win32\socket.h" > </File> <File @@ -563,11 +563,11 @@ > </File> <File - RelativePath=".\include\platform\thread.h" + RelativePath=".\include\platform\win32\thread.h" > </File> <File - RelativePath=".\include\platform\win32\thread.h" + RelativePath=".\include\platform\thread.h" > </File> <File @@ -575,11 +575,11 @@ > </File> <File - RelativePath=".\include\platform\types.h" + RelativePath=".\include\platform\win32\types.h" > </File> <File - RelativePath=".\include\platform\win32\types.h" + RelativePath=".\include\platform\types.h" > </File> <File @@ -595,11 +595,11 @@ > </File> <File - RelativePath=".\include\platform\win32\window_gl.h" + RelativePath=".\include\platform\window_gl.h" > </File> <File - RelativePath=".\include\platform\window_gl.h" + RelativePath=".\include\platform\win32\window_gl.h" > </File> <File Modified: trunk/source/shared_lib/sources/lua/lua_script.cpp =================================================================== --- trunk/source/shared_lib/sources/lua/lua_script.cpp 2009-08-17 08:49:55 UTC (rev 160) +++ trunk/source/shared_lib/sources/lua/lua_script.cpp 2009-08-17 10:27:56 UTC (rev 161) @@ -47,6 +47,11 @@ void LuaScript::loadCode(const string &code, const string &name){ int errorCode= luaL_loadbuffer(luaState, code.c_str(), code.size(), name.c_str()); if(errorCode!=0){ + FILE *fp = fopen ( "bad.lua", "w" ); + if ( fp ) { + fprintf ( fp, "%s", code.c_str() ); + fclose ( fp ); + } throw runtime_error("Error loading lua code: " + errorToString(errorCode)); } Modified: trunk/source/shared_lib/sources/xml/xml_parser.cpp =================================================================== --- trunk/source/shared_lib/sources/xml/xml_parser.cpp 2009-08-17 08:49:55 UTC (rev 160) +++ trunk/source/shared_lib/sources/xml/xml_parser.cpp 2009-08-17 10:27:56 UTC (rev 161) @@ -2,7 +2,8 @@ // This file is part of Glest Shared Library (www.glest.org) // // Copyright (C) 2001-2008 Marti\xF1o Figueroa, -// 2008 Daniel Santos <dan...@po...> +// 2008 Daniel Santos <dan...@po...>, +// 2009 Nathan Turner <hailstone3> // // You can redistribute this code and/or modify it under // the terms of the GNU General Public License as published @@ -16,22 +17,10 @@ #include <fstream> #include <stdexcept> -#include <xercesc/dom/DOM.hpp> -#include <xercesc/util/PlatformUtils.hpp> -#include <xercesc/framework/LocalFileFormatTarget.hpp> -#include <xercesc/framework/MemBufInputSource.hpp> -#include <xercesc/framework/Wrapper4InputSource.hpp> - #include "conversion.h" #include "leak_dumper.h" -XERCES_CPP_NAMESPACE_USE - -#if !defined(WIN32) || !defined(WIN64) // windows is a piece of shit -# define DOMDocument XERCES_CPP_NAMESPACE::DOMDocument -#endif - using namespace std; namespace Shared{ namespace Xml{ @@ -39,46 +28,12 @@ using namespace Util; // ===================================================== -// class ErrorHandler -// ===================================================== - -class ErrorHandler: public DOMErrorHandler{ -public: - virtual bool handleError (const DOMError &domError){ - if(domError.getSeverity()== DOMError::DOM_SEVERITY_FATAL_ERROR){ - char msgStr[strSize], fileStr[strSize]; - XMLString::transcode(domError.getMessage(), msgStr, strSize-1); - XMLString::transcode(domError.getLocation()->getURI(), fileStr, strSize-1); - int lineNumber= domError.getLocation()->getLineNumber(); - throw runtime_error("Error parsing XML, file: " + string(fileStr) + ", line: " + intToStr(lineNumber) + ": " + string(msgStr)); - } - return true; - } -}; - -// ===================================================== // class XmlIo // ===================================================== bool XmlIo::initialized= false; XmlIo::XmlIo(){ - try{ - XMLPlatformUtils::Initialize(); - } - catch(const XMLException&){ - throw runtime_error("Error initializing XML system"); - } - - try{ - XMLCh str[strSize]; - XMLString::transcode("LS", str, strSize-1); - - implementation = DOMImplementationRegistry::getDOMImplementation(str); - } - catch(const DOMException){ - throw runtime_error("Exception while creating XML parser"); - } } XmlIo &XmlIo::getInstance(){ @@ -87,238 +42,63 @@ } XmlIo::~XmlIo(){ - XMLPlatformUtils::Terminate(); } XmlNode *XmlIo::load(const string &path){ + // creates a document from file -#if XERCES_VERSION_MAJOR < 3 - DOMBuilder *parser = NULL; -#else - DOMLSParser *parser = NULL; -#endif - DOMDocument *document = NULL; - XmlNode *rootNode = NULL; + TiXmlDocument document( path.c_str() ); - try{ - ErrorHandler errorHandler; -#if XERCES_VERSION_MAJOR < 3 - parser= (static_cast<DOMImplementationLS*>(implementation))->createDOMBuilder(DOMImplementationLS::MODE_SYNCHRONOUS, 0); - parser->setErrorHandler(&errorHandler); - parser->setFeature(XMLUni::fgXercesSchemaFullChecking, true); - parser->setFeature(XMLUni::fgDOMValidation, true); -#else - parser = (static_cast<DOMImplementationLS*>(implementation))->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0); - DOMConfiguration *config = parser->getDomConfig(); - config->setParameter(XMLUni::fgXercesSchemaFullChecking, true); - config->setParameter(XMLUni::fgDOMValidate, true); -#endif - document= parser->parseURI(path.c_str()); + if ( !document.LoadFile() ) { + char message[strSize]; + sprintf(message, "Error parsing XML, file: %s, line %i, %s", path.c_str(), document.ErrorRow(), document.ErrorDesc()); + throw runtime_error(message); + } - if(!document){ - throw runtime_error("Can not parse URL: " + path); - } + XmlNode *rootNode = new XmlNode(document.RootElement()); - rootNode = new XmlNode(document->getDocumentElement()); - parser->release(); - return rootNode; - } - catch(const DOMException &e){ - if(rootNode) { - delete rootNode; - } - if(parser) { - parser->release(); - } - throw runtime_error("Exception while loading: " + path + ": " + XMLString::transcode(e.msg)); - } + return rootNode; } XmlNode *XmlIo::parseString(const char *doc, size_t size) { -#if XERCES_VERSION_MAJOR < 3 - DOMBuilder *parser = NULL; -#else - DOMLSParser *parser = NULL; - DOMConfiguration *config = NULL; -#endif - DOMDocument *document = NULL; - XmlNode *rootNode = NULL; + // creates a document from string - if(size == (size_t)-1) { - size = strlen(doc); - } + TiXmlDocument document; - try{ - ErrorHandler errorHandler; - MemBufInputSource memInput((const XMLByte*)doc, size, (const XMLCh*)L"bite me"); - Wrapper4InputSource wrapperSource(&memInput, false); -#if XERCES_VERSION_MAJOR < 3 - parser= (static_cast<DOMImplementationLS*>(implementation))->createDOMBuilder(DOMImplementationLS::MODE_SYNCHRONOUS, 0); - parser->setErrorHandler(&errorHandler); - parser->setFeature(XMLUni::fgXercesSchemaFullChecking, true); - parser->setFeature(XMLUni::fgDOMValidation, true); - document = parser->parse(wrapperSource); -#else - parser = (static_cast<DOMImplementationLS*>(implementation))->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0); - config = parser->getDomConfig(); - config->setParameter(XMLUni::fgXercesSchemaFullChecking, true); - config->setParameter(XMLUni::fgDOMValidate, true); - document = parser->parse(static_cast<DOMLSInput*>(&wrapperSource)); -#endif - + document.Parse(doc); // returns const char* but not sure why - if(document == NULL){ - throw runtime_error("Failed to parse in-memory document"); - } - - rootNode= new XmlNode(document->getDocumentElement()); - parser->release(); - return rootNode; + if ( document.Error() ) { + char message[strSize]; + sprintf(message, "Error parsing XML text: line %i, %s", document.ErrorRow(), document.ErrorDesc()); + throw runtime_error(message); } - catch(const DOMException &e){ - if(rootNode) { - delete rootNode; - } - if(parser) { - parser->release(); - } - throw runtime_error(string("Exception while parsing in-memory document: ") + XMLString::transcode(e.msg)); - } -} -void XmlIo::save(const string &path, const XmlNode *node){ -#if XERCES_VERSION_MAJOR < 3 - DOMWriter* writer = NULL; -#else - DOMLSSerializer *serializer = NULL; - DOMLSOutput* output = NULL; - DOMConfiguration* config = NULL; -#endif - DOMDocument *document = NULL; - DOMElement *documentElement = NULL; - + XmlNode *rootNode = new XmlNode(document.RootElement()); - try{ - XMLCh str[strSize]; - XMLString::transcode(node->getName().c_str(), str, strSize-1); - - document = implementation->createDocument(0, str, 0); - documentElement = document->getDocumentElement(); - - node->populateElement(documentElement, document); - - LocalFileFormatTarget file(path.c_str()); -#if XERCES_VERSION_MAJOR < 3 - DOMWriter* writer = implementation->createDOMWriter(); - writer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true); - writer->writeNode(&file, *document); -#else - serializer = implementation->createLSSerializer(); - output=implementation->createLSOutput(); - config=serializer->getDomConfig(); - config->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint,true); - output->setByteStream(&file); - serializer->write(document,output); - output->release(); - serializer->release(); -#endif - - document->release(); - } - catch(const DOMException &e){ -#if XERCES_VERSION_MAJOR < 3 - if(writer) { - writer->release(); - } -#else - if(serializer) { - serializer->release(); - } - if(output) { - output->release(); - } -#endif - - if(document) { - document->release(); - } - throw runtime_error("Exception while saving: " + path + ": " + XMLString::transcode(e.msg)); - } + return rootNode; } -/** WARNING: return value must be freed by calling XmlIo::getInstance().releaseString(). */ -char *XmlIo::toString(const XmlNode *node, bool pretty) { -#if XERCES_VERSION_MAJOR < 3 - DOMWriter* writer = NULL; -#else - DOMLSSerializer *serializer = NULL; - DOMLSOutput* output = NULL; - DOMConfiguration* config = NULL; -#endif - XMLCh str[strSize]; - DOMDocument *document = NULL; - DOMElement *documentElement; - XMLCh *xmlText = NULL; - char *ret = NULL; +void XmlIo::save(const string &path, const XmlNode *node){ + // doesn't keep: space chars, doc type declaration (although a generic one + // can be added), any other text like comments - try { - XMLString::transcode(node->getName().c_str(), str, strSize-1); + TiXmlDocument document; - document = implementation->createDocument(0, str, 0); - documentElement = document->getDocumentElement(); + TiXmlElement *rootElement = new TiXmlElement(node->getName().c_str()); + + if ( !document.LinkEndChild(rootElement) ) { // TinyXML owns pointer + throw runtime_error("Problem adding xml child element to: document"); + } - node->populateElement(documentElement, document); + node->populateElement(rootElement); - // retrieve as string -#if XERCES_VERSION_MAJOR < 3 - DOMWriter* writer = implementation->createDOMWriter(); - writer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, pretty); - writer->setEncoding((const XMLCh*)L"UTF-8"); - xmlText = writer->writeToString(*document); - ret = XMLString::transcode(xmlText); - XMLString::release(&xmlText); - writer->release(); -#else - serializer = implementation->createLSSerializer(); - output=implementation->createLSOutput(); - config=serializer->getDomConfig(); - config->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint,true); - //output->setByteStream(&file); - xmlText = serializer->writeToString(document); - ret = XMLString::transcode(xmlText); - XMLString::release(&xmlText); - output->release(); - serializer->release(); -#endif - - document->release(); - return ret; + if ( !document.SaveFile( path.c_str() ) ) { + throw runtime_error("Unable to save xml file: " + path); } - catch(const DOMException &e){ -#if XERCES_VERSION_MAJOR < 3 - if(writer) { - writer->release(); - } -#else - if(serializer) { - serializer->release(); - } - if(output) { - output->release(); - } -#endif - if(xmlText) { - XMLString::release(&xmlText); - } - if(document) { - document->release(); - } - throw runtime_error(string("Exception while converting to string: ") + XMLString::transcode(e.msg)); - } } void XmlIo::releaseString(char **domAllocatedString) { - XMLString::release(domAllocatedString); + delete domAllocatedString; } // ===================================================== @@ -341,6 +121,14 @@ XmlIo::getInstance().save(path, rootNode); } +void XmlTree::parse(const string &xml){ + this->rootNode= XmlIo::getInstance().parseString(xml.c_str()); +} + +char *XmlTree::toString() const { + return rootNode->toString(); +} + XmlTree::~XmlTree(){ delete rootNode; } @@ -349,44 +137,46 @@ // class XmlNode // ===================================================== -XmlNode::XmlNode(DOMNode *node){ +XmlNode::XmlNode(TiXmlNode *node) : text() { + //no node + if ( !node ) { + name = ""; + return; + } //get name - char str[strSize]; - XMLString::transcode(node->getNodeName(), str, strSize-1); - name= str; + name = node->ValueStr(); //check document - if(node->getNodeType()==DOMNode::DOCUMENT_NODE){ - name="document"; + if (node->Type() == TiXmlNode::DOCUMENT) { + name = "document"; } - //check children - for(int i=0; i<node->getChildNodes()->getLength(); ++i){ - DOMNode *currentNode= node->getChildNodes()->item(i); - if(currentNode->getNodeType()==DOMNode::ELEMENT_NODE){ - XmlNode *xmlNode= new XmlNode(currentNode); - children.push_back(xmlNode); - } + //add children to node + TiXmlElement *childElement = node->FirstChildElement(); + + while ( childElement ) { + XmlNode *xmlNode = new XmlNode(childElement); // recursive, null childElement as base + + children.push_back(xmlNode); + childElement = childElement->NextSiblingElement(); } - //check attributes - DOMNamedNodeMap *domAttributes= node->getAttributes(); - if(domAttributes!=NULL){ - for(int i=0; i<domAttributes->getLength(); ++i){ - DOMNode *currentNode= domAttributes->item(i); - if(currentNode->getNodeType()==DOMNode::ATTRIBUTE_NODE){ - XmlAttribute *xmlAttribute= new XmlAttribute(domAttributes->item(i)); - attributes.push_back(xmlAttribute); - } - } + //add attributes to node + TiXmlElement *element = node->ToElement(); + TiXmlAttribute *attribute = element->FirstAttribute(); + + while ( attribute ) { + XmlAttribute *xmlAttribute = new XmlAttribute(attribute); + attributes.push_back(xmlAttribute); + + attribute = attribute->Next(); } - //get value - if(node->getNodeType()==DOMNode::ELEMENT_NODE && children.size()==0){ - char *textStr= XMLString::transcode(node->getTextContent()); - text= textStr; - XMLString::release(&textStr); + // text + const char * txt = element->GetText (); + if ( txt ) { + text = txt; } } @@ -419,12 +209,12 @@ if (!required) { return NULL; } - throw runtime_error("'" + getName() + "' node doesn't have an attribute named '" + name + "'"); + throw runtime_error("\"" + getName() + "\" node doesn't have a attribute named \"" + name + "\""); } XmlNode *XmlNode::getChild(int i) const { if (i >= children.size()) { - throw runtime_error("'" + getName() + "' node doesn't have " + throw runtime_error("\"" + getName() + "\" node doesn't have " + intToStr(i + 1) + " children"); } return children[i]; @@ -446,12 +236,9 @@ if (!required) { return NULL; } - if ( i == 0 ) - throw runtime_error("Node '" + getName() + "' doesn't have a" - + " child named '" + childName + "'"); - else - throw runtime_error("Node '" + getName() + "' doesn't have " - + intToStr(i + 1) + " children named '" + childName + "'"); + throw runtime_error("Node \"" + getName() + "\" doesn't have " + + intToStr(i + 1) + " children named \"" + childName + + "\"\n\nTree: " + getTreeString()); } XmlNode *XmlNode::addChild(const string &name){ @@ -466,30 +253,50 @@ return attr; } -void XmlNode::populateElement(DOMElement *node, DOMDocument *document) const { - XMLCh str[strSize]; +char *XmlNode::toString() const { + string xmlString = "<" + name; + + //add attributes to string for (int i = 0; i < attributes.size(); ++i) { - XMLString::transcode(attributes[i]->getName().c_str(), str, strSize - 1); - DOMAttr *attr = document->createAttribute(str); + xmlString += " " + attributes[i]->toString(); + } + + if (children.size() <= 0) { + xmlString += "/>"; + } else { + xmlString += ">"; - XMLString::transcode(attributes[i]->getValue().c_str(), str, strSize - 1); - attr->setValue(str); + //add children nodes to string + for (int i = 0; i < children.size(); ++i) { + xmlString += children[i]->toString(); // recursive, base when no children + } - node->setAttributeNode(attr); + //closing tag + xmlString += "</" + name + ">"; } - for (int i = 0; i < children.size(); ++i) { - node->appendChild(children[i]->buildElement(document)); - } + char *cstr = new char [xmlString.size()+1]; + strcpy(cstr, xmlString.c_str()); + + return cstr; } -DOMElement *XmlNode::buildElement(DOMDocument *document) const { - XMLCh str[strSize]; - XMLString::transcode(name.c_str(), str, strSize - 1); - DOMElement *node = document->createElement(str); +void XmlNode::populateElement(TiXmlElement *node) const { + //add all the attributes to the element node + for (int i = 0; i < attributes.size(); ++i) { + node->SetAttribute(attributes[i]->getName(), attributes[i]->getValue().c_str()); + } - populateElement(node, document); - return node; + //add all the children to the element node + for (int i = 0; i < children.size(); ++i) { + TiXmlElement *childElement = new TiXmlElement(children[i]->getName().c_str()); + + if ( !(node->LinkEndChild(childElement)) ) { // TinyXML owns pointer + throw runtime_error("Problem adding xml child element to: " + name); + } + + children[i]->populateElement(childElement); // recursive, base when no children + } } string XmlNode::getTreeString() const{ @@ -513,14 +320,9 @@ // class XmlAttribute // ===================================================== -XmlAttribute::XmlAttribute(DOMNode *attribute){ - char str[strSize]; - - XMLString::transcode(attribute->getNodeValue(), str, strSize-1); - value= str; - - XMLString::transcode(attribute->getNodeName(), str, strSize-1); - name= str; +XmlAttribute::XmlAttribute(TiXmlAttribute *attribute){ + name = attribute->Name(); + value = attribute->ValueStr(); } bool XmlAttribute::getBoolValue() const { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |