diff options
-rw-r--r-- | example/clientdata/items.xml | 12 | ||||
-rw-r--r-- | src/CMakeLists.txt | 7 | ||||
-rw-r--r-- | src/Makefile.am | 16 | ||||
-rw-r--r-- | src/account-server/main-account.cpp | 33 | ||||
-rw-r--r-- | src/account-server/storage.cpp | 20 | ||||
-rw-r--r-- | src/common/permissionmanager.cpp | 5 | ||||
-rw-r--r-- | src/common/resourcemanager.cpp (renamed from src/game-server/resourcemanager.cpp) | 82 | ||||
-rw-r--r-- | src/common/resourcemanager.hpp (renamed from src/game-server/resourcemanager.hpp) | 0 | ||||
-rw-r--r-- | src/game-server/itemmanager.cpp | 7 | ||||
-rw-r--r-- | src/game-server/main-game.cpp | 2 | ||||
-rw-r--r-- | src/game-server/mapmanager.cpp | 6 | ||||
-rw-r--r-- | src/game-server/mapreader.cpp | 6 | ||||
-rw-r--r-- | src/game-server/monster.cpp | 2 | ||||
-rw-r--r-- | src/game-server/monstermanager.cpp | 6 | ||||
-rw-r--r-- | src/game-server/skillmanager.cpp | 2 | ||||
-rw-r--r-- | src/game-server/statusmanager.cpp | 7 | ||||
-rw-r--r-- | src/scripting/script.cpp | 8 | ||||
-rw-r--r-- | src/utils/xml.cpp | 144 | ||||
-rw-r--r-- | src/utils/xml.hpp | 60 |
19 files changed, 248 insertions, 177 deletions
diff --git a/example/clientdata/items.xml b/example/clientdata/items.xml new file mode 100644 index 0000000..fbf899a --- /dev/null +++ b/example/clientdata/items.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<items> + <item id="1" + image="use-food-candy.png" + name="Candy" + description="A sugar-free candy." + type="usable" + hp="5" + weight="1" + max-per-slot="30" + /> +</items> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 48aaf3a..69393de 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -103,6 +103,8 @@ SET(SRCS common/configuration.hpp common/configuration.cpp common/inventorydata.hpp + common/resourcemanager.hpp + common/resourcemanager.cpp net/bandwidth.hpp net/bandwidth.cpp net/connection.hpp @@ -120,6 +122,8 @@ SET(SRCS utils/logger.cpp utils/processorutils.hpp utils/processorutils.cpp + utils/string.hpp + utils/string.cpp utils/stringfilter.h utils/stringfilter.cpp utils/timer.h @@ -130,7 +134,6 @@ SET(SRCS utils/tokendispenser.cpp utils/xml.hpp utils/xml.cpp - utils/string.cpp ) SET(SRCS_MANASERVACCOUNT @@ -225,8 +228,6 @@ SET(SRCS_MANASERVGAME game-server/postman.hpp game-server/quest.hpp game-server/quest.cpp - game-server/resourcemanager.hpp - game-server/resourcemanager.cpp game-server/skillmanager.hpp game-server/skillmanager.cpp game-server/spawnarea.hpp diff --git a/src/Makefile.am b/src/Makefile.am index 3e31cf2..ff53714 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -41,6 +41,8 @@ manaserv_account_SOURCES = \ common/configuration.hpp \ common/configuration.cpp \ common/inventorydata.hpp \ + common/resourcemanager.hpp \ + common/resourcemanager.cpp \ dal/dalexcept.h \ dal/dataprovider.h \ dal/dataprovider.cpp \ @@ -68,6 +70,8 @@ manaserv_account_SOURCES = \ utils/processorutils.cpp \ utils/sha256.h \ utils/sha256.cpp \ + utils/string.hpp \ + utils/string.cpp \ utils/stringfilter.h \ utils/stringfilter.cpp \ utils/timer.cpp \ @@ -76,8 +80,7 @@ manaserv_account_SOURCES = \ utils/tokendispenser.hpp \ utils/tokendispenser.cpp \ utils/xml.hpp \ - utils/xml.cpp \ - utils/string.cpp + utils/xml.cpp manaserv_game_CXXFLAGS = -Wall @@ -91,6 +94,8 @@ manaserv_game_SOURCES = \ common/inventorydata.hpp \ common/permissionmanager.hpp \ common/permissionmanager.cpp \ + common/resourcemanager.hpp \ + common/resourcemanager.cpp \ game-server/accountconnection.hpp \ game-server/accountconnection.cpp \ game-server/actor.hpp \ @@ -134,8 +139,6 @@ manaserv_game_SOURCES = \ game-server/postman.hpp \ game-server/quest.hpp \ game-server/quest.cpp \ - game-server/resourcemanager.hpp \ - game-server/resourcemanager.cpp \ game-server/skillmanager.hpp \ game-server/skillmanager.cpp \ game-server/spawnarea.hpp \ @@ -175,6 +178,8 @@ manaserv_game_SOURCES = \ utils/logger.cpp \ utils/processorutils.hpp \ utils/processorutils.cpp \ + utils/string.hpp \ + utils/string.cpp \ utils/stringfilter.h \ utils/stringfilter.cpp \ utils/timer.h \ @@ -187,8 +192,7 @@ manaserv_game_SOURCES = \ utils/xml.hpp \ utils/xml.cpp \ utils/zlib.hpp \ - utils/zlib.cpp \ - utils/string.cpp + utils/zlib.cpp if BUILD_MYSQL manaserv_account_SOURCES += \ diff --git a/src/account-server/main-account.cpp b/src/account-server/main-account.cpp index 0a3fd5f..460a5f1 100644 --- a/src/account-server/main-account.cpp +++ b/src/account-server/main-account.cpp @@ -18,14 +18,6 @@ * along with The Mana Server. If not, see <http://www.gnu.org/licenses/>. */ -#include <cstdlib> -#include <getopt.h> -#include <signal.h> -#include <iostream> -#include <fstream> -#include <physfs.h> -#include <enet/enet.h> - #ifdef HAVE_CONFIG_H #include "../config.h" #endif @@ -38,6 +30,7 @@ #include "chat-server/guildmanager.hpp" #include "chat-server/post.hpp" #include "common/configuration.hpp" +#include "common/resourcemanager.hpp" #include "net/bandwidth.hpp" #include "net/connectionhandler.hpp" #include "net/messageout.hpp" @@ -46,6 +39,14 @@ #include "utils/stringfilter.h" #include "utils/timer.h" +#include <cstdlib> +#include <getopt.h> +#include <signal.h> +#include <iostream> +#include <fstream> +#include <physfs.h> +#include <enet/enet.h> + using utils::Logger; // Default options that automake should be able to override. @@ -63,16 +64,9 @@ Storage *storage; /** Communications (chat) message handler */ ChatHandler *chatHandler; -/** Chat Channels Manager */ ChatChannelManager *chatChannelManager; - -/** Guild Manager */ GuildManager *guildManager; - -/** Post Manager */ PostManager *postalManager; - -/** Bandwidth Monitor */ BandwidthMonitor *gBandwidth; /** Callback used when SIGQUIT signal is received. */ @@ -147,6 +141,8 @@ static void initialize() LOG_INFO("Using config file: " << configPath); LOG_INFO("Using log file: " << logPath); + ResourceManager::initialize(); + // check inter-server password if (Configuration::getValue("net_password", "") == "") { @@ -164,15 +160,10 @@ static void initialize() } // --- Initialize the managers - // Initialize the slang's and double quotes filter. - stringFilter = new StringFilter; - // Initialize the Chat channels manager + stringFilter = new StringFilter; // The slang's and double quotes filter. chatChannelManager = new ChatChannelManager; - // Initialise the Guild manager guildManager = new GuildManager; - // Initialise the post manager postalManager = new PostManager; - // Initialise the bandwidth monitor gBandwidth = new BandwidthMonitor; // --- Initialize the global handlers diff --git a/src/account-server/storage.cpp b/src/account-server/storage.cpp index 6e11f59..3973506 100644 --- a/src/account-server/storage.cpp +++ b/src/account-server/storage.cpp @@ -36,8 +36,7 @@ #include "utils/xml.hpp" #include "utils/sha256.h" -// TODO: make data/items.xml a constant or read it from config file -static const char *DEFAULT_ITEM_FILE = "data/items.xml"; +static const char *DEFAULT_ITEM_FILE = "items.xml"; // defines the supported db version static const char *DB_VERSION_PARAMETER = "database_version"; @@ -1920,24 +1919,18 @@ void Storage::deletePost(Letter *letter) */ void Storage::syncDatabase() { - xmlDocPtr doc = xmlReadFile(DEFAULT_ITEM_FILE, NULL, 0); - if (!doc) - { - LOG_ERROR("Item Manager: Error while parsing item database (items.xml)!"); - return; - } + XML::Document doc(DEFAULT_ITEM_FILE); + xmlNodePtr rootNode = doc.rootNode(); - xmlNodePtr node = xmlDocGetRootElement(doc); - if (!node || !xmlStrEqual(node->name, BAD_CAST "items")) + if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "items")) { - LOG_ERROR("Item Manager:(items.xml) is not a valid database file!"); - xmlFreeDoc(doc); + LOG_ERROR("Item Manager: Error while parsing item database (items.xml)!"); return; } mDb->beginTransaction(); int itmCount = 0; - for (node = node->xmlChildrenNode; node != NULL; node = node->next) + for_each_xml_child_node(node, rootNode) { // Try to load the version of the item database. The version is defined // as subversion tag embedded as XML attribute. So every modification @@ -2024,7 +2017,6 @@ void Storage::syncDatabase() } mDb->commitTransaction(); - xmlFreeDoc(doc); } /** diff --git a/src/common/permissionmanager.cpp b/src/common/permissionmanager.cpp index ecfd464..549e362 100644 --- a/src/common/permissionmanager.cpp +++ b/src/common/permissionmanager.cpp @@ -18,16 +18,15 @@ * along with The Mana Server. If not, see <http://www.gnu.org/licenses/>. */ -#include <cstring> - #include "common/permissionmanager.hpp" +#include "common/resourcemanager.hpp" #include "game-server/character.hpp" -#include "game-server/resourcemanager.hpp" #include "utils/logger.h" #include "utils/xml.hpp" #include <string.h> +#include <cstring> static std::map<std::string, unsigned char> permissions; static std::map<std::string, unsigned char> aliases; diff --git a/src/game-server/resourcemanager.cpp b/src/common/resourcemanager.cpp index 3545484..c02bf7d 100644 --- a/src/game-server/resourcemanager.cpp +++ b/src/common/resourcemanager.cpp @@ -18,6 +18,12 @@ * along with The Mana Server. If not, see <http://www.gnu.org/licenses/>. */ +#include "common/resourcemanager.hpp" + +#include "common/configuration.hpp" + +#include "utils/logger.h" + #include <cstdlib> #include <cstring> @@ -31,83 +37,19 @@ #include <physfs.h> -#include "game-server/resourcemanager.hpp" - -#include "utils/logger.h" - #define PKG_DATADIR "" void ResourceManager::initialize() { PHYSFS_permitSymbolicLinks(1); - // Add the main data directory to our PhysicsFS search path - PHYSFS_addToSearchPath("data", 1); - PHYSFS_addToSearchPath(PKG_DATADIR "data", 1); -#ifdef _WIN32 - // Define the path in which to search - std::string searchString = std::string("data/*.zip"); - - // Create our find file data structure - struct _finddata_t findFileInfo; - - // Find the first zipped file - long handle = - static_cast<long>(::_findfirst(searchString.c_str(), &findFileInfo)); - long file = handle; - - // Loop until all files we're searching for are found - while (file >= 0) { - // Define the file path string - std::string filePath = std::string("data/") + - std::string(findFileInfo.name); + const std::string clientDataPath = + Configuration::getValue("clientDataPath", "example/clientdata"); + const std::string serverDataPath = + Configuration::getValue("serverDataPath", "example/serverdata"); - LOG_INFO("Adding to PhysicsFS: " << findFileInfo.name); - - // Add the zip file to our PhysicsFS search path - PHYSFS_addToSearchPath(filePath.c_str(), 1); - - // Find the next file - file = ::_findnext(handle, &findFileInfo); - } - - // Shutdown findfile stuff - ::_findclose(handle); -#else - // Retrieve the current path - char programPath[256]; - if (!getcwd(programPath, 256)) - strcpy(programPath, "."); - strncat(programPath, "/data", 256 - strlen(programPath) - 1); - - // Create our directory structure - DIR *dir = opendir(programPath); - - // Return if the directory is invalid - if (dir == NULL) { - return; - } - - struct dirent *direntry; - while ((direntry = readdir(dir)) != NULL) - { - char *ext = strstr(direntry->d_name, ".zip"); - - if (ext != NULL && strcmp(ext, ".zip") == 0) - { - // Define the file path string - std::string filePath = std::string(programPath) + - std::string("/") + std::string(direntry->d_name); - - LOG_INFO("Adding to PhysicsFS: " << filePath); - - // Add the zip file to our PhysicsFS search path - PHYSFS_addToSearchPath(filePath.c_str(), 1); - } - } - - closedir(dir); -#endif + PHYSFS_addToSearchPath(clientDataPath.c_str(), 1); + PHYSFS_addToSearchPath(serverDataPath.c_str(), 1); } bool ResourceManager::exists(const std::string &path) diff --git a/src/game-server/resourcemanager.hpp b/src/common/resourcemanager.hpp index 74c4189..74c4189 100644 --- a/src/game-server/resourcemanager.hpp +++ b/src/common/resourcemanager.hpp diff --git a/src/game-server/itemmanager.cpp b/src/game-server/itemmanager.cpp index 5c946a4..96f9c21 100644 --- a/src/game-server/itemmanager.cpp +++ b/src/game-server/itemmanager.cpp @@ -18,19 +18,18 @@ * along with The Mana Server. If not, see <http://www.gnu.org/licenses/>. */ -#include <map> -#include <set> - #include "game-server/itemmanager.hpp" #include "defines.h" +#include "common/resourcemanager.hpp" #include "game-server/item.hpp" -#include "game-server/resourcemanager.hpp" #include "game-server/skillmanager.hpp" #include "scripting/script.hpp" #include "utils/logger.h" #include "utils/xml.hpp" +#include <map> +#include <set> #include <sstream> typedef std::map< int, ItemClass * > ItemClasses; diff --git a/src/game-server/main-game.cpp b/src/game-server/main-game.cpp index 36da4c3..1e01bcb 100644 --- a/src/game-server/main-game.cpp +++ b/src/game-server/main-game.cpp @@ -37,6 +37,7 @@ #include "common/configuration.hpp" #include "common/permissionmanager.hpp" +#include "common/resourcemanager.hpp" #include "game-server/accountconnection.hpp" #include "game-server/gamehandler.hpp" #include "game-server/skillmanager.hpp" @@ -45,7 +46,6 @@ #include "game-server/monstermanager.hpp" #include "game-server/statusmanager.hpp" #include "game-server/postman.hpp" -#include "game-server/resourcemanager.hpp" #include "game-server/state.hpp" #include "net/bandwidth.hpp" #include "net/connectionhandler.hpp" diff --git a/src/game-server/mapmanager.cpp b/src/game-server/mapmanager.cpp index b27348b..ced6b58 100644 --- a/src/game-server/mapmanager.cpp +++ b/src/game-server/mapmanager.cpp @@ -18,17 +18,17 @@ * along with The Mana Server. If not, see <http://www.gnu.org/licenses/>. */ -#include <cassert> - #include "game-server/mapmanager.hpp" +#include "common/resourcemanager.hpp" #include "game-server/map.hpp" #include "game-server/mapcomposite.hpp" #include "game-server/mapreader.hpp" -#include "game-server/resourcemanager.hpp" #include "utils/logger.h" #include "utils/xml.hpp" +#include <cassert> + /** * List of all the game maps, be they present or not on this server. */ diff --git a/src/game-server/mapreader.cpp b/src/game-server/mapreader.cpp index 30e73bf..8088582 100644 --- a/src/game-server/mapreader.cpp +++ b/src/game-server/mapreader.cpp @@ -18,15 +18,13 @@ * along with The Mana Server. If not, see <http://www.gnu.org/licenses/>. */ -#include <cstring> - #include "game-server/mapreader.hpp" +#include "common/resourcemanager.hpp" #include "game-server/map.hpp" #include "game-server/mapcomposite.hpp" #include "game-server/mapmanager.hpp" #include "game-server/monstermanager.hpp" -#include "game-server/resourcemanager.hpp" #include "game-server/spawnarea.hpp" #include "game-server/trigger.hpp" #include "scripting/script.hpp" @@ -37,6 +35,8 @@ #include "utils/zlib.hpp" #include "utils/string.hpp" +#include <cstring> + static std::vector< int > tilesetFirstGids; bool MapReader::readMap(const std::string &filename, MapComposite diff --git a/src/game-server/monster.cpp b/src/game-server/monster.cpp index 5bd56cc..2489e73 100644 --- a/src/game-server/monster.cpp +++ b/src/game-server/monster.cpp @@ -21,10 +21,10 @@ #include "game-server/monster.hpp" #include "common/configuration.hpp" +#include "common/resourcemanager.hpp" #include "game-server/character.hpp" #include "game-server/collisiondetection.hpp" #include "game-server/item.hpp" -#include "game-server/resourcemanager.hpp" #include "game-server/mapcomposite.hpp" #include "game-server/state.hpp" #include "scripting/script.hpp" diff --git a/src/game-server/monstermanager.cpp b/src/game-server/monstermanager.cpp index e3beda7..af6f3a2 100644 --- a/src/game-server/monstermanager.cpp +++ b/src/game-server/monstermanager.cpp @@ -18,16 +18,16 @@ * along with The Mana Server. If not, see <http://www.gnu.org/licenses/>. */ -#include <map> - #include "game-server/monstermanager.hpp" +#include "common/resourcemanager.hpp" #include "game-server/itemmanager.hpp" #include "game-server/monster.hpp" -#include "game-server/resourcemanager.hpp" #include "utils/logger.h" #include "utils/xml.hpp" +#include <map> + typedef std::map< int, MonsterClass * > MonsterClasses; static MonsterClasses monsterClasses; /**< Monster reference */ static std::string monsterReferenceFile; diff --git a/src/game-server/skillmanager.cpp b/src/game-server/skillmanager.cpp index c4a18e5..ea29e58 100644 --- a/src/game-server/skillmanager.cpp +++ b/src/game-server/skillmanager.cpp @@ -20,7 +20,7 @@ #include "game-server/skillmanager.hpp" -#include "game-server/resourcemanager.hpp" +#include "common/resourcemanager.hpp" #include "utils/string.hpp" // for the toupper function #include "utils/logger.h" #include "utils/xml.hpp" diff --git a/src/game-server/statusmanager.cpp b/src/game-server/statusmanager.cpp index 3472ae7..173996d 100644 --- a/src/game-server/statusmanager.cpp +++ b/src/game-server/statusmanager.cpp @@ -18,17 +18,16 @@ * along with The Mana Server. If not, see <http://www.gnu.org/licenses/>. */ -#include <map> -#include <set> - #include "game-server/statusmanager.hpp" +#include "common/resourcemanager.hpp" #include "game-server/statuseffect.hpp" -#include "game-server/resourcemanager.hpp" #include "scripting/script.hpp" #include "utils/logger.h" #include "utils/xml.hpp" +#include <map> +#include <set> #include <sstream> typedef std::map< int, StatusEffect * > StatusEffects; diff --git a/src/scripting/script.cpp b/src/scripting/script.cpp index 39a0404..01d237f 100644 --- a/src/scripting/script.cpp +++ b/src/scripting/script.cpp @@ -18,15 +18,15 @@ * along with The Mana Server. If not, see <http://www.gnu.org/licenses/>. */ -#include <cstdlib> -#include <map> - #include "scripting/script.hpp" +#include "common/resourcemanager.hpp" #include "game-server/being.hpp" -#include "game-server/resourcemanager.hpp" #include "utils/logger.h" +#include <cstdlib> +#include <map> + typedef std::map< std::string, Script::Factory > Engines; static Engines *engines = NULL; diff --git a/src/utils/xml.cpp b/src/utils/xml.cpp index ab9ba77..659f928 100644 --- a/src/utils/xml.cpp +++ b/src/utils/xml.cpp @@ -1,6 +1,7 @@ /* - * The Mana Server - * Copyright (C) 2006-2010 The Mana World Development Team + * XML utility functions + * Copyright (C) 2004-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers * * This file is part of The Mana Server. * @@ -18,47 +19,132 @@ * along with The Mana Server. If not, see <http://www.gnu.org/licenses/>. */ -#include <cstdlib> - #include "utils/xml.hpp" +#include "common/resourcemanager.hpp" +#include "utils/logger.h" + +#include <iostream> +#include <fstream> + namespace XML { + Document::Document(const std::string &filename, bool useResman): + mDoc(0) + { + int size; + char *data = NULL; + if (useResman) + { + data = ResourceManager::loadFile(filename, size); + } + else + { + std::ifstream file; + file.open(filename.c_str(), std::ios::in); -int getProperty(xmlNodePtr node, const char *name, int def) -{ - if (xmlChar *prop = xmlGetProp(node, BAD_CAST name)) + if (file.is_open()) + { + // Get length of file + file.seekg(0, std::ios::end); + size = file.tellg(); + file.seekg(0, std::ios::beg); + + data = (char*) malloc(size); + + file.read(data, size); + file.close(); + } + else + { + LOG_ERROR("(XML::Document) Error loading XML file: " + << filename); + } + } + + if (data) + { + mDoc = xmlParseMemory(data, size); + free(data); + + if (!mDoc) + { + LOG_ERROR("(XML::Document) Error parsing XML file: " + << filename); + } + } + else + { + LOG_ERROR("(XML::Document) Error loading XML file: " + << filename); + } + } + + Document::Document(const char *data, int size) + { + mDoc = xmlParseMemory(data, size); + } + + Document::~Document() { - int ret = atoi((char*)prop); - xmlFree(prop); + if (mDoc) + xmlFreeDoc(mDoc); + } + + xmlNodePtr Document::rootNode() + { + return mDoc ? xmlDocGetRootElement(mDoc) : 0; + } + + int getProperty(xmlNodePtr node, const char *name, int def) + { + int &ret = def; + + xmlChar *prop = xmlGetProp(node, BAD_CAST name); + if (prop) + { + ret = atoi((char*) prop); + xmlFree(prop); + } + return ret; } - return def; -} -double getFloatProperty(xmlNodePtr node, const char* name, double def) -{ - double &ret = def; + double getFloatProperty(xmlNodePtr node, const char *name, double def) + { + double &ret = def; - xmlChar *prop = xmlGetProp(node, BAD_CAST name); - if (prop) { - ret = atof((char*)prop); - xmlFree(prop); + xmlChar *prop = xmlGetProp(node, BAD_CAST name); + if (prop) + { + ret = atof((char*) prop); + xmlFree(prop); + } + + return ret; } - return ret; -} + std::string getProperty(xmlNodePtr node, const char *name, + const std::string &def) + { + xmlChar *prop = xmlGetProp(node, BAD_CAST name); + if (prop) + { + std::string val = (char*) prop; + xmlFree(prop); + return val; + } -std::string getProperty(xmlNodePtr node, const char *name, - const std::string &def) -{ - if (xmlChar *prop = xmlGetProp(node, BAD_CAST name)) + return def; + } + + xmlNodePtr findFirstChildByName(xmlNodePtr parent, const char *name) { - std::string val = (char *)prop; - xmlFree(prop); - return val; + for_each_xml_child_node(child, parent) + if (xmlStrEqual(child->name, BAD_CAST name)) + return child; + + return NULL; } - return def; -} } // namespace XML diff --git a/src/utils/xml.hpp b/src/utils/xml.hpp index e6b618c..ee37b48 100644 --- a/src/utils/xml.hpp +++ b/src/utils/xml.hpp @@ -1,6 +1,7 @@ /* - * The Mana Server - * Copyright (C) 2004-2010 The Mana World Development Team + * XML utility functions + * Copyright (C) 2004-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers * * This file is part of The Mana Server. * @@ -18,34 +19,79 @@ * along with The Mana Server. If not, see <http://www.gnu.org/licenses/>. */ + #ifndef XML_H #define XML_H -#include <string> #include <libxml/tree.h> -#include "game-server/item.hpp" +#include <string> +/** + * XML helper functions. + */ namespace XML { /** + * A helper class for parsing an XML document, which also cleans it up + * again (RAII). + */ + class Document + { + public: + /** + * Constructor that attempts to load the given file through the + * resource manager. Logs errors. + */ + Document(const std::string &filename, bool useResman = true); + + /** + * Constructor that attempts to load an XML document from memory. + * Does not log errors. + * + * @param data the string to parse as XML + * @param size the length of the string in bytes + */ + Document(const char *data, int size); + + /** + * Destructor. Frees the loaded XML file. + */ + ~Document(); + + /** + * Returns the root node of the document (or NULL if there was a + * load error). + */ + xmlNodePtr rootNode(); + + private: + xmlDocPtr mDoc; + }; + + /** * Gets an integer property from an xmlNodePtr. */ int getProperty(xmlNodePtr node, const char *name, int def); /** + * Gets an floating point property from an xmlNodePtr. + */ + double getFloatProperty(xmlNodePtr node, const char *name, double def); + + /** * Gets a string property from an xmlNodePtr. */ std::string getProperty(xmlNodePtr node, const char *name, const std::string &def); /** - * Gets an floating point property from an xmlNodePtr. + * Finds the first child node with the given name */ - double getFloatProperty(xmlNodePtr node, const char *name, double def); + xmlNodePtr findFirstChildByName(xmlNodePtr parent, const char *name); } #define for_each_xml_child_node(var, parent) \ for (xmlNodePtr var = parent->xmlChildrenNode; var; var = var->next) -#endif +#endif // XML_H |