X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fio%2Ffile.cpp;h=74930baaf497286f32925ee395641147813daf58;hb=378ec811c8df431f5b4e7094eb1949476d3a79fe;hp=2990d5c1c728a618012b0310f5451d671957e8c7;hpb=6e0fd758970bcb5bad5e3f2454b694cc4d7b4b66;p=libs%2Fcore.git diff --git a/source/io/file.cpp b/source/io/file.cpp index 2990d5c..74930ba 100644 --- a/source/io/file.cpp +++ b/source/io/file.cpp @@ -3,8 +3,8 @@ #include #include #endif +#include #include -#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 @@ -189,7 +189,7 @@ void File::sync() #endif } -int File::seek(int off, SeekType st) +unsigned File::seek(int off, SeekType st) { check_access(M_NONE); @@ -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); + off_t ret = lseek(handle, off, type); + if(ret==(off_t)-1) + throw system_error("lseek"); #endif eof_flag = false; @@ -211,18 +211,18 @@ int File::seek(int off, SeekType st) return ret; } -int File::tell() const +unsigned File::tell() const { check_access(M_NONE); #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); + off_t ret = lseek(handle, 0, SEEK_CUR); + if(ret==(off_t)-1) + 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