]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/file.h
Move files to prepare for assimilation into core
[libs/core.git] / source / io / file.h
diff --git a/source/io/file.h b/source/io/file.h
new file mode 100644 (file)
index 0000000..05aaf95
--- /dev/null
@@ -0,0 +1,77 @@
+#ifndef MSP_IO_FILE_H_
+#define MSP_IO_FILE_H_
+
+#include <string>
+#include "base.h"
+#include "buffered.h"
+#include "filtered.h"
+#include "seek.h"
+
+namespace Msp {
+namespace IO {
+
+/**
+A class for reading and writing files.
+
+Non-blocking mode is not supported on Win32.
+*/
+class File: public Base
+{
+public:
+       enum CreateMode
+       {
+               C_NONE = 0,
+               C_CREATE = 1,
+               C_TRUNCATE = 2
+       };
+
+private:
+       Handle handle;
+
+public:
+       /** Creates a new file object and opens it.  If the create flag is set and
+       write access is requested and the file does exist, it is created.  Otherwise
+       a missing file is an error. */
+       File(const std::string &, Mode = M_READ, CreateMode = CreateMode(C_CREATE+C_TRUNCATE));
+       virtual ~File();
+
+       /** Closes the file.  Any attempt to access the file after this will cause
+       an exception to be thrown. */
+       void close();
+
+       void set_block(bool);
+
+protected:
+       virtual unsigned do_write(const char *, unsigned);
+       virtual unsigned do_read(char *, unsigned);
+
+public:
+       virtual void sync();
+
+       /** Changes the read/write offset of the file.  Returns the new offset. */
+       virtual int seek(int, SeekType);
+       
+       /** Returns the current read/write offset of the file. */
+       virtual int tell() const;
+
+       virtual Handle get_event_handle() { return handle; }
+
+private:
+       void check_access(Mode) const;
+};
+
+inline File::CreateMode operator|(File::CreateMode m, File::CreateMode n)
+{ return File::CreateMode(static_cast<int>(m)|static_cast<int>(n)); }
+
+inline File::CreateMode operator&(File::CreateMode m, File::CreateMode n)
+{ return File::CreateMode(static_cast<int>(m)&static_cast<int>(n)); }
+
+inline File::CreateMode operator~(File::CreateMode m)
+{ return File::CreateMode(~static_cast<int>(m)); }
+
+typedef Filtered<File, Buffered> BufferedFile;
+
+} // namespace IO
+} // namespace Msp
+
+#endif