diff --git a/coding/coding_tests/zip_reader_test.cpp b/coding/coding_tests/zip_reader_test.cpp index aa92f6af3b..a7d905004a 100644 --- a/coding/coding_tests/zip_reader_test.cpp +++ b/coding/coding_tests/zip_reader_test.cpp @@ -6,7 +6,7 @@ #include "../../base/logging.hpp" #include "../../base/macros.hpp" -char const zipBytes[] = "PK\003\004\n\0\0\0\0\0\222\226\342>\302\032" +static char const zipBytes[] = "PK\003\004\n\0\0\0\0\0\222\226\342>\302\032" "x\372\005\0\0\0\005\0\0\0\b\0\034\0te" "st.txtUT\t\0\003\303>\017N\017" "?\017Nux\v\0\001\004\365\001\0\0\004P\0" @@ -68,3 +68,60 @@ UNIT_TEST(ZipReaderSmoke) FileWriter::DeleteFileX(ZIPFILE); } +/// zip file with 3 files inside: 1.txt, 2.txt, 3.ttt +static char const zipBytes2[] = "\x50\x4b\x3\x4\xa\x0\x0\x0\x0\x0\x92\x6b\xf6\x3e\x53\xfc\x51\x67\x2\x0\x0" +"\x0\x2\x0\x0\x0\x5\x0\x1c\x0\x31\x2e\x74\x78\x74\x55\x54\x9\x0\x3\xd3\x50\x29\x4e\xd4\x50\x29\x4e\x75\x78" +"\xb\x0\x1\x4\xf5\x1\x0\x0\x4\x14\x0\x0\x0\x31\xa\x50\x4b\x3\x4\xa\x0\x0\x0\x0\x0\x95\x6b\xf6\x3e\x90\xaf" +"\x7c\x4c\x2\x0\x0\x0\x2\x0\x0\x0\x5\x0\x1c\x0\x32\x2e\x74\x78\x74\x55\x54\x9\x0\x3\xd9\x50\x29\x4e\xd9\x50" +"\x29\x4e\x75\x78\xb\x0\x1\x4\xf5\x1\x0\x0\x4\x14\x0\x0\x0\x32\xa\x50\x4b\x3\x4\xa\x0\x0\x0\x0\x0\x9c\x6b" +"\xf6\x3e\xd1\x9e\x67\x55\x2\x0\x0\x0\x2\x0\x0\x0\x5\x0\x1c\x0\x33\x2e\x74\x74\x74\x55\x54\x9\x0\x3\xe8\x50" +"\x29\x4e\xe9\x50\x29\x4e\x75\x78\xb\x0\x1\x4\xf5\x1\x0\x0\x4\x14\x0\x0\x0\x33\xa\x50\x4b\x1\x2\x1e\x3\xa" +"\x0\x0\x0\x0\x0\x92\x6b\xf6\x3e\x53\xfc\x51\x67\x2\x0\x0\x0\x2\x0\x0\x0\x5\x0\x18\x0\x0\x0\x0\x0\x1\x0\x0" +"\x0\xa4\x81\x0\x0\x0\x0\x31\x2e\x74\x78\x74\x55\x54\x5\x0\x3\xd3\x50\x29\x4e\x75\x78\xb\x0\x1\x4\xf5\x1\x0" +"\x0\x4\x14\x0\x0\x0\x50\x4b\x1\x2\x1e\x3\xa\x0\x0\x0\x0\x0\x95\x6b\xf6\x3e\x90\xaf\x7c\x4c\x2\x0\x0\x0\x2" +"\x0\x0\x0\x5\x0\x18\x0\x0\x0\x0\x0\x1\x0\x0\x0\xa4\x81\x41\x0\x0\x0\x32\x2e\x74\x78\x74\x55\x54\x5\x0\x3" +"\xd9\x50\x29\x4e\x75\x78\xb\x0\x1\x4\xf5\x1\x0\x0\x4\x14\x0\x0\x0\x50\x4b\x1\x2\x1e\x3\xa\x0\x0\x0\x0\x0" +"\x9c\x6b\xf6\x3e\xd1\x9e\x67\x55\x2\x0\x0\x0\x2\x0\x0\x0\x5\x0\x18\x0\x0\x0\x0\x0\x1\x0\x0\x0\xa4\x81\x82" +"\x0\x0\x0\x33\x2e\x74\x74\x74\x55\x54\x5\x0\x3\xe8\x50\x29\x4e\x75\x78\xb\x0\x1\x4\xf5\x1\x0\x0\x4\x14\x0" +"\x0\x0\x50\x4b\x5\x6\x0\x0\x0\x0\x3\x0\x3\x0\xe1\x0\x0\x0\xc3\x0\x0\x0\x0\x0"; + +static char const invalidZip[] = "1234567890asdqwetwezxvcbdhg322353tgfsd"; + +UNIT_TEST(ZipFilesList) +{ + string const ZIPFILE = "list_test.zip"; + { + FileWriter f(ZIPFILE); + f.Write(zipBytes2, ARRAY_SIZE(zipBytes2) - 1); + } + string const ZIPFILE_INVALID = "invalid_test.zip"; + { + FileWriter f(ZIPFILE_INVALID); + f.Write(invalidZip, ARRAY_SIZE(invalidZip) - 1); + } + + try + { + vector files = ZipFileReader::FilesList(ZIPFILE); + TEST_EQUAL(files.size(), 3, ()); + TEST_EQUAL(files[0], "1.txt", ()); + TEST_EQUAL(files[1], "2.txt", ()); + TEST_EQUAL(files[2], "3.ttt", ()); + } + catch (FileReader::OpenException const & e) + { + TEST(false, ("Can't get list of files inside zip", e.what())); + } + + try + { + vector files = ZipFileReader::FilesList(ZIPFILE_INVALID); + TEST(false, ("This test shouldn't be reached - exception should be thrown")); + } + catch (FileReader::OpenException const &) + { + } + + FileWriter::DeleteFileX(ZIPFILE_INVALID); + FileWriter::DeleteFileX(ZIPFILE); +} diff --git a/coding/zip_reader.cpp b/coding/zip_reader.cpp index 0849f8c02d..ee798f6769 100644 --- a/coding/zip_reader.cpp +++ b/coding/zip_reader.cpp @@ -39,3 +39,28 @@ ZipFileReader::ZipFileReader(string const & container, string const & file) SetOffsetAndSize(offset, fileInfo.uncompressed_size); } + +vector ZipFileReader::FilesList(string const & zipContainer) +{ + 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 != unzGoToFirstFile(zip)) + MYTHROW(LocateZipException, ("Can't find first file inside zip", zipContainer)); + + vector filesList; + do + { + char fileName[256]; + if (UNZ_OK != unzGetCurrentFileInfo64(zip, NULL, fileName, ARRAY_SIZE(fileName), NULL, 0, NULL, 0)) + MYTHROW(LocateZipException, ("Can't get file name inside zip", zipContainer)); + + filesList.push_back(fileName); + + } while (UNZ_OK == unzGoToNextFile(zip)); + + return filesList; +} diff --git a/coding/zip_reader.hpp b/coding/zip_reader.hpp index 4a56ded689..beaba2ccdf 100644 --- a/coding/zip_reader.hpp +++ b/coding/zip_reader.hpp @@ -14,4 +14,6 @@ public: DECLARE_EXCEPTION(InvalidZipException, OpenException); ZipFileReader(string const & container, string const & file); + + static vector FilesList(string const & zipContainer); };