X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Ffile.cpp;h=5ead278813d7bd73e8c9eae38282e8b07f1d0bd4;hp=90694324aa1d6e52f8c59b9f649135725926e031;hb=c8bf2d6c15893ccc9dbc4e04611b7229029f4808;hpb=609c9a508cfdc7b42c46c4f21d17639204165a00 diff --git a/source/io/file.cpp b/source/io/file.cpp index 9069432..5ead278 100644 --- a/source/io/file.cpp +++ b/source/io/file.cpp @@ -28,18 +28,24 @@ File::~File() void File::set_block(bool b) { - mode = b?(mode&~M_NONBLOCK):(mode|M_NONBLOCK); + adjust_mode(mode, M_NONBLOCK, !b); sys_set_blocking(handle, b); } -unsigned File::do_write(const char *buf, unsigned size) +void File::set_inherit(bool i) +{ + adjust_mode(mode, M_INHERIT, i); + sys_set_inherit(handle, i); +} + +size_t File::do_write(const char *buf, size_t size) { check_access(M_WRITE); if(size==0) return 0; -#ifdef WIN32 +#ifdef _WIN32 if(mode&M_APPEND) seek(0, S_END); #endif @@ -47,14 +53,14 @@ unsigned File::do_write(const char *buf, unsigned size) return sys_write(handle, buf, size); } -unsigned File::do_read(char *buf, unsigned size) +size_t File::do_read(char *buf, size_t size) { check_access(M_READ); if(size==0) return 0; - unsigned ret = sys_read(handle, buf, size); + size_t ret = sys_read(handle, buf, size); if(ret==0) set_eof(); @@ -81,5 +87,81 @@ const Handle &File::get_handle(Mode m) return handle; } + +BufferedFile::BufferedFile(const string &fn, Mode m, File::CreateMode cm): + file(fn, m, cm), + buffer(file), + position(0) +{ + mode = m; + file.signal_end_of_file.connect(sigc::mem_fun(this, &BufferedFile::set_eof)); +} + +void BufferedFile::set_block(bool b) +{ + file.set_block(b); +} + +void BufferedFile::set_inherit(bool) +{ + throw logic_error("BufferedFile::set_inherit"); +} + +size_t BufferedFile::do_write(const char *buf, size_t size) +{ + size_t ret = buffer.write(buf, size); + position += ret; + return ret; +} + +size_t BufferedFile::do_read(char *buf, size_t size) +{ + size_t ret = buffer.read(buf, size); + position += ret; + return ret; +} + +size_t BufferedFile::put(char c) +{ + size_t ret = buffer.put(c); + position += ret; + return ret; +} + +bool BufferedFile::getline(string &line) +{ + bool ret = buffer.getline(line); + if(ret) + position += line.size(); + return ret; +} + +int BufferedFile::get() +{ + int ret = buffer.get(); + if(ret>=0) + ++position; + return ret; +} + +const Handle &BufferedFile::get_handle(Mode) +{ + throw logic_error("BufferedFile::get_handle"); +} + +SeekOffset BufferedFile::seek(SeekOffset offset, SeekType type) +{ + if(type==S_CUR) + { + offset += position; + type = S_BEG; + } + + signal_flush_required.emit(); + position = file.seek(offset, type); + eof_flag = false; + return position; +} + } // namespace IO } // namespace Msp