-/* $Id$
-
-This file is part of libmspio
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
#ifndef WIN32
#include <errno.h>
#include <fcntl.h>
if(cm&~(C_CREATE|C_TRUNCATE))
throw InvalidParameterValue("Invalid create mode");
- mode=m;
+ mode = m;
#ifdef WIN32
- int flags=0;
- int create_flags=OPEN_EXISTING;
+ int flags = 0;
+ int create_flags = OPEN_EXISTING;
if(mode&M_READ)
- flags|=GENERIC_READ;
+ flags |= GENERIC_READ;
else if(mode&M_WRITE)
{
- flags|=GENERIC_WRITE;
+ flags |= GENERIC_WRITE;
switch(static_cast<int>(cm))
{
- case C_NONE: create_flags=OPEN_EXISTING; break;
- case C_CREATE: create_flags=OPEN_ALWAYS; break;
- case C_TRUNCATE: create_flags=TRUNCATE_EXISTING; break;
- case C_CREATE+C_TRUNCATE: create_flags=CREATE_ALWAYS; break;
+ case C_NONE: create_flags = OPEN_EXISTING; break;
+ case C_CREATE: create_flags = OPEN_ALWAYS; break;
+ case C_TRUNCATE: create_flags = TRUNCATE_EXISTING; break;
+ case C_CREATE+C_TRUNCATE: create_flags = CREATE_ALWAYS; break;
}
}
- handle=CreateFile(fn.c_str(), flags, 0, 0, create_flags, FILE_ATTRIBUTE_NORMAL, 0);
+ handle = CreateFile(fn.c_str(), flags, 0, 0, create_flags, FILE_ATTRIBUTE_NORMAL, 0);
if(handle==INVALID_HANDLE_VALUE)
- throw SystemError(format("Can't open file '%s'", fn), GetLastError());
+ {
+ int err = GetLastError();
+ if(err==ERROR_FILE_NOT_FOUND)
+ throw FileNotFound("Can't find file "+fn, fn);
+ else
+ throw SystemError(format("Can't open file '%s'", fn), GetLastError());
+ }
#else
- int flags=0;
+ int flags = 0;
switch(mode&M_RDWR)
{
- case M_READ: flags|=O_RDONLY; break;
- case M_WRITE: flags|=O_WRONLY; break;
- case M_RDWR: flags|=O_RDWR; break;
+ case M_READ: flags |= O_RDONLY; break;
+ case M_WRITE: flags |= O_WRONLY; break;
+ case M_RDWR: flags |= O_RDWR; break;
default:;
}
if(mode&M_WRITE)
{
if(cm&C_CREATE)
- flags|=O_CREAT;
+ flags |= O_CREAT;
if(cm&C_TRUNCATE)
- flags|=O_TRUNC;
+ flags |= O_TRUNC;
}
if(mode&M_APPEND)
- flags|=O_APPEND;
+ flags |= O_APPEND;
if(mode&M_NONBLOCK)
- flags|=O_NONBLOCK;
+ flags |= O_NONBLOCK;
- handle=::open(fn.c_str(), flags, 0666);
+ handle = ::open(fn.c_str(), flags, 0666);
if(handle==-1)
{
- int err=errno;
+ int err = errno;
if(err==ENOENT)
throw FileNotFound("Can't find file "+fn, fn);
else
set_events(P_NONE);
- signal_closing.emit();
+ signal_flush_required.emit();
#ifdef WIN32
CloseHandle(handle);
::close(handle);
#endif
- handle=MSP_IO_INVALID_HANDLE;
+ handle = MSP_IO_INVALID_HANDLE;
signal_closed.emit();
}
{
check_access(M_NONE);
- mode=(mode&~M_NONBLOCK);
+ mode = (mode&~M_NONBLOCK);
if(b)
- mode=(mode|M_NONBLOCK);
+ mode = (mode|M_NONBLOCK);
#ifndef WIN32
- int flags=fcntl(handle, F_GETFD);
+ int flags = fcntl(handle, F_GETFD);
fcntl(handle, F_SETFL, (flags&O_NONBLOCK)|(b?0:O_NONBLOCK));
#endif
}
+void File::sync()
+{
+#ifndef WIN32
+ signal_flush_required.emit();
+
+ fsync(handle);
+#endif
+}
+
/**
Seeks the file to the given byte offset.
{
check_access(M_NONE);
- int type=sys_seek_type(st);
+ signal_flush_required.emit();
+
+ int type = sys_seek_type(st);
#ifdef WIN32
- DWORD ret=SetFilePointer(handle, off, 0, type);
+ DWORD ret = SetFilePointer(handle, off, 0, type);
if(ret==INVALID_SET_FILE_POINTER)
throw SystemError("Seek failed", GetLastError());
#else
- int ret=lseek(handle, off, type);
+ int ret = lseek(handle, off, type);
if(ret==-1)
throw SystemError("Seek failed", errno);
#endif
- eof_flag=false;
+ eof_flag = false;
return ret;
}
check_access(M_NONE);
#ifdef WIN32
- DWORD ret=SetFilePointer(handle, 0, 0, FILE_CURRENT);
+ DWORD ret = SetFilePointer(handle, 0, 0, FILE_CURRENT);
if(ret==INVALID_SET_FILE_POINTER)
throw SystemError("Tell failed", GetLastError());
#else
- int ret=lseek(handle, 0, SEEK_CUR);
+ int ret = lseek(handle, 0, SEEK_CUR);
if(ret==-1)
throw SystemError("Tell failed", errno);
#endif
if(WriteFile(handle, buf, size, &ret, 0)==0)
throw SystemError("Writing to file failed", GetLastError());
#else
- int ret=::write(handle, buf, size);
+ int ret = ::write(handle, buf, size);
if(ret==-1)
{
if(errno==EAGAIN)
return ret;
}
-void File::sync()
-{
-#ifndef WIN32
- fsync(handle);
-#endif
-}
-
/**
Reads data from the file.
if(ReadFile(handle, buf, size, &ret, 0)==0)
throw SystemError("Reading from file failed", GetLastError());
#else
- int ret=::read(handle, buf, size);
+ int ret = ::read(handle, buf, size);
if(ret==-1)
{
if(errno==EAGAIN)
if(ret==0)
{
- eof_flag=true;
+ eof_flag = true;
signal_end_of_file.emit();
}