SatDump 2.0.0-alpha-76a915210
Loading...
Searching...
No Matches
zip_file_iterators.h
1#pragma once
2
3#include "core/exception.h"
4#include "file_iterators.h"
5#include "libs/miniz/miniz.h"
6#include <filesystem>
7#include <memory>
8
9namespace satdump
10{
11 namespace utils
12 {
13 class ZipFileIteratorItem : public FilesIteratorItem
14 {
15 private:
16 const mz_zip_archive *zip;
17 const int num;
18
19 public:
20 ZipFileIteratorItem(mz_zip_archive *zip, int num, std::string name) : FilesIteratorItem(name), zip(zip), num(num) {}
21 ~ZipFileIteratorItem() {}
22
23 std::vector<uint8_t> getPayload()
24 {
25 size_t filesize = 0;
26 void *file_ptr = mz_zip_reader_extract_to_heap((mz_zip_archive *)zip, num, &filesize, 0);
27 std::vector<uint8_t> vec((uint8_t *)file_ptr, (uint8_t *)file_ptr + filesize);
28 mz_free(file_ptr);
29 return vec;
30 }
31 };
32
33 class ZipFilesIterator : public FilesIterator
34 {
35 private:
36 mz_zip_archive zip{};
37 int numfiles;
38 int file_index;
39
40 public:
41 ZipFilesIterator(std::string zipfile)
42 {
43 if (!mz_zip_reader_init_file(&zip, zipfile.c_str(), 0))
44 throw satdump_exception("Invalid zip file! " + zipfile);
45 numfiles = mz_zip_reader_get_num_files(&zip);
46 file_index = 0;
47 }
48
49 ~ZipFilesIterator() { mz_zip_reader_end(&zip); }
50
51 bool getNext(std::shared_ptr<FilesIteratorItem> &v)
52 {
53 bool vv = file_index < numfiles;
54
55 if (vv)
56 {
57 v.reset();
58
59 if (mz_zip_reader_is_file_supported(&zip, file_index))
60 {
61 char filename[2000]; // TODOREWORK?
62 if (mz_zip_reader_get_filename(&zip, file_index, filename, 2000))
63 v = std::make_unique<ZipFileIteratorItem>(&zip, file_index, std::filesystem::path(filename).stem().string() + std::filesystem::path(filename).extension().string());
64 }
65
66 file_index++;
67 }
68
69 return vv;
70 }
71
72 void reset() { file_index = 0; }
73 };
74 } // namespace utils
75} // namespace satdump
Definition file_iterators.h:21