1#include "taichi/common/zip.h"
2#include "taichi/common/miniz.h"
3
4namespace taichi {
5namespace zip {
6
7bool 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
40fail:
41 succ &= mz_zip_reader_end(&zip);
42
43 return succ;
44}
45
46} // namespace zip
47} // namespace taichi
48