]> git.tdb.fi Git - libs/core.git/blob - source/io/file.h
Check errors from CreateSemaphore
[libs/core.git] / source / io / file.h
1 #ifndef MSP_IO_FILE_H_
2 #define MSP_IO_FILE_H_
3
4 #include <stdexcept>
5 #include <string>
6 #include <msp/core/mspcore_api.h>
7 #include "buffered.h"
8 #include "handle.h"
9 #include "seekable.h"
10
11 namespace Msp {
12 namespace IO {
13
14 class MSPCORE_API file_not_found: public std::runtime_error
15 {
16 public:
17         file_not_found(const std::string &fn): std::runtime_error(fn) { }
18 };
19
20 class MSPCORE_API file_already_exists: public std::runtime_error
21 {
22 public:
23         file_already_exists(const std::string &fn): std::runtime_error(fn) { }
24 };
25
26
27 /**
28 A class for reading and writing files.
29
30 Non-blocking mode is not supported on Win32.
31 */
32 class MSPCORE_API File: public Seekable
33 {
34 public:
35         enum CreateMode
36         {
37                 C_NONE = 0,
38                 C_CREATE = 1,
39                 C_TRUNCATE = 2,
40                 C_OVERWRITE = C_CREATE+C_TRUNCATE,
41                 C_EXCLUSIVE = 4,
42                 C_NEW = C_CREATE+C_EXCLUSIVE
43         };
44
45 private:
46         Handle handle;
47
48 public:
49         /** Creates a new file object and opens it.  If the create flag is set and
50         write access is requested and the file does exist, it is created.  Otherwise
51         a missing file is an error. */
52         File(const std::string &, Mode = M_READ, CreateMode = C_OVERWRITE);
53 private:
54         void platform_init(const std::string &, CreateMode);
55 public:
56         ~File() override;
57
58         void set_block(bool) override;
59         void set_inherit(bool) override;
60
61 protected:
62         std::size_t do_write(const char *, std::size_t) override;
63         std::size_t do_read(char *, std::size_t) override;
64
65 public:
66         void sync();
67
68         SeekOffset seek(SeekOffset, SeekType) override;
69         SeekOffset tell() const override;
70
71         const Handle &get_handle(Mode) override;
72 };
73
74 inline File::CreateMode operator|(File::CreateMode m, File::CreateMode n)
75 { return File::CreateMode(static_cast<int>(m)|static_cast<int>(n)); }
76
77 inline File::CreateMode operator&(File::CreateMode m, File::CreateMode n)
78 { return File::CreateMode(static_cast<int>(m)&static_cast<int>(n)); }
79
80 inline File::CreateMode operator~(File::CreateMode m)
81 { return File::CreateMode(~static_cast<int>(m)); }
82
83
84 class MSPCORE_API BufferedFile: public Seekable
85 {
86 private:
87         File file;
88         Buffered buffer;
89         SeekOffset position;
90
91 public:
92         BufferedFile(const std::string &, Mode = M_READ, File::CreateMode = File::C_OVERWRITE);
93
94         void set_block(bool) override;
95         void set_inherit(bool) override;
96
97 protected:
98         std::size_t do_write(const char *, std::size_t) override;
99         std::size_t do_read(char *, std::size_t) override;
100 public:
101         std::size_t put(char) override;
102
103         bool getline(std::string &) override;
104         int get() override;
105
106         const Handle &get_handle(Mode) override;
107
108         SeekOffset seek(SeekOffset, SeekType) override;
109         SeekOffset tell() const override { return position; }
110 };
111
112 } // namespace IO
113 } // namespace Msp
114
115 #endif