diff options
author | d3fault <d3fault@d3fault.net> | 2017-11-24 16:07:53 -0700 |
---|---|---|
committer | d3fault <d3fault@d3fault.net> | 2018-01-17 04:32:47 +0000 |
commit | 1a4cc8d57b928509a64f9679e5c0e7afaa05cb54 (patch) | |
tree | 7748aa4993fca0bf115402e2df4bd7d4d49537db /src/corelib/io/qfsfileengine.cpp | |
parent | 0aecac1dcfd4b8e353e2fc0b0ad06d77b4b125d6 (diff) |
Add QIODevice::NewOnly and QIODevice::ExistingOnly OpenMode flags
When QFile::open is called with the NewOnly flag, the call will
fail if the file already exists. As usual, if the file does not exist,
it will be created. Like QTemporaryFile, there is a guarantee from
the operating system that you are not accidentally creating a new file
on top of an older file. When QFile::open is called with the
ExistingOnly flag, the call will fail if the file does not exist. The
ExistingOnly flag only provides new functionality when used with the
WriteOnly flag. For ReadOnly it provides no change in functionality,
as ReadOnly by itself already never creates.
Task-number: QTBUG-52244
Change-Id: I8e3206728f245f95172c225bf297023fb078fc6d
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
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; |