1 | #include "taichi/common/zip.h" |
2 | #include "taichi/common/miniz.h" |
3 | |
4 | namespace taichi { |
5 | namespace zip { |
6 | |
7 | bool ZipArchive::try_from_bytes(const void *data, size_t size, ZipArchive &ar) { |
8 | mz_bool succ = MZ_TRUE; |
9 | ar.file_dict.clear(); |
10 | |
11 | mz_zip_archive zip; |
12 | mz_zip_zero_struct(&zip); |
13 | |
14 | { |
15 | succ &= mz_zip_reader_init_mem(&zip, data, size, 0); |
16 | if (succ != MZ_TRUE) { |
17 | goto fail; |
18 | } |
19 | } |
20 | |
21 | { |
22 | mz_uint nfile = mz_zip_reader_get_num_files(&zip); |
23 | for (mz_uint i = 0; i < nfile; ++i) { |
24 | mz_zip_archive_file_stat file_stat; |
25 | succ &= mz_zip_reader_file_stat(&zip, i, &file_stat); |
26 | if (succ != MZ_TRUE) { |
27 | goto fail; |
28 | } |
29 | |
30 | std::vector<uint8_t> file_data(file_stat.m_uncomp_size); |
31 | succ &= mz_zip_reader_extract_to_mem(&zip, i, file_data.data(), |
32 | file_data.size(), 0); |
33 | if (succ != MZ_TRUE) { |
34 | goto fail; |
35 | } |
36 | ar.file_dict[file_stat.m_filename] = std::move(file_data); |
37 | } |
38 | } |
39 | |
40 | fail: |
41 | succ &= mz_zip_reader_end(&zip); |
42 | |
43 | return succ; |
44 | } |
45 | |
46 | } // namespace zip |
47 | } // namespace taichi |
48 | |