1 #ifndef OSMIUM_IO_GZIP_COMPRESSION_HPP
2 #define OSMIUM_IO_GZIP_COMPRESSION_HPP
68 std::runtime_error(what),
69 gzip_error_code(error_code),
70 system_errno(error_code == Z_ERRNO ? errno : 0) {
79 OSMIUM_NORETURN inline void throw_gzip_error(gzFile gzfile,
const char* msg,
int zlib_error = 0) {
80 std::string error(
"gzip error: ");
83 int errnum = zlib_error;
85 error += std::to_string(zlib_error);
87 error += ::gzerror(gzfile, &errnum);
102 m_gzfile(::gzdopen(fd,
"w")) {
104 detail::throw_gzip_error(m_gzfile,
"write initialization failed");
112 void write(
const std::string& data)
override final {
114 int nwrite = ::gzwrite(m_gzfile, data.data(), static_cast_with_assert<unsigned int>(data.size()));
116 detail::throw_gzip_error(m_gzfile,
"write failed");
123 int result = ::gzclose(m_gzfile);
125 if (result != Z_OK) {
126 detail::throw_gzip_error(m_gzfile,
"write close failed", result);
141 m_gzfile(::gzdopen(fd,
"r")) {
143 detail::throw_gzip_error(m_gzfile,
"read initialization failed");
151 std::string
read() override final {
153 int nread = ::gzread(m_gzfile, const_cast<char*>(buffer.data()), static_cast_with_assert<unsigned int>(buffer.size()));
155 detail::throw_gzip_error(m_gzfile,
"read failed");
157 buffer.resize(static_cast<std::string::size_type>(nread));
163 int result = ::gzclose(m_gzfile);
165 if (result != Z_OK) {
166 detail::throw_gzip_error(m_gzfile,
"read close failed", result);
185 m_zstream.next_in =
reinterpret_cast<unsigned char*
>(
const_cast<char*
>(buffer));
186 m_zstream.avail_in = static_cast_with_assert<unsigned int>(size);
187 int result = inflateInit2(&m_zstream, MAX_WBITS | 32);
188 if (result != Z_OK) {
189 std::string message(
"gzip error: decompression init failed: ");
191 message.append(m_zstream.msg);
198 inflateEnd(&m_zstream);
201 std::string
read() override final {
205 const size_t buffer_size = 10240;
206 output.append(buffer_size,
'\0');
207 m_zstream.next_out =
reinterpret_cast<unsigned char*
>(
const_cast<char*
>(output.data()));
208 m_zstream.avail_out = buffer_size;
209 int result = inflate(&m_zstream, Z_SYNC_FLUSH);
211 if (result != Z_OK) {
216 if (result != Z_OK && result != Z_STREAM_END) {
217 std::string message(
"gzip error: inflate failed: ");
219 message.append(m_zstream.msg);
224 output.resize(static_cast<unsigned long>(m_zstream.next_out - reinterpret_cast<const unsigned char*>(output.data())));
246 #endif // OSMIUM_IO_GZIP_COMPRESSION_HPP
gzFile m_gzfile
Definition: gzip_compression.hpp:96
Definition: gzip_compression.hpp:173
gzip_error(const std::string &what, int error_code)
Definition: gzip_compression.hpp:67
gzFile m_gzfile
Definition: gzip_compression.hpp:135
#define OSMIUM_NORETURN
Definition: compatibility.hpp:44
Definition: gzip_compression.hpp:94
z_stream m_zstream
Definition: gzip_compression.hpp:177
static CompressionFactory & instance()
Definition: compression.hpp:136
~GzipBufferDecompressor() overridefinal
Definition: gzip_compression.hpp:197
static constexpr unsigned int input_buffer_size
Definition: compression.hpp:78
std::string read() overridefinal
Definition: gzip_compression.hpp:151
Definition: reader_iterator.hpp:39
void close() overridefinal
Definition: gzip_compression.hpp:121
size_t m_buffer_size
Definition: gzip_compression.hpp:176
Definition: gzip_compression.hpp:133
Definition: compression.hpp:74
GzipBufferDecompressor(const char *buffer, size_t size)
Definition: gzip_compression.hpp:181
Namespace for everything in the Osmium library.
Definition: assembler.hpp:55
~GzipCompressor() overridefinal
Definition: gzip_compression.hpp:108
const char * m_buffer
Definition: gzip_compression.hpp:175
void close() overridefinal
Definition: gzip_compression.hpp:161
int system_errno
Definition: gzip_compression.hpp:65
Definition: gzip_compression.hpp:62
~GzipDecompressor() overridefinal
Definition: gzip_compression.hpp:147
int gzip_error_code
Definition: gzip_compression.hpp:64
GzipDecompressor(int fd)
Definition: gzip_compression.hpp:139
Definition: compression.hpp:59
void write(const std::string &data) overridefinal
Definition: gzip_compression.hpp:112
std::string read() overridefinal
Definition: gzip_compression.hpp:201
GzipCompressor(int fd)
Definition: gzip_compression.hpp:100
bool register_compression(osmium::io::file_compression compression, create_compressor_type create_compressor, create_decompressor_type_fd create_decompressor_fd, create_decompressor_type_buffer create_decompressor_buffer)
Definition: compression.hpp:141