]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/file.cpp
Use size_t for sizes in I/O classes
[libs/core.git] / source / io / file.cpp
index 90694324aa1d6e52f8c59b9f649135725926e031..5ead278813d7bd73e8c9eae38282e8b07f1d0bd4 100644 (file)
@@ -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