diff options
author | Yuri Gorshenin <y@maps.me> | 2016-05-10 15:24:46 +0300 |
---|---|---|
committer | Yuri Gorshenin <y@maps.me> | 2016-05-10 15:37:41 +0300 |
commit | 18287be1dbd25e98d3ac59e13a86687c5e697605 (patch) | |
tree | 0e0ed21893a75a3d3487c96a8bf8cdc9424855b4 /coding | |
parent | 9375997212876b739a713dd49caf99821be8466d (diff) |
[coding] Fixes to SRTM parser CL.
Diffstat (limited to 'coding')
-rw-r--r-- | coding/zip_reader.cpp | 36 | ||||
-rw-r--r-- | coding/zip_reader.hpp | 6 |
2 files changed, 21 insertions, 21 deletions
diff --git a/coding/zip_reader.cpp b/coding/zip_reader.cpp index 4c37d66090..102bdd77a4 100644 --- a/coding/zip_reader.cpp +++ b/coding/zip_reader.cpp @@ -118,30 +118,28 @@ void ZipFileReader::UnzipFile(string const & zipContainer, string const & fileIn outFileGuard.release(); } -char* ZipFileReader::UnzipFileToMemory(string const & zipContainer, string const & fileInZip) +void ZipFileReader::UnzipFileToMemory(string const & cont, string const & file, + vector<char> & data) { - unzFile zip = unzOpen64(zipContainer.c_str()); + unzFile zip = unzOpen64(cont.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)); + MYTHROW(OpenZipException, ("Can't get zip file handle:", cont)); + MY_SCOPE_GUARD(zipCloser, bind(&unzClose, zip)); + if (UNZ_OK != unzLocateFile(zip, file.c_str(), 1 /* case sensitivity */)) + MYTHROW(LocateZipException, ("Can't locate file inside zip container:", file)); 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; + MYTHROW(LocateZipException, ("Can't open file inside zip container:", file)); + MY_SCOPE_GUARD(currentFileCloser, bind(&unzCloseCurrentFile, zip)); - char* buf= new char[uncompressedFileSize]; + unz_file_info64 info; + if (UNZ_OK != unzGetCurrentFileInfo64(zip, &info, NULL, 0, NULL, 0, NULL, 0)) + MYTHROW(LocateZipException, ("Can't get uncompressed file size inside zip:", file)); - int const readBytes = unzReadCurrentFile(zip, buf, uncompressedFileSize); - if (readBytes < 0) - MYTHROW(InvalidZipException, ("Error", readBytes, "while unzipping", fileInZip, "from", zipContainer)); + size_t const size = info.uncompressed_size; + data.resize(size); - return buf; + int const bytesRead = unzReadCurrentFile(zip, data.data(), size); + if (bytesRead < 0) + MYTHROW(InvalidZipException, ("Error:", bytesRead, "while unzipping", file, "in", cont)); } diff --git a/coding/zip_reader.hpp b/coding/zip_reader.hpp index 6c36693df4..7970cff087 100644 --- a/coding/zip_reader.hpp +++ b/coding/zip_reader.hpp @@ -32,8 +32,10 @@ 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); + /// Unzips |file| in |cont| to |buffer|. + /// + /// @warning Can throw OpenZipException and LocateZipException. + static void UnzipFileToMemory(string const & cont, string const & file, vector<char> & data); static void FilesList(string const & zipContainer, FileListT & filesList); |