17 #ifndef ARCHIVE_ARCHIVE_H_
18 #define ARCHIVE_ARCHIVE_H_
21 #include <archive_entry.h>
35 : url(url), plain_text(plain_text) {
38 if (0 == (
ar = archive_read_new())) {
39 throw std::runtime_error(std::string(
"archive_read_new failed!"));
47 #ifdef LIBARCHIVE_ENABLE_ALL
49 archive_read_support_format_all(
ar);
50 archive_read_support_filter_all(
ar);
51 archive_read_support_format_raw(
ar);
54 archive_read_support_format_ar(
ar);
55 archive_read_support_format_cpio(
ar);
56 archive_read_support_format_empty(
ar);
57 archive_read_support_format_lha(
ar);
58 archive_read_support_format_tar(
ar);
59 archive_read_support_format_xar(
ar);
60 archive_read_support_format_7zip(
ar);
61 archive_read_support_format_cab(
ar);
62 archive_read_support_format_rar(
ar);
63 archive_read_support_format_iso9660(
ar);
64 archive_read_support_format_zip(
ar);
66 archive_read_support_filter_bzip2(
ar);
67 archive_read_support_filter_compress(
ar);
68 archive_read_support_filter_gzip(
ar);
69 archive_read_support_filter_lzip(
ar);
70 archive_read_support_filter_lzma(
ar);
71 archive_read_support_filter_xz(
ar);
72 archive_read_support_filter_uu(
ar);
73 archive_read_support_filter_rpm(
ar);
74 archive_read_support_filter_lrzip(
ar);
75 archive_read_support_filter_lzop(
ar);
76 archive_read_support_filter_grzip(
ar);
80 archive_read_support_format_raw(
ar);
85 archive_read_close(
ar);
88 archive_read_free(
ar);
94 auto cstr = archive_error_string(
ar);
95 return std::string(
"libarchive error: ") +
101 switch (rc = archive_read_next_header(
ar, &
entry)) {
112 switch (rc = archive_read_data_block(
ar, buff, size, offset)) {
122 return archive_filter_bytes(
ar, -1);
142 virtual ptrdiff_t
read(
const void** buff) {
152 static ptrdiff_t
read(
struct archive*
a,
void* client_data,
const void** buff) {
153 return ((
Archive*)client_data)->read(buff);
156 static int open(
struct archive*
a,
void* client_data) {
157 return ((
Archive*)client_data)->open();
160 static int close(
struct archive*
a,
void* client_data) {
161 return ((
Archive*)client_data)->close();
180 std::regex url_regex(R
"(^(([^:\/?#]+):)?(//([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)",
181 std::regex::extended);
182 if (!std::regex_match(url, sm, url_regex)) {
183 throw std::runtime_error(std::string(
"malformed url: ") + url);
188 for (
size_t i = 0; i < sm.size(); i++) {
189 url_parts[i] = sm[i].str();
198 return std::string(archive_entry_pathname(
entry));
virtual bool read_data_block(const void **buff, size_t *size, int64_t *offset)
static ptrdiff_t read(struct archive *a, void *client_data, const void **buff)
static int open(struct archive *a, void *client_data)
virtual ptrdiff_t read(const void **buff)
std::map< int, std::string > url_parts
virtual int64_t get_position_compressed() const
const std::string url_part(const int i)
virtual void init_for_read()
virtual bool read_next_header()
virtual std::string archive_error(int err)
static int close(struct archive *a, void *client_data)
static void parse_url(const std::string url, std::map< int, std::string > &url_parts)
Archive(const std::string url, const bool plain_text)