summaryrefslogtreecommitdiff
path: root/lib/common/FileStream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/common/FileStream.cpp')
-rw-r--r--lib/common/FileStream.cpp110
1 files changed, 93 insertions, 17 deletions
diff --git a/lib/common/FileStream.cpp b/lib/common/FileStream.cpp
index e0806e10..d6a3c5da 100644
--- a/lib/common/FileStream.cpp
+++ b/lib/common/FileStream.cpp
@@ -24,13 +24,40 @@
// Created: 2003/07/31
//
// --------------------------------------------------------------------------
-FileStream::FileStream(const char *Filename, int flags, int mode)
+FileStream::FileStream(const std::string& rFilename, int flags, int mode)
#ifdef WIN32
- : mOSFileHandle(::openfile(Filename, flags, mode)),
+ : mOSFileHandle(::openfile(rFilename.c_str(), flags, mode)),
#else
- : mOSFileHandle(::open(Filename, flags, mode)),
+ : mOSFileHandle(::open(rFilename.c_str(), flags, mode)),
#endif
- mIsEOF(false)
+ mIsEOF(false),
+ mFileName(rFilename)
+{
+ AfterOpen();
+}
+
+// --------------------------------------------------------------------------
+//
+// Function
+// Name: FileStream::FileStream(const char *, int, int)
+// Purpose: Alternative constructor, takes a const char *,
+// avoids const strings being interpreted as handles!
+// Created: 2003/07/31
+//
+// --------------------------------------------------------------------------
+FileStream::FileStream(const char *pFilename, int flags, int mode)
+#ifdef WIN32
+ : mOSFileHandle(::openfile(pFilename, flags, mode)),
+#else
+ : mOSFileHandle(::open(pFilename, flags, mode)),
+#endif
+ mIsEOF(false),
+ mFileName(pFilename)
+{
+ AfterOpen();
+}
+
+void FileStream::AfterOpen()
{
#ifdef WIN32
if(mOSFileHandle == INVALID_HANDLE_VALUE)
@@ -46,12 +73,16 @@ FileStream::FileStream(const char *Filename, int flags, int mode)
}
else
{
+ #ifdef WIN32
+ BOX_LOG_WIN_WARNING_NUMBER("Failed to open file: " <<
+ mFileName, winerrno);
+ #else
+ BOX_LOG_SYS_WARNING("Failed to open file: " <<
+ mFileName);
+ #endif
THROW_EXCEPTION(CommonException, OSFileOpenError)
}
}
-#ifdef WIN32
- this->fileName = Filename;
-#endif
}
@@ -65,7 +96,8 @@ FileStream::FileStream(const char *Filename, int flags, int mode)
// --------------------------------------------------------------------------
FileStream::FileStream(tOSFileHandle FileDescriptor)
: mOSFileHandle(FileDescriptor),
- mIsEOF(false)
+ mIsEOF(false),
+ mFileName("HANDLE")
{
#ifdef WIN32
if(mOSFileHandle == INVALID_HANDLE_VALUE)
@@ -77,9 +109,6 @@ FileStream::FileStream(tOSFileHandle FileDescriptor)
BOX_ERROR("FileStream: called with invalid file handle");
THROW_EXCEPTION(CommonException, OSFileOpenError)
}
-#ifdef WIN32
- this->fileName = "HANDLE";
-#endif
}
#if 0
@@ -150,27 +179,32 @@ int FileStream::Read(void *pBuffer, int NBytes, int Timeout)
NULL
);
- if ( valid )
+ if(valid)
{
r = numBytesRead;
}
- else if (GetLastError() == ERROR_BROKEN_PIPE)
+ else if(GetLastError() == ERROR_BROKEN_PIPE)
{
r = 0;
}
else
{
- BOX_ERROR("Failed to read from file: " <<
- GetErrorMessage(GetLastError()));
+ BOX_LOG_WIN_ERROR("Failed to read from file: " << mFileName);
r = -1;
}
#else
int r = ::read(mOSFileHandle, pBuffer, NBytes);
+ if(r == -1)
+ {
+ BOX_LOG_SYS_ERROR("Failed to read from file: " << mFileName);
+ }
#endif
+
if(r == -1)
{
THROW_EXCEPTION(CommonException, OSFileReadError)
}
+
if(r == 0)
{
mIsEOF = true;
@@ -190,8 +224,8 @@ int FileStream::Read(void *pBuffer, int NBytes, int Timeout)
// --------------------------------------------------------------------------
IOStream::pos_type FileStream::BytesLeftToRead()
{
- struct stat st;
- if(::fstat(mOSFileHandle, &st) != 0)
+ EMU_STRUCT_STAT st;
+ if(EMU_FSTAT(mOSFileHandle, &st) != 0)
{
THROW_EXCEPTION(CommonException, OSFileError)
}
@@ -233,6 +267,7 @@ void FileStream::Write(const void *pBuffer, int NBytes)
#else
if(::write(mOSFileHandle, pBuffer, NBytes) != NBytes)
{
+ BOX_LOG_SYS_ERROR("Failed to write to file: " << mFileName);
THROW_EXCEPTION(CommonException, OSFileWriteError)
}
#endif
@@ -368,3 +403,44 @@ bool FileStream::StreamClosed()
return mIsEOF;
}
+// --------------------------------------------------------------------------
+//
+// Function
+// Name: FileStream::CompareWith(IOStream&, int)
+// Purpose: Compare bytes in this file with other stream's data
+// Created: 2009/01/03
+//
+// --------------------------------------------------------------------------
+bool FileStream::CompareWith(IOStream& rOther, int Timeout)
+{
+ // Size
+ IOStream::pos_type mySize = BytesLeftToRead();
+ IOStream::pos_type otherSize = 0;
+
+ // Test the contents
+ char buf1[2048];
+ char buf2[2048];
+ while(StreamDataLeft() && rOther.StreamDataLeft())
+ {
+ int readSize = rOther.Read(buf1, sizeof(buf1), Timeout);
+ otherSize += readSize;
+
+ if(Read(buf2, readSize) != readSize ||
+ ::memcmp(buf1, buf2, readSize) != 0)
+ {
+ return false;
+ }
+ }
+
+ // Check read all the data from the server and file -- can't be
+ // equal if local and remote aren't the same length. Can't use
+ // StreamDataLeft() test on local file, because if it's the same
+ // size, it won't know it's EOF yet.
+
+ if(rOther.StreamDataLeft() || otherSize != mySize)
+ {
+ return false;
+ }
+
+ return true;
+}