annotate modules/zip/ZipArchive.cpp @ 503:964b8b700087

Get rid of format (see https://github.com/ikalnitsky/termcolor instead)
author David Demelier <markand@malikania.fr>
date Wed, 03 Feb 2016 10:30:59 +0100
parents 7ee8da32da98
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
486
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * ZipArchive.cpp -- wrapper around libzip
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013-2015 David Demelier <markand@malikania.fr>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <cerrno>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <cstdlib>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <cstring>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <stdexcept>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include "ZipArchive.h"
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 namespace source {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 /* --------------------------------------------------------
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 * Buffer (zip_source_buffer)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 * -------------------------------------------------------- */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 Buffer::Buffer(std::string data)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 : m_data(std::move(data))
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
36
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 struct zip_source *Buffer::source(struct zip *archive) const
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 auto size = m_data.size();
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 auto data = static_cast<char *>(std::malloc(size));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 if (data == nullptr)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 throw std::runtime_error(std::strerror(errno));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 std::memcpy(data, m_data.data(), size);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 auto src = zip_source_buffer(archive, data, size, 1);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 if (src == nullptr) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 std::free(data);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 throw std::runtime_error(zip_strerror(archive));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
53
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 return src;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 /* --------------------------------------------------------
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 * File (zip_source_file)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 * -------------------------------------------------------- */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 File::File(std::string path, ZipUint64 start, ZipInt64 length)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 : m_path(std::move(path))
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 , m_start(start)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 , m_length(length)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
67
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 struct zip_source *File::source(struct zip *archive) const
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 auto src = zip_source_file(archive, m_path.c_str(), m_start, m_length);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
71
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 if (src == nullptr)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 throw std::runtime_error(zip_strerror(archive));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 return src;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
77
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 } // !source
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 /* --------------------------------------------------------
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 * ZipArchive
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 * ------------------------------------------------------- */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 ZipArchive::ZipArchive(const std::string &path, ZipFlags flags)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 : m_handle(nullptr, nullptr)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 int error;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 struct zip *archive = zip_open(path.c_str(), flags, &error);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
89
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 if (archive == nullptr)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 char buf[128]{};
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
93
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 zip_error_to_str(buf, sizeof (buf), error, errno);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
95
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 throw std::runtime_error(buf);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 m_handle = { archive, zip_close };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
101
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 void ZipArchive::setFileComment(ZipUint64 index, const std::string &text, ZipFlags flags)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 auto size = text.size();
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 auto cstr = (size == 0) ? nullptr : text.c_str();
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 if (zip_file_set_comment(m_handle.get(), index, cstr, size, flags) < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
110
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 std::string ZipArchive::getFileComment(ZipUint64 index, ZipFlags flags) const
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 zip_uint32_t length = 0;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 auto text = zip_file_get_comment(m_handle.get(), index, &length, flags);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 if (text == nullptr)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
118
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 return { text, length };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
121
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 void ZipArchive::setComment(const std::string &comment)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 if (zip_set_archive_comment(m_handle.get(), comment.c_str(), comment.size()) < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 std::string ZipArchive::getComment(ZipFlags flags) const
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 int length = 0;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 auto text = zip_get_archive_comment(m_handle.get(), &length, flags);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
132
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 if (text == nullptr)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
135
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 return { text, static_cast<size_t>(length) };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
138
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 bool ZipArchive::exists(const std::string &name, ZipFlags flags) const noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 return zip_name_locate(m_handle.get(), name.c_str(), flags) >= 0;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 ZipInt64 ZipArchive::find(const std::string &name, ZipFlags flags) const
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 auto index = zip_name_locate(m_handle.get(), name.c_str(), flags);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
147
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 if (index < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
150
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 return index;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
153
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 ZipStat ZipArchive::stat(const std::string &name, ZipFlags flags) const
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 ZipStat st;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
157
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 if (zip_stat(m_handle.get(), name.c_str(), flags, &st) < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
160
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 return st;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
163
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 ZipStat ZipArchive::stat(ZipUint64 index, ZipFlags flags) const
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 ZipStat st;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
167
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 if (zip_stat_index(m_handle.get(), index, flags, &st) < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
170
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 return st;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
173
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 ZipInt64 ZipArchive::add(const ZipSource &source, const std::string &name, ZipFlags flags)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 auto src = source.source(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 auto ret = zip_file_add(m_handle.get(), name.c_str(), src, flags);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
178
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 if (ret < 0) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 zip_source_free(src);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
183
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 return ret;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
186
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 ZipInt64 ZipArchive::addDirectory(const std::string &directory, ZipFlags flags)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 auto ret = zip_dir_add(m_handle.get(), directory.c_str(), flags);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
190
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 if (ret < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
193
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 return ret;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
196
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 void ZipArchive::replace(const ZipSource &source, ZipUint64 index, ZipFlags flags)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 auto src = source.source(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
200
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 if (zip_file_replace(m_handle.get(), index, src, flags) < 0) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 zip_source_free(src);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
206
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 ZipFile ZipArchive::open(const std::string &name, ZipFlags flags, const std::string &password)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 struct zip_file *file;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
210
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 if (password.size() > 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 file = zip_fopen_encrypted(m_handle.get(), name.c_str(), flags, password.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 else
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 file = zip_fopen(m_handle.get(), name.c_str(), flags);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
215
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 if (file == nullptr)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
218
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 return file;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
221
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 ZipFile ZipArchive::open(ZipUint64 index, ZipFlags flags, const std::string &password)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 struct zip_file *file;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
225
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 if (password.size() > 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 file = zip_fopen_index_encrypted(m_handle.get(), index, flags, password.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 else
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 file = zip_fopen_index(m_handle.get(), index, flags);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
230
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 if (file == nullptr)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
233
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 return file;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
236
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 void ZipArchive::rename(ZipUint64 index, const std::string &name, ZipFlags flags)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 if (zip_file_rename(m_handle.get(), index, name.c_str(), flags) < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
242
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 void ZipArchive::setFileCompression(ZipUint64 index, ZipInt32 comp, ZipUint32 flags)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 if (zip_set_file_compression(m_handle.get(), index, comp, flags) < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
248
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 void ZipArchive::remove(ZipUint64 index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 if (zip_delete(m_handle.get(), index) < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
254
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 ZipInt64 ZipArchive::numEntries(ZipFlags flags) const noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 return zip_get_num_entries(m_handle.get(), flags);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
259
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 void ZipArchive::unchange(ZipUint64 index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 if (zip_unchange(m_handle.get(), index) < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
265
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 void ZipArchive::unchangeAll()
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 if (zip_unchange_all(m_handle.get()) < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
271
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 void ZipArchive::unchangeArchive()
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 if (zip_unchange_archive(m_handle.get()) < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
277
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 void ZipArchive::setDefaultPassword(const std::string &password)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 auto cstr = (password.size() > 0) ? password.c_str() : nullptr;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
281
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 if (zip_set_default_password(m_handle.get(), cstr) < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
285
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 void ZipArchive::setFlag(ZipFlags flags, int value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 if (zip_set_archive_flag(m_handle.get(), flags, value) < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
291
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 int ZipArchive::getFlag(ZipFlags which, ZipFlags flags) const
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 auto ret = zip_get_archive_flag(m_handle.get(), which, flags);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
295
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 if (ret < 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 throw std::runtime_error(zip_strerror(m_handle.get()));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
298
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 return ret;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 }