diff options
author | Max Horn | 2008-09-05 22:12:46 +0000 |
---|---|---|
committer | Max Horn | 2008-09-05 22:12:46 +0000 |
commit | 2cb285c9a0c068c4f1ed77c351b5f553fd7df0be (patch) | |
tree | 46dcc7a85a9748d136259151edf455e211e82bde | |
parent | b00f8dc2ed09c828747574a23a7538bb068931f5 (diff) | |
download | scummvm-rg350-2cb285c9a0c068c4f1ed77c351b5f553fd7df0be.tar.gz scummvm-rg350-2cb285c9a0c068c4f1ed77c351b5f553fd7df0be.tar.bz2 scummvm-rg350-2cb285c9a0c068c4f1ed77c351b5f553fd7df0be.zip |
Added simple ZipArchive class, and changed some GUI code to use it, instead of the ugly C API to the unzip code
svn-id: r34370
-rw-r--r-- | common/unzip.h | 50 | ||||
-rw-r--r-- | gui/theme.cpp | 104 |
2 files changed, 72 insertions, 82 deletions
diff --git a/common/unzip.h b/common/unzip.h index 2d888fe5b1..43faaf4a74 100644 --- a/common/unzip.h +++ b/common/unzip.h @@ -65,9 +65,12 @@ #ifndef _unz_H #define _unz_H +#ifdef USE_ZLIB + #include "common/scummsys.h" +#include "common/archive.h" +#include "common/stream.h" -#ifdef USE_ZLIB #ifdef __cplusplus extern "C" { @@ -302,6 +305,49 @@ extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, } #endif -#endif + +class ZipArchive : Common::Archive { + unzFile _zipFile; + +public: + ZipArchive(const Common::String &name) { + _zipFile = unzOpen(name.c_str()); + } + ~ZipArchive() { + unzClose(_zipFile); + } + + virtual bool hasFile(const Common::String &name) { + return (_zipFile && unzLocateFile(_zipFile, name.c_str(), 2) == UNZ_OK); + } + + virtual int getAllNames(Common::StringList &list) { + // TODO + return 0; + } + + virtual Common::SeekableReadStream *openFile(const Common::String &name) { + if (!_zipFile) + return 0; + + unzLocateFile(_zipFile, name.c_str(), 2); + + unz_file_info fileInfo; + unzOpenCurrentFile(_zipFile); + unzGetCurrentFileInfo(_zipFile, &fileInfo, NULL, 0, NULL, 0, NULL, 0); + byte *buffer = (byte *)calloc(fileInfo.uncompressed_size+1, 1); + assert(buffer); + unzReadCurrentFile(_zipFile, buffer, fileInfo.uncompressed_size); + unzCloseCurrentFile(_zipFile); + return new Common::MemoryReadStream(buffer, fileInfo.uncompressed_size+1, true); + + // FIXME: instead of reading all into a memory stream, we could + // instead create a new ZipStream class. But then we have to be + // careful to handle the case where the client code opens multiple + // files in the archive and tries to use them indepenendtly. + } +}; + +#endif // USE_ZLIB #endif /* _unz_H */ diff --git a/gui/theme.cpp b/gui/theme.cpp index 5d1ce05fd4..df388d60ab 100644 --- a/gui/theme.cpp +++ b/gui/theme.cpp @@ -26,6 +26,7 @@ #include "gui/eval.h" #include "common/file.h" +#include "common/archive.h" #include "common/unzip.h" namespace GUI { @@ -69,24 +70,11 @@ const Graphics::Font *Theme::loadFont(const char *filename) { return font; #ifdef USE_ZLIB - unzFile zipFile = unzOpen((_stylefile + ".zip").c_str()); - if (zipFile && unzLocateFile(zipFile, cacheFilename.c_str(), 2) == UNZ_OK) { - unz_file_info fileInfo; - unzOpenCurrentFile(zipFile); - unzGetCurrentFileInfo(zipFile, &fileInfo, NULL, 0, NULL, 0, NULL, 0); - uint8 *buffer = new uint8[fileInfo.uncompressed_size+1]; - assert(buffer); - memset(buffer, 0, (fileInfo.uncompressed_size+1)*sizeof(uint8)); - unzReadCurrentFile(zipFile, buffer, fileInfo.uncompressed_size); - unzCloseCurrentFile(zipFile); - Common::MemoryReadStream stream(buffer, fileInfo.uncompressed_size+1); - - font = Graphics::NewFont::loadFromCache(stream); - - delete[] buffer; - buffer = 0; + ZipArchive zipArchive(_stylefile + ".zip"); + if (zipArchive.hasFile(cacheFilename)) { + Common::FilePtr stream(zipArchive.openFile(cacheFilename)); + font = Graphics::NewFont::loadFromCache(*stream.get()); } - unzClose(zipFile); #endif if (font) return font; @@ -99,24 +87,11 @@ const Graphics::Font *Theme::loadFont(const char *filename) { #ifdef USE_ZLIB if (!font) { - unzFile zipFile = unzOpen((_stylefile + ".zip").c_str()); - if (zipFile && unzLocateFile(zipFile, filename, 2) == UNZ_OK) { - unz_file_info fileInfo; - unzOpenCurrentFile(zipFile); - unzGetCurrentFileInfo(zipFile, &fileInfo, NULL, 0, NULL, 0, NULL, 0); - uint8 *buffer = new uint8[fileInfo.uncompressed_size+1]; - assert(buffer); - memset(buffer, 0, (fileInfo.uncompressed_size+1)*sizeof(uint8)); - unzReadCurrentFile(zipFile, buffer, fileInfo.uncompressed_size); - unzCloseCurrentFile(zipFile); - Common::MemoryReadStream stream(buffer, fileInfo.uncompressed_size+1); - - font = Graphics::NewFont::loadFont(stream); - - delete[] buffer; - buffer = 0; + ZipArchive zipArchive(_stylefile + ".zip"); + if (zipArchive.hasFile(filename)) { + Common::FilePtr stream(zipArchive.openFile(filename)); + font = Graphics::NewFont::loadFont(*stream.get()); } - unzClose(zipFile); } #endif @@ -158,37 +133,20 @@ bool Theme::loadConfigFile(const Common::String &stylefile) { if (ConfMan.hasKey("extrapath")) Common::File::addDefaultDirectoryRecursive(ConfMan.get("extrapath")); - if (!_configFile.loadFromFile(stylefile + ".ini")) { + if (_configFile.loadFromFile(stylefile + ".ini")) + return true; + #ifdef USE_ZLIB - // Maybe find a nicer solution to this - unzFile zipFile = unzOpen((stylefile + ".zip").c_str()); - if (zipFile && unzLocateFile(zipFile, (stylefile + ".ini").c_str(), 2) == UNZ_OK) { - unz_file_info fileInfo; - unzOpenCurrentFile(zipFile); - unzGetCurrentFileInfo(zipFile, &fileInfo, NULL, 0, NULL, 0, NULL, 0); - uint8 *buffer = new uint8[fileInfo.uncompressed_size+1]; - assert(buffer); - memset(buffer, 0, (fileInfo.uncompressed_size+1)*sizeof(uint8)); - unzReadCurrentFile(zipFile, buffer, fileInfo.uncompressed_size); - unzCloseCurrentFile(zipFile); - Common::MemoryReadStream stream(buffer, fileInfo.uncompressed_size+1); - if (!_configFile.loadFromStream(stream)) { - unzClose(zipFile); - return false; - } - delete[] buffer; - buffer = 0; - } else { - unzClose(zipFile); - return false; - } - unzClose(zipFile); -#else - return false; -#endif + // Maybe find a nicer solution to this + ZipArchive zipArchive(stylefile + ".zip"); + if (zipArchive.hasFile(stylefile + ".ini")) { + Common::FilePtr stream(zipArchive.openFile(stylefile + ".ini")); + if (_configFile.loadFromStream(*stream.get())) + return true; } +#endif - return true; + return false; } bool Theme::themeConfigUseable(const Common::String &stylefile, const Common::String &style, Common::String *cStyle, Common::ConfigFile *cfg) { @@ -210,30 +168,16 @@ bool Theme::themeConfigUseable(const Common::String &stylefile, const Common::St if (!file.open(stylefile + ".ini")) { #ifdef USE_ZLIB // Maybe find a nicer solution to this - unzFile zipFile = unzOpen((stylefile + ".zip").c_str()); - if (zipFile && unzLocateFile(zipFile, (stylefile + ".ini").c_str(), 2) == UNZ_OK) { + ZipArchive zipArchive(stylefile + ".zip"); + if (zipArchive.hasFile(stylefile + ".ini")) { if (!style.empty() || cStyle || cfg) { - unz_file_info fileInfo; - unzOpenCurrentFile(zipFile); - unzGetCurrentFileInfo(zipFile, &fileInfo, NULL, 0, NULL, 0, NULL, 0); - uint8 *buffer = new uint8[fileInfo.uncompressed_size+1]; - assert(buffer); - memset(buffer, 0, (fileInfo.uncompressed_size+1)*sizeof(uint8)); - unzReadCurrentFile(zipFile, buffer, fileInfo.uncompressed_size); - unzCloseCurrentFile(zipFile); - Common::MemoryReadStream stream(buffer, fileInfo.uncompressed_size+1); - if (!cfg->loadFromStream(stream)) { - unzClose(zipFile); + Common::FilePtr stream(zipArchive.openFile(stylefile + ".ini")); + if (!cfg->loadFromStream(*stream.get())) return false; - } - delete[] buffer; - buffer = 0; } } else { - unzClose(zipFile); return false; } - unzClose(zipFile); #else return false; #endif |