1 #include <msp/core/except.h>
3 #include "handle_private.h"
10 File::File(const string &fn, Mode m, CreateMode cm)
13 throw invalid_argument("File::File mode");
14 if(cm&~(C_CREATE|C_TRUNCATE|C_EXCLUSIVE))
15 throw invalid_argument("File::File create");
16 if((cm&C_EXCLUSIVE) && (!(cm&C_CREATE) || (cm&C_TRUNCATE)))
17 throw invalid_argument("File::File create");
21 platform_init(fn, cm);
26 signal_flush_required.emit();
30 void File::set_block(bool b)
32 adjust_mode(mode, M_NONBLOCK, !b);
33 sys_set_blocking(handle, b);
36 void File::set_inherit(bool i)
38 adjust_mode(mode, M_INHERIT, i);
39 sys_set_inherit(handle, i);
42 size_t File::do_write(const char *buf, size_t size)
44 check_access(M_WRITE);
54 return sys_write(handle, buf, size);
57 size_t File::do_read(char *buf, size_t size)
64 size_t ret = sys_read(handle, buf, size);
71 SeekOffset File::seek(SeekOffset off, SeekType type)
73 signal_flush_required.emit();
74 off = sys_seek(handle, off, type);
80 SeekOffset File::tell() const
82 return sys_seek(const_cast<Handle &>(handle), 0, S_CUR);
85 const Handle &File::get_handle(Mode m)
92 BufferedFile::BufferedFile(const string &fn, Mode m, File::CreateMode cm):
98 file.signal_end_of_file.connect(sigc::mem_fun(this, &BufferedFile::set_eof));
101 void BufferedFile::set_block(bool b)
106 void BufferedFile::set_inherit(bool)
108 throw unsupported("BufferedFile::set_inherit");
111 size_t BufferedFile::do_write(const char *buf, size_t size)
113 size_t ret = buffer.write(buf, size);
118 size_t BufferedFile::do_read(char *buf, size_t size)
120 size_t ret = buffer.read(buf, size);
125 size_t BufferedFile::put(char c)
127 size_t ret = buffer.put(c);
132 bool BufferedFile::getline(string &line)
134 bool ret = buffer.getline(line);
136 position += line.size();
140 int BufferedFile::get()
142 int ret = buffer.get();
148 const Handle &BufferedFile::get_handle(Mode)
150 throw unsupported("BufferedFile::get_handle");
153 SeekOffset BufferedFile::seek(SeekOffset offset, SeekType type)
161 signal_flush_required.emit();
162 position = file.seek(offset, type);