summaryrefslogtreecommitdiff
path: root/lib/common/FileStream.cpp
diff options
context:
space:
mode:
authorMartin Ebourne <martin@ebourne.me.uk>2005-12-12 20:50:00 +0000
committerMartin Ebourne <martin@ebourne.me.uk>2005-12-12 20:50:00 +0000
commit3bedf8846f4d7a5cb38276b274662d62a36dcd52 (patch)
tree9d51de8b0f3d06ba6549a5a1958e52f592343140 /lib/common/FileStream.cpp
parent81d8eda2419e7a23088a98cdfc52a305c9ceac0d (diff)
Marged chris/win32/merge/07-win32-fixes at r210 to trunk
Diffstat (limited to 'lib/common/FileStream.cpp')
-rwxr-xr-xlib/common/FileStream.cpp116
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
}