1 #ifndef OSMIUM_IO_READER_HPP
2 #define OSMIUM_IO_READER_HPP
42 #include <system_error>
47 # include <sys/wait.h>
55 #include <osmium/io/detail/input_format.hpp>
56 #include <osmium/io/detail/read_thread.hpp>
57 #include <osmium/io/detail/read_write.hpp>
58 #include <osmium/io/detail/queue_util.hpp>
109 detail::future_string_queue_type& input_queue,
110 detail::future_buffer_queue_type& osmdata_queue,
111 std::promise<osmium::io::Header>&& header_promise,
113 std::promise<osmium::io::Header> promise = std::move(header_promise);
114 auto creator = detail::ParserFactory::instance().get_creator_function(file);
115 auto parser = creator(input_queue, osmdata_queue, promise, read_which_entities);
131 static int execute(
const std::string& command,
const std::string& filename,
int* childpid) {
133 if (pipe(pipefd) < 0) {
134 throw std::system_error(errno, std::system_category(),
"opening pipe failed");
138 throw std::system_error(errno, std::system_category(),
"fork failed");
142 for (
int i = 0; i < 32; ++i) {
143 if (i != pipefd[1]) {
147 if (dup2(pipefd[1], 1) < 0) {
151 ::open(
"/dev/null", O_RDONLY);
152 ::open(
"/dev/null", O_WRONLY);
157 if (::execlp(command.c_str(), command.c_str(),
"-g", filename.c_str(),
nullptr) < 0) {
177 std::string protocol = filename.substr(0, filename.find_first_of(
':'));
178 if (protocol ==
"http" || protocol ==
"https" || protocol ==
"ftp" || protocol ==
"file") {
180 return execute(
"curl", filename, childpid);
182 throw io_error(
"Reading OSM files from the network currently not supported on Windows.");
185 return osmium::io::detail::open_for_reading(filename);
201 m_file(file.check()),
202 m_read_which_entities(read_which_entities),
205 m_input_queue(max_input_queue_size,
"raw_input"),
206 m_decompressor(m_file.buffer() ?
207 osmium::io::
CompressionFactory::instance().create_decompressor(file.compression(), m_file.buffer(), m_file.buffer_size()) :
209 m_read_thread_manager(*m_decompressor.get(), m_input_queue),
210 m_osmdata_queue(max_osmdata_queue_size,
"parser_results"),
211 m_osmdata_queue_wrapper(m_osmdata_queue),
215 std::promise<osmium::io::Header> header_promise;
216 m_header_future = header_promise.get_future();
253 m_read_thread_manager.stop();
255 m_osmdata_queue_wrapper.drain();
258 m_read_thread_manager.close();
266 pid_t pid = ::waitpid(m_childpid, &status, 0);
267 #pragma GCC diagnostic push
268 #pragma GCC diagnostic ignored "-Wold-style-cast"
269 if (pid < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) {
270 throw std::system_error(errno, std::system_category(),
"subprocess returned error");
272 #pragma GCC diagnostic pop
286 throw io_error(
"Can not get header from reader when in status 'error'");
290 if (m_header_future.valid()) {
291 m_header = m_header_future.
get();
319 throw io_error(
"Can not read from reader when in status 'closed', 'eof', or 'error'");
328 buffer = m_osmdata_queue_wrapper.pop();
329 if (detail::at_end_of_data(buffer)) {
331 m_read_thread_manager.close();
363 template <
typename... TArgs>
367 Reader reader(std::forward<TArgs>(args)...);
380 #endif // OSMIUM_IO_READER_HPP
detail::queue_wrapper< osmium::memory::Buffer > m_osmdata_queue_wrapper
Definition: reader.hpp:100
status
Definition: reader.hpp:84
osmium::memory::Buffer read()
Definition: reader.hpp:314
Reader(const osmium::io::File &file, osmium::osm_entity_bits::type read_which_entities=osmium::osm_entity_bits::all)
Definition: reader.hpp:200
type
Definition: entity_bits.hpp:60
int m_childpid
Definition: reader.hpp:91
std::future< osmium::io::Header > m_header_future
Definition: reader.hpp:102
std::string get(const std::string &key, const std::string &default_value="") const noexcept
Definition: options.hpp:124
osmium::memory::Buffer read_file(TArgs &&...args)
Definition: reader.hpp:364
enum osmium::io::Reader::status m_status
std::unique_ptr< osmium::io::Decompressor > m_decompressor
Definition: reader.hpp:95
Reader & operator=(const Reader &)=delete
static constexpr size_t max_osmdata_queue_size
Definition: reader.hpp:79
bool eof() const
Definition: reader.hpp:349
object or changeset
Definition: entity_bits.hpp:71
detail::future_string_queue_type m_input_queue
Definition: reader.hpp:93
osmium::io::File m_file
Definition: reader.hpp:81
Namespace for everything in the Osmium library.
Definition: assembler.hpp:59
void add_buffer(const Buffer &buffer)
Definition: buffer.hpp:467
osmium::io::detail::ReadThreadManager m_read_thread_manager
Definition: reader.hpp:97
static int execute(const std::string &command, const std::string &filename, int *childpid)
Definition: reader.hpp:131
Definition: reader.hpp:76
~Reader() noexcept
Definition: reader.hpp:234
size_t committed() const noexcept
Definition: buffer.hpp:238
static void parser_thread(const osmium::io::File &file, detail::future_string_queue_type &input_queue, detail::future_buffer_queue_type &osmdata_queue, std::promise< osmium::io::Header > &&header_promise, osmium::osm_entity_bits::type read_which_entities)
Definition: reader.hpp:108
osmium::io::Header header()
Definition: reader.hpp:284
Definition: buffer.hpp:97
osmium::thread::thread_handler m_thread
Definition: reader.hpp:105
static int open_input_file_or_url(const std::string &filename, int *childpid)
Definition: reader.hpp:176
detail::future_buffer_queue_type m_osmdata_queue
Definition: reader.hpp:99
osmium::io::Header m_header
Definition: reader.hpp:103
Definition: entity_bits.hpp:62
Reader(const char *filename, osmium::osm_entity_bits::type read_types=osmium::osm_entity_bits::all)
Definition: reader.hpp:224
Definition: compression.hpp:117
static constexpr size_t max_input_queue_size
Definition: reader.hpp:78
void close()
Definition: reader.hpp:250
osmium::osm_entity_bits::type m_read_which_entities
Definition: reader.hpp:82
size_t commit()
Definition: buffer.hpp:328
Reader(const std::string &filename, osmium::osm_entity_bits::type read_types=osmium::osm_entity_bits::all)
Definition: reader.hpp:220