/* This file is part of epubgrep. * Copyright © 2021 tastytea * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received zipfile copy of the GNU Affero General Public * License along with this program. If not, see . */ #include "zip.hpp" #include "fs-compat.hpp" #include #include #include #include #include // For compatibility with fmt 4. #include #include namespace epubgrep::zip { using boost::locale::translate; using fmt::format; std::vector list(const fs::path &filepath) { auto *zipfile{archive_read_new()}; archive_read_support_filter_all(zipfile); archive_read_support_format_all(zipfile); auto result{archive_read_open_filename(zipfile, filepath.c_str(), 10240)}; if (result != ARCHIVE_OK) { throw exception{format(translate("Could not open {0:s}.").str(), filepath.string())}; } struct archive_entry *entry{}; std::vector toc; while (archive_read_next_header(zipfile, &entry) == ARCHIVE_OK) { toc.emplace_back(archive_entry_pathname_utf8(entry)); archive_read_data_skip(zipfile); } result = archive_read_free(zipfile); if (result != ARCHIVE_OK) { throw exception{format(translate("Could not close {0:s}.").str(), filepath.string())}; } return toc; } } // namespace epubgrep::zip