]> git.tdb.fi Git - libs/core.git/blob - source/io/file.cpp
90694324aa1d6e52f8c59b9f649135725926e031
[libs/core.git] / source / io / file.cpp
1 #include "file.h"
2 #include "handle_private.h"
3
4 using namespace std;
5
6 namespace Msp {
7 namespace IO {
8
9 File::File(const string &fn, Mode m, CreateMode cm)
10 {
11         if(!(m&M_RDWR))
12                 throw invalid_argument("File::File mode");
13         if(cm&~(C_CREATE|C_TRUNCATE|C_EXCLUSIVE))
14                 throw invalid_argument("File::File create");
15         if((cm&C_EXCLUSIVE) && (!(cm&C_CREATE) || (cm&C_TRUNCATE)))
16                 throw invalid_argument("File::File create");
17
18         mode = m;
19
20         platform_init(fn, cm);
21 }
22
23 File::~File()
24 {
25         signal_flush_required.emit();
26         sys_close(handle);
27 }
28
29 void File::set_block(bool b)
30 {
31         mode = b?(mode&~M_NONBLOCK):(mode|M_NONBLOCK);
32         sys_set_blocking(handle, b);
33 }
34
35 unsigned File::do_write(const char *buf, unsigned size)
36 {
37         check_access(M_WRITE);
38
39         if(size==0)
40                 return 0;
41
42 #ifdef WIN32
43         if(mode&M_APPEND)
44                 seek(0, S_END);
45 #endif
46
47         return sys_write(handle, buf, size);
48 }
49
50 unsigned File::do_read(char *buf, unsigned size)
51 {
52         check_access(M_READ);
53
54         if(size==0)
55                 return 0;
56
57         unsigned ret = sys_read(handle, buf, size);
58         if(ret==0)
59                 set_eof();
60
61         return ret;
62 }
63
64 SeekOffset File::seek(SeekOffset off, SeekType type)
65 {
66         signal_flush_required.emit();
67         off = sys_seek(handle, off, type);
68         eof_flag = false;
69
70         return off;
71 }
72
73 SeekOffset File::tell() const
74 {
75         return sys_seek(const_cast<Handle &>(handle), 0, S_CUR);
76 }
77
78 const Handle &File::get_handle(Mode m)
79 {
80         check_access(m);
81         return handle;
82 }
83
84 } // namespace IO
85 } // namespace Msp