]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/base.h
Use #ifdef _WIN32 rather than WIN32
[libs/core.git] / source / io / base.h
index 8e4d4a547243ec86a867c6fce4c2ba8122c8f11b..c58be90f7ebd039504e261105e53dc7329a1ac13 100644 (file)
@@ -2,6 +2,8 @@
 #define MSP_IO_BASE_H_
 
 #include <sigc++/sigc++.h>
+#include <msp/core/mutex.h>
+#include "handle.h"
 #include "mode.h"
 #include "poll.h"
 
@@ -17,6 +19,18 @@ leaving stale pointers in an EventDispatcher.
 class Base
 {
 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<void> signal_end_of_file;
 
@@ -24,9 +38,6 @@ public:
        seeked) and any data buffered by upper layers needs to be flushed. */
        sigc::signal<void> signal_flush_required;
 
-       /** Emitted when the I/O object has closed. */
-       sigc::signal<void> signal_closed;
-
        /** Emitted when the object is deleted.  Mainly for use by
        EventDispatcher. */
        sigc::signal<void> signal_deleted;
@@ -34,6 +45,7 @@ public:
 protected:
        Mode mode;
        bool eof_flag;
+       Mutex *mutex;
 
        Base();
 private:
@@ -54,6 +66,8 @@ public:
        Mode get_mode() const { return mode; }
 
 protected:
+       void check_access(Mode) const;
+
        virtual unsigned do_write(const char *, unsigned) = 0;
        virtual unsigned do_read(char *, unsigned) = 0;
 
@@ -83,8 +97,18 @@ public:
        to end-of-file or non-blocking operation. */
        virtual int get();
 
-       /** Returns the end-of-file flag. */
+protected:
+       void set_eof();
+
+public:
+       /** 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);
 };
 
 } // namespace IO