From c3e9fbfc9a92e5d75a0d1002cfba48947718dc4d Mon Sep 17 00:00:00 2001 From: Yohann Ferreira Date: Tue, 3 Aug 2010 18:13:17 +0200 Subject: Changed the stats.xml to attributes.xml according to the server commit. Also, fixed a compilation warning about passing a NULL value to a boolean parameter. The built-ins are kept for now. Reviewed-by: Jaxad0127. --- src/net/manaserv/network.cpp | 4 ++-- src/net/manaserv/stats.cpp | 12 ++++++++---- src/net/tmwa/gamehandler.cpp | 3 ++- 3 files changed, 12 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/net/manaserv/network.cpp b/src/net/manaserv/network.cpp index 4b9751d7..636585c9 100644 --- a/src/net/manaserv/network.cpp +++ b/src/net/manaserv/network.cpp @@ -73,7 +73,7 @@ void finalize() if (connections) { logger->error("Tried to shutdown the network subsystem while there " - "are network connections left!"); + "are network connections left!"); } clearNetworkHandlers(); @@ -85,7 +85,7 @@ Connection *getConnection() if (!client) { logger->error("Tried to instantiate a network object before " - "initializing the network subsystem!"); + "initializing the network subsystem!"); } return new Connection(client); diff --git a/src/net/manaserv/stats.cpp b/src/net/manaserv/stats.cpp index f109a232..ece0e72a 100644 --- a/src/net/manaserv/stats.cpp +++ b/src/net/manaserv/stats.cpp @@ -32,6 +32,8 @@ #include #include +#define DEFAULT_ATTRIBUTESDB_FILE "attributes.xml" + namespace ManaServ { namespace Stats { typedef struct { @@ -123,12 +125,13 @@ namespace Stats { void load() { - XML::Document doc("stats.xml"); + XML::Document doc(DEFAULT_ATTRIBUTESDB_FILE); xmlNodePtr rootNode = doc.rootNode(); if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "stats")) { - logger->log("Stats: Error while loading stats.xml!"); + logger->log("Stats: Error while loading " + DEFAULT_ATTRIBUTESDB_FILE ". Using Built-ins."); loadBuiltins(); return; } @@ -142,7 +145,8 @@ namespace Stats { if (id == 0) { - logger->log("Stats: Invalid or missing stat ID in stats.xml!"); + logger->log("Stats: Invalid or missing stat ID in " + DEFAULT_ATTRIBUTESDB_FILE "!"); continue; } else if (stats.find(id) != stats.end()) @@ -155,7 +159,7 @@ namespace Stats { if (name.empty()) { logger->log("Stats: Invalid or missing stat name in " - "stats.xml!"); + DEFAULT_ATTRIBUTESDB_FILE "!"); continue; } diff --git a/src/net/tmwa/gamehandler.cpp b/src/net/tmwa/gamehandler.cpp index 179d98e4..435d5d30 100644 --- a/src/net/tmwa/gamehandler.cpp +++ b/src/net/tmwa/gamehandler.cpp @@ -98,7 +98,8 @@ void GameHandler::handleMessage(Net::MessageIn &msg) case SMSG_MAP_QUIT_RESPONSE: if (msg.readInt8()) { - new OkDialog(_("Game"), _("Request to quit denied!"), NULL); + new OkDialog(_("Game"), _("Request to quit denied!"), false, + NULL); } break; } -- cgit v1.2.3-70-g09d2 From 6d315d0e61f419636021476582a49ab0b1f1b5e9 Mon Sep 17 00:00:00 2001 From: Jared Adams Date: Thu, 5 Aug 2010 16:28:30 -0600 Subject: Add better XML error logging and do some related cleanup Error details from libxml2 are no longer ignored and are properly logged now. XML initialization code is now in the XML namespace. The XML::Document constructor that took a data pointer was removed because it wasn't being used and it would make the new logging less useful (no filename). Signed-off-by: Chuck Miller --- src/main.cpp | 23 +++-------------------- src/utils/xml.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- src/utils/xml.h | 14 +++++--------- 3 files changed, 54 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/main.cpp b/src/main.cpp index 56019976..29713c27 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,11 +21,10 @@ #include "main.h" -#include "utils/gettext.h" - #include "client.h" -#include +#include "utils/gettext.h" +#include "utils/xml.h" #include #include @@ -178,22 +177,6 @@ static void initInternationalization() #endif } -static void xmlNullLogger(void *ctx, const char *msg, ...) -{ - // Does nothing, that's the whole point of it -} - -// Initialize libxml2 and check for potential ABI mismatches between -// compiled version and the shared library actually used. -static void initXML() -{ - xmlInitParser(); - LIBXML_TEST_VERSION; - - // Suppress libxml2 error messages - xmlSetGenericErrorFunc(NULL, xmlNullLogger); -} - int main(int argc, char *argv[]) { @@ -227,7 +210,7 @@ int main(int argc, char *argv[]) } atexit((void(*)()) PHYSFS_deinit); - initXML(); + XML::init(); Client client(options); return client.exec(); diff --git a/src/utils/xml.cpp b/src/utils/xml.cpp index 341f34c0..8d444fab 100644 --- a/src/utils/xml.cpp +++ b/src/utils/xml.cpp @@ -25,14 +25,30 @@ #include "resources/resourcemanager.h" -#include +#include +#include + #include +#include namespace XML { + static void xmlLogger(void *ctx, xmlErrorPtr error); + + struct XMLContext + { + std::string file; + bool resman; + }; + Document::Document(const std::string &filename, bool useResman): mDoc(0) { + XMLContext *ctx = new XMLContext(); + ctx->file = filename; + ctx->resman = useResman; + xmlSetStructuredErrorFunc(ctx, xmlLogger); + int size; char *data = NULL; if (useResman) @@ -75,11 +91,8 @@ namespace XML { logger->log("Error loading %s", filename.c_str()); } - } - Document::Document(const char *data, int size) - { - mDoc = xmlParseMemory(data, size); + xmlSetStructuredErrorFunc(NULL, xmlLogger); } Document::~Document() @@ -144,4 +157,32 @@ namespace XML return NULL; } + static void xmlLogger(void *ctx, xmlErrorPtr error) + { + XMLContext *context = static_cast(ctx); + + if (context) + logger->log("Error in XML file '%s' on line %d", + context->file.c_str(), error->line); + else + logger->log("Error in unknown xml file on line %d", + error->line); + + logger->log(error->message); + + // No need to keep errors around + xmlCtxtResetLastError(error->ctxt); + } + + void init() + { + // Initialize libxml2 and check for potential ABI mismatches between + // compiled version and the shared library actually used. + xmlInitParser(); + LIBXML_TEST_VERSION; + + // Handle libxml2 error messages + xmlSetStructuredErrorFunc(NULL, xmlLogger); + } + } // namespace XML diff --git a/src/utils/xml.h b/src/utils/xml.h index 72745501..8ffecb76 100644 --- a/src/utils/xml.h +++ b/src/utils/xml.h @@ -44,15 +44,6 @@ namespace XML */ 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. */ @@ -88,6 +79,11 @@ namespace XML * Finds the first child node with the given name */ xmlNodePtr findFirstChildByName(xmlNodePtr parent, const char *name); + + /** + * Initializes the XML engine. + */ + void init(); } #define for_each_xml_child_node(var, parent) \ -- cgit v1.2.3-70-g09d2 From 8eadc834ed3e8439836f7dc87390a56a1164ec11 Mon Sep 17 00:00:00 2001 From: Jared Adams Date: Fri, 13 Aug 2010 14:45:52 -0600 Subject: Simplify handling of compressed files ResourceManager will now check for ".gz" and act appropriately (unless told not to). Compression handling functions are now in new utils/zlib files, along with a function to load a file from drive, uncompressing it if it ends in ".gz". Reviewed-by: Freeyorp --- mana.cbp | 2 + mana.files | 99 ++++++++++---------- src/CMakeLists.txt | 2 + src/Makefile.am | 2 + src/resources/mapreader.cpp | 142 +---------------------------- src/resources/resourcemanager.cpp | 45 ++++++++-- src/resources/resourcemanager.h | 9 +- src/utils/xml.cpp | 25 +----- src/utils/zlib.cpp | 184 ++++++++++++++++++++++++++++++++++++++ src/utils/zlib.h | 48 ++++++++++ 10 files changed, 338 insertions(+), 220 deletions(-) create mode 100644 src/utils/zlib.cpp create mode 100644 src/utils/zlib.h (limited to 'src') diff --git a/mana.cbp b/mana.cbp index cc12f237..0f6e06c1 100644 --- a/mana.cbp +++ b/mana.cbp @@ -592,6 +592,8 @@ + + diff --git a/mana.files b/mana.files index 1a6026f3..e4547905 100644 --- a/mana.files +++ b/mana.files @@ -12,6 +12,9 @@ ./data/graphics/images/CMakeLists.txt ./data/graphics/images/Makefile.am ./data/graphics/Makefile.am +./data/graphics/sprites/CMakeLists.txt +./data/graphics/sprites/error.xml +./data/graphics/sprites/Makefile.am ./data/help/about.txt ./data/help/changes.txt ./data/help/CMakeLists.txt @@ -310,52 +313,6 @@ ./src/net/chathandler.h ./src/net/download.cpp ./src/net/download.h -./src/net/tmwa/adminhandler.cpp -./src/net/tmwa/adminhandler.h -./src/net/tmwa/beinghandler.cpp -./src/net/tmwa/beinghandler.h -./src/net/tmwa/buysellhandler.cpp -./src/net/tmwa/buysellhandler.h -./src/net/tmwa/charserverhandler.cpp -./src/net/tmwa/charserverhandler.h -./src/net/tmwa/chathandler.cpp -./src/net/tmwa/chathandler.h -./src/net/tmwa/gamehandler.cpp -./src/net/tmwa/gamehandler.h -./src/net/tmwa/generalhandler.cpp -./src/net/tmwa/generalhandler.h -./src/net/tmwa/gui/guildtab.cpp -./src/net/tmwa/gui/guildtab.h -./src/net/tmwa/guildhandler.cpp -./src/net/tmwa/guildhandler.h -./src/net/tmwa/gui/partytab.cpp -./src/net/tmwa/gui/partytab.h -./src/net/tmwa/inventoryhandler.cpp -./src/net/tmwa/inventoryhandler.h -./src/net/tmwa/itemhandler.cpp -./src/net/tmwa/itemhandler.h -./src/net/tmwa/loginhandler.cpp -./src/net/tmwa/loginhandler.h -./src/net/tmwa/messagehandler.cpp -./src/net/tmwa/messagehandler.h -./src/net/tmwa/messagein.cpp -./src/net/tmwa/messagein.h -./src/net/tmwa/messageout.cpp -./src/net/tmwa/messageout.h -./src/net/tmwa/network.cpp -./src/net/tmwa/network.h -./src/net/tmwa/npchandler.cpp -./src/net/tmwa/npchandler.h -./src/net/tmwa/partyhandler.cpp -./src/net/tmwa/partyhandler.h -./src/net/tmwa/playerhandler.cpp -./src/net/tmwa/playerhandler.h -./src/net/tmwa/protocol.h -./src/net/tmwa/specialhandler.cpp -./src/net/tmwa/specialhandler.h -./src/net/tmwa/token.h -./src/net/tmwa/tradehandler.cpp -./src/net/tmwa/tradehandler.h ./src/net/gamehandler.h ./src/net/generalhandler.h ./src/net/guildhandler.h @@ -423,6 +380,52 @@ ./src/net/playerhandler.h ./src/net/serverinfo.h ./src/net/specialhandler.h +./src/net/tmwa/adminhandler.cpp +./src/net/tmwa/adminhandler.h +./src/net/tmwa/beinghandler.cpp +./src/net/tmwa/beinghandler.h +./src/net/tmwa/buysellhandler.cpp +./src/net/tmwa/buysellhandler.h +./src/net/tmwa/charserverhandler.cpp +./src/net/tmwa/charserverhandler.h +./src/net/tmwa/chathandler.cpp +./src/net/tmwa/chathandler.h +./src/net/tmwa/gamehandler.cpp +./src/net/tmwa/gamehandler.h +./src/net/tmwa/generalhandler.cpp +./src/net/tmwa/generalhandler.h +./src/net/tmwa/gui/guildtab.cpp +./src/net/tmwa/gui/guildtab.h +./src/net/tmwa/guildhandler.cpp +./src/net/tmwa/guildhandler.h +./src/net/tmwa/gui/partytab.cpp +./src/net/tmwa/gui/partytab.h +./src/net/tmwa/inventoryhandler.cpp +./src/net/tmwa/inventoryhandler.h +./src/net/tmwa/itemhandler.cpp +./src/net/tmwa/itemhandler.h +./src/net/tmwa/loginhandler.cpp +./src/net/tmwa/loginhandler.h +./src/net/tmwa/messagehandler.cpp +./src/net/tmwa/messagehandler.h +./src/net/tmwa/messagein.cpp +./src/net/tmwa/messagein.h +./src/net/tmwa/messageout.cpp +./src/net/tmwa/messageout.h +./src/net/tmwa/network.cpp +./src/net/tmwa/network.h +./src/net/tmwa/npchandler.cpp +./src/net/tmwa/npchandler.h +./src/net/tmwa/partyhandler.cpp +./src/net/tmwa/partyhandler.h +./src/net/tmwa/playerhandler.cpp +./src/net/tmwa/playerhandler.h +./src/net/tmwa/protocol.h +./src/net/tmwa/specialhandler.cpp +./src/net/tmwa/specialhandler.h +./src/net/tmwa/token.h +./src/net/tmwa/tradehandler.cpp +./src/net/tmwa/tradehandler.h ./src/net/tradehandler.h ./src/net/worldinfo.h ./src/npc.cpp @@ -531,9 +534,13 @@ ./src/utils/stringutils.h ./src/utils/xml.cpp ./src/utils/xml.h +./src/utils/zlib.cpp +./src/utils/zlib.h ./src/vector.cpp ./src/vector.h ./src/winver.h +./tools/dyecmd/CMakeLists.txt +./tools/dyecmd/src/CMakeLists.txt ./tools/dyecmd/src/dyecmd.cpp ./tools/dyecmd/src/dye.cpp ./tools/dyecmd/src/dye.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9b38b496..6c470aef 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -402,6 +402,8 @@ SET(SRCS utils/mkdir.h utils/xml.cpp utils/xml.h + utils/zlib.cpp + utils/zlib.h animatedsprite.cpp animatedsprite.h animationparticle.cpp diff --git a/src/Makefile.am b/src/Makefile.am index d12a9a56..1f2391a8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -301,6 +301,8 @@ mana_SOURCES = gui/widgets/avatarlistbox.cpp \ utils/mutex.h \ utils/xml.cpp \ utils/xml.h \ + utils/zlib.cpp \ + utils/zlib.h \ animatedsprite.cpp \ animatedsprite.h \ animationparticle.cpp \ diff --git a/src/resources/mapreader.cpp b/src/resources/mapreader.cpp index a8582c9b..b7c4fd72 100644 --- a/src/resources/mapreader.cpp +++ b/src/resources/mapreader.cpp @@ -33,10 +33,9 @@ #include "utils/base64.h" #include "utils/stringutils.h" #include "utils/xml.h" +#include "utils/zlib.h" -#include #include -#include // DO NOT CHANGE THESE STRINGS TO BE PASSED BY REFERENCE, AS THIS METHOD ALTERS // (THAT IS, DESTROYS) THEM. @@ -66,149 +65,12 @@ static std::string resolveRelativePath(std::string base, std::string relative) return base + relative; } -/** - * Inflates either zlib or gzip deflated memory. The inflated memory is - * expected to be freed by the caller. - */ -int inflateMemory(unsigned char *in, unsigned int inLength, - unsigned char *&out, unsigned int &outLength) -{ - int bufferSize = 256 * 1024; - int ret; - z_stream strm; - - out = (unsigned char*) malloc(bufferSize); - - strm.zalloc = Z_NULL; - strm.zfree = Z_NULL; - strm.opaque = Z_NULL; - strm.next_in = in; - strm.avail_in = inLength; - strm.next_out = out; - strm.avail_out = bufferSize; - - ret = inflateInit2(&strm, 15 + 32); - - if (ret != Z_OK) - return ret; - - do - { - if (strm.next_out == NULL) - { - inflateEnd(&strm); - return Z_MEM_ERROR; - } - - ret = inflate(&strm, Z_NO_FLUSH); - assert(ret != Z_STREAM_ERROR); - - switch (ret) - { - case Z_NEED_DICT: - ret = Z_DATA_ERROR; - case Z_DATA_ERROR: - case Z_MEM_ERROR: - (void) inflateEnd(&strm); - return ret; - } - - if (ret != Z_STREAM_END) - { - out = (unsigned char*) realloc(out, bufferSize * 2); - - if (out == NULL) - { - inflateEnd(&strm); - return Z_MEM_ERROR; - } - - strm.next_out = out + bufferSize; - strm.avail_out = bufferSize; - bufferSize *= 2; - } - } - while (ret != Z_STREAM_END); - assert(strm.avail_in == 0); - - outLength = bufferSize - strm.avail_out; - (void) inflateEnd(&strm); - return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; -} - -int inflateMemory(unsigned char *in, unsigned int inLength, - unsigned char *&out) -{ - unsigned int outLength = 0; - int ret = inflateMemory(in, inLength, out, outLength); - - if (ret != Z_OK || out == NULL) - { - if (ret == Z_MEM_ERROR) - { - logger->log("Error: Out of memory while decompressing map data!"); - } - else if (ret == Z_VERSION_ERROR) - { - logger->log("Error: Incompatible zlib version!"); - } - else if (ret == Z_DATA_ERROR) - { - logger->log("Error: Incorrect zlib compressed data!"); - } - else - { - logger->log("Error: Unknown error while decompressing map data!"); - } - - free(out); - out = NULL; - outLength = 0; - } - - return outLength; -} - Map *MapReader::readMap(const std::string &filename) { logger->log("Attempting to read map %s", filename.c_str()); - // Load the file through resource manager - ResourceManager *resman = ResourceManager::getInstance(); - int fileSize; - void *buffer = resman->loadFile(filename, fileSize); Map *map = NULL; - if (buffer == NULL) - { - logger->log("Map file not found (%s)", filename.c_str()); - return NULL; - } - - unsigned char *inflated; - unsigned int inflatedSize; - - if (filename.find(".gz", filename.length() - 3) != std::string::npos) - { - // Inflate the gzipped map data - inflatedSize = - inflateMemory((unsigned char*) buffer, fileSize, inflated); - free(buffer); - - if (inflated == NULL) - { - logger->log("Could not decompress map file (%s)", - filename.c_str()); - return NULL; - } - } - else - { - inflated = (unsigned char*) buffer; - inflatedSize = fileSize; - } - - XML::Document doc((char*) inflated, inflatedSize); - free(inflated); + XML::Document doc(filename); xmlNodePtr node = doc.rootNode(); diff --git a/src/resources/resourcemanager.cpp b/src/resources/resourcemanager.cpp index f785f20a..c63b626e 100644 --- a/src/resources/resourcemanager.cpp +++ b/src/resources/resourcemanager.cpp @@ -31,6 +31,8 @@ #include "resources/soundeffect.h" #include "resources/spritedef.h" +#include "utils/zlib.h" + #include #include @@ -411,34 +413,59 @@ void ResourceManager::deleteInstance() instance = NULL; } -void *ResourceManager::loadFile(const std::string &fileName, int &fileSize) +void *ResourceManager::loadFile(const std::string &filename, int &filesize, + bool inflate) { // Attempt to open the specified file using PhysicsFS - PHYSFS_file *file = PHYSFS_openRead(fileName.c_str()); + PHYSFS_file *file = PHYSFS_openRead(filename.c_str()); // If the handler is an invalid pointer indicate failure if (file == NULL) { logger->log("Warning: Failed to load %s: %s", - fileName.c_str(), PHYSFS_getLastError()); + filename.c_str(), PHYSFS_getLastError()); return NULL; } // Log the real dir of the file - logger->log("Loaded %s/%s", PHYSFS_getRealDir(fileName.c_str()), - fileName.c_str()); + logger->log("Loaded %s/%s", PHYSFS_getRealDir(filename.c_str()), + filename.c_str()); // Get the size of the file - fileSize = PHYSFS_fileLength(file); + filesize = PHYSFS_fileLength(file); // Allocate memory and load the file - void *buffer = malloc(fileSize); - PHYSFS_read(file, buffer, 1, fileSize); + void *buffer = malloc(filesize); + PHYSFS_read(file, buffer, 1, filesize); // Close the file and let the user deallocate the memory PHYSFS_close(file); - return buffer; + unsigned char *inflated; + unsigned int inflatedSize; + + if (inflate && filename.find(".gz", filename.length() - 3) + != std::string::npos) + { + // Inflate the gzipped map data + inflatedSize = + inflateMemory((unsigned char*) buffer, filesize, inflated); + free(buffer); + + if (inflated == NULL) + { + logger->log("Could not decompress file: %s", + filename.c_str()); + return NULL; + } + + filesize = inflatedSize; + return inflated; + } + else + { + return buffer; + } } bool ResourceManager::copyFile(const std::string &src, const std::string &dst) diff --git a/src/resources/resourcemanager.h b/src/resources/resourcemanager.h index e1aed521..28ab4725 100644 --- a/src/resources/resourcemanager.h +++ b/src/resources/resourcemanager.h @@ -183,13 +183,16 @@ class ResourceManager * Allocates data into a buffer pointer for raw data loading. The * returned data is expected to be freed using free(). * - * @param fileName The name of the file to be loaded. - * @param fileSize The size of the file that was loaded. + * @param filename The name of the file to be loaded. + * @param filesize The size of the file that was loaded. + * @param inflate True to uncompress the file if the filename ends in + * ".gz", false to ignore that. * * @return An allocated byte array containing the data that was loaded, * or NULL on fail. */ - void *loadFile(const std::string &fileName, int &fileSize); + void *loadFile(const std::string &filename, int &filesize, + bool inflate = true); /** * Retrieves the contents of a text file. diff --git a/src/utils/xml.cpp b/src/utils/xml.cpp index 8d444fab..9835f88c 100644 --- a/src/utils/xml.cpp +++ b/src/utils/xml.cpp @@ -25,12 +25,11 @@ #include "resources/resourcemanager.h" +#include "utils/zlib.h" + #include #include -#include -#include - namespace XML { static void xmlLogger(void *ctx, xmlErrorPtr error); @@ -58,25 +57,7 @@ namespace XML } else { - std::ifstream file; - file.open(filename.c_str(), std::ios::in); - - 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 - { - logger->log("Error loading XML file %s", filename.c_str()); - } + data = (char *) loadCompressedFile(filename, size); } if (data) diff --git a/src/utils/zlib.cpp b/src/utils/zlib.cpp new file mode 100644 index 00000000..8e2a1795 --- /dev/null +++ b/src/utils/zlib.cpp @@ -0,0 +1,184 @@ +/* + * The Mana Client + * Copyright (C) 2004-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * + * This file is part of The Mana Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "utils/zlib.h" + +#include "log.h" + +#include +#include +#include +#include +#include + +/** + * Inflates either zlib or gzip deflated memory. The inflated memory is + * expected to be freed by the caller. + */ +int inflateMemory(unsigned char *in, unsigned int inLength, + unsigned char *&out, unsigned int &outLength) +{ + int bufferSize = 256 * 1024; + int ret; + z_stream strm; + + out = (unsigned char*) malloc(bufferSize); + + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.next_in = in; + strm.avail_in = inLength; + strm.next_out = out; + strm.avail_out = bufferSize; + + ret = inflateInit2(&strm, 15 + 32); + + if (ret != Z_OK) + return ret; + + do + { + if (strm.next_out == NULL) + { + inflateEnd(&strm); + return Z_MEM_ERROR; + } + + ret = inflate(&strm, Z_NO_FLUSH); + assert(ret != Z_STREAM_ERROR); + + switch (ret) + { + case Z_NEED_DICT: + ret = Z_DATA_ERROR; + case Z_DATA_ERROR: + case Z_MEM_ERROR: + (void) inflateEnd(&strm); + return ret; + } + + if (ret != Z_STREAM_END) + { + out = (unsigned char*) realloc(out, bufferSize * 2); + + if (out == NULL) + { + inflateEnd(&strm); + return Z_MEM_ERROR; + } + + strm.next_out = out + bufferSize; + strm.avail_out = bufferSize; + bufferSize *= 2; + } + } + while (ret != Z_STREAM_END); + assert(strm.avail_in == 0); + + outLength = bufferSize - strm.avail_out; + (void) inflateEnd(&strm); + return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; +} + +int inflateMemory(unsigned char *in, unsigned int inLength, + unsigned char *&out) +{ + unsigned int outLength = 0; + int ret = inflateMemory(in, inLength, out, outLength); + + if (ret != Z_OK || out == NULL) + { + if (ret == Z_MEM_ERROR) + { + logger->log("Error: Out of memory while decompressing data!"); + } + else if (ret == Z_VERSION_ERROR) + { + logger->log("Error: Incompatible zlib version!"); + } + else if (ret == Z_DATA_ERROR) + { + logger->log("Error: Incorrect zlib compressed data!"); + } + else + { + logger->log("Error: Unknown error while decompressing data!"); + } + + free(out); + out = NULL; + outLength = 0; + } + + return outLength; +} + +void *loadCompressedFile(const std::string &filename, int &filesize) +{ + std::ifstream file; + file.open(filename.c_str(), std::ios::in); + + if (file.is_open()) + { + // Get length of file + file.seekg (0, std::ios::end); + filesize = file.tellg(); + file.seekg(0, std::ios::beg); + + char *buffer = (char *) malloc(filesize); + + file.read(buffer, filesize); + file.close(); + + unsigned char *inflated; + unsigned int inflatedSize; + + if (inflated && filename.find(".gz", filename.length() - 3) + != std::string::npos) + { + // Inflate the gzipped map data + inflatedSize = + inflateMemory((unsigned char*) buffer, filesize, inflated); + free(buffer); + + if (inflated == NULL) + { + logger->log("Could not decompress file: %s", + filename.c_str()); + return NULL; + } + + filesize = inflatedSize; + return inflated; + } + else + { + return buffer; + } + } + else + { + logger->log("Error loading file from drive: %s", filename.c_str()); + } + + return NULL; +} diff --git a/src/utils/zlib.h b/src/utils/zlib.h new file mode 100644 index 00000000..003e64b6 --- /dev/null +++ b/src/utils/zlib.h @@ -0,0 +1,48 @@ +/* + * The Mana Client + * Copyright (C) 2007-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * + * This file is part of The Mana Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef UTILS_ZLIB_H +#define UTILS_ZLIB_H + +#include + +/** + * Inflates either zlib or gzip deflated memory. The inflated memory is + * expected to be freed by the caller. + */ +int inflateMemory(unsigned char *in, unsigned int inLength, + unsigned char *&out, unsigned int &outLength); + +int inflateMemory(unsigned char *in, unsigned int inLength, + unsigned char *&out); + +/** + * Loads the given file from the filesystem, uncompressing if it ends in ".gz". + * + * @param filename The name of the file to be loaded and uncompressed + * @param filesize The size of the file that was loaded and uncompressed. + * + * @return An allocated byte array containing the data that was loaded and + * uncompressed, or NULL on fail. + */ +void *loadCompressedFile(const std::string &filename, int &filesize); + +#endif // UTILS_ZLIB_H -- cgit v1.2.3-70-g09d2 From 07d6c28b6cbd83a73b0613bffe67be90a86d58ca Mon Sep 17 00:00:00 2001 From: Jared Adams Date: Wed, 14 Jul 2010 09:21:17 -0600 Subject: Add code to change gameservers to manaserv netcode Reviewed-by: Freeyorp --- src/net/manaserv/gamehandler.cpp | 10 ++++++++-- src/net/manaserv/playerhandler.cpp | 17 +++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/net/manaserv/gamehandler.cpp b/src/net/manaserv/gamehandler.cpp index 271fff15..5e29a896 100644 --- a/src/net/manaserv/gamehandler.cpp +++ b/src/net/manaserv/gamehandler.cpp @@ -94,7 +94,10 @@ void GameHandler::handleMessage(Net::MessageIn &msg) void GameHandler::connect() { gameServerConnection->connect(gameServer.hostname, gameServer.port); - chatServerConnection->connect(chatServer.hostname, chatServer.port); + + // Will already be connected if we just changed gameservers + if (!chatServerConnection->isConnected()) + chatServerConnection->connect(chatServer.hostname, chatServer.port); } bool GameHandler::isConnected() @@ -106,7 +109,10 @@ bool GameHandler::isConnected() void GameHandler::disconnect() { gameServerConnection->disconnect(); - chatHandler->disconnect(); + + // No need if we're just changing gameservers + if (Client::getState() != STATE_CHANGE_MAP) + chatHandler->disconnect(); } void GameHandler::inGame() diff --git a/src/net/manaserv/playerhandler.cpp b/src/net/manaserv/playerhandler.cpp index 2347fee2..33367927 100644 --- a/src/net/manaserv/playerhandler.cpp +++ b/src/net/manaserv/playerhandler.cpp @@ -56,6 +56,10 @@ extern Net::PlayerHandler *playerHandler; namespace ManaServ { +extern Connection *gameServerConnection; +extern std::string netToken; +extern ServerInfo gameServer; + void RespawnRequestListener::action(const gcn::ActionEvent &event) { Net::getPlayerHandler()->respawn(); @@ -65,8 +69,6 @@ void RespawnRequestListener::action(const gcn::ActionEvent &event) handler->clearDialogs(); } -extern Connection *gameServerConnection; - PlayerHandler::PlayerHandler() { static const Uint16 _messages[] = { @@ -94,11 +96,18 @@ void PlayerHandler::handleMessage(Net::MessageIn &msg) break; case GPMSG_PLAYER_SERVER_CHANGE: - { // TODO: Implement reconnecting to another game server - std::string token = msg.readString(32); + { // TODO: Fix the servers to test this + netToken = msg.readString(32); std::string address = msg.readString(); int port = msg.readInt16(); logger->log("Changing server to %s:%d", address.c_str(), port); + + gameServer.hostname = address; + gameServer.port = port; + + gameServerConnection->disconnect(); + Client::setState(STATE_CHANGE_MAP); + player_node->setMap(0); } break; case GPMSG_PLAYER_ATTRIBUTE_CHANGE: -- cgit v1.2.3-70-g09d2 From 730974c34134c45f2fc20598908005d7a9b5636b Mon Sep 17 00:00:00 2001 From: Bernd Wachter Date: Sat, 14 Aug 2010 23:56:51 +0300 Subject: Add included enet to CMake --- CMakeLists.txt | 2 ++ libs/enet/CMakeLists.txt | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 12 ++++++++--- 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 libs/enet/CMakeLists.txt (limited to 'src') diff --git a/CMakeLists.txt b/CMakeLists.txt index b396b8e1..552ab6e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +CMAKE_POLICY(VERSION 2.6) PROJECT(MANA) @@ -45,6 +46,7 @@ ELSE (WIN32) ENDIF (WIN32) ADD_SUBDIRECTORY(data) +ADD_SUBDIRECTORY(libs/enet) ADD_SUBDIRECTORY(src) IF (GETTEXT_FOUND AND ENABLE_NLS) diff --git a/libs/enet/CMakeLists.txt b/libs/enet/CMakeLists.txt new file mode 100644 index 00000000..714d9c03 --- /dev/null +++ b/libs/enet/CMakeLists.txt @@ -0,0 +1,55 @@ +INCLUDE(CheckFunctionExists) +CHECK_FUNCTION_EXISTS(gethostbyaddr_r HAS_GETHOSTBYNAME_R) +IF(HAS_GETHOSTBYNAME_R EQUAL 1) + SET (FLAGS "${FLAGS} -DHAS_GETHOSTBYADDR_R") +ENDIF() + +CHECK_FUNCTION_EXISTS(poll HAS_POLL) +IF(HAS_POLL EQUAL 1) + SET (FLAGS "${FLAGS} -DHAS_POLL") +ENDIF() + +CHECK_FUNCTION_EXISTS(fcntl HAS_FCNTL) +IF(HAS_FCNTL) + SET (FLAGS "${FLAGS} -DHAS_FCNTL") +ENDIF() + +CHECK_FUNCTION_EXISTS(inet_pton HAS_INETPTON) +IF(HAS_INETPTON EQUAL 1) + SET (FLAGS "${FLAGS} -DHAS_INETPTON") +ENDIF() + +CHECK_FUNCTION_EXISTS(inet_ntop HAS_INETNTOP) +IF(HAS_INETNTOP EQUAL 1) + SET (FLAGS "${FLAGS} -DHAS_INETNTOP") +ENDIF() + +INCLUDE(CheckTypeSize) +SET (CMAKE_EXTRA_INCLUDE_FILES sys/socket.h) +CHECK_TYPE_SIZE(socklen_t SOCKLEN_T) +IF(HAVE_SOCKLEN_T) + SET (FLAGS "${FLAGS} -DHAS_SOCKLEN_T") +ENDIF() + +INCLUDE(CheckStructHasMember) +CHECK_STRUCT_HAS_MEMBER("struct msghdr" msg_flags sys/socket.h HAS_MSGHDR_FLAGS) +IF(HAS_MSGHDR_FLAGS EQUAL 1) + SET (FLAGS "${FLAGS} -DHAS_MSGHDR_FLAGS") +ENDIF() + +SET (SRCS + callbacks.c + compress.c + host.c + list.c + packet.c + peer.c + protocol.c + unix.c + win32.c + ) + +INCLUDE_DIRECTORIES("include") + +ADD_LIBRARY(enet STATIC ${SRCS}) +SET_TARGET_PROPERTIES(enet PROPERTIES COMPILE_FLAGS "${FLAGS}") \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6c470aef..38589505 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,7 +4,6 @@ FIND_PACKAGE(SDL_mixer REQUIRED) FIND_PACKAGE(SDL_net REQUIRED) FIND_PACKAGE(SDL_ttf REQUIRED) FIND_PACKAGE(SDL_gfx REQUIRED) -FIND_PACKAGE(ENet REQUIRED) FIND_PACKAGE(CURL REQUIRED) FIND_PACKAGE(LibXml2 REQUIRED) FIND_PACKAGE(PhysFS REQUIRED) @@ -22,6 +21,13 @@ IF (CMAKE_COMPILER_IS_GNUCXX) ENDIF() ENDIF() +IF (POLICY CMP0015) + CMAKE_POLICY(SET CMP0015 OLD) +ENDIF() +INCLUDE_DIRECTORIES("../libs/enet/include") +LINK_DIRECTORIES("../libs/enet") +SET(INTERNAL_LIBRARIES enet) + SET(FLAGS "-DPACKAGE_VERSION=\\\"${VERSION}\\\"") SET(FLAGS "${FLAGS} -DPKG_DATADIR=\\\"${PKG_DATADIR}/\\\"") SET(FLAGS "${FLAGS} -DLOCALEDIR=\\\"${LOCALEDIR}/\\\"") @@ -71,7 +77,6 @@ INCLUDE_DIRECTORIES( ${SDLNET_INCLUDE_DIR} ${SDLTTF_INCLUDE_DIR} ${SDLGFX_INCLUDE_DIR} - ${ENET_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${PHYSFS_INCLUDE_DIR} ${CURL_INCLUDE_DIR} @@ -623,13 +628,13 @@ SET (PROGRAMS mana) ADD_EXECUTABLE(mana WIN32 ${SRCS} ${SRCS_MANA} ${SRCS_TMWA}) TARGET_LINK_LIBRARIES(mana + ${INTERNAL_LIBRARIES} ${SDLGFX_LIBRARIES} ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY} ${SDLMIXER_LIBRARY} ${SDLNET_LIBRARY} ${SDLTTF_LIBRARY} - ${ENET_LIBRARIES} ${PNG_LIBRARIES} ${PHYSFS_LIBRARY} ${CURL_LIBRARIES} @@ -638,6 +643,7 @@ TARGET_LINK_LIBRARIES(mana ${OPENGL_LIBRARIES} ${LIBINTL_LIBRARIES} ${EXTRA_LIBRARIES}) + INSTALL(TARGETS mana RUNTIME DESTINATION ${PKG_BINDIR}) IF (CMAKE_SYSTEM_NAME STREQUAL SunOS) -- cgit v1.2.3-70-g09d2