diff options
-rw-r--r-- | src/corelib/io/qtemporarydir.cpp | 38 | ||||
-rw-r--r-- | src/corelib/io/qtemporarydir.h | 1 | ||||
-rw-r--r-- | tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp | 3 | ||||
-rw-r--r-- | tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp | 8 | ||||
-rw-r--r-- | tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp | 3 |
5 files changed, 37 insertions, 16 deletions
diff --git a/src/corelib/io/qtemporarydir.cpp b/src/corelib/io/qtemporarydir.cpp index 0beda22f24..32c3d92dca 100644 --- a/src/corelib/io/qtemporarydir.cpp +++ b/src/corelib/io/qtemporarydir.cpp @@ -38,6 +38,7 @@ #include "qdiriterator.h" #include "qplatformdefs.h" #include <QDebug> +#include <QPair> #if defined(QT_BUILD_CORE_LIB) #include "qcoreapplication.h" @@ -59,7 +60,7 @@ public: void create(const QString &templateName); - QString path; + QString pathOrError; bool autoRemove; bool success; }; @@ -97,7 +98,7 @@ static int nextRand(int &v) return r; } -static char *q_mkdtemp(char *templateName) +QPair<QString, bool> q_mkdtemp(char *templateName) { static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; @@ -105,8 +106,7 @@ static char *q_mkdtemp(char *templateName) char *XXXXXX = templateName + length - 6; - if ((length < 6u) || strncmp(XXXXXX, "XXXXXX", 6)) - return 0; + Q_ASSERT((length >= 6u) && strncmp(XXXXXX, "XXXXXX", 6) == 0); for (int i = 0; i < 256; ++i) { int v = qrand(); @@ -133,17 +133,18 @@ static char *q_mkdtemp(char *templateName) qWarning() << "Unable to remove unused directory" << templateNameStr; continue; } - return templateName; + return qMakePair(QFile::decodeName(templateName), true); } } - return 0; + return qMakePair(qt_error_string(), false); } #else // defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID) -static char *q_mkdtemp(char *templateName) +QPair<QString, bool> q_mkdtemp(char *templateName) { - return mkdtemp(templateName); + bool ok = (mkdtemp(templateName) != 0); + return qMakePair(ok ? QFile::decodeName(templateName) : qt_error_string(), ok); } #endif @@ -153,10 +154,9 @@ void QTemporaryDirPrivate::create(const QString &templateName) QByteArray buffer = QFile::encodeName(templateName); if (!buffer.endsWith("XXXXXX")) buffer += "XXXXXX"; - if (q_mkdtemp(buffer.data())) { // modifies buffer - success = true; - path = QFile::decodeName(buffer.constData()); - } + QPair<QString, bool> result = q_mkdtemp(buffer.data()); // modifies buffer + pathOrError = result.first; + success = result.second; } //************* QTemporaryDir @@ -256,12 +256,24 @@ bool QTemporaryDir::isValid() const } /*! + \since 5.6 + + If isValid() returns \c false, this function returns the error string that + explains why the creation of the temporary directory failed. Otherwise, this + function return an empty string. +*/ +QString QTemporaryDir::errorString() const +{ + return d_ptr->success ? QString() : d_ptr->pathOrError; +} + +/*! Returns the path to the temporary directory. Empty if the QTemporaryDir could not be created. */ QString QTemporaryDir::path() const { - return d_ptr->path; + return d_ptr->success ? d_ptr->pathOrError : QString(); } /*! diff --git a/src/corelib/io/qtemporarydir.h b/src/corelib/io/qtemporarydir.h index 8b98226529..ab6d841cdf 100644 --- a/src/corelib/io/qtemporarydir.h +++ b/src/corelib/io/qtemporarydir.h @@ -52,6 +52,7 @@ public: ~QTemporaryDir(); bool isValid() const; + QString errorString() const; bool autoRemove() const; void setAutoRemove(bool b); diff --git a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp index 2b01cfd7a9..bbee33ac78 100644 --- a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp +++ b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp @@ -281,7 +281,8 @@ void tst_QFileInfo::initTestCase() m_resourcesDir = dataPath + QLatin1String("/resources"); m_proFile = dataPath + QLatin1String("/tst_qfileinfo.pro"); - QVERIFY(m_dir.isValid()); + QVERIFY2(m_dir.isValid(), + ("Failed to create temporary dir: " + m_dir.errorString()).toUtf8()); QVERIFY(QDir::setCurrent(m_dir.path())); } diff --git a/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp b/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp index 3e98a369ce..58a3db9615 100644 --- a/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp +++ b/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp @@ -93,6 +93,7 @@ void tst_QTemporaryDir::construction() QCOMPARE(dir.path().left(tmp.size()), tmp); QVERIFY(dir.path().contains("tst_qtemporarydir")); QVERIFY(QFileInfo(dir.path()).isDir()); + QCOMPARE(dir.errorString(), QString()); } // Testing get/set functions @@ -251,6 +252,7 @@ void tst_QTemporaryDir::nonWritableCurrentDir() QTemporaryDir dir("tempXXXXXX"); dir.setAutoRemove(true); QVERIFY(!dir.isValid()); + QVERIFY(!dir.errorString().isEmpty()); QVERIFY(dir.path().isEmpty()); #endif } @@ -287,7 +289,11 @@ void tst_QTemporaryDir::stressTest() for (int i = 0; i < iterations; ++i) { QTemporaryDir dir(pattern); dir.setAutoRemove(false); - QVERIFY2(dir.isValid(), qPrintable(QString::fromLatin1("Failed to create #%1 under %2.").arg(i).arg(QDir::toNativeSeparators(pattern)))); + QVERIFY2(dir.isValid(), + qPrintable(QString::fromLatin1("Failed to create #%1 under %2: %3.") + .arg(i) + .arg(QDir::toNativeSeparators(pattern)) + .arg(dir.errorString()))); QVERIFY(!names.contains(dir.path())); names.insert(dir.path()); } diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp index 25b9be0881..7c32f2cc12 100644 --- a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp +++ b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp @@ -82,7 +82,8 @@ tst_QMimeDatabase::tst_QMimeDatabase() void tst_QMimeDatabase::initTestCase() { - QVERIFY(m_temporaryDir.isValid()); + QVERIFY2(m_temporaryDir.isValid(), + ("Could not create temporary subdir: " + m_temporaryDir.errorString()).toUtf8()); // Create a "global" and a "local" XDG data dir, right here. // The local dir will be empty initially, while the global dir will contain a copy of freedesktop.org.xml |