X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fbase.h;h=aadc6acd48db7c49430e4823c74423a354168535;hp=61819cfe8144c782dae9e8749d971c3f336aa641;hb=HEAD;hpb=70929f1a2265b112405eb2d4b03e1a374008b57d diff --git a/source/io/base.h b/source/io/base.h index 61819cf..92c860d 100644 --- a/source/io/base.h +++ b/source/io/base.h @@ -1,7 +1,12 @@ #ifndef MSP_IO_BASE_H_ #define MSP_IO_BASE_H_ +#include #include +#include +#include +#include +#include "handle.h" #include "mode.h" #include "poll.h" @@ -10,13 +15,22 @@ namespace IO { /** Common interface for all I/O objects. - -A derived class must call set_events(P_NONE) before it is destroyed to avoid -leaving stale pointers in an EventDispatcher. */ -class Base +class MSPCORE_API Base: private NonCopyable { public: + /** RAII synchronization primitive. Prevents concurrent access to the + target object during the lifetime of the Synchronize object. */ + class Synchronize + { + private: + Base &io; + + public: + Synchronize(Base &); + ~Synchronize(); + }; + /** Emitted when there is no more data to be read. */ sigc::signal signal_end_of_file; @@ -29,13 +43,11 @@ public: sigc::signal signal_deleted; protected: - Mode mode; - bool eof_flag; + Mode mode = M_READ; + bool eof_flag = false; + Mutex *mutex = nullptr; Base(); -private: - Base(const Base &); - Base &operator=(const Base &); public: virtual ~Base(); @@ -45,7 +57,13 @@ public: was done. Blocking is enabled by default. */ - virtual void set_block(bool) { } + virtual void set_block(bool) = 0; + + /** Sets inheritance mode. When inheritance is enabled, the file descriptor + will persist through Process::execute. + + Inheritance is disabled by default. */ + virtual void set_inherit(bool) = 0; /** Returns the current mode flags. */ Mode get_mode() const { return mode; } @@ -53,25 +71,25 @@ public: protected: void check_access(Mode) const; - virtual unsigned do_write(const char *, unsigned) = 0; - virtual unsigned do_read(char *, unsigned) = 0; + virtual std::size_t do_write(const char *, std::size_t) = 0; + virtual std::size_t do_read(char *, std::size_t) = 0; public: /** Writes data from a buffer. Subject to blocking. Returns the number of bytes written, which may be zero for a non-blockin operation. */ - unsigned write(const char *b, unsigned c) { return do_write(b, c); } + std::size_t write(const char *b, std::size_t c) { return do_write(b, c); } /** Writes a string. This is identical to calling write(s.data(), s.size()). */ - unsigned write(const std::string &s) { return do_write(s.data(), s.size()); } + std::size_t write(const std::string &s) { return do_write(s.data(), s.size()); } /** Writes a single character. This is identical to calling write(&c, 1). */ - virtual unsigned put(char c) { return do_write(&c, 1); } + virtual std::size_t put(char c) { return do_write(&c, 1); } /** Reads data into a buffer. Subject to blocking. Returns the number of bytes read, which may be zero for a non-blocking operation. */ - unsigned read(char *b, unsigned c) { return do_read(b, c); } + std::size_t read(char *b, std::size_t c) { return do_read(b, c); } /** Reads characters up to the next linefeed or end-of-file. The linefeed is not included in the line. Returns true if a line was successfully read, @@ -86,8 +104,14 @@ protected: void set_eof(); public: - /** Returns the end-of-file flag. */ + /** Returns the end-of-file flag. Note that some types of objects won't + indicate end-of-file until you try to read at least one byte past the actual + end, while others indicate it when you've read the last byte. */ bool eof() const { return eof_flag; } + + /** Returns the system-level handle for the object. Used by Console to + perform redirections. */ + virtual const Handle &get_handle(Mode) = 0; }; } // namespace IO