diff options
Diffstat (limited to 'src/corelib/io/qfsfileengine.cpp')
-rw-r--r-- | src/corelib/io/qfsfileengine.cpp | 97 |
1 files changed, 43 insertions, 54 deletions
diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp index d924b22431..3d3af7468b 100644 --- a/src/corelib/io/qfsfileengine.cpp +++ b/src/corelib/io/qfsfileengine.cpp @@ -6,7 +6,6 @@ #include "qfsfileengine_iterator_p.h" #include "qfilesystemengine_p.h" #include "qdatetime.h" -#include "qdiriterator.h" #include "qset.h" #include <QtCore/qdebug.h> @@ -18,7 +17,7 @@ #endif #include <stdio.h> #include <stdlib.h> -#if defined(Q_OS_MAC) +#if defined(Q_OS_DARWIN) # include <private/qcore_mac_p.h> #endif @@ -273,7 +272,7 @@ bool QFSFileEnginePrivate::openFh(QIODevice::OpenMode openMode, FILE *fh) if (ret != 0) { q->setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError, - QSystemError::stdString()); + QSystemError::stdString(errno)); this->openMode = QIODevice::NotOpen; this->fh = nullptr; @@ -328,14 +327,14 @@ bool QFSFileEnginePrivate::openFd(QIODevice::OpenMode openMode, int fd) // Seek to the end when in Append mode. if (openMode & QFile::Append) { - int ret; + QT_OFF_T ret; do { ret = QT_LSEEK(fd, 0, SEEK_END); } while (ret == -1 && errno == EINTR); if (ret == -1) { q->setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError, - QSystemError::stdString()); + QSystemError::stdString(errno)); this->openMode = QIODevice::NotOpen; this->fd = -1; @@ -394,7 +393,7 @@ bool QFSFileEnginePrivate::closeFdFh() if (!flushed || !closed) { if (flushed) { // If not flushed, we want the flush error to fall through. - q->setError(QFile::UnspecifiedError, QSystemError::stdString()); + q->setError(QFile::UnspecifiedError, QSystemError::stdString(errno)); } return false; } @@ -446,7 +445,7 @@ bool QFSFileEnginePrivate::flushFh() if (ret != 0) { q->setError(errno == ENOSPC ? QFile::ResourceError : QFile::WriteError, - QSystemError::stdString()); + QSystemError::stdString(errno)); return false; } return true; @@ -521,11 +520,11 @@ bool QFSFileEngine::seek(qint64 pos) /*! \reimp */ -QDateTime QFSFileEngine::fileTime(FileTime time) const +QDateTime QFSFileEngine::fileTime(QFile::FileTime time) const { Q_D(const QFSFileEngine); - if (time == AccessTime) { + if (time == QFile::FileAccessTime) { // always refresh for the access time d->metaData.clearFlags(QFileSystemMetaData::AccessTime); } @@ -561,14 +560,14 @@ bool QFSFileEnginePrivate::seekFdFh(qint64 pos) } while (ret != 0 && errno == EINTR); if (ret != 0) { - q->setError(QFile::ReadError, QSystemError::stdString()); + q->setError(QFile::ReadError, QSystemError::stdString(errno)); return false; } } else { // Unbuffered stdio mode. if (QT_LSEEK(fd, QT_OFF_T(pos), SEEK_SET) == -1) { + q->setError(QFile::PositionError, QSystemError::stdString(errno)); qWarning("QFile::at: Cannot set file position %lld", pos); - q->setError(QFile::PositionError, QSystemError::stdString()); return false; } } @@ -621,17 +620,15 @@ qint64 QFSFileEnginePrivate::readFdFh(char *data, qint64 len) // Buffered stdlib mode. size_t result; - bool retry = true; do { result = fread(data + readBytes, 1, size_t(len - readBytes), fh); - eof = feof(fh); - if (retry && eof && result == 0) { + eof = feof(fh); // Doesn't change errno + if (eof && result == 0) { // On OS X, this is needed, e.g., if a file was written to // through another stream since our last read. See test // tst_QFile::appendAndRead QT_FSEEK(fh, QT_FTELL(fh), SEEK_SET); // re-sync stream. - retry = false; - continue; + break; } readBytes += result; } while (!eof && (result == 0 ? errno == EINTR : readBytes < len)); @@ -651,12 +648,13 @@ qint64 QFSFileEnginePrivate::readFdFh(char *data, qint64 len) result = QT_READ(fd, data + readBytes, chunkSize); } while (result > 0 && (readBytes += result) < len); - eof = !(result == -1); + // QT_READ (::read()) returns 0 to indicate end-of-file + eof = result == 0; } if (!eof && readBytes == 0) { readBytes = -1; - q->setError(QFile::ReadError, QSystemError::stdString()); + q->setError(QFile::ReadError, QSystemError::stdString(errno)); } return readBytes; @@ -701,8 +699,8 @@ qint64 QFSFileEnginePrivate::readLineFdFh(char *data, qint64 maxlen) // does the same, so we'd get two '\0' at the end - passing maxlen + 1 // solves this. if (!fgets(data, int(maxlen + 1), fh)) { - if (!feof(fh)) - q->setError(QFile::ReadError, QSystemError::stdString()); + if (!feof(fh)) // Doesn't change errno + q->setError(QFile::ReadError, QSystemError::stdString(errno)); return -1; // error } @@ -779,7 +777,8 @@ qint64 QFSFileEnginePrivate::writeFdFh(const char *data, qint64 len) if (len && writtenBytes == 0) { writtenBytes = -1; - q->setError(errno == ENOSPC ? QFile::ResourceError : QFile::WriteError, QSystemError::stdString()); + q->setError(errno == ENOSPC ? QFile::ResourceError : QFile::WriteError, + QSystemError::stdString(errno)); } else { // reset the cached size, if any metaData.clearFlags(QFileSystemMetaData::SizeAttribute); @@ -792,29 +791,16 @@ qint64 QFSFileEnginePrivate::writeFdFh(const char *data, qint64 len) /*! \internal */ -QAbstractFileEngine::Iterator *QFSFileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames) +QAbstractFileEngine::IteratorUniquePtr +QFSFileEngine::beginEntryList(const QString &path, QDir::Filters filters, + const QStringList &filterNames) { - return new QFSFileEngineIterator(filters, filterNames); + return std::make_unique<QFSFileEngineIterator>(path, filters, filterNames); } -/*! - \internal -*/ -QAbstractFileEngine::Iterator *QFSFileEngine::endEntryList() -{ - return nullptr; -} #endif // QT_NO_FILESYSTEMITERATOR /*! - \internal -*/ -QStringList QFSFileEngine::entryList(QDir::Filters filters, const QStringList &filterNames) const -{ - return QAbstractFileEngine::entryList(filters, filterNames); -} - -/*! \reimp */ bool QFSFileEngine::isSequential() const @@ -906,7 +892,7 @@ bool QFSFileEngine::supportsExtension(Extension extension) const \reimp */ -/*! \fn bool QFSFileEngine::setFileTime(const QDateTime &newDate, QAbstractFileEngine::FileTime time) +/*! \fn bool QFSFileEngine::setFileTime(const QDateTime &newDate, QFile::FileTime time) \reimp */ @@ -996,29 +982,32 @@ bool QFSFileEngine::remove() return ret; } -/*! - \reimp +/* + An alternative to setFileName() when you have already constructed + a QFileSystemEntry. */ -bool QFSFileEngine::rename(const QString &newName) +void QFSFileEngine::setFileEntry(QFileSystemEntry &&entry) { Q_D(QFSFileEngine); - QSystemError error; - bool ret = QFileSystemEngine::renameFile(d->fileEntry, QFileSystemEntry(newName), error); - if (!ret) - setError(QFile::RenameError, error.toString()); - return ret; + d->init(); + d->fileEntry = std::move(entry); } -/*! - \reimp -*/ -bool QFSFileEngine::renameOverwrite(const QString &newName) + +bool QFSFileEngine::rename_helper(const QString &newName, RenameMode mode) { Q_D(QFSFileEngine); + + auto func = mode == Rename ? QFileSystemEngine::renameFile + : QFileSystemEngine::renameOverwriteFile; QSystemError error; - bool ret = QFileSystemEngine::renameOverwriteFile(d->fileEntry, QFileSystemEntry(newName), error); - if (!ret) + auto newEntry = QFileSystemEntry(newName); + const bool ret = func(d->fileEntry, newEntry, error); + if (!ret) { setError(QFile::RenameError, error.toString()); - return ret; + return false; + } + setFileEntry(std::move(newEntry)); + return true; } /*! |