diff options
Diffstat (limited to 'src/corelib/io/qfsfileengine.cpp')
-rw-r--r-- | src/corelib/io/qfsfileengine.cpp | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp index 538fcb9a37..387990ed79 100644 --- a/src/corelib/io/qfsfileengine.cpp +++ b/src/corelib/io/qfsfileengine.cpp @@ -165,6 +165,35 @@ QFSFileEngine::QFSFileEngine(QFSFileEnginePrivate &dd) } /*! + \internal +*/ +bool QFSFileEngine::processOpenModeFlags(QIODevice::OpenMode *mode) +{ + QIODevice::OpenMode &openMode = *mode; + if ((openMode & QFile::NewOnly) && (openMode & QFile::ExistingOnly)) { + qWarning("NewOnly and ExistingOnly are mutually exclusive"); + setError(QFile::OpenError, QLatin1String("NewOnly and ExistingOnly are mutually exclusive")); + return false; + } + + if ((openMode & QFile::ExistingOnly) && !(openMode & (QFile::ReadOnly | QFile::WriteOnly))) { + qWarning("ExistingOnly must be specified alongside ReadOnly, WriteOnly, or ReadWrite"); + setError(QFile::OpenError, QLatin1String("ExistingOnly must be specified alongside ReadOnly, WriteOnly, or ReadWrite")); + return false; + } + + // Either Append or NewOnly implies WriteOnly + if (openMode & (QFile::Append | QFile::NewOnly)) + openMode |= QFile::WriteOnly; + + // WriteOnly implies Truncate when ReadOnly, Append, and NewOnly are not set. + if ((openMode & QFile::WriteOnly) && !(openMode & (QFile::ReadOnly | QFile::Append | QFile::NewOnly))) + openMode |= QFile::Truncate; + + return true; +} + +/*! Destructs the QFSFileEngine. */ QFSFileEngine::~QFSFileEngine() @@ -205,13 +234,8 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode) return false; } - // Append implies WriteOnly. - if (openMode & QFile::Append) - openMode |= QFile::WriteOnly; - - // WriteOnly implies Truncate if neither ReadOnly nor Append are sent. - if ((openMode & QFile::WriteOnly) && !(openMode & (QFile::ReadOnly | QFile::Append))) - openMode |= QFile::Truncate; + if (!processOpenModeFlags(&openMode)) + return false; d->openMode = openMode; d->lastFlushFailed = false; @@ -238,13 +262,8 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, FILE *fh, QFile::FileHand Q_D(QFSFileEngine); - // Append implies WriteOnly. - if (openMode & QFile::Append) - openMode |= QFile::WriteOnly; - - // WriteOnly implies Truncate if neither ReadOnly nor Append are sent. - if ((openMode & QFile::WriteOnly) && !(openMode & (QFile::ReadOnly | QFile::Append))) - openMode |= QFile::Truncate; + if (!processOpenModeFlags(&openMode)) + return false; d->openMode = openMode; d->lastFlushFailed = false; @@ -302,13 +321,8 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, int fd, QFile::FileHandle { Q_D(QFSFileEngine); - // Append implies WriteOnly. - if (openMode & QFile::Append) - openMode |= QFile::WriteOnly; - - // WriteOnly implies Truncate if neither ReadOnly nor Append are sent. - if ((openMode & QFile::WriteOnly) && !(openMode & (QFile::ReadOnly | QFile::Append))) - openMode |= QFile::Truncate; + if (!processOpenModeFlags(&openMode)) + return false; d->openMode = openMode; d->lastFlushFailed = false; |