Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Zolotarev <deathbaba@gmail.com>2011-07-02 21:14:34 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:20:21 +0300
commitf65c4fef950feb2f5f280e769bb06f108e1fa6d2 (patch)
tree0241c23f42951e02b37cea22e3631dd019581ed9 /coding/zip_reader.cpp
parentf2f968c546009462418c2e87e3c1c93c3d92e350 (diff)
Added zip reader support (only works with non-compressed files)
Diffstat (limited to 'coding/zip_reader.cpp')
-rw-r--r--coding/zip_reader.cpp21
1 files changed, 13 insertions, 8 deletions
diff --git a/coding/zip_reader.cpp b/coding/zip_reader.cpp
index b82e87b854..0849f8c02d 100644
--- a/coding/zip_reader.cpp
+++ b/coding/zip_reader.cpp
@@ -10,7 +10,7 @@
ZipFileReader::ZipFileReader(string const & container, string const & file)
: base_type(container)
{
- unzFile zip = unzOpen(container.c_str());
+ unzFile zip = unzOpen64(container.c_str());
if (!zip)
MYTHROW(OpenZipException, ("Can't get zip file handle", container));
@@ -19,18 +19,23 @@ ZipFileReader::ZipFileReader(string const & container, string const & file)
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));
+ if (UNZ_OK != unzOpenCurrentFile(zip))
+ MYTHROW(LocateZipException, ("Can't open file inside zip", file));
- unz_file_info fileInfo;
- if (UNZ_OK != unzGetCurrentFileInfo(zip, &fileInfo, NULL, 0, NULL, 0, NULL, 0))
+ uint64_t offset = unzGetCurrentFileZStreamPos64(zip);
+ unzCloseCurrentFile(zip);
+
+ if (offset > Size())
+ MYTHROW(LocateZipException, ("Invalid offset inside zip", file));
+
+ unz_file_info64 fileInfo;
+ if (UNZ_OK != unzGetCurrentFileInfo64(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));
+ LOG(LDEBUG, (file, "offset:", offset, "size:", fileInfo.uncompressed_size));
- SetOffsetAndSize(filePos.pos_in_zip_directory, fileInfo.uncompressed_size);
+ SetOffsetAndSize(offset, fileInfo.uncompressed_size);
}