diff options
author | Martin Ebourne <martin@ebourne.me.uk> | 2005-12-12 20:50:00 +0000 |
---|---|---|
committer | Martin Ebourne <martin@ebourne.me.uk> | 2005-12-12 20:50:00 +0000 |
commit | 3bedf8846f4d7a5cb38276b274662d62a36dcd52 (patch) | |
tree | 9d51de8b0f3d06ba6549a5a1958e52f592343140 /lib/common/FileStream.cpp | |
parent | 81d8eda2419e7a23088a98cdfc52a305c9ceac0d (diff) |
Marged chris/win32/merge/07-win32-fixes at r210 to trunk
Diffstat (limited to 'lib/common/FileStream.cpp')
-rwxr-xr-x | lib/common/FileStream.cpp | 116 |
1 files changed, 108 insertions, 8 deletions
diff --git a/lib/common/FileStream.cpp b/lib/common/FileStream.cpp index ca6894ae..9f5460bb 100755 --- a/lib/common/FileStream.cpp +++ b/lib/common/FileStream.cpp @@ -22,14 +22,25 @@ // // -------------------------------------------------------------------------- FileStream::FileStream(const char *Filename, int flags, int mode) +#ifdef WIN32 + : mOSFileHandle(::openfile(Filename, flags, mode)), +#else : mOSFileHandle(::open(Filename, flags, mode)), +#endif mIsEOF(false) { +#ifdef WIN32 + if(mOSFileHandle == 0) +#else if(mOSFileHandle < 0) +#endif { MEMLEAKFINDER_NOT_A_LEAK(this); THROW_EXCEPTION(CommonException, OSFileOpenError) } +#ifdef WIN32 + this->fileName = Filename; +#endif } @@ -41,7 +52,7 @@ FileStream::FileStream(const char *Filename, int flags, int mode) // Created: 2003/08/28 // // -------------------------------------------------------------------------- -FileStream::FileStream(int FileDescriptor) +FileStream::FileStream(tOSFileHandle FileDescriptor) : mOSFileHandle(FileDescriptor), mIsEOF(false) { @@ -52,7 +63,7 @@ FileStream::FileStream(int FileDescriptor) } } - +#if 0 // -------------------------------------------------------------------------- // // Function @@ -71,6 +82,7 @@ FileStream::FileStream(const FileStream &rToCopy) THROW_EXCEPTION(CommonException, OSFileOpenError) } } +#endif // 0 // -------------------------------------------------------------------------- // @@ -82,7 +94,7 @@ FileStream::FileStream(const FileStream &rToCopy) // -------------------------------------------------------------------------- FileStream::~FileStream() { - if(mOSFileHandle >= 0) + if(mOSFileHandle != INVALID_FILE) { Close(); } @@ -98,8 +110,33 @@ FileStream::~FileStream() // -------------------------------------------------------------------------- int FileStream::Read(void *pBuffer, int NBytes, int Timeout) { - if(mOSFileHandle == -1) {THROW_EXCEPTION(CommonException, FileClosed)} + if(mOSFileHandle == INVALID_FILE) + { + THROW_EXCEPTION(CommonException, FileClosed) + } + +#ifdef WIN32 + int r; + DWORD numBytesRead = 0; + BOOL valid = ReadFile( + this->mOSFileHandle, + pBuffer, + NBytes, + &numBytesRead, + NULL + ); + + if ( valid ) + { + r = numBytesRead; + } + else + { + r = -1; + } +#else int r = ::read(mOSFileHandle, pBuffer, NBytes); +#endif if(r == -1) { THROW_EXCEPTION(CommonException, OSFileReadError) @@ -143,11 +180,34 @@ IOStream::pos_type FileStream::BytesLeftToRead() // -------------------------------------------------------------------------- void FileStream::Write(const void *pBuffer, int NBytes) { - if(mOSFileHandle == -1) {THROW_EXCEPTION(CommonException, FileClosed)} + if(mOSFileHandle == INVALID_FILE) + { + THROW_EXCEPTION(CommonException, FileClosed) + } + +#ifdef WIN32 + DWORD numBytesWritten = 0; + BOOL res = WriteFile( + this->mOSFileHandle, + pBuffer, + NBytes, + &numBytesWritten, + NULL + ); + + if ( (res == 0) || (numBytesWritten != NBytes)) + { + DWORD err = GetLastError(); + THROW_EXCEPTION(CommonException, OSFileWriteError) + } + + +#else if(::write(mOSFileHandle, pBuffer, NBytes) != NBytes) { THROW_EXCEPTION(CommonException, OSFileWriteError) } +#endif } @@ -161,7 +221,21 @@ void FileStream::Write(const void *pBuffer, int NBytes) // -------------------------------------------------------------------------- IOStream::pos_type FileStream::GetPosition() const { - if(mOSFileHandle == -1) {THROW_EXCEPTION(CommonException, FileClosed)} + if(mOSFileHandle == INVALID_FILE) + { + THROW_EXCEPTION(CommonException, FileClosed) + } + +#ifdef WIN32 + LARGE_INTEGER conv; + + conv.HighPart = 0; + conv.LowPart = 0; + + conv.LowPart = SetFilePointer(this->mOSFileHandle, 0, &conv.HighPart, FILE_CURRENT); + + return (IOStream::pos_type)conv.QuadPart; +#else // ! WIN32 off_t p = ::lseek(mOSFileHandle, 0, SEEK_CUR); if(p == -1) { @@ -169,6 +243,7 @@ IOStream::pos_type FileStream::GetPosition() const } return (IOStream::pos_type)p; +#endif // WIN32 } @@ -182,12 +257,28 @@ IOStream::pos_type FileStream::GetPosition() const // -------------------------------------------------------------------------- void FileStream::Seek(IOStream::pos_type Offset, int SeekType) { - if(mOSFileHandle == -1) {THROW_EXCEPTION(CommonException, FileClosed)} + if(mOSFileHandle == INVALID_FILE) + { + THROW_EXCEPTION(CommonException, FileClosed) + } + +#ifdef WIN32 + LARGE_INTEGER conv; + + conv.QuadPart = Offset; + DWORD retVal = SetFilePointer(this->mOSFileHandle, conv.LowPart, &conv.HighPart, ConvertSeekTypeToOSWhence(SeekType)); + + if ( retVal == INVALID_SET_FILE_POINTER && (GetLastError() != NO_ERROR) ) + { + THROW_EXCEPTION(CommonException, OSFileError) + } +#else // ! WIN32 if(::lseek(mOSFileHandle, Offset, ConvertSeekTypeToOSWhence(SeekType)) == -1) { THROW_EXCEPTION(CommonException, OSFileError) } - +#endif // WIN32 + // Not end of file any more! mIsEOF = false; } @@ -207,12 +298,21 @@ void FileStream::Close() { THROW_EXCEPTION(CommonException, FileAlreadyClosed) } +#ifdef WIN32 + if(::CloseHandle(mOSFileHandle) == 0) + { + THROW_EXCEPTION(CommonException, OSFileCloseError) + } + mOSFileHandle = NULL; + mIsEOF = true; +#else if(::close(mOSFileHandle) != 0) { THROW_EXCEPTION(CommonException, OSFileCloseError) } mOSFileHandle = -1; mIsEOF = true; +#endif } |