1 #ifndef OSMIUM_IO_GZIP_COMPRESSION_HPP 2 #define OSMIUM_IO_GZIP_COMPRESSION_HPP 46 #include <osmium/io/detail/read_write.hpp> 79 gzip_error(
const std::string& what,
const int error_code) :
82 if (error_code == Z_ERRNO) {
93 OSMIUM_NORETURN inline void throw_gzip_error(gzFile gzfile,
const char* msg) {
94 std::string error{
"gzip error: "};
99 error += ::gzerror(gzfile, &error_code);
117 osmium::detail::disable_invalid_parameter_handler diph;
121 throw gzip_error{
"gzip error: write initialization failed"};
139 void write(
const std::string& data)
final {
141 osmium::detail::disable_invalid_parameter_handler diph;
144 assert(data.size() < std::numeric_limits<unsigned int>::max());
146 const int nwrite = ::gzwrite(
m_gzfile, data.data(), static_cast<unsigned int>(data.size()));
148 detail::throw_gzip_error(
m_gzfile,
"write failed");
156 osmium::detail::disable_invalid_parameter_handler diph;
158 const int result = ::gzclose_w(
m_gzfile);
160 if (result != Z_OK) {
161 throw gzip_error{
"gzip error: write close failed", result};
164 osmium::io::detail::reliable_fsync(
m_fd);
166 osmium::io::detail::reliable_close(
m_fd);
180 osmium::detail::disable_invalid_parameter_handler diph;
185 osmium::io::detail::reliable_close(fd);
188 throw gzip_error{
"gzip error: read initialization failed"};
208 osmium::detail::disable_invalid_parameter_handler diph;
212 assert(buffer.size() < std::numeric_limits<unsigned int>::max());
213 int nread = ::gzread(
m_gzfile, &*buffer.begin(), static_cast<unsigned int>(buffer.size()));
215 detail::throw_gzip_error(
m_gzfile,
"read failed");
217 buffer.resize(static_cast<std::string::size_type>(nread));
218 #if ZLIB_VERNUM >= 0x1240 227 osmium::detail::disable_invalid_parameter_handler diph;
229 const int result = ::gzclose_r(
m_gzfile);
231 if (result != Z_OK) {
232 throw gzip_error{
"gzip error: read close failed", result};
251 m_zstream.next_in = reinterpret_cast<unsigned char*>(const_cast<char*>(buffer));
252 assert(size < std::numeric_limits<unsigned int>::max());
253 m_zstream.avail_in = static_cast<unsigned int>(size);
254 const int result = inflateInit2(&
m_zstream, MAX_WBITS | 32);
255 if (result != Z_OK) {
256 std::string message{
"gzip error: decompression init failed: "};
282 const std::size_t buffer_size = 10240;
283 output.append(buffer_size,
'\0');
284 m_zstream.next_out = reinterpret_cast<unsigned char*>(&*output.begin());
286 const int result = inflate(&
m_zstream, Z_SYNC_FLUSH);
288 if (result != Z_OK) {
293 if (result != Z_OK && result != Z_STREAM_END) {
294 std::string message{
"gzip error: inflate failed: "};
301 output.resize(static_cast<std::size_t>(
m_zstream.next_out - reinterpret_cast<const unsigned char*>(output.data())));
324 inline bool get_registered_gzip_compression() noexcept {
325 return registered_gzip_compression;
334 #endif // OSMIUM_IO_GZIP_COMPRESSION_HPP gzFile m_gzfile
Definition: gzip_compression.hpp:109
Definition: compression.hpp:95
GzipBufferDecompressor & operator=(const GzipBufferDecompressor &)=delete
Definition: gzip_compression.hpp:239
gzFile m_gzfile
Definition: gzip_compression.hpp:174
#define OSMIUM_NORETURN
Definition: compatibility.hpp:41
Definition: gzip_compression.hpp:106
std::size_t m_buffer_size
Definition: gzip_compression.hpp:242
z_stream m_zstream
Definition: gzip_compression.hpp:243
gzip_error(const std::string &what, const int error_code)
Definition: gzip_compression.hpp:79
static CompressionFactory & instance()
Definition: compression.hpp:180
GzipDecompressor & operator=(const GzipDecompressor &)=delete
Definition: gzip_compression.hpp:172
~GzipDecompressor() noexcept final
Definition: gzip_compression.hpp:198
Definition: compression.hpp:87
void set_offset(const std::size_t offset) noexcept
Definition: compression.hpp:124
int m_fd
Definition: gzip_compression.hpp:108
bool do_fsync() const noexcept
Definition: compression.hpp:63
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
GzipCompressor(const int fd, const fsync sync)
Definition: gzip_compression.hpp:113
const char * m_buffer
Definition: gzip_compression.hpp:241
void close() final
Definition: gzip_compression.hpp:307
fsync
Definition: writer_options.hpp:51
GzipDecompressor(const int fd)
Definition: gzip_compression.hpp:178
void close() final
Definition: gzip_compression.hpp:153
int system_errno
Definition: gzip_compression.hpp:73
gzip_error(const std::string &what)
Definition: gzip_compression.hpp:75
GzipCompressor & operator=(const GzipCompressor &)=delete
Definition: gzip_compression.hpp:70
std::string read() final
Definition: gzip_compression.hpp:206
int gzip_error_code
Definition: gzip_compression.hpp:72
Definition: compression.hpp:57
void write(const std::string &data) final
Definition: gzip_compression.hpp:139
~GzipCompressor() noexcept final
Definition: gzip_compression.hpp:131
~GzipBufferDecompressor() noexcept final
Definition: gzip_compression.hpp:270
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:185
GzipBufferDecompressor(const char *buffer, const std::size_t size)
Definition: gzip_compression.hpp:247
std::string read() final
Definition: gzip_compression.hpp:278
void close() final
Definition: gzip_compression.hpp:224