diff options
author | Jared Adams <jaxad0127@gmail.com> | 2010-08-13 14:45:52 -0600 |
---|---|---|
committer | Jared Adams <jaxad0127@gmail.com> | 2010-08-13 18:43:16 -0600 |
commit | 8eadc834ed3e8439836f7dc87390a56a1164ec11 (patch) | |
tree | 36cf9915914517b137d488a40d1f61265867723d /src/resources/mapreader.cpp | |
parent | 6d315d0e61f419636021476582a49ab0b1f1b5e9 (diff) | |
download | mana-8eadc834ed3e8439836f7dc87390a56a1164ec11.tar.gz mana-8eadc834ed3e8439836f7dc87390a56a1164ec11.tar.bz2 mana-8eadc834ed3e8439836f7dc87390a56a1164ec11.tar.xz mana-8eadc834ed3e8439836f7dc87390a56a1164ec11.zip |
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
Diffstat (limited to 'src/resources/mapreader.cpp')
-rw-r--r-- | src/resources/mapreader.cpp | 142 |
1 files changed, 2 insertions, 140 deletions
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 <cassert> #include <iostream> -#include <zlib.h> // 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(); |