Move processOpenModeFlags out of QFSFileEngine

The same logic is needed for QWinRTFileEngine. To be able to reuse the
code, it was moved out of the class.

Task-number: QTBUG-77095
Change-Id: If52b2fc8a0f3056d32fc693775565a1c3803b7d4
Reviewed-by: André de la Rocha <andre.rocha@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
bb10
Oliver Wolff 2019-07-23 11:10:59 +02:00
parent 3fbb6a9572
commit 56b1cb0b04
2 changed files with 36 additions and 19 deletions

View File

@ -167,19 +167,21 @@ QFSFileEngine::QFSFileEngine(QFSFileEnginePrivate &dd)
/*!
\internal
*/
bool QFSFileEngine::processOpenModeFlags(QIODevice::OpenMode *mode)
ProcessOpenModeResult processOpenModeFlags(QIODevice::OpenMode openMode)
{
QIODevice::OpenMode &openMode = *mode;
ProcessOpenModeResult result;
result.ok = false;
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;
result.error = QLatin1String("NewOnly and ExistingOnly are mutually exclusive");
return result;
}
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;
result.error = QLatin1String(
"ExistingOnly must be specified alongside ReadOnly, WriteOnly, or ReadWrite");
return result;
}
// Either Append or NewOnly implies WriteOnly
@ -190,7 +192,9 @@ bool QFSFileEngine::processOpenModeFlags(QIODevice::OpenMode *mode)
if ((openMode & QFile::WriteOnly) && !(openMode & (QFile::ReadOnly | QFile::Append | QFile::NewOnly)))
openMode |= QFile::Truncate;
return true;
result.ok = true;
result.openMode = openMode;
return result;
}
/*!
@ -234,16 +238,19 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode)
return false;
}
if (!processOpenModeFlags(&openMode))
const ProcessOpenModeResult res = processOpenModeFlags(openMode);
if (!res.ok) {
setError(QFileDevice::OpenError, res.error);
return false;
}
d->openMode = openMode;
d->openMode = res.openMode;
d->lastFlushFailed = false;
d->tried_stat = 0;
d->fh = 0;
d->fd = -1;
return d->nativeOpen(openMode);
return d->nativeOpen(d->openMode);
}
/*!
@ -262,17 +269,20 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, FILE *fh, QFile::FileHand
Q_D(QFSFileEngine);
if (!processOpenModeFlags(&openMode))
const ProcessOpenModeResult res = processOpenModeFlags(openMode);
if (!res.ok) {
setError(QFileDevice::OpenError, res.error);
return false;
}
d->openMode = openMode;
d->openMode = res.openMode;
d->lastFlushFailed = false;
d->closeFileHandle = (handleFlags & QFile::AutoCloseHandle);
d->fileEntry.clear();
d->tried_stat = 0;
d->fd = -1;
return d->openFh(openMode, fh);
return d->openFh(d->openMode, fh);
}
/*!
@ -321,10 +331,13 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, int fd, QFile::FileHandle
{
Q_D(QFSFileEngine);
if (!processOpenModeFlags(&openMode))
const ProcessOpenModeResult res = processOpenModeFlags(openMode);
if (!res.ok) {
setError(QFileDevice::OpenError, res.error);
return false;
}
d->openMode = openMode;
d->openMode = res.openMode;
d->lastFlushFailed = false;
d->closeFileHandle = (handleFlags & QFile::AutoCloseHandle);
d->fileEntry.clear();
@ -332,7 +345,7 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, int fd, QFile::FileHandle
d->fd = -1;
d->tried_stat = 0;
return d->openFd(openMode, fd);
return d->openFd(d->openMode, fd);
}

View File

@ -61,6 +61,13 @@
QT_BEGIN_NAMESPACE
struct ProcessOpenModeResult {
bool ok;
QIODevice::OpenMode openMode;
QString error;
};
inline Q_CORE_EXPORT ProcessOpenModeResult processOpenModeFlags(QIODevice::OpenMode mode);
class QFSFileEnginePrivate;
class Q_CORE_EXPORT QFSFileEngine : public QAbstractFileEngine
@ -131,9 +138,6 @@ public:
protected:
QFSFileEngine(QFSFileEnginePrivate &dd);
private:
inline bool processOpenModeFlags(QIODevice::OpenMode *mode);
};
class Q_AUTOTEST_EXPORT QFSFileEnginePrivate : public QAbstractFileEnginePrivate