Skip to content

Commit 91ff9b6

Browse files
committed
fix zip tests
1 parent ac41478 commit 91ff9b6

11 files changed

Lines changed: 84 additions & 87 deletions

File tree

src/odr/internal/cfb/cfb_util.hpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,6 @@ class Archive final : public std::enable_shared_from_this<Archive> {
8484
using reference = const Entry &;
8585

8686
Iterator() = default;
87-
Iterator(const Iterator &) = default;
88-
Iterator(Iterator &&) noexcept = default;
8987
Iterator(const Archive &parent, const impl::CompoundFileEntry &entry)
9088
: m_entry{Entry(parent, entry)} {
9189
dig_left_();
@@ -95,19 +93,13 @@ class Archive final : public std::enable_shared_from_this<Archive> {
9593
: m_entry{Entry(parent, entry, parent_path)} {
9694
dig_left_();
9795
}
98-
~Iterator() = default;
99-
Iterator &operator=(const Iterator &) = default;
100-
Iterator &operator=(Iterator &&) noexcept = default;
10196

10297
[[nodiscard]] reference operator*() const { return *m_entry; }
10398
[[nodiscard]] pointer operator->() const { return &*m_entry; }
10499

105100
[[nodiscard]] bool operator==(const Iterator &other) const {
106101
return m_entry == other.m_entry;
107102
}
108-
[[nodiscard]] bool operator!=(const Iterator &other) const {
109-
return m_entry != other.m_entry;
110-
}
111103

112104
Iterator &operator++() {
113105
next_();

src/odr/internal/common/path.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,13 @@ AbsPath Path::make_absolute() const {
158158
return AbsPath("/" + m_path);
159159
}
160160

161+
RelPath Path::make_relative() const {
162+
if (!m_absolute) {
163+
return RelPath(*this);
164+
}
165+
return RelPath(m_path.substr(1));
166+
}
167+
161168
std::string Path::basename() const noexcept {
162169
const auto find = m_path.rfind('/');
163170
if (find == std::string::npos) {

src/odr/internal/common/path.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class Path {
4444
[[nodiscard]] RelPath as_relative() &&;
4545

4646
[[nodiscard]] AbsPath make_absolute() const;
47+
[[nodiscard]] RelPath make_relative() const;
4748

4849
[[nodiscard]] std::string basename() const noexcept;
4950
[[nodiscard]] std::string extension() const noexcept;

src/odr/internal/odf/odf_document.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,29 +44,30 @@ void Document::save(const Path &path) const {
4444

4545
// `mimetype` has to be the first file and uncompressed
4646
if (m_filesystem->is_file(AbsPath("/mimetype"))) {
47-
archive.insert_file(std::end(archive), AbsPath("/mimetype"),
47+
archive.insert_file(std::end(archive), RelPath("mimetype"),
4848
m_filesystem->open(AbsPath("/mimetype")), 0);
4949
}
5050

5151
for (auto walker = m_filesystem->file_walker(AbsPath("/")); !walker->end();
5252
walker->next()) {
53-
auto p = walker->path();
54-
if (p == Path("/mimetype")) {
53+
const AbsPath &abs_path = walker->path();
54+
RelPath rel_path = abs_path.rebase(AbsPath("/"));
55+
if (abs_path == Path("/mimetype")) {
5556
continue;
5657
}
57-
if (m_filesystem->is_directory(p)) {
58-
archive.insert_directory(std::end(archive), p);
58+
if (walker->is_directory()) {
59+
archive.insert_directory(std::end(archive), rel_path);
5960
continue;
6061
}
61-
if (p == Path("/content.xml")) {
62+
if (abs_path == Path("/content.xml")) {
6263
// TODO stream
6364
std::stringstream out;
6465
m_content_xml.print(out, "", pugi::format_raw);
6566
auto tmp = std::make_shared<MemoryFile>(out.str());
66-
archive.insert_file(std::end(archive), p, tmp);
67+
archive.insert_file(std::end(archive), rel_path, tmp);
6768
continue;
6869
}
69-
if (p == Path("/META-INF/manifest.xml")) {
70+
if (abs_path == Path("/META-INF/manifest.xml")) {
7071
// TODO
7172
auto manifest =
7273
util::xml::parse(*m_filesystem, AbsPath("/META-INF/manifest.xml"));
@@ -78,11 +79,12 @@ void Document::save(const Path &path) const {
7879
std::stringstream out;
7980
manifest.print(out, "", pugi::format_raw);
8081
auto tmp = std::make_shared<MemoryFile>(out.str());
81-
archive.insert_file(std::end(archive), p, tmp);
82+
archive.insert_file(std::end(archive), rel_path, tmp);
8283

8384
continue;
8485
}
85-
archive.insert_file(std::end(archive), p, m_filesystem->open(p));
86+
archive.insert_file(std::end(archive), rel_path,
87+
m_filesystem->open(abs_path));
8688
}
8789

8890
std::ofstream ostream = util::file::create(path.string());

src/odr/internal/ooxml/text/ooxml_text_document.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,22 @@ void Document::save(const Path &path) const {
4343

4444
for (auto walker = m_filesystem->file_walker(AbsPath("/")); !walker->end();
4545
walker->next()) {
46-
auto p = walker->path();
47-
if (m_filesystem->is_directory(p)) {
48-
archive.insert_directory(std::end(archive), p);
46+
const AbsPath &abs_path = walker->path();
47+
RelPath rel_path = walker->path().rebase(AbsPath("/"));
48+
if (walker->is_directory()) {
49+
archive.insert_directory(std::end(archive), rel_path);
4950
continue;
5051
}
51-
if (p == Path("/word/document.xml")) {
52+
if (abs_path == AbsPath("/word/document.xml")) {
5253
// TODO stream
5354
std::stringstream out;
5455
m_document_xml.print(out, "", pugi::format_raw);
5556
auto tmp = std::make_shared<MemoryFile>(out.str());
56-
archive.insert_file(std::end(archive), p, tmp);
57+
archive.insert_file(std::end(archive), rel_path, tmp);
5758
continue;
5859
}
59-
archive.insert_file(std::end(archive), p, m_filesystem->open(p));
60+
archive.insert_file(std::end(archive), rel_path,
61+
m_filesystem->open(abs_path));
6062
}
6163

6264
std::ofstream ostream = util::file::create(path.string());

src/odr/internal/zip/zip_archive.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@
1414

1515
namespace odr::internal::zip {
1616

17-
ZipArchive::Entry::Entry(Path path, std::shared_ptr<abstract::File> file,
17+
ZipArchive::Entry::Entry(RelPath path, std::shared_ptr<abstract::File> file,
1818
std::uint32_t compression_level)
1919
: m_path{std::move(path)}, m_file{std::move(file)},
2020
m_compression_level{compression_level} {}
2121

22-
bool ZipArchive::Entry::is_file() const { return m_file.operator bool(); }
22+
bool ZipArchive::Entry::is_file() const { return m_file != nullptr; }
2323

24-
bool ZipArchive::Entry::is_directory() const { return !m_file; }
24+
bool ZipArchive::Entry::is_directory() const { return m_file == nullptr; }
2525

26-
Path ZipArchive::Entry::path() const { return m_path; }
26+
const RelPath &ZipArchive::Entry::path() const { return m_path; }
2727

2828
std::shared_ptr<abstract::File> ZipArchive::Entry::file() const {
2929
return m_file;
@@ -41,14 +41,15 @@ ZipArchive::ZipArchive() = default;
4141

4242
ZipArchive::ZipArchive(const std::shared_ptr<util::Archive> &archive) {
4343
for (auto &&entry : *archive) {
44+
RelPath path(entry.path());
4445
if (entry.is_file()) {
4546
std::uint8_t compression_level = 6;
4647
if (entry.method() == util::Method::STORED) {
4748
compression_level = 0;
4849
}
49-
insert_file(end(), entry.path(), entry.file(), compression_level);
50+
insert_file(end(), std::move(path), entry.file(), compression_level);
5051
} else if (entry.is_directory()) {
51-
insert_directory(end(), entry.path());
52+
insert_directory(end(), std::move(path));
5253
}
5354
}
5455
}
@@ -58,7 +59,7 @@ std::shared_ptr<abstract::Filesystem> ZipArchive::as_filesystem() const {
5859
auto filesystem = std::make_shared<VirtualFilesystem>();
5960

6061
for (const auto &e : *this) {
61-
AbsPath path = e.path().make_absolute();
62+
AbsPath path = Path(e.path()).make_absolute();
6263

6364
if (e.is_directory()) {
6465
filesystem->create_directory(path);
@@ -80,7 +81,8 @@ void ZipArchive::save(std::ostream &out) const {
8081
archive.m_pWrite = [](void *opaque, std::uint64_t /*offset*/,
8182
const void *buffer, std::size_t size) {
8283
auto out = static_cast<std::ostream *>(opaque);
83-
out->write(static_cast<const char *>(buffer), size);
84+
out->write(static_cast<const char *>(buffer),
85+
static_cast<std::streamsize>(size));
8486
return size;
8587
};
8688
state = mz_zip_writer_init(&archive, 0);
@@ -89,7 +91,7 @@ void ZipArchive::save(std::ostream &out) const {
8991
}
9092

9193
for (auto &&entry : *this) {
92-
auto path = entry.path().make_absolute();
94+
RelPath path = entry.path().make_relative();
9395

9496
if (entry.is_file()) {
9597
auto file = entry.file();
@@ -128,7 +130,7 @@ ZipArchive::Iterator ZipArchive::begin() const {
128130

129131
ZipArchive::Iterator ZipArchive::end() const { return std::cend(m_entries); }
130132

131-
ZipArchive::Iterator ZipArchive::find(const Path &path) const {
133+
ZipArchive::Iterator ZipArchive::find(const RelPath &path) const {
132134
for (auto it = begin(); it != end(); ++it) {
133135
if (it->path() == path) {
134136
return it;
@@ -139,15 +141,15 @@ ZipArchive::Iterator ZipArchive::find(const Path &path) const {
139141
}
140142

141143
ZipArchive::Iterator
142-
ZipArchive::insert_file(Iterator at, Path path,
144+
ZipArchive::insert_file(Iterator at, RelPath path,
143145
std::shared_ptr<abstract::File> file,
144146
std::uint32_t compression_level) {
145147
return m_entries.insert(
146148
at,
147149
ZipArchive::Entry(std::move(path), std::move(file), compression_level));
148150
}
149151

150-
ZipArchive::Iterator ZipArchive::insert_directory(Iterator at, Path path) {
152+
ZipArchive::Iterator ZipArchive::insert_directory(Iterator at, RelPath path) {
151153
return m_entries.insert(at, ZipArchive::Entry(std::move(path), nullptr, 0));
152154
}
153155

src/odr/internal/zip/zip_archive.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,28 +40,28 @@ class ZipArchive final : public abstract::Archive {
4040
[[nodiscard]] Iterator begin() const;
4141
[[nodiscard]] Iterator end() const;
4242

43-
[[nodiscard]] Iterator find(const Path &path) const;
43+
[[nodiscard]] Iterator find(const RelPath &path) const;
4444

45-
Iterator insert_file(Iterator at, Path path,
45+
Iterator insert_file(Iterator at, RelPath path,
4646
std::shared_ptr<abstract::File> file,
4747
std::uint32_t compression_level = 6);
48-
Iterator insert_directory(Iterator at, Path path);
48+
Iterator insert_directory(Iterator at, RelPath path);
4949

5050
class Entry {
5151
public:
52-
Entry(Path path, std::shared_ptr<abstract::File> file,
52+
Entry(RelPath path, std::shared_ptr<abstract::File> file,
5353
std::uint32_t compression_level);
5454

5555
[[nodiscard]] bool is_file() const;
5656
[[nodiscard]] bool is_directory() const;
57-
[[nodiscard]] Path path() const;
57+
[[nodiscard]] const RelPath &path() const;
5858
[[nodiscard]] std::shared_ptr<abstract::File> file() const;
5959
[[nodiscard]] std::uint32_t compression_level() const;
6060

6161
void file(std::shared_ptr<abstract::File> file);
6262

6363
private:
64-
Path m_path;
64+
RelPath m_path;
6565
std::shared_ptr<abstract::File> m_file;
6666
std::uint32_t m_compression_level{6};
6767

src/odr/internal/zip/zip_util.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,12 +145,12 @@ bool Archive::Entry::is_directory() const {
145145
return mz_zip_reader_is_file_a_directory(m_archive->zip(), m_index);
146146
}
147147

148-
Path Archive::Entry::path() const {
148+
RelPath Archive::Entry::path() const {
149149
std::lock_guard lock(m_archive->mutex());
150150
char filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE];
151151
mz_zip_reader_get_filename(m_archive->zip(), m_index, filename,
152152
MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE);
153-
return Path(filename).make_absolute();
153+
return RelPath(filename);
154154
}
155155

156156
Method Archive::Entry::method() const {
@@ -208,7 +208,7 @@ Archive::Iterator Archive::end() const {
208208
return {*this, mz_zip_reader_get_num_files(&m_zip)};
209209
}
210210

211-
Archive::Iterator Archive::find(const Path &path) const {
211+
Archive::Iterator Archive::find(const RelPath &path) const {
212212
return std::find_if(begin(), end(), [&path](const Entry &entry) {
213213
return entry.path() == path;
214214
});
@@ -224,8 +224,8 @@ void util::open_from_file(mz_zip_archive &archive, const abstract::File &file,
224224
archive.m_pRead = [](void *opaque, std::uint64_t offset, void *buffer,
225225
std::size_t size) {
226226
auto in = static_cast<std::istream *>(opaque);
227-
in->seekg(offset);
228-
in->read(static_cast<char *>(buffer), size);
227+
in->seekg(static_cast<std::streamsize>(offset));
228+
in->read(static_cast<char *>(buffer), static_cast<std::streamsize>(size));
229229
return size;
230230
};
231231
const bool state = mz_zip_reader_init(
@@ -242,7 +242,8 @@ bool util::append_file(mz_zip_archive &archive, const std::string &path,
242242
auto read_callback = [](void *opaque, std::uint64_t /*offset*/, void *buffer,
243243
std::size_t size) -> std::size_t {
244244
auto istream = static_cast<std::istream *>(opaque);
245-
istream->read(static_cast<char *>(buffer), size);
245+
istream->read(static_cast<char *>(buffer),
246+
static_cast<std::streamsize>(size));
246247
return istream->gcount();
247248
};
248249

src/odr/internal/zip/zip_util.hpp

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#include <miniz/miniz_zip.h>
1616

1717
namespace odr::internal {
18-
class Path;
18+
class RelPath;
1919
class MemoryFile;
2020
class DiskFile;
2121
} // namespace odr::internal
@@ -44,7 +44,7 @@ class Archive final : public std::enable_shared_from_this<Archive> {
4444
[[nodiscard]] Iterator begin() const;
4545
[[nodiscard]] Iterator end() const;
4646

47-
[[nodiscard]] Iterator find(const Path &path) const;
47+
[[nodiscard]] Iterator find(const RelPath &path) const;
4848

4949
class Entry {
5050
public:
@@ -59,13 +59,10 @@ class Archive final : public std::enable_shared_from_this<Archive> {
5959
[[nodiscard]] bool operator==(const Entry &other) const {
6060
return m_index == other.m_index;
6161
}
62-
[[nodiscard]] bool operator!=(const Entry &other) const {
63-
return m_index != other.m_index;
64-
}
6562

6663
[[nodiscard]] bool is_file() const;
6764
[[nodiscard]] bool is_directory() const;
68-
[[nodiscard]] Path path() const;
65+
[[nodiscard]] RelPath path() const;
6966
[[nodiscard]] Method method() const;
7067
[[nodiscard]] std::shared_ptr<abstract::File> file() const;
7168

@@ -84,22 +81,14 @@ class Archive final : public std::enable_shared_from_this<Archive> {
8481
using pointer = const Entry *;
8582
using reference = const Entry &;
8683

87-
Iterator(const Iterator &) = default;
88-
Iterator(Iterator &&) noexcept = default;
8984
Iterator(const Archive &zip, std::uint32_t index) : m_entry{zip, index} {}
90-
~Iterator() = default;
91-
Iterator &operator=(const Iterator &) = default;
92-
Iterator &operator=(Iterator &&) noexcept = default;
9385

9486
[[nodiscard]] reference operator*() const { return m_entry; }
9587
[[nodiscard]] pointer operator->() const { return &m_entry; }
9688

9789
[[nodiscard]] bool operator==(const Iterator &other) const {
9890
return m_entry == other.m_entry;
9991
}
100-
[[nodiscard]] bool operator!=(const Iterator &other) const {
101-
return m_entry != other.m_entry;
102-
}
10392

10493
Iterator &operator++() {
10594
m_entry.m_index++;

test/src/internal/cfb/cfb_archive_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ TEST(CfbArchive, open_encrypted_docx) {
3030
util::Archive cfb(std::make_shared<MemoryFile>(
3131
DiskFile(TestData::test_file_path("odr-public/docx/encrypted.docx"))));
3232

33-
EXPECT_TRUE(cfb.find(AbsPath("Encryption")) == std::end(cfb));
33+
EXPECT_TRUE(cfb.find(AbsPath("/Encryption")) == std::end(cfb));
3434
EXPECT_TRUE(cfb.find(AbsPath("/EncryptionInfo")) != std::end(cfb));
3535
}

0 commit comments

Comments
 (0)