diff options
Diffstat (limited to 'src/corelib/io/qfsfileengine.cpp')
-rw-r--r-- | src/corelib/io/qfsfileengine.cpp | 97 |
1 files changed, 70 insertions, 27 deletions
diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp index 88e8baedca..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() @@ -195,6 +224,9 @@ void QFSFileEngine::setFileName(const QString &file) */ bool QFSFileEngine::open(QIODevice::OpenMode openMode) { + Q_ASSERT_X(openMode & QIODevice::Unbuffered, "QFSFileEngine::open", + "QFSFileEngine no longer supports buffered mode; upper layer must buffer"); + Q_D(QFSFileEngine); if (d->fileEntry.isEmpty()) { qWarning("QFSFileEngine::open: No file name specified"); @@ -202,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; @@ -230,15 +257,13 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, FILE *fh) bool QFSFileEngine::open(QIODevice::OpenMode openMode, FILE *fh, QFile::FileHandleFlags handleFlags) { - Q_D(QFSFileEngine); + Q_ASSERT_X(openMode & QIODevice::Unbuffered, "QFSFileEngine::open", + "QFSFileEngine no longer supports buffered mode; upper layer must buffer"); - // Append implies WriteOnly. - if (openMode & QFile::Append) - openMode |= QFile::WriteOnly; + Q_D(QFSFileEngine); - // 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; @@ -255,6 +280,9 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, FILE *fh, QFile::FileHand */ bool QFSFileEnginePrivate::openFh(QIODevice::OpenMode openMode, FILE *fh) { + Q_ASSERT_X(openMode & QIODevice::Unbuffered, "QFSFileEngine::open", + "QFSFileEngine no longer supports buffered mode; upper layer must buffer"); + Q_Q(QFSFileEngine); this->fh = fh; fd = -1; @@ -293,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; @@ -516,6 +539,25 @@ bool QFSFileEngine::seek(qint64 pos) } /*! + \reimp +*/ +QDateTime QFSFileEngine::fileTime(FileTime time) const +{ + Q_D(const QFSFileEngine); + + if (time == AccessTime) { + // always refresh for the access time + d->metaData.clearFlags(QFileSystemMetaData::AccessTime); + } + + if (d->doStat(QFileSystemMetaData::Times)) + return d->metaData.fileTime(time); + + return QDateTime(); +} + + +/*! \internal */ bool QFSFileEnginePrivate::seekFdFh(qint64 pos) @@ -699,6 +741,7 @@ qint64 QFSFileEnginePrivate::readLineFdFh(char *data, qint64 maxlen) qint64 QFSFileEngine::write(const char *data, qint64 len) { Q_D(QFSFileEngine); + d->metaData.clearFlags(QFileSystemMetaData::Times); // On Windows' stdlib implementation, the results of calling fread and // fwrite are undefined if not called either in sequence, or if preceded @@ -860,9 +903,9 @@ bool QFSFileEngine::supportsExtension(Extension extension) const /*! \fn bool QFSFileEngine::copy(const QString ©Name) - For windows, copy the file to file \a copyName. + For Windows or Apple platforms, copy the file to file \a copyName. - Not implemented for Unix. + Not implemented for other Unix platforms. */ /*! \fn QString QFSFileEngine::currentPath(const QString &fileName) @@ -886,11 +929,11 @@ bool QFSFileEngine::supportsExtension(Extension extension) const For Unix, the list contains just the root path "/". */ -/*! \fn QString QFSFileEngine::fileName(FileName file) const +/*! \fn QString QFSFileEngine::fileName(QAbstractFileEngine::FileName file) const \reimp */ -/*! \fn QDateTime QFSFileEngine::fileTime(FileTime time) const +/*! \fn bool QFSFileEngine::setFileTime(const QDateTime &newDate, QAbstractFileEngine::FileTime time) \reimp */ @@ -916,7 +959,7 @@ bool QFSFileEngine::supportsExtension(Extension extension) const \reimp */ -/*! \fn uint QFSFileEngine::ownerId(FileOwner own) const +/*! \fn uint QFSFileEngine::ownerId(QAbstractFileEngine::FileOwner own) const In Unix, if stat() is successful, the \c uid is returned if \a own is the owner. Otherwise the \c gid is returned. If stat() is unsuccessful, -2 is reuturned. @@ -924,7 +967,7 @@ bool QFSFileEngine::supportsExtension(Extension extension) const For Windows, -2 is always returned. */ -/*! \fn QString QFSFileEngine::owner(FileOwner own) const +/*! \fn QString QFSFileEngine::owner(QAbstractFileEngine::FileOwner own) const \reimp */ |