1 #ifndef OSMIUM_IO_GZIP_COMPRESSION_HPP 2 #define OSMIUM_IO_GZIP_COMPRESSION_HPP 46 #include <osmium/io/detail/read_write.hpp> 77 gzip_error_code(error_code),
78 system_errno(error_code == Z_ERRNO ? errno : 0) {
87 OSMIUM_NORETURN inline void throw_gzip_error(gzFile gzfile,
const char* msg,
int zlib_error = 0) {
88 std::string error{
"gzip error: "};
91 int errnum = zlib_error;
93 error += std::to_string(zlib_error);
95 error += ::gzerror(gzfile, &errnum);
112 m_gzfile(::gzdopen(fd,
"w")) {
114 detail::throw_gzip_error(m_gzfile,
"write initialization failed");
132 void write(
const std::string& data)
final {
134 assert(data.size() < std::numeric_limits<unsigned int>::max());
135 const int nwrite = ::gzwrite(m_gzfile, data.data(),
static_cast<unsigned int>(data.size()));
137 detail::throw_gzip_error(m_gzfile,
"write failed");
144 const int result = ::gzclose(m_gzfile);
146 if (result != Z_OK) {
147 detail::throw_gzip_error(m_gzfile,
"write close failed", result);
150 osmium::io::detail::reliable_fsync(m_fd);
152 osmium::io::detail::reliable_close(m_fd);
165 m_gzfile(::gzdopen(fd,
"r")) {
167 detail::throw_gzip_error(m_gzfile,
"read initialization failed");
187 assert(buffer.size() < std::numeric_limits<unsigned int>::max());
188 int nread = ::gzread(m_gzfile, const_cast<char*>(buffer.data()), static_cast<unsigned int>(buffer.size()));
190 detail::throw_gzip_error(m_gzfile,
"read failed");
192 buffer.resize(static_cast<std::string::size_type>(nread));
193 #if ZLIB_VERNUM >= 0x1240 194 set_offset(
size_t(::gzoffset(m_gzfile)));
201 const int result = ::gzclose(m_gzfile);
203 if (result != Z_OK) {
204 detail::throw_gzip_error(m_gzfile,
"read close failed", result);
223 m_zstream.next_in =
reinterpret_cast<unsigned char*
>(
const_cast<char*
>(buffer));
224 assert(size < std::numeric_limits<unsigned int>::max());
225 m_zstream.avail_in =
static_cast<unsigned int>(size);
226 const int result = inflateInit2(&m_zstream, MAX_WBITS | 32);
227 if (result != Z_OK) {
228 std::string message{
"gzip error: decompression init failed: "};
230 message.append(m_zstream.msg);
254 const size_t buffer_size = 10240;
255 output.append(buffer_size,
'\0');
256 m_zstream.next_out =
reinterpret_cast<unsigned char*
>(
const_cast<char*
>(output.data()));
257 m_zstream.avail_out = buffer_size;
258 const int result = inflate(&m_zstream, Z_SYNC_FLUSH);
260 if (result != Z_OK) {
265 if (result != Z_OK && result != Z_STREAM_END) {
266 std::string message(
"gzip error: inflate failed: ");
268 message.append(m_zstream.msg);
273 output.resize(static_cast<std::size_t>(m_zstream.next_out - reinterpret_cast<const unsigned char*>(output.data())));
280 inflateEnd(&m_zstream);
296 inline bool get_registered_gzip_compression() noexcept {
297 return registered_gzip_compression;
306 #endif // OSMIUM_IO_GZIP_COMPRESSION_HPP gzFile m_gzfile
Definition: gzip_compression.hpp:105
Definition: gzip_compression.hpp:211
gzip_error(const std::string &what, int error_code)
Definition: gzip_compression.hpp:75
gzFile m_gzfile
Definition: gzip_compression.hpp:160
#define OSMIUM_NORETURN
Definition: compatibility.hpp:41
Definition: gzip_compression.hpp:102
z_stream m_zstream
Definition: gzip_compression.hpp:215
static CompressionFactory & instance()
Definition: compression.hpp:184
static constexpr unsigned int input_buffer_size
Definition: compression.hpp:100
GzipCompressor(int fd, fsync sync)
Definition: gzip_compression.hpp:109
size_t m_buffer_size
Definition: gzip_compression.hpp:214
Definition: gzip_compression.hpp:158
~GzipDecompressor() noexcept final
Definition: gzip_compression.hpp:177
Definition: compression.hpp:93
int m_fd
Definition: gzip_compression.hpp:104
GzipBufferDecompressor(const char *buffer, size_t size)
Definition: gzip_compression.hpp:219
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
const char * m_buffer
Definition: gzip_compression.hpp:213
void close() final
Definition: gzip_compression.hpp:279
fsync
Definition: writer_options.hpp:51
void close() final
Definition: gzip_compression.hpp:142
int system_errno
Definition: gzip_compression.hpp:73
Definition: gzip_compression.hpp:70
std::string read() final
Definition: gzip_compression.hpp:185
int gzip_error_code
Definition: gzip_compression.hpp:72
GzipDecompressor(int fd)
Definition: gzip_compression.hpp:164
Definition: compression.hpp:63
void write(const std::string &data) final
Definition: gzip_compression.hpp:132
~GzipCompressor() noexcept final
Definition: gzip_compression.hpp:124
~GzipBufferDecompressor() noexcept final
Definition: gzip_compression.hpp:242
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:189
std::string read() final
Definition: gzip_compression.hpp:250
void close() final
Definition: gzip_compression.hpp:199