]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/file.cpp
Rework exceptions for IO
[libs/core.git] / source / io / file.cpp
index 2990d5c1c728a618012b0310f5451d671957e8c7..727542fe1d15baa3fbdcdc6678be9914e82d0ade 100644 (file)
@@ -3,8 +3,8 @@
 #include <fcntl.h>
 #include <unistd.h>
 #endif
+#include <msp/core/systemerror.h>
 #include <msp/strings/formatter.h>
-#include "except.h"
 #include "file.h"
 
 using namespace std;
@@ -15,9 +15,9 @@ namespace IO {
 File::File(const string &fn, Mode m, CreateMode cm)
 {
        if(!(m&M_RDWR))
-               throw InvalidParameterValue("Invalid read/write mode");
+               throw invalid_argument("File::File mode");
        if(cm&~(C_CREATE|C_TRUNCATE))
-               throw InvalidParameterValue("Invalid create mode");
+               throw invalid_argument("File::File create");
 
        mode = m;
 
@@ -45,9 +45,9 @@ File::File(const string &fn, Mode m, CreateMode cm)
        {
                int err = GetLastError();
                if(err==ERROR_FILE_NOT_FOUND)
-                       throw FileNotFound("Can't find file "+fn, fn);
+                       throw file_not_found(fn);
                else
-                       throw SystemError(format("Can't open file '%s'", fn), GetLastError());
+                       throw system_error(format("CreateFile(%s)", fn), err);
        }
 #else
        int flags = 0;
@@ -76,9 +76,9 @@ File::File(const string &fn, Mode m, CreateMode cm)
        {
                int err = errno;
                if(err==ENOENT)
-                       throw FileNotFound("Can't find file "+fn, fn);
+                       throw file_not_found(fn);
                else
-                       throw SystemError(format("Can't open file '%s'", fn), err);
+                       throw system_error(format("open(%s)", fn), err);
        }
 #endif
 
@@ -134,7 +134,7 @@ unsigned File::do_write(const char *buf, unsigned size)
                seek(0, S_END);
        DWORD ret;
        if(WriteFile(handle, buf, size, &ret, 0)==0)
-               throw SystemError("Writing to file failed", GetLastError());
+               throw system_error("WriteFile");
 #else
        int ret = ::write(handle, buf, size);
        if(ret==-1)
@@ -142,7 +142,7 @@ unsigned File::do_write(const char *buf, unsigned size)
                if(errno==EAGAIN)
                        return 0;
                else
-                       throw SystemError("Writing to file failed", errno);
+                       throw system_error("write");
        }
 #endif
 
@@ -159,7 +159,7 @@ unsigned File::do_read(char *buf, unsigned size)
 #ifdef WIN32
        DWORD ret;
        if(ReadFile(handle, buf, size, &ret, 0)==0)
-               throw SystemError("Reading from file failed", GetLastError());
+               throw system_error("ReadFile");
 #else
        int ret = ::read(handle, buf, size);
        if(ret==-1)
@@ -167,7 +167,7 @@ unsigned File::do_read(char *buf, unsigned size)
                if(errno==EAGAIN)
                        return 0;
                else
-                       throw SystemError("Reading from file failed", errno);
+                       throw system_error("read");
        }
 #endif
 
@@ -199,11 +199,11 @@ int File::seek(int off, SeekType st)
 #ifdef WIN32
        DWORD ret = SetFilePointer(handle, off, 0, type);
        if(ret==INVALID_SET_FILE_POINTER)
-               throw SystemError("Seek failed", GetLastError());
+               throw system_error("SetFilePointer");
 #else
        int ret = lseek(handle, off, type);
        if(ret==-1)
-               throw SystemError("Seek failed", errno);
+               throw system_error("lseek");
 #endif
 
        eof_flag = false;
@@ -218,11 +218,11 @@ int File::tell() const
 #ifdef WIN32
        DWORD ret = SetFilePointer(handle, 0, 0, FILE_CURRENT);
        if(ret==INVALID_SET_FILE_POINTER)
-               throw SystemError("Tell failed", GetLastError());
+               throw system_error("SetFilePointer");
 #else
        int ret = lseek(handle, 0, SEEK_CUR);
        if(ret==-1)
-               throw SystemError("Tell failed", errno);
+               throw system_error("lseek");
 #endif
 
        return ret;
@@ -230,12 +230,8 @@ int File::tell() const
 
 void File::check_access(Mode m) const
 {
-       if(handle==MSP_IO_INVALID_HANDLE)
-               throw InvalidState("File is not open");
-       if(m==M_READ && !(mode&M_READ))
-               throw InvalidState("File is not readable");
-       if(m==M_WRITE && !(mode&M_WRITE))
-               throw InvalidState("File is not writable");
+       if(handle==MSP_IO_INVALID_HANDLE || (m && !(mode&m)))
+               throw invalid_access(m);
 }
 
 } // namespace IO