summaryrefslogtreecommitdiff
path: root/src/resources/mapreader.cpp
diff options
context:
space:
mode:
authorJared Adams <jaxad0127@gmail.com>2010-08-13 14:45:52 -0600
committerJared Adams <jaxad0127@gmail.com>2010-08-13 18:43:16 -0600
commit8eadc834ed3e8439836f7dc87390a56a1164ec11 (patch)
tree36cf9915914517b137d488a40d1f61265867723d /src/resources/mapreader.cpp
parent6d315d0e61f419636021476582a49ab0b1f1b5e9 (diff)
downloadmana-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.cpp142
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();