diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index 82d67ab644..9247dd326d 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -44,10 +44,10 @@ #ifndef QT_NO_TEMPORARYFILE #include "qplatformdefs.h" -#include "qstringbuilder.h" #include "private/qfile_p.h" #include "private/qfsfileengine_p.h" #include "private/qsystemerror_p.h" +#include "private/qfilesystemengine_p.h" #if defined(Q_OS_SYMBIAN) #include "private/qcore_symbian_p.h" @@ -102,38 +102,6 @@ typedef char Latin1Char; typedef int NativeFileHandle; #endif -struct Placeholder -{ - Placeholder(int size) - : size_(size) - { - } - - int size() const - { - return size_; - } - -private: - int size_; -}; - -template <> -struct QConcatenable -{ - typedef Placeholder type; - typedef QByteArray ConvertTo; - enum { ExactSize = true }; - static int size(const Placeholder &p) { return p.size(); } - - template - static inline void appendTo(const Placeholder &p, CharT *&out) - { - // Uninitialized - out += p.size(); - } -}; - /* * Copyright (c) 1987, 1993 * The Regents of the University of California. All rights reserved. @@ -366,43 +334,59 @@ bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode) if (!filePathIsTemplate) return QFSFileEngine::open(openMode); - const QFileSystemEntry::NativePath qfilename = d->fileEntry.nativeFilePath(); + QString qfilename = d->fileEntry.filePath(); - // Find placeholder string. + // Ensure there is a placeholder mask uint phPos = qfilename.length(); uint phLength = 0; while (phPos != 0) { --phPos; - if (qfilename[phPos] == Latin1Char('X')) { + if (qfilename[phPos] == QLatin1Char('X')) { ++phLength; continue; } if (phLength >= 6 - || qfilename[phPos] == -#if !defined(Q_OS_WIN) && !defined(Q_OS_SYMBIAN) - '/' -#else - QLatin1Char('\\') -#endif - ) { + || qfilename[phPos] == QLatin1Char('/')) { ++phPos; break; } + // start over phLength = 0; } - QFileSystemEntry::NativePath filename; + if (phLength < 6) + qfilename.append(QLatin1String(".XXXXXX")); - if (phLength < 6) { - phPos = qfilename.length() + 1; // Account for added dot in prefix - phLength = 6; - filename = qfilename % Latin1Char('.') % Placeholder(phLength); - } else - filename = qfilename; + // "Nativify" :-) + QFileSystemEntry::NativePath filename = QFileSystemEngine::absoluteName( + QFileSystemEntry(qfilename, QFileSystemEntry::FromInternalPath())) + .nativeFilePath(); + + // Find mask in native path + phPos = filename.length(); + phLength = 0; + while (phPos != 0) { + --phPos; + + if (filename[phPos] == Latin1Char('X')) { + ++phLength; + continue; + } + + if (phLength >= 6) { + ++phPos; + break; + } + + // start over + phLength = 0; + } + + Q_ASSERT(phLength >= 6); QSystemError error; #if defined(Q_OS_WIN) diff --git a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp index 655c167c21..f2d2b0a1c8 100644 --- a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp +++ b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp @@ -647,6 +647,8 @@ void tst_QTemporaryFile::QTBUG_4796_data() QString unicode = QString::fromUtf8("\xc3\xa5\xc3\xa6\xc3\xb8"); QTest::newRow("") << QString() << QString() << true; + QTest::newRow(".") << QString(".") << QString() << true; + QTest::newRow("..") << QString("..") << QString() << true; QTest::newRow("blaXXXXXX") << QString("bla") << QString() << true; QTest::newRow("XXXXXXbla") << QString() << QString("bla") << true; QTest::newRow("does-not-exist/qt_temp.XXXXXX") << QString("does-not-exist/qt_temp") << QString() << false;