1 #ifndef LIBFILEZILLA_AIO_READER_HEADER
2 #define LIBFILEZILLA_AIO_READER_HEADER
11 #include "../file.hpp"
12 #include "../thread_pool.hpp"
34 virtual bool seekable()
const {
return false; }
37 bool seek(uint64_t offset, uint64_t size = nosize);
42 std::wstring
const& name()
const {
return name_; }
45 virtual uint64_t
size()
const {
return size_; }
60 std::pair<aio_result, buffer_lease> get_buffer(
event_handler & h);
77 , logger_(pool.logger())
79 , max_buffers_(max_buffers ? max_buffers : 1)
85 , logger_(pool.logger())
87 , max_buffers_(max_buffers ? max_buffers : 1)
90 virtual std::pair<aio_result, buffer_lease> do_get_buffer(scoped_lock & l) = 0;
100 virtual void operator()(event_base
const&)
override;
101 void on_buffer_availability(aio_waitable
const* w);
102 virtual void do_on_buffer_availability(
fz::scoped_lock & l, aio_waitable
const* w) = 0;
105 aio_buffer_pool & buffer_pool_;
106 logger_interface & logger_;
108 std::wstring
const name_;
110 size_t const max_buffers_{};
111 std::list<buffer_lease> buffers_;
113 uint64_t size_{nosize};
114 uint64_t max_size_{nosize};
115 uint64_t start_offset_{nosize};
116 uint64_t remaining_{nosize};
118 bool get_buffer_called_{};
132 : name_(std::move(name))
138 virtual std::unique_ptr<reader_factory> clone()
const = 0;
151 virtual std::unique_ptr<reader_base> open(
aio_buffer_pool & pool, uint64_t offset = 0, uint64_t size = reader_base::nosize,
size_t max_buffers = 0) = 0;
153 virtual bool seekable()
const {
return false; }
155 std::wstring name()
const {
return name_; }
157 virtual uint64_t size()
const {
return reader_base::nosize; }
175 virtual size_t preferred_buffer_count()
const {
return 1; }
178 reader_factory() =
default;
179 reader_factory(reader_factory
const&) =
default;
181 std::wstring
const name_;
205 explicit operator bool()
const {
return impl_.operator bool(); }
207 std::wstring name()
const {
return impl_ ? impl_->name() : std::wstring(); }
209 uint64_t size()
const {
return impl_ ? impl_->size() : aio_base::nosize; }
212 std::unique_ptr<reader_factory> impl_;
221 using reader_base::reader_base;
224 virtual std::pair<aio_result, buffer_lease> do_get_buffer(
scoped_lock & l)
override;
249 virtual bool seekable()
const override;
251 virtual datetime mtime()
const override;
254 virtual void FZ_PRIVATE_SYMBOL do_close(
scoped_lock & l)
override;
255 virtual bool FZ_PRIVATE_SYMBOL do_seek(
scoped_lock & l)
override;
259 void FZ_PRIVATE_SYMBOL entry();
271 virtual std::unique_ptr<reader_base> open(
aio_buffer_pool & pool, uint64_t offset = 0, uint64_t size = reader_base::nosize,
size_t max_buffers = 4)
override;
272 virtual std::unique_ptr<reader_factory> clone()
const override;
274 virtual bool seekable()
const override {
return true; }
276 virtual uint64_t size()
const override;
277 virtual datetime mtime()
const override;
281 virtual size_t preferred_buffer_count()
const override {
return 4; }
283 thread_pool & thread_pool_;
297 virtual bool seekable()
const override {
return true; }
300 virtual std::pair<aio_result, buffer_lease> FZ_PRIVATE_SYMBOL do_get_buffer(
scoped_lock & l)
override;
301 virtual void FZ_PRIVATE_SYMBOL do_close(
scoped_lock & l)
override;
302 virtual bool FZ_PRIVATE_SYMBOL do_seek(
scoped_lock & l)
override;
306 std::string_view
const view_;
326 virtual std::unique_ptr<reader_base> open(
aio_buffer_pool & pool, uint64_t offset = 0, uint64_t size = reader_base::nosize,
size_t max_buffers = 1)
override;
327 virtual std::unique_ptr<reader_factory> clone()
const override;
329 virtual bool seekable()
const override {
return true; }
331 virtual uint64_t size()
const override {
return view_.size(); }
334 std::string_view
const view_;
346 virtual bool seekable()
const override {
return true; }
349 virtual std::pair<aio_result, buffer_lease> FZ_PRIVATE_SYMBOL do_get_buffer(
scoped_lock & l)
override;
350 virtual void FZ_PRIVATE_SYMBOL do_close(
scoped_lock & l)
override;
351 virtual bool FZ_PRIVATE_SYMBOL do_seek(
scoped_lock & l)
override;
355 std::string
const data_;
368 , data_(std::move(data))
371 virtual std::unique_ptr<reader_base> open(
aio_buffer_pool & pool, uint64_t offset = 0, uint64_t size = reader_base::nosize,
size_t max_buffers = 1)
override;
372 virtual std::unique_ptr<reader_factory> clone()
const override;
374 virtual bool seekable()
const override {
return true; }
376 virtual uint64_t size()
const override {
return data_.size(); }
379 std::string
const data_;
Factory for.
Definition: reader.hpp:266
virtual bool do_seek(scoped_lock &)
Definition: reader.hpp:94
virtual uint64_t size() const
Size of the reader. If the size is indetermined, nosize is returned.
Definition: reader.hpp:45
A simple scoped lock.
Definition: mutex.hpp:116
Definition: reader.hpp:290
Definition: event_handler.hpp:60
Base class for all readers.
Definition: reader.hpp:26
Waitable condition variable.
Definition: mutex.hpp:233
Handle for asynchronous tasks.
Definition: thread_pool.hpp:24
Buffer management and wait machinery for asynchronous I/O.
Represents a point of time in wallclock, tracking the timestamps accuracy/precision.
Definition: time.hpp:40
virtual size_t min_buffer_usage() const
The reader requires at least this many buffers.
Definition: reader.hpp:166
virtual bool multiple_buffer_usage() const
Whether the reader can benefit from multiple buffers.
Definition: reader.hpp:173
A buffer pool for use with async readers/writers.
Definition: aio.hpp:106
String reader, keeps a copy of the string.
Definition: reader.hpp:338
virtual bool multiple_buffer_usage() const override
Whether the reader can benefit from multiple buffers.
Definition: reader.hpp:279
virtual datetime mtime() const
Last modification time, might be indetermined.
Definition: reader.hpp:48
Factory for.
Definition: reader.hpp:359
A reader factory.
Definition: reader.hpp:125
The namespace used by libfilezilla.
Definition: apply.hpp:17
Base class for threaded readers.
Definition: reader.hpp:218
Lean class for file access.
Definition: file.hpp:28
File reader.
Definition: reader.hpp:237
A dumb thread-pool for asynchronous tasks.
Definition: thread_pool.hpp:63
Holder for reader factories.
Definition: reader.hpp:185
Definition: reader.hpp:314
reader_base(std::wstring &&name, aio_buffer_pool &pool, size_t max_buffers) noexcept
Constructs a reader.
Definition: reader.hpp:74