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 /common | |
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
Diffstat (limited to 'common')
-rw-r--r-- | common/unzip.h | 50 |
1 files changed, 48 insertions, 2 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 */ |