1 #ifndef OSMIUM_IO_BZIP2_COMPRESSION_HPP 2 #define OSMIUM_IO_BZIP2_COMPRESSION_HPP 46 #include <osmium/io/detail/read_write.hpp> 59 #include <system_error> 78 bzip2_error_code(error_code),
79 system_errno(error_code == BZ_IO_ERROR ? errno : 0) {
88 OSMIUM_NORETURN inline void throw_bzip2_error(BZFILE* bzfile,
const char* msg,
int bzlib_error = 0) {
89 std::string error{
"bzip2 error: "};
92 int errnum = bzlib_error;
94 error += std::to_string(bzlib_error);
96 error += ::BZ2_bzerror(bzfile, &errnum);
113 m_file(fdopen(::dup(fd),
"wb")),
115 m_bzfile(::BZ2_bzWriteOpen(&m_bzerror, m_file, 6, 0, 0)) {
117 detail::throw_bzip2_error(m_bzfile,
"write open failed", m_bzerror);
135 void write(
const std::string& data)
final {
137 assert(data.size() < std::numeric_limits<int>::max());
138 ::BZ2_bzWrite(&error, m_bzfile, const_cast<char*>(data.data()), static_cast<int>(data.size()));
139 if (error != BZ_OK && error != BZ_STREAM_END) {
140 detail::throw_bzip2_error(m_bzfile,
"write failed", error);
147 ::BZ2_bzWriteClose(&error, m_bzfile, 0,
nullptr,
nullptr);
151 osmium::io::detail::reliable_fsync(::fileno(m_file));
153 if (fclose(m_file) != 0) {
154 throw std::system_error{errno, std::system_category(),
"Close failed"};
157 if (error != BZ_OK) {
158 detail::throw_bzip2_error(m_bzfile,
"write close failed", error);
168 int m_bzerror = BZ_OK;
170 bool m_stream_end =
false;
175 m_file(fdopen(::dup(fd),
"rb")),
176 m_bzfile(::BZ2_bzReadOpen(&m_bzerror, m_file, 0, 0, nullptr, 0)) {
178 detail::throw_bzip2_error(m_bzfile,
"read open failed", m_bzerror);
202 assert(buffer.size() < std::numeric_limits<int>::max());
203 const int nread = ::BZ2_bzRead(&error, m_bzfile, const_cast<char*>(buffer.data()), static_cast<int>(buffer.size()));
204 if (error != BZ_OK && error != BZ_STREAM_END) {
205 detail::throw_bzip2_error(m_bzfile,
"read failed", error);
207 if (error == BZ_STREAM_END) {
210 if (! feof(m_file)) {
211 ::BZ2_bzReadGetUnused(&error, m_bzfile, &unused, &nunused);
212 if (error != BZ_OK) {
213 detail::throw_bzip2_error(m_bzfile,
"get unused failed", error);
215 std::string unused_data(static_cast<const char*>(unused), static_cast<std::string::size_type>(nunused));
216 ::BZ2_bzReadClose(&error, m_bzfile);
217 if (error != BZ_OK) {
218 detail::throw_bzip2_error(m_bzfile,
"read close failed", error);
220 assert(unused_data.size() < std::numeric_limits<int>::max());
221 m_bzfile = ::BZ2_bzReadOpen(&error, m_file, 0, 0, const_cast<void*>(static_cast<const void*>(unused_data.data())),
static_cast<int>(unused_data.size()));
222 if (error != BZ_OK) {
223 detail::throw_bzip2_error(m_bzfile,
"read open failed", error);
229 buffer.resize(static_cast<std::string::size_type>(nread));
232 set_offset(
size_t(ftell(m_file)));
240 ::BZ2_bzReadClose(&error, m_bzfile);
243 if (fclose(m_file) != 0) {
244 throw std::system_error{errno, std::system_category(),
"Close failed"};
247 if (error != BZ_OK) {
248 detail::throw_bzip2_error(m_bzfile,
"read close failed", error);
267 m_bzstream.next_in =
const_cast<char*
>(buffer);
268 assert(size < std::numeric_limits<unsigned int>::max());
269 m_bzstream.avail_in =
static_cast<unsigned int>(size);
270 const int result = BZ2_bzDecompressInit(&m_bzstream, 0, 0);
271 if (result != BZ_OK) {
272 std::string message{
"bzip2 error: decompression init failed: "};
295 const size_t buffer_size = 10240;
296 output.resize(buffer_size);
297 m_bzstream.next_out =
const_cast<char*
>(output.data());
298 m_bzstream.avail_out = buffer_size;
299 const int result = BZ2_bzDecompress(&m_bzstream);
301 if (result != BZ_OK) {
306 if (result != BZ_OK && result != BZ_STREAM_END) {
307 std::string message{
"bzip2 error: decompress failed: "};
311 output.resize(static_cast<std::size_t>(m_bzstream.next_out - output.data()));
318 BZ2_bzDecompressEnd(&m_bzstream);
334 inline bool get_registered_bzip2_compression() noexcept {
335 return registered_bzip2_compression;
344 #endif // OSMIUM_IO_BZIP2_COMPRESSION_HPP bz_stream m_bzstream
Definition: bzip2_compression.hpp:259
Definition: bzip2_compression.hpp:165
int bzip2_error_code
Definition: bzip2_compression.hpp:73
Bzip2Compressor(int fd, fsync sync)
Definition: bzip2_compression.hpp:111
#define OSMIUM_NORETURN
Definition: compatibility.hpp:41
~Bzip2Decompressor() noexcept final
Definition: bzip2_compression.hpp:188
void close() final
Definition: bzip2_compression.hpp:317
void write(const std::string &data) final
Definition: bzip2_compression.hpp:135
const char * m_buffer
Definition: bzip2_compression.hpp:257
int m_bzerror
Definition: bzip2_compression.hpp:106
size_t m_buffer_size
Definition: bzip2_compression.hpp:258
static CompressionFactory & instance()
Definition: compression.hpp:184
~Bzip2BufferDecompressor() noexcept final
Definition: bzip2_compression.hpp:283
static constexpr unsigned int input_buffer_size
Definition: compression.hpp:100
bzip2_error(const std::string &what, int error_code)
Definition: bzip2_compression.hpp:76
std::string read() final
Definition: bzip2_compression.hpp:196
Definition: bzip2_compression.hpp:103
int system_errno
Definition: bzip2_compression.hpp:74
Definition: compression.hpp:93
FILE * m_file
Definition: bzip2_compression.hpp:105
Definition: bzip2_compression.hpp:255
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
Bzip2BufferDecompressor(const char *buffer, size_t size)
Definition: bzip2_compression.hpp:263
fsync
Definition: writer_options.hpp:51
BZFILE * m_bzfile
Definition: bzip2_compression.hpp:169
BZFILE * m_bzfile
Definition: bzip2_compression.hpp:107
void close() final
Definition: bzip2_compression.hpp:144
void close() final
Definition: bzip2_compression.hpp:237
std::string read() final
Definition: bzip2_compression.hpp:291
Definition: compression.hpp:63
FILE * m_file
Definition: bzip2_compression.hpp:167
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
Bzip2Decompressor(int fd)
Definition: bzip2_compression.hpp:174
~Bzip2Compressor() noexcept final
Definition: bzip2_compression.hpp:127
Definition: bzip2_compression.hpp:71