From e1c75e5922a4f031e9f8312d1f981f63bcbeb48d Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sun, 7 Sep 2008 13:20:14 +0000 Subject: Fix test regression on Windows where a const char pointer was treated as a file handle instead of as a string. --- lib/common/FileStream.cpp | 28 +++++++++++++++++++++++++++- lib/common/FileStream.h | 13 +++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/common/FileStream.cpp b/lib/common/FileStream.cpp index 2e76460a..c4a979b5 100644 --- a/lib/common/FileStream.cpp +++ b/lib/common/FileStream.cpp @@ -32,6 +32,32 @@ FileStream::FileStream(const std::string& rFilename, int flags, int mode) #endif 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) @@ -48,7 +74,7 @@ FileStream::FileStream(const std::string& rFilename, int flags, int mode) else { BOX_LOG_SYS_WARNING("Failed to open file: " << - rFilename); + mFileName); THROW_EXCEPTION(CommonException, OSFileOpenError) } } diff --git a/lib/common/FileStream.h b/lib/common/FileStream.h index 5efb91ea..e3ab9f46 100644 --- a/lib/common/FileStream.h +++ b/lib/common/FileStream.h @@ -38,6 +38,18 @@ public: int flags = O_RDONLY, #endif int mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)); + + // Ensure that const char * name doesn't end up as a handle + // on Windows! + + FileStream(const char *pFilename, +#ifdef WIN32 + int flags = (O_RDONLY | O_BINARY), +#else + int flags = O_RDONLY, +#endif + int mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)); + FileStream(tOSFileHandle FileDescriptor); virtual ~FileStream(); @@ -56,6 +68,7 @@ private: tOSFileHandle mOSFileHandle; bool mIsEOF; FileStream(const FileStream &rToCopy) { /* do not call */ } + void AfterOpen(); // for debugging.. std::string mFileName; -- cgit v1.2.3