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