diff options
author | Alex Zolotarev <deathbaba@gmail.com> | 2011-07-02 19:27:59 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:20:20 +0300 |
commit | f2f968c546009462418c2e87e3c1c93c3d92e350 (patch) | |
tree | 575bef1cbb04e3a89333e64497098e9a1f086b99 /coding/zip_reader.cpp | |
parent | 2cbd88b88265f9efc2763b695aba4de860f9a0e3 (diff) |
[3party] Added all zlib files and zip support compilation
Diffstat (limited to 'coding/zip_reader.cpp')
-rw-r--r-- | coding/zip_reader.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/coding/zip_reader.cpp b/coding/zip_reader.cpp new file mode 100644 index 0000000000..b82e87b854 --- /dev/null +++ b/coding/zip_reader.cpp @@ -0,0 +1,36 @@ +#include "zip_reader.hpp" + +#include "../base/scope_guard.hpp" +#include "../base/logging.hpp" + +#include "../std/bind.hpp" + +#include "../3party/zlib/contrib/minizip/unzip.h" + +ZipFileReader::ZipFileReader(string const & container, string const & file) + : base_type(container) +{ + unzFile zip = unzOpen(container.c_str()); + if (!zip) + MYTHROW(OpenZipException, ("Can't get zip file handle", container)); + + MY_SCOPE_GUARD(zipGuard, bind(&unzClose, zip)); + + if (UNZ_OK != unzLocateFile(zip, file.c_str(), 1)) + MYTHROW(LocateZipException, ("Can't locate file inside zip", file)); + + unz_file_pos filePos; + if (UNZ_OK != unzGetFilePos(zip, &filePos)) + MYTHROW(LocateZipException, ("Can't locate file offset inside zip", file)); + + unz_file_info fileInfo; + if (UNZ_OK != unzGetCurrentFileInfo(zip, &fileInfo, NULL, 0, NULL, 0, NULL, 0)) + MYTHROW(LocateZipException, ("Can't get uncompressed file size inside zip", file)); + + if (fileInfo.compressed_size != fileInfo.uncompressed_size) + MYTHROW(InvalidZipException, ("File should be uncompressed inside zip", file)); + + LOG(LDEBUG, (file, "offset:", filePos.pos_in_zip_directory, "size:", fileInfo.uncompressed_size)); + + SetOffsetAndSize(filePos.pos_in_zip_directory, fileInfo.uncompressed_size); +} |