QTemporaryFile: add a simpler rename() (non-virtual) override

Calling the parent version is still ok, but if you call the new one you
get a bit of benefit. Since we control the file name, we don't have to
worry about a case-changing renaming (by choice). We also know that the
file is a regular one, because we created it.

[ChangeLog][Important Behavior Changes][QTemporaryFile] rename() no
longer attempts to do block copying, as that usually indicates a mistake
in the user's code. Instead, either create the temporary file in the
same directory as the new name to be, or use QSaveFile.

Change-Id: I1eba2b016de74620bfc8fffd14ccaac0cdb9fe87
Reviewed-by: David Faure <david.faure@kdab.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
This commit is contained in:
Thiago Macieira 2017-06-29 11:22:01 -07:00
parent 363dc9146e
commit 38bc95aece
2 changed files with 36 additions and 0 deletions

View File

@ -54,6 +54,8 @@
#if defined(QT_BUILD_CORE_LIB)
#include "qcoreapplication.h"
#else
#define tr(X) QString::fromLatin1(X)
#endif
QT_BEGIN_NAMESPACE
@ -686,6 +688,36 @@ void QTemporaryFile::setFileTemplate(const QString &name)
static_cast<QTemporaryFileEngine*>(d->fileEngine)->setFileTemplate(name);
}
/*!
\internal
This is just a simplified version of QFile::rename() because we know a few
extra details about what kind of file we have. The documentation is hidden
from the user because QFile::rename() should be enough.
*/
bool QTemporaryFile::rename(const QString &newName)
{
Q_D(QTemporaryFile);
auto tef = static_cast<QTemporaryFileEngine *>(d->fileEngine);
if (!tef || !tef->isReallyOpen() || !tef->filePathWasTemplate)
return QFile::rename(newName);
unsetError();
close();
if (error() == QFile::NoError) {
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;
}
d->setError(QFile::RenameError, tef->errorString());
}
return false;
}
/*!
\fn QTemporaryFile *QTemporaryFile::createLocalFile(const QString &fileName)
\overload

View File

@ -80,6 +80,10 @@ public:
QString fileName() const Q_DECL_OVERRIDE;
QString fileTemplate() const;
void setFileTemplate(const QString &name);
// Hides QFile::rename
bool rename(const QString &newName);
#if QT_DEPRECATED_SINCE(5,1)
QT_DEPRECATED inline static QTemporaryFile *createLocalFile(const QString &fileName)
{ return createNativeFile(fileName); }