summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2017-06-29 11:22:01 -0700
committerThiago Macieira <thiago.macieira@intel.com>2017-08-04 17:29:54 +0000
commit38bc95aeceea5b4edbcfaee446d94b6062530770 (patch)
tree2fb9990811e255230ad05885c4026f348b316f72
parent363dc9146e53e24172bb9c0ae68100a8543bd9ae (diff)
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>
-rw-r--r--src/corelib/io/qtemporaryfile.cpp32
-rw-r--r--src/corelib/io/qtemporaryfile.h4
2 files changed, 36 insertions, 0 deletions
diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index efab2a30ff..a7fa485399 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -54,6 +54,8 @@
#if defined(QT_BUILD_CORE_LIB)
#include "qcoreapplication.h"
+#else
+#define tr(X) QString::fromLatin1(X)
#endif
QT_BEGIN_NAMESPACE
@@ -687,6 +689,36 @@ void QTemporaryFile::setFileTemplate(const QString &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
\obsolete
diff --git a/src/corelib/io/qtemporaryfile.h b/src/corelib/io/qtemporaryfile.h
index 3dc2e75f50..7fc5a299fc 100644
--- a/src/corelib/io/qtemporaryfile.h
+++ b/src/corelib/io/qtemporaryfile.h
@@ -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); }