Android-cuttlefish cvd tool
zip_cc.h
Go to the documentation of this file.
1//
2// Copyright (C) 2025 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16#pragma once
17
18#include <stddef.h>
19#include <stdint.h>
20
21#include <memory>
22#include <optional>
23#include <string>
24
26
27namespace cuttlefish {
28
30 public:
31 virtual ~ReadableZipSourceCallback() = default;
32
33 virtual bool Close() = 0;
34 virtual bool Open() = 0;
35 virtual int64_t Read(char* data, uint64_t len) = 0;
36 virtual uint64_t Size() = 0;
37};
38
39/* Callback interface to provide file data to libzip. */
41 public:
42 virtual ~SeekableZipSourceCallback() = default;
43
44 virtual bool SetOffset(int64_t offset) = 0;
45 virtual int64_t Offset() = 0;
46};
47
48enum class ZipCompression {
50 kStore,
51 kBzip2,
53 kXz,
54 kZstd,
55};
56
57struct ZipStat {
58 std::optional<std::string> name;
59 std::optional<uint64_t> index;
60 std::optional<uint64_t> size;
61 std::optional<uint64_t> compressed_size;
62 std::optional<ZipCompression> compression_method;
63};
64
66 public:
67 friend class ReadableZip;
68 friend class SeekableZipSource;
69 friend class WritableZip;
70 friend class WritableZipSource;
71 friend class ZipSourceReader;
73 friend class ZipSourceWriter;
74
76 std::unique_ptr<ReadableZipSourceCallback>);
77
78 // Can be safely called with a subclass type.
81 // Can be safely called with a subclass type.
83
85
86 /* Returns a RAII instance that puts this instance in an "open for reading"
87 * state. Can fail. Should not outlive this instance. */
89
90 private:
91 struct Impl; // For pimpl: to avoid exposing libzip headers
92
93 ReadableZipSource(std::unique_ptr<Impl>);
94
95 std::unique_ptr<Impl> impl_;
96};
97
99 public:
100 friend class ReadableZip;
101 friend class WritableZipSource;
102
104 std::unique_ptr<SeekableZipSourceCallback>);
105
109
110 /* Returns a RAII instance that puts this instance in an "open for reading"
111 * state. Can fail. Should not outlive this instance. */
113
114 private:
115 SeekableZipSource(std::unique_ptr<Impl>);
116};
117
119 public:
120 friend class ReadableZip;
121 /* References `data`, may not update it on write but `data` should outlive the
122 * returned instance. */
123 static Result<WritableZipSource> BorrowData(const void* data, size_t size);
124 static Result<WritableZipSource> FromFile(const std::string& path);
125 /* Data access to an in-memory buffer based on serializing a zip archive. */
127
131
132 /* Returns a RAII instance that puts this instance in an "open for writing"
133 * state. Can fail. Should not outlive this instance. Cannot be used at the
134 * same time as the `Reader()` method from superclasses. */
136
137 private:
138 WritableZipSource(std::unique_ptr<Impl>);
139};
140
141/* A `ReadableZipSource` in an "open for reading" state. */
143 public:
144 friend class ReadableZipSource;
146
148 virtual ~ZipSourceReader();
150
151 /* Returns a failed Result on error, or a successful result with bytes read or
152 * 0 on EOF. */
153 Result<uint64_t> Read(void* data, uint64_t length);
154
155 private:
157
159};
160
161/* A `SeekableZipSource` in an "open for reading" state. */
163 public:
164 friend class SeekableZipSource;
165
169
170 Result<void> SeekFromStart(int64_t offset);
171
172 private:
174};
175
176/* A `WritableZipSource` in an "open for writing" state. */
178 public:
179 friend class WritableZipSource;
180
184
185 /* Writes are not committed until `Finalize` is called. Returns number of
186 * bytes written. */
187 Result<uint64_t> Write(void* data, uint64_t length);
188 Result<void> SeekFromStart(int64_t offset);
189
190 /* Commits writes and closes the writer. */
192
193 private:
195
197};
198
200 public:
201 friend class WritableZip;
202 friend class WritableZipSource;
203
205
207 virtual ~ReadableZip();
209
210 /* Counts members, including un-finalized ones from AddFile. */
212
213 /* Decompresses and extract a file from the archive. */
214 Result<SeekableZipSource> GetFile(const std::string& name);
215 Result<SeekableZipSource> GetFile(uint64_t index);
216
217 private:
218 struct Impl; // For pimpl: to avoid exposing libzip headers
219
220 ReadableZip(std::unique_ptr<Impl>);
221
222 std::unique_ptr<Impl> impl_;
223};
224
225class WritableZip : public ReadableZip {
226 public:
227 enum class OpenBehavior {
228 KeepIfExists,
229 Truncate,
230 };
233
235 ~WritableZip() override;
237
238 /* Mutates the archive to add a file. Reading the contents of the sources that
239 * are added is deferred until `Finalize` time. */
240 Result<void> AddFile(const std::string& name, ReadableZipSource);
241
242 /* Performs transfers from the input `ZipSource`s to the output `ZipSource`
243 * and does the archive encoding. */
245
246 private:
248
249 WritableZip(std::unique_ptr<Impl>);
250};
251
252} // namespace cuttlefish
Definition: expected.h:86
virtual ~ReadableZipSourceCallback()=default
virtual int64_t Read(char *data, uint64_t len)=0
Definition: zip_cc.h:65
Result< class ZipSourceReader > Reader()
Definition: zip_cc.cc:262
static Result< ReadableZipSource > FromCallbacks(std::unique_ptr< ReadableZipSourceCallback >)
Definition: zip_cc.cc:213
friend class SeekableZipSource
Definition: zip_cc.h:68
ReadableZipSource(ReadableZipSource &&)
Result< ZipStat > Stat()
Definition: zip_cc.cc:233
ReadableZipSource & operator=(ReadableZipSource &&)
std::unique_ptr< Impl > impl_
Definition: zip_cc.h:95
Definition: zip_cc.h:199
Result< SeekableZipSource > GetFile(const std::string &name)
Definition: zip_cc.cc:481
static Result< ReadableZip > FromSource(SeekableZipSource)
Definition: zip_cc.cc:445
ReadableZip(ReadableZip &&)
friend class WritableZip
Definition: zip_cc.h:201
std::unique_ptr< Impl > impl_
Definition: zip_cc.h:222
ReadableZip & operator=(ReadableZip &&)
Result< uint64_t > NumEntries()
Definition: zip_cc.cc:471
virtual bool SetOffset(int64_t offset)=0
virtual ~SeekableZipSourceCallback()=default
Definition: zip_cc.h:98
friend class WritableZipSource
Definition: zip_cc.h:101
static Result< SeekableZipSource > FromCallbacks(std::unique_ptr< SeekableZipSourceCallback >)
Definition: zip_cc.cc:274
SeekableZipSource & operator=(SeekableZipSource &&)
SeekableZipSource(SeekableZipSource &&)
Result< class SeekingZipSourceReader > Reader()
Definition: zip_cc.cc:295
Definition: zip_cc.h:162
SeekingZipSourceReader(SeekingZipSourceReader &&)
Result< void > SeekFromStart(int64_t offset)
Definition: zip_cc.cc:380
SeekingZipSourceReader & operator=(SeekingZipSourceReader &&)
Definition: zip_cc.h:118
Result< class ZipSourceWriter > Writer()
Definition: zip_cc.cc:335
static Result< WritableZipSource > BorrowData(const void *data, size_t size)
Definition: zip_cc.cc:307
WritableZipSource(WritableZipSource &&)
WritableZipSource & operator=(WritableZipSource &&)
static Result< WritableZipSource > FromFile(const std::string &path)
Definition: zip_cc.cc:319
static Result< WritableZipSource > FromZip(class WritableZip)
Definition: zip_cc.cc:571
Definition: zip_cc.h:225
OpenBehavior
Definition: zip_cc.h:227
WritableZip & operator=(WritableZip &&)
static Result< void > Finalize(WritableZip)
Definition: zip_cc.cc:560
WritableZip(WritableZip &&)
Result< void > AddFile(const std::string &name, ReadableZipSource)
Definition: zip_cc.cc:544
static Result< WritableZip > FromSource(WritableZipSource, OpenBehavior open_behavior=OpenBehavior::Truncate)
Definition: zip_cc.cc:507
Definition: zip_cc.h:142
friend class SeekingZipSourceReader
Definition: zip_cc.h:145
ReadableZipSource * source_
Definition: zip_cc.h:158
ZipSourceReader(ZipSourceReader &&)
Definition: zip_cc.cc:346
virtual ~ZipSourceReader()
Definition: zip_cc.cc:357
Result< uint64_t > Read(void *data, uint64_t length)
Definition: zip_cc.cc:363
ZipSourceReader & operator=(ZipSourceReader &&)
Definition: zip_cc.cc:351
Definition: zip_cc.h:177
static Result< void > Finalize(ZipSourceWriter)
Definition: zip_cc.cc:435
ZipSourceWriter(ZipSourceWriter &&)
Definition: zip_cc.cc:396
~ZipSourceWriter()
Definition: zip_cc.cc:407
Result< uint64_t > Write(void *data, uint64_t length)
Definition: zip_cc.cc:413
Result< void > SeekFromStart(int64_t offset)
Definition: zip_cc.cc:424
ZipSourceWriter & operator=(ZipSourceWriter &&)
Definition: zip_cc.cc:401
WritableZipSource * source_
Definition: zip_cc.h:196
char data[Size]
Definition: incremental_server.cpp:1
uint32_t size
Definition: io.h:2
Definition: alloc_utils.cpp:23
ZipCompression
Definition: zip_cc.h:48
Definition: zip_cc.cc:196
Definition: zip_cc.cc:202
Definition: zip_cc.h:57
std::optional< uint64_t > compressed_size
Definition: zip_cc.h:61
std::optional< ZipCompression > compression_method
Definition: zip_cc.h:62
std::optional< uint64_t > index
Definition: zip_cc.h:59
std::optional< std::string > name
Definition: zip_cc.h:58
std::optional< uint64_t > size
Definition: zip_cc.h:60