1 #ifndef OSMIUM_IO_GZIP_COMPRESSION_HPP 2 #define OSMIUM_IO_GZIP_COMPRESSION_HPP 58 #include <osmium/io/detail/read_write.hpp> 86 OSMIUM_NORETURN inline void throw_gzip_error(gzFile gzfile,
const char* msg,
int zlib_error = 0) {
87 std::string error{
"gzip error: "};
90 int errnum = zlib_error;
92 error += std::to_string(zlib_error);
94 error += ::gzerror(gzfile, &errnum);
113 detail::throw_gzip_error(
m_gzfile,
"write initialization failed");
125 void write(
const std::string& data)
final {
127 const int nwrite = ::gzwrite(
m_gzfile, data.data(), static_cast_with_assert<unsigned int>(data.size()));
129 detail::throw_gzip_error(
m_gzfile,
"write failed");
136 const int result = ::gzclose(
m_gzfile);
138 if (result != Z_OK) {
139 detail::throw_gzip_error(
m_gzfile,
"write close failed", result);
142 osmium::io::detail::reliable_fsync(
m_fd);
144 osmium::io::detail::reliable_close(
m_fd);
160 detail::throw_gzip_error(
m_gzfile,
"read initialization failed");
174 int nread = ::gzread(
m_gzfile, const_cast<char*>(buffer.data()), static_cast_with_assert<unsigned int>(buffer.size()));
176 detail::throw_gzip_error(
m_gzfile,
"read failed");
178 buffer.resize(static_cast<std::string::size_type>(nread));
179 #if ZLIB_VERNUM >= 0x1240 187 const int result = ::gzclose(
m_gzfile);
189 if (result != Z_OK) {
190 detail::throw_gzip_error(
m_gzfile,
"read close failed", result);
209 m_zstream.next_in =
reinterpret_cast<unsigned char*
>(
const_cast<char*
>(buffer));
210 m_zstream.avail_in = static_cast_with_assert<unsigned int>(size);
211 const int result = inflateInit2(&
m_zstream, MAX_WBITS | 32);
212 if (result != Z_OK) {
213 std::string message{
"gzip error: decompression init failed: "};
233 const size_t buffer_size = 10240;
234 output.append(buffer_size,
'\0');
235 m_zstream.next_out =
reinterpret_cast<unsigned char*
>(
const_cast<char*
>(output.data()));
237 const int result = inflate(&
m_zstream, Z_SYNC_FLUSH);
239 if (result != Z_OK) {
244 if (result != Z_OK && result != Z_STREAM_END) {
245 std::string message(
"gzip error: inflate failed: ");
252 output.resize(static_cast<unsigned long>(
m_zstream.next_out - reinterpret_cast<const unsigned char*>(output.data())));
275 inline bool get_registered_gzip_compression() noexcept {
276 return registered_gzip_compression;
285 #endif // OSMIUM_IO_GZIP_COMPRESSION_HPP gzFile m_gzfile
Definition: gzip_compression.hpp:104
Definition: gzip_compression.hpp:197
gzip_error(const std::string &what, int error_code)
Definition: gzip_compression.hpp:74
gzFile m_gzfile
Definition: gzip_compression.hpp:152
void set_offset(std::size_t offset) noexcept
Definition: compression.hpp:122
#define OSMIUM_NORETURN
Definition: compatibility.hpp:41
Definition: gzip_compression.hpp:101
z_stream m_zstream
Definition: gzip_compression.hpp:201
static CompressionFactory & instance()
Definition: compression.hpp:176
static constexpr unsigned int input_buffer_size
Definition: compression.hpp:94
GzipCompressor(int fd, fsync sync)
Definition: gzip_compression.hpp:108
size_t m_buffer_size
Definition: gzip_compression.hpp:200
Definition: gzip_compression.hpp:150
~GzipDecompressor() noexcept final
Definition: gzip_compression.hpp:164
Definition: compression.hpp:87
int m_fd
Definition: gzip_compression.hpp:103
GzipBufferDecompressor(const char *buffer, size_t size)
Definition: gzip_compression.hpp:205
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
const char * m_buffer
Definition: gzip_compression.hpp:199
void close() final
Definition: gzip_compression.hpp:258
fsync
Definition: writer_options.hpp:51
bool do_fsync() const
Definition: compression.hpp:69
void close() final
Definition: gzip_compression.hpp:134
int system_errno
Definition: gzip_compression.hpp:72
Definition: gzip_compression.hpp:69
std::string read() final
Definition: gzip_compression.hpp:172
int gzip_error_code
Definition: gzip_compression.hpp:71
GzipDecompressor(int fd)
Definition: gzip_compression.hpp:156
Definition: compression.hpp:63
void write(const std::string &data) final
Definition: gzip_compression.hpp:125
~GzipCompressor() noexcept final
Definition: gzip_compression.hpp:117
~GzipBufferDecompressor() noexcept final
Definition: gzip_compression.hpp:221
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:181
std::string read() final
Definition: gzip_compression.hpp:229
void close() final
Definition: gzip_compression.hpp:185