1 #ifndef OSMIUM_IO_GZIP_COMPRESSION_HPP 2 #define OSMIUM_IO_GZIP_COMPRESSION_HPP 46 #include <osmium/io/detail/read_write.hpp> 78 gzip_error(
const std::string& what,
const int error_code) :
80 gzip_error_code(error_code) {
81 if (error_code == Z_ERRNO) {
92 [[noreturn]]
inline void throw_gzip_error(gzFile gzfile,
const char* msg) {
93 std::string error{
"gzip error: "};
98 error += ::gzerror(gzfile, &error_code);
116 osmium::detail::disable_invalid_parameter_handler diph;
118 m_gzfile = ::gzdopen(osmium::io::detail::reliable_dup(fd),
"wb");
120 throw gzip_error{
"gzip error: write initialization failed"};
138 void write(
const std::string& data)
override {
140 osmium::detail::disable_invalid_parameter_handler diph;
143 assert(data.size() < std::numeric_limits<unsigned int>::max());
145 const int nwrite = ::gzwrite(m_gzfile, data.data(),
static_cast<unsigned int>(data.size()));
147 detail::throw_gzip_error(m_gzfile,
"write failed");
155 osmium::detail::disable_invalid_parameter_handler diph;
157 const int result = ::gzclose_w(m_gzfile);
159 if (result != Z_OK) {
160 throw gzip_error{
"gzip error: write close failed", result};
169 osmium::io::detail::reliable_fsync(m_fd);
171 osmium::io::detail::reliable_close(m_fd);
179 gzFile m_gzfile =
nullptr;
185 osmium::detail::disable_invalid_parameter_handler diph;
187 m_gzfile = ::gzdopen(fd,
"rb");
190 osmium::io::detail::reliable_close(fd);
193 throw gzip_error{
"gzip error: read initialization failed"};
213 osmium::detail::disable_invalid_parameter_handler diph;
217 assert(buffer.size() < std::numeric_limits<unsigned int>::max());
218 int nread = ::gzread(m_gzfile, &*buffer.begin(),
static_cast<unsigned int>(buffer.size()));
220 detail::throw_gzip_error(m_gzfile,
"read failed");
222 buffer.resize(static_cast<std::string::size_type>(nread));
223 #if ZLIB_VERNUM >= 0x1240 224 set_offset(static_cast<std::size_t>(::gzoffset(m_gzfile)));
232 osmium::detail::disable_invalid_parameter_handler diph;
234 const int result = ::gzclose_r(m_gzfile);
236 if (result != Z_OK) {
237 throw gzip_error{
"gzip error: read close failed", result};
256 m_zstream.next_in =
reinterpret_cast<unsigned char*
>(
const_cast<char*
>(buffer));
257 assert(size < std::numeric_limits<unsigned int>::max());
258 m_zstream.avail_in =
static_cast<unsigned int>(size);
259 const int result = inflateInit2(&m_zstream, MAX_WBITS | 32);
260 if (result != Z_OK) {
261 std::string message{
"gzip error: decompression init failed: "};
263 message.append(m_zstream.msg);
287 const std::size_t buffer_size = 10240;
288 output.append(buffer_size,
'\0');
289 m_zstream.next_out =
reinterpret_cast<unsigned char*
>(&*output.begin());
290 m_zstream.avail_out = buffer_size;
291 const int result = inflate(&m_zstream, Z_SYNC_FLUSH);
293 if (result != Z_OK) {
298 if (result != Z_OK && result != Z_STREAM_END) {
299 std::string message{
"gzip error: inflate failed: "};
301 message.append(m_zstream.msg);
306 output.resize(static_cast<std::size_t>(m_zstream.next_out - reinterpret_cast<const unsigned char*>(output.data())));
313 inflateEnd(&m_zstream);
329 inline bool get_registered_gzip_compression() noexcept {
330 return registered_gzip_compression;
339 #endif // OSMIUM_IO_GZIP_COMPRESSION_HPP gzFile m_gzfile
Definition: gzip_compression.hpp:108
Definition: compression.hpp:95
Definition: gzip_compression.hpp:244
Definition: gzip_compression.hpp:105
std::size_t m_buffer_size
Definition: gzip_compression.hpp:247
z_stream m_zstream
Definition: gzip_compression.hpp:248
gzip_error(const std::string &what, const int error_code)
Definition: gzip_compression.hpp:78
void close() override
Definition: gzip_compression.hpp:152
static CompressionFactory & instance()
Definition: compression.hpp:180
~GzipDecompressor() noexcept
Definition: gzip_compression.hpp:203
Definition: gzip_compression.hpp:177
bool register_compression(osmium::io::file_compression compression, const create_compressor_type &create_compressor, const create_decompressor_type_fd &create_decompressor_fd, const create_decompressor_type_buffer &create_decompressor_buffer)
Definition: compression.hpp:185
Definition: compression.hpp:87
~GzipBufferDecompressor() noexcept
Definition: gzip_compression.hpp:275
~GzipCompressor() noexcept
Definition: gzip_compression.hpp:130
int m_fd
Definition: gzip_compression.hpp:107
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
GzipCompressor(const int fd, const fsync sync)
Definition: gzip_compression.hpp:112
const char * m_buffer
Definition: gzip_compression.hpp:246
void close() override
Definition: gzip_compression.hpp:312
fsync
Definition: writer_options.hpp:51
GzipDecompressor(const int fd)
Definition: gzip_compression.hpp:183
int system_errno
Definition: gzip_compression.hpp:72
void close() override
Definition: gzip_compression.hpp:229
gzip_error(const std::string &what)
Definition: gzip_compression.hpp:74
Definition: gzip_compression.hpp:69
int gzip_error_code
Definition: gzip_compression.hpp:71
void write(const std::string &data) override
Definition: gzip_compression.hpp:138
std::string read() override
Definition: gzip_compression.hpp:211
std::string read() override
Definition: gzip_compression.hpp:283
Definition: compression.hpp:57
GzipBufferDecompressor(const char *buffer, const std::size_t size)
Definition: gzip_compression.hpp:252