]> git.tdb.fi Git - libs/core.git/blob - source/io/base.h
Make sure all classes have sensible copy semantics
[libs/core.git] / source / io / base.h
1 #ifndef MSP_IO_BASE_H_
2 #define MSP_IO_BASE_H_
3
4 #include <sigc++/sigc++.h>
5 #include <msp/core/mutex.h>
6 #include <msp/core/noncopyable.h>
7 #include "handle.h"
8 #include "mode.h"
9 #include "poll.h"
10
11 namespace Msp {
12 namespace IO {
13
14 /**
15 Common interface for all I/O objects.
16 */
17 class Base: private NonCopyable
18 {
19 public:
20         /** RAII synchronization primitive.  Prevents concurrent access to the
21         target object during the lifetime of the Synchronize object. */
22         class Synchronize
23         {
24         private:
25                 Base &io;
26
27         public:
28                 Synchronize(Base &);
29                 ~Synchronize();
30         };
31
32         /** Emitted when there is no more data to be read. */
33         sigc::signal<void> signal_end_of_file;
34
35         /** Emitted when there is a nonlinearity in I/O (such as a file being
36         seeked) and any data buffered by upper layers needs to be flushed. */
37         sigc::signal<void> signal_flush_required;
38
39         /** Emitted when the object is deleted.  Mainly for use by
40         EventDispatcher. */
41         sigc::signal<void> signal_deleted;
42
43 protected:
44         Mode mode;
45         bool eof_flag;
46         Mutex *mutex;
47
48         Base();
49 public:
50         virtual ~Base();
51
52         /** Sets blocking mode.  When blocking is enabled, most operations won't
53         return until they can make progress.  When blocking is disabled, these
54         operations may return immediately with a return code indicating that nothing
55         was done.
56
57         Blocking is enabled by default. */
58         virtual void set_block(bool) = 0;
59
60         /** Sets inheritance mode.  When inheritance is enabled, the file descriptor
61         will persist through Process::execute.
62
63         Inheritance is disabled by default. */
64         virtual void set_inherit(bool) = 0;
65
66         /** Returns the current mode flags. */
67         Mode get_mode() const { return mode; }
68
69 protected:
70         void check_access(Mode) const;
71
72         virtual unsigned do_write(const char *, unsigned) = 0;
73         virtual unsigned do_read(char *, unsigned) = 0;
74
75 public:
76         /** Writes data from a buffer.  Subject to blocking.  Returns the number of
77         bytes written, which may be zero for a non-blockin operation. */
78         unsigned write(const char *b, unsigned c) { return do_write(b, c); }
79
80         /** Writes a string.  This is identical to calling
81         write(s.data(), s.size()). */
82         unsigned write(const std::string &s) { return do_write(s.data(), s.size()); }
83
84         /** Writes a single character.  This is identical to calling
85         write(&c, 1). */
86         virtual unsigned put(char c) { return do_write(&c, 1); }
87
88         /** Reads data into a buffer.  Subject to blocking.  Returns the number of
89         bytes read, which may be zero for a non-blocking operation. */
90         unsigned read(char *b, unsigned c) { return do_read(b, c); }
91
92         /** Reads characters up to the next linefeed or end-of-file.  The linefeed
93         is not included in the line.  Returns true if a line was successfully read,
94         false otherwise. */
95         virtual bool getline(std::string &);
96
97         /** Reads a single character.  Returns -1 if no character was available due
98         to end-of-file or non-blocking operation. */
99         virtual int get();
100
101 protected:
102         void set_eof();
103
104 public:
105         /** Returns the end-of-file flag.  Note that some types of objects won't
106         indicate end-of-file until you try to read at least one byte past the actual
107         end, while others indicate it when you've read the last byte. */
108         bool eof() const { return eof_flag; }
109
110         /** Returns the system-level handle for the object.  Used by Console to
111         perform redirections. */
112         virtual const Handle &get_handle(Mode) = 0;
113 };
114
115 } // namespace IO
116 } // namespace Msp
117
118 #endif