X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fseekable.cpp;h=6bc84855541c6f0974eb3c8ba29405fb67d8febd;hp=a75cf33e67725fe6e978f98d927681cce59e16d5;hb=817e584903996a041692640720a5a272d847a3c7;hpb=1a6331551a025ddcc1772ae447c326ec70e0e107 diff --git a/source/io/seekable.cpp b/source/io/seekable.cpp index a75cf33..6bc8485 100644 --- a/source/io/seekable.cpp +++ b/source/io/seekable.cpp @@ -1,83 +1,17 @@ -#ifndef WIN32 -#define _LARGEFILE64_SOURCE -#include -#include -#else -#include -#endif -#include #include -#include "handle.h" -#include "handle_private.h" #include "seekable.h" using namespace std; -namespace { - -using namespace Msp::IO; - -int sys_seek_type(SeekType st) -{ -#ifdef WIN32 - if(st==S_BEG) - return FILE_BEGIN; - else if(st==S_CUR) - return FILE_CURRENT; - else if(st==S_END) - return FILE_END; -#else - if(st==S_BEG) - return SEEK_SET; - else if(st==S_CUR) - return SEEK_CUR; - else if(st==S_END) - return SEEK_END; -#endif - - throw invalid_argument("sys_seek_type"); -} - -} // namespace - - namespace Msp { namespace IO { bad_seek::bad_seek(SeekOffset offset, SeekType type): - runtime_error(type==S_BEG ? lexical_cast(offset) : + runtime_error(type==S_BEG ? lexical_cast(offset) : type==S_CUR ? format("CUR%+d", offset) : type==S_END ? format("END%+d", offset) : format("SeekType(%d)", type)) { } - -SeekOffset sys_seek(Handle &handle, SeekOffset offset, SeekType type) -{ -#ifdef WIN32 - LONG high = offset>>32; - DWORD ret = SetFilePointer(*handle, offset, &high, sys_seek_type(type)); - if(ret==INVALID_SET_FILE_POINTER) - { - DWORD err = GetLastError(); - if(err!=NO_ERROR) - throw system_error("SetFilePointer"); - } - - return (SeekOffset(high)<<32) | ret; -#else - off64_t ret = lseek64(*handle, offset, sys_seek_type(type)); - if(ret==(off64_t)-1) - { - if(errno==EINVAL) - throw bad_seek(offset, type); - else - throw system_error("lseek64"); - } - - return ret; -#endif -} - } // namespace IO } // namespace Msp