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>
87 std::unique_ptr<osmium::io::detail::InputFormat>
m_input;
101 static int execute(
const std::string& command,
const std::string& filename,
int* childpid) {
103 if (pipe(pipefd) < 0) {
104 throw std::system_error(errno, std::system_category(),
"opening pipe failed");
108 throw std::system_error(errno, std::system_category(),
"fork failed");
112 for (
int i = 0; i < 32; ++i) {
113 if (i != pipefd[1]) {
117 if (dup2(pipefd[1], 1) < 0) {
121 ::open(
"/dev/null", O_RDONLY);
122 ::open(
"/dev/null", O_WRONLY);
127 if (::execlp(command.c_str(), command.c_str(),
"-g", filename.c_str(),
nullptr) < 0) {
147 std::string protocol = filename.substr(0, filename.find_first_of(
':'));
148 if (protocol ==
"http" || protocol ==
"https" || protocol ==
"ftp" || protocol ==
"file") {
150 return execute(
"curl", filename, childpid);
152 throw std::runtime_error(
"Reading OSM files from the network currently not supported on Windows.");
155 return osmium::io::detail::open_for_reading(filename);
172 m_read_which_entities(read_which_entities),
175 m_input_queue(20,
"raw_input"),
176 m_decompressor(m_file.buffer() ?
177 osmium::io::
CompressionFactory::instance().create_decompressor(file.compression(), m_file.buffer(), m_file.buffer_size()) :
179 m_read_future(
std::async(
std::launch::async, detail::ReadThread(m_input_queue, m_decompressor.get(), m_input_done))),
180 m_input(
osmium::io::detail::InputFormatFactory::instance().create_input(m_file, m_read_which_entities, m_input_queue)) {
219 pid_t pid = ::waitpid(m_childpid, &status, 0);
220 #pragma GCC diagnostic push
221 #pragma GCC diagnostic ignored "-Wold-style-cast"
222 if (pid < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) {
223 throw std::system_error(errno, std::system_category(),
"subprocess returned error");
225 #pragma GCC diagnostic pop
237 return m_input->header();
295 template <
class... TArgs>
299 Reader reader(std::forward<TArgs>(args)...);
312 #endif // OSMIUM_IO_READER_HPP
osmium::memory::Buffer read()
Definition: reader.hpp:250
Reader(const osmium::io::File &file, osmium::osm_entity_bits::type read_which_entities=osmium::osm_entity_bits::all)
Definition: reader.hpp:170
type
Definition: entity_bits.hpp:60
int m_childpid
Definition: reader.hpp:80
osmium::memory::Buffer read_file(TArgs &&...args)
Definition: reader.hpp:296
Definition: reader_iterator.hpp:39
std::unique_ptr< osmium::io::Decompressor > m_decompressor
Definition: reader.hpp:84
Reader & operator=(const Reader &)=delete
bool eof() const
Definition: reader.hpp:281
object or changeset
Definition: entity_bits.hpp:71
osmium::io::File m_file
Definition: reader.hpp:77
Namespace for everything in the Osmium library.
Definition: assembler.hpp:55
void add_buffer(const Buffer &buffer)
Definition: buffer.hpp:380
static int execute(const std::string &command, const std::string &filename, int *childpid)
Definition: reader.hpp:101
Definition: reader.hpp:75
osmium::io::Header header() const
Definition: reader.hpp:236
std::future< bool > m_read_future
Definition: reader.hpp:85
size_t committed() const noexcept
Definition: buffer.hpp:218
Definition: buffer.hpp:95
osmium::thread::Queue< std::string > m_input_queue
Definition: reader.hpp:82
static int open_input_file_or_url(const std::string &filename, int *childpid)
Definition: reader.hpp:146
Definition: entity_bits.hpp:62
~Reader()
Definition: reader.hpp:194
std::unique_ptr< osmium::io::detail::InputFormat > m_input
Definition: reader.hpp:87
Reader(const char *filename, osmium::osm_entity_bits::type read_types=osmium::osm_entity_bits::all)
Definition: reader.hpp:187
void check_for_exception(std::future< T > &future)
Definition: util.hpp:53
Definition: compression.hpp:105
std::atomic< bool > m_input_done
Definition: reader.hpp:79
void close()
Definition: reader.hpp:210
osmium::osm_entity_bits::type m_read_which_entities
Definition: reader.hpp:78
void wait_until_done(std::future< T > &future)
Definition: util.hpp:64
size_t commit()
Definition: buffer.hpp:273
Reader(const std::string &filename, osmium::osm_entity_bits::type read_types=osmium::osm_entity_bits::all)
Definition: reader.hpp:183