diff options
author | Ahmad Samir <a.samirh78@gmail.com> | 2024-04-17 02:08:48 +0200 |
---|---|---|
committer | Ahmad Samir <a.samirh78@gmail.com> | 2024-04-20 04:29:31 +0200 |
commit | df6b74f4617bf0ba14420ed15fcc5866cccfb7d0 (patch) | |
tree | 42eb97c82d52e266888fcb7b5e2dba623215c662 | |
parent | d691872b865c735f9d35886388c89f7ace7df5c8 (diff) |
QFSFileEngine: update d->fileEntry after a successful rename
Otherwise member methods such as size() could return incorrect info.
Add setFileEntry(QFileSystemEntry &&); to reuse a QFileSystemEntry if we
have already constructed one.
As a result of this, a QTemporaryFileEngine::setFileName() call has
become redundant and can be removed; the code it executed is already
taken care of:
- QFSFileEngine::close(): already called by QTFEngine::rename() a couple
of lines above
- QFSFileEngine::setFileName(): QTFEngine::rename() calls
QFSFileEngine::rename() which in turn updates the `fileEntry`
This commit is covered by tst_QTemporaryFile::rename(), i.e. if
QFSFileEngine::rename() didn't update the fileEntry, that test would
fail.
Change-Id: I312f35cf7fdf9b1a8cd0bce5e98ba7a48cf9426e
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/io/qfsfileengine.cpp | 21 | ||||
-rw-r--r-- | src/corelib/io/qfsfileengine_p.h | 3 | ||||
-rw-r--r-- | src/corelib/io/qfsfileengine_win.cpp | 3 | ||||
-rw-r--r-- | src/corelib/io/qtemporaryfile.cpp | 8 |
4 files changed, 27 insertions, 8 deletions
diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp index a4d0cc0e4f..f49106edd4 100644 --- a/src/corelib/io/qfsfileengine.cpp +++ b/src/corelib/io/qfsfileengine.cpp @@ -990,6 +990,17 @@ bool QFSFileEngine::remove() return ret; } +/* + An alternative to setFileName() when you have already constructed + a QFileSystemEntry. +*/ +void QFSFileEngine::setFileEntry(QFileSystemEntry &&entry) +{ + Q_D(QFSFileEngine); + d->init(); + d->fileEntry = std::move(entry); +} + bool QFSFileEngine::rename_helper(const QString &newName, RenameMode mode) { Q_D(QFSFileEngine); @@ -997,10 +1008,14 @@ bool QFSFileEngine::rename_helper(const QString &newName, RenameMode mode) auto func = mode == Rename ? QFileSystemEngine::renameFile : QFileSystemEngine::renameOverwriteFile; QSystemError error; - const bool ret = func(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; } /*! diff --git a/src/corelib/io/qfsfileengine_p.h b/src/corelib/io/qfsfileengine_p.h index 231ad9020a..dfc40e20b6 100644 --- a/src/corelib/io/qfsfileengine_p.h +++ b/src/corelib/io/qfsfileengine_p.h @@ -83,6 +83,7 @@ public: bool setFileTime(const QDateTime &newDate, QFile::FileTime time) override; QDateTime fileTime(QFile::FileTime time) const override; void setFileName(const QString &file) override; + void setFileEntry(QFileSystemEntry &&entry); int handle() const override; #ifndef QT_NO_FILESYSTEMITERATOR @@ -160,7 +161,7 @@ public: bool isSequentialFdFh() const; #endif #ifdef Q_OS_WIN - bool nativeRenameOverwrite(const QString &newName); + bool nativeRenameOverwrite(const QFileSystemEntry &newEntry); #endif uchar *map(qint64 offset, qint64 size, QFile::MemoryMapFlags flags); diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp index 20f6f8e8ff..4ac305f49b 100644 --- a/src/corelib/io/qfsfileengine_win.cpp +++ b/src/corelib/io/qfsfileengine_win.cpp @@ -396,11 +396,10 @@ bool QFSFileEnginePrivate::nativeIsSequential() const || (fileType == FILE_TYPE_PIPE); } -bool QFSFileEnginePrivate::nativeRenameOverwrite(const QString &newName) +bool QFSFileEnginePrivate::nativeRenameOverwrite(const QFileSystemEntry &newEntry) { if (fileHandle == INVALID_HANDLE_VALUE) return false; - QFileSystemEntry newEntry(newName, QFileSystemEntry::FromInternalPath()); const QString newFilePath = newEntry.nativeFilePath(); const size_t nameByteLength = newFilePath.length() * sizeof(wchar_t); if (nameByteLength + sizeof(wchar_t) > std::numeric_limits<DWORD>::max()) diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index d76bc3b328..4e48a18d91 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -393,8 +393,13 @@ bool QTemporaryFileEngine::renameOverwrite(const QString &newName) } #ifdef Q_OS_WIN if (flags & Win32NonShared) { - bool ok = d_func()->nativeRenameOverwrite(newName); + QFileSystemEntry newEntry(newName, QFileSystemEntry::FromInternalPath()); + bool ok = d_func()->nativeRenameOverwrite(newEntry); QFSFileEngine::close(); + if (ok) { + // Match what QFSFileEngine::renameOverwrite() does + setFileEntry(std::move(newEntry)); + } return ok; } #endif @@ -868,7 +873,6 @@ bool QTemporaryFile::rename(const QString &newName) if (tef->rename(newName)) { unsetError(); // engine was able to handle the new name so we just reset it - tef->setFileName(newName); d->fileName = newName; return true; } |