diff options
author | Lev Dragunov <l.dragunov@corp.mail.ru> | 2016-04-22 13:25:12 +0300 |
---|---|---|
committer | Yuri Gorshenin <y@maps.me> | 2016-05-10 15:29:44 +0300 |
commit | 9375997212876b739a713dd49caf99821be8466d (patch) | |
tree | 9eb5513499d1d1eb6c429234b90273fb5016f449 /coding | |
parent | 0d2847d2bbd017aa5d44e0727bf1281e55a93c7d (diff) |
Srtm reader with tests.
Diffstat (limited to 'coding')
-rw-r--r-- | coding/zip_reader.cpp | 28 | ||||
-rw-r--r-- | coding/zip_reader.hpp | 3 |
2 files changed, 31 insertions, 0 deletions
diff --git a/coding/zip_reader.cpp b/coding/zip_reader.cpp index 32de85bcbf..4c37d66090 100644 --- a/coding/zip_reader.cpp +++ b/coding/zip_reader.cpp @@ -117,3 +117,31 @@ void ZipFileReader::UnzipFile(string const & zipContainer, string const & fileIn outFileGuard.release(); } + +char* ZipFileReader::UnzipFileToMemory(string const & zipContainer, string const & fileInZip) +{ + unzFile zip = unzOpen64(zipContainer.c_str()); + if (!zip) + MYTHROW(OpenZipException, ("Can't get zip file handle", zipContainer)); + MY_SCOPE_GUARD(zipGuard, bind(&unzClose, zip)); + + if (UNZ_OK != unzLocateFile(zip, fileInZip.c_str(), 1)) + MYTHROW(LocateZipException, ("Can't locate file inside zip", fileInZip)); + + if (UNZ_OK != unzOpenCurrentFile(zip)) + MYTHROW(LocateZipException, ("Can't open file inside zip", fileInZip)); + MY_SCOPE_GUARD(currentFileGuard, bind(&unzCloseCurrentFile, zip)); + + 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", fileInZip)); + size_t const uncompressedFileSize = fileInfo.uncompressed_size; + + char* buf= new char[uncompressedFileSize]; + + int const readBytes = unzReadCurrentFile(zip, buf, uncompressedFileSize); + if (readBytes < 0) + MYTHROW(InvalidZipException, ("Error", readBytes, "while unzipping", fileInZip, "from", zipContainer)); + + return buf; +} diff --git a/coding/zip_reader.hpp b/coding/zip_reader.hpp index b518b8d9e3..6c36693df4 100644 --- a/coding/zip_reader.hpp +++ b/coding/zip_reader.hpp @@ -32,6 +32,9 @@ public: static void UnzipFile(string const & zipContainer, string const & fileInZip, string const & outFilePath, ProgressFn progressFn = ProgressFn()); + /// @warning Counsumer must manually free result + static char* UnzipFileToMemory(string const & zipContainer, string const & fileInZip); + static void FilesList(string const & zipContainer, FileListT & filesList); /// Quick version without exceptions |