Merge "zip_archive: Make Inflate a public API."
This commit is contained in:
commit
d2ea4471bc
2 changed files with 61 additions and 39 deletions
|
|
@ -230,4 +230,44 @@ int32_t ProcessZipEntryContents(ZipArchiveHandle handle, ZipEntry* entry,
|
||||||
ProcessZipEntryFunction func, void* cookie);
|
ProcessZipEntryFunction func, void* cookie);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
namespace zip_archive {
|
||||||
|
|
||||||
|
class Writer {
|
||||||
|
public:
|
||||||
|
virtual bool Append(uint8_t* buf, size_t buf_size) = 0;
|
||||||
|
virtual ~Writer();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Writer() = default;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Writer(const Writer&) = delete;
|
||||||
|
void operator=(const Writer&) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Reader {
|
||||||
|
public:
|
||||||
|
virtual bool ReadAtOffset(uint8_t* buf, size_t len, uint32_t offset) const = 0;
|
||||||
|
virtual ~Reader();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Reader() = default;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Reader(const Reader&) = delete;
|
||||||
|
void operator=(const Reader&) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Inflates the first |compressed_length| bytes of |reader| to a given |writer|.
|
||||||
|
* |crc_out| is set to the CRC32 checksum of the uncompressed data.
|
||||||
|
*
|
||||||
|
* Returns 0 on success and negative values on failure, for example if |reader|
|
||||||
|
* cannot supply the right amount of data, or if the number of bytes written to
|
||||||
|
* data does not match |uncompressed_length|.
|
||||||
|
*/
|
||||||
|
int32_t Inflate(const Reader& reader, const uint32_t compressed_length,
|
||||||
|
const uint32_t uncompressed_length, Writer* writer, uint64_t* crc_out);
|
||||||
|
} // namespace zip_archive
|
||||||
|
|
||||||
#endif // LIBZIPARCHIVE_ZIPARCHIVE_H_
|
#endif // LIBZIPARCHIVE_ZIPARCHIVE_H_
|
||||||
|
|
|
||||||
|
|
@ -725,22 +725,10 @@ int32_t Next(void* cookie, ZipEntry* data, ZipString* name) {
|
||||||
return kIterationEnd;
|
return kIterationEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
class Writer {
|
|
||||||
public:
|
|
||||||
virtual bool Append(uint8_t* buf, size_t buf_size) = 0;
|
|
||||||
virtual ~Writer() {}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Writer() = default;
|
|
||||||
|
|
||||||
private:
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(Writer);
|
|
||||||
};
|
|
||||||
|
|
||||||
// A Writer that writes data to a fixed size memory region.
|
// A Writer that writes data to a fixed size memory region.
|
||||||
// The size of the memory region must be equal to the total size of
|
// The size of the memory region must be equal to the total size of
|
||||||
// the data appended to it.
|
// the data appended to it.
|
||||||
class MemoryWriter : public Writer {
|
class MemoryWriter : public zip_archive::Writer {
|
||||||
public:
|
public:
|
||||||
MemoryWriter(uint8_t* buf, size_t size) : Writer(), buf_(buf), size_(size), bytes_written_(0) {}
|
MemoryWriter(uint8_t* buf, size_t size) : Writer(), buf_(buf), size_(size), bytes_written_(0) {}
|
||||||
|
|
||||||
|
|
@ -764,7 +752,7 @@ class MemoryWriter : public Writer {
|
||||||
|
|
||||||
// A Writer that appends data to a file |fd| at its current position.
|
// A Writer that appends data to a file |fd| at its current position.
|
||||||
// The file will be truncated to the end of the written data.
|
// The file will be truncated to the end of the written data.
|
||||||
class FileWriter : public Writer {
|
class FileWriter : public zip_archive::Writer {
|
||||||
public:
|
public:
|
||||||
// Creates a FileWriter for |fd| and prepare to write |entry| to it,
|
// Creates a FileWriter for |fd| and prepare to write |entry| to it,
|
||||||
// guaranteeing that the file descriptor is valid and that there's enough
|
// guaranteeing that the file descriptor is valid and that there's enough
|
||||||
|
|
@ -848,19 +836,7 @@ class FileWriter : public Writer {
|
||||||
size_t total_bytes_written_;
|
size_t total_bytes_written_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Reader {
|
class EntryReader : public zip_archive::Reader {
|
||||||
public:
|
|
||||||
virtual bool ReadAtOffset(uint8_t* buf, size_t len, uint32_t offset) const = 0;
|
|
||||||
virtual ~Reader() {}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Reader() = default;
|
|
||||||
|
|
||||||
private:
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(Reader);
|
|
||||||
};
|
|
||||||
|
|
||||||
class EntryReader : public Reader {
|
|
||||||
public:
|
public:
|
||||||
EntryReader(const MappedZipFile& zip_file, const ZipEntry* entry)
|
EntryReader(const MappedZipFile& zip_file, const ZipEntry* entry)
|
||||||
: Reader(), zip_file_(zip_file), entry_(entry) {}
|
: Reader(), zip_file_(zip_file), entry_(entry) {}
|
||||||
|
|
@ -884,9 +860,14 @@ static inline int zlib_inflateInit2(z_stream* stream, int window_bits) {
|
||||||
}
|
}
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
static int32_t InflateReaderToWriter(const Reader& reader, const uint32_t compressed_length,
|
namespace zip_archive {
|
||||||
const uint32_t uncompressed_length, Writer* writer,
|
|
||||||
uint64_t* crc_out) {
|
// Moved out of line to avoid -Wweak-vtables.
|
||||||
|
Reader::~Reader() {}
|
||||||
|
Writer::~Writer() {}
|
||||||
|
|
||||||
|
int32_t Inflate(const Reader& reader, const uint32_t compressed_length,
|
||||||
|
const uint32_t uncompressed_length, Writer* writer, uint64_t* crc_out) {
|
||||||
const size_t kBufSize = 32768;
|
const size_t kBufSize = 32768;
|
||||||
std::vector<uint8_t> read_buf(kBufSize);
|
std::vector<uint8_t> read_buf(kBufSize);
|
||||||
std::vector<uint8_t> write_buf(kBufSize);
|
std::vector<uint8_t> write_buf(kBufSize);
|
||||||
|
|
@ -987,17 +968,18 @@ static int32_t InflateReaderToWriter(const Reader& reader, const uint32_t compre
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
} // namespace zip_archive
|
||||||
|
|
||||||
static int32_t InflateEntryToWriter(MappedZipFile& mapped_zip, const ZipEntry* entry,
|
static int32_t InflateEntryToWriter(MappedZipFile& mapped_zip, const ZipEntry* entry,
|
||||||
Writer* writer, uint64_t* crc_out) {
|
zip_archive::Writer* writer, uint64_t* crc_out) {
|
||||||
const EntryReader reader(mapped_zip, entry);
|
const EntryReader reader(mapped_zip, entry);
|
||||||
|
|
||||||
return InflateReaderToWriter(reader, entry->compressed_length, entry->uncompressed_length, writer,
|
return zip_archive::Inflate(reader, entry->compressed_length, entry->uncompressed_length, writer,
|
||||||
crc_out);
|
crc_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t CopyEntryToWriter(MappedZipFile& mapped_zip, const ZipEntry* entry, Writer* writer,
|
static int32_t CopyEntryToWriter(MappedZipFile& mapped_zip, const ZipEntry* entry,
|
||||||
uint64_t* crc_out) {
|
zip_archive::Writer* writer, uint64_t* crc_out) {
|
||||||
static const uint32_t kBufSize = 32768;
|
static const uint32_t kBufSize = 32768;
|
||||||
std::vector<uint8_t> buf(kBufSize);
|
std::vector<uint8_t> buf(kBufSize);
|
||||||
|
|
||||||
|
|
@ -1030,7 +1012,7 @@ static int32_t CopyEntryToWriter(MappedZipFile& mapped_zip, const ZipEntry* entr
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ExtractToWriter(ZipArchiveHandle handle, ZipEntry* entry, Writer* writer) {
|
int32_t ExtractToWriter(ZipArchiveHandle handle, ZipEntry* entry, zip_archive::Writer* writer) {
|
||||||
ZipArchive* archive = reinterpret_cast<ZipArchive*>(handle);
|
ZipArchive* archive = reinterpret_cast<ZipArchive*>(handle);
|
||||||
const uint16_t method = entry->method;
|
const uint16_t method = entry->method;
|
||||||
|
|
||||||
|
|
@ -1060,12 +1042,12 @@ int32_t ExtractToWriter(ZipArchiveHandle handle, ZipEntry* entry, Writer* writer
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ExtractToMemory(ZipArchiveHandle handle, ZipEntry* entry, uint8_t* begin, uint32_t size) {
|
int32_t ExtractToMemory(ZipArchiveHandle handle, ZipEntry* entry, uint8_t* begin, uint32_t size) {
|
||||||
std::unique_ptr<Writer> writer(new MemoryWriter(begin, size));
|
std::unique_ptr<zip_archive::Writer> writer(new MemoryWriter(begin, size));
|
||||||
return ExtractToWriter(handle, entry, writer.get());
|
return ExtractToWriter(handle, entry, writer.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ExtractEntryToFile(ZipArchiveHandle handle, ZipEntry* entry, int fd) {
|
int32_t ExtractEntryToFile(ZipArchiveHandle handle, ZipEntry* entry, int fd) {
|
||||||
std::unique_ptr<Writer> writer(FileWriter::Create(fd, entry));
|
std::unique_ptr<zip_archive::Writer> writer(FileWriter::Create(fd, entry));
|
||||||
if (writer.get() == nullptr) {
|
if (writer.get() == nullptr) {
|
||||||
return kIoError;
|
return kIoError;
|
||||||
}
|
}
|
||||||
|
|
@ -1098,7 +1080,7 @@ ZipString::ZipString(const char* entry_name) : name(reinterpret_cast<const uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(_WIN32)
|
#if !defined(_WIN32)
|
||||||
class ProcessWriter : public Writer {
|
class ProcessWriter : public zip_archive::Writer {
|
||||||
public:
|
public:
|
||||||
ProcessWriter(ProcessZipEntryFunction func, void* cookie)
|
ProcessWriter(ProcessZipEntryFunction func, void* cookie)
|
||||||
: Writer(), proc_function_(func), cookie_(cookie) {}
|
: Writer(), proc_function_(func), cookie_(cookie) {}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue