diff options
Diffstat (limited to 'src/corelib/plugin')
-rw-r--r-- | src/corelib/plugin/qfactoryloader.cpp | 13 | ||||
-rw-r--r-- | src/corelib/plugin/qlibrary.cpp | 6 | ||||
-rw-r--r-- | src/corelib/plugin/qlibrary.h | 8 | ||||
-rw-r--r-- | src/corelib/plugin/qlibrary_win.cpp | 7 | ||||
-rw-r--r-- | src/corelib/plugin/qpluginloader.h | 4 | ||||
-rw-r--r-- | src/corelib/plugin/quuid.cpp | 414 | ||||
-rw-r--r-- | src/corelib/plugin/quuid.h | 28 |
7 files changed, 282 insertions, 198 deletions
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp index 40000e7b24..a4be18a67f 100644 --- a/src/corelib/plugin/qfactoryloader.cpp +++ b/src/corelib/plugin/qfactoryloader.cpp @@ -54,6 +54,8 @@ #include "qjsonobject.h" #include "qjsonarray.h" +#include <qtcore_tracepoints_p.h> + QT_BEGIN_NAMESPACE class QFactoryLoaderPrivate : public QObjectPrivate @@ -122,8 +124,8 @@ void QFactoryLoader::update() // // ### FIXME find a proper solution // - const bool isLoadingDebugAndReleaseCocoa = plugins.contains(QStringLiteral("libqcocoa_debug.dylib")) - && plugins.contains(QStringLiteral("libqcocoa.dylib")); + const bool isLoadingDebugAndReleaseCocoa = plugins.contains(QLatin1String("libqcocoa_debug.dylib")) + && plugins.contains(QLatin1String("libqcocoa.dylib")); #endif for (int j = 0; j < plugins.count(); ++j) { QString fileName = QDir::cleanPath(path + QLatin1Char('/') + plugins.at(j)); @@ -131,10 +133,10 @@ void QFactoryLoader::update() #ifdef Q_OS_MAC if (isLoadingDebugAndReleaseCocoa) { #ifdef QT_DEBUG - if (fileName.contains(QStringLiteral("libqcocoa.dylib"))) + if (fileName.contains(QLatin1String("libqcocoa.dylib"))) continue; // Skip release plugin in debug mode #else - if (fileName.contains(QStringLiteral("libqcocoa_debug.dylib"))) + if (fileName.contains(QLatin1String("libqcocoa_debug.dylib"))) continue; // Skip debug plugin in release mode #endif } @@ -142,6 +144,9 @@ void QFactoryLoader::update() if (qt_debug_component()) { qDebug() << "QFactoryLoader::QFactoryLoader() looking at" << fileName; } + + Q_TRACE(qfactoryloader_update, fileName); + library = QLibraryPrivate::findOrCreate(QFileInfo(fileName).canonicalFilePath()); if (!library->isPlugin()) { if (qt_debug_component()) { diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index 9e6e70756f..a3b8be8911 100644 --- a/src/corelib/plugin/qlibrary.cpp +++ b/src/corelib/plugin/qlibrary.cpp @@ -64,6 +64,8 @@ #include "qelfparser_p.h" #include "qmachparser_p.h" +#include <qtcore_tracepoints_p.h> + QT_BEGIN_NAMESPACE #ifdef QT_NO_DEBUG @@ -548,6 +550,8 @@ bool QLibraryPrivate::load() if (fileName.isEmpty()) return false; + Q_TRACE(qlibraryprivate_load_entry, fileName); + bool ret = load_sys(); if (qt_debug_component()) { if (ret) { @@ -564,6 +568,8 @@ bool QLibraryPrivate::load() installCoverageTool(this); } + Q_TRACE(qlibraryprivate_load_exit, ret); + return ret; } diff --git a/src/corelib/plugin/qlibrary.h b/src/corelib/plugin/qlibrary.h index 89be52aac3..0b37b8b134 100644 --- a/src/corelib/plugin/qlibrary.h +++ b/src/corelib/plugin/qlibrary.h @@ -65,10 +65,10 @@ public: Q_FLAG(LoadHint) Q_FLAG(LoadHints) - explicit QLibrary(QObject *parent = Q_NULLPTR); - explicit QLibrary(const QString& fileName, QObject *parent = Q_NULLPTR); - explicit QLibrary(const QString& fileName, int verNum, QObject *parent = Q_NULLPTR); - explicit QLibrary(const QString& fileName, const QString &version, QObject *parent = Q_NULLPTR); + explicit QLibrary(QObject *parent = nullptr); + explicit QLibrary(const QString& fileName, QObject *parent = nullptr); + explicit QLibrary(const QString& fileName, int verNum, QObject *parent = nullptr); + explicit QLibrary(const QString& fileName, const QString &version, QObject *parent = nullptr); ~QLibrary(); QFunctionPointer resolve(const char *symbol); diff --git a/src/corelib/plugin/qlibrary_win.cpp b/src/corelib/plugin/qlibrary_win.cpp index a4d3f67c27..9368e53b3f 100644 --- a/src/corelib/plugin/qlibrary_win.cpp +++ b/src/corelib/plugin/qlibrary_win.cpp @@ -116,7 +116,7 @@ bool QLibraryPrivate::load_sys() #endif if (!pHnd) { errorString = QLibrary::tr("Cannot load library %1: %2").arg( - QDir::toNativeSeparators(fileName)).arg(qt_error_string()); + QDir::toNativeSeparators(fileName), qt_error_string()); } else { // Query the actual name of the library that was loaded errorString.clear(); @@ -152,7 +152,7 @@ bool QLibraryPrivate::unload_sys() { if (!FreeLibrary(pHnd)) { errorString = QLibrary::tr("Cannot unload library %1: %2").arg( - QDir::toNativeSeparators(fileName)).arg(qt_error_string()); + QDir::toNativeSeparators(fileName), qt_error_string()); return false; } errorString.clear(); @@ -164,8 +164,7 @@ QFunctionPointer QLibraryPrivate::resolve_sys(const char* symbol) FARPROC address = GetProcAddress(pHnd, symbol); if (!address) { errorString = QLibrary::tr("Cannot resolve symbol \"%1\" in %2: %3").arg( - QString::fromLatin1(symbol)).arg( - QDir::toNativeSeparators(fileName)).arg(qt_error_string()); + QString::fromLatin1(symbol), QDir::toNativeSeparators(fileName), qt_error_string()); } else { errorString.clear(); } diff --git a/src/corelib/plugin/qpluginloader.h b/src/corelib/plugin/qpluginloader.h index 80b10f76bf..5e417249a4 100644 --- a/src/corelib/plugin/qpluginloader.h +++ b/src/corelib/plugin/qpluginloader.h @@ -59,8 +59,8 @@ class Q_CORE_EXPORT QPluginLoader : public QObject Q_PROPERTY(QString fileName READ fileName WRITE setFileName) Q_PROPERTY(QLibrary::LoadHints loadHints READ loadHints WRITE setLoadHints) public: - explicit QPluginLoader(QObject *parent = Q_NULLPTR); - explicit QPluginLoader(const QString &fileName, QObject *parent = Q_NULLPTR); + explicit QPluginLoader(QObject *parent = nullptr); + explicit QPluginLoader(const QString &fileName, QObject *parent = nullptr); ~QPluginLoader(); QObject *instance(); diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp index 0afce7fcf0..b113ca13ce 100644 --- a/src/corelib/plugin/quuid.cpp +++ b/src/corelib/plugin/quuid.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com> ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -39,31 +40,34 @@ #include "quuid.h" +#include "qcryptographichash.h" #include "qdatastream.h" -#include "qendian.h" #include "qdebug.h" +#include "qendian.h" +#include "qrandom.h" #include "private/qtools_p.h" -#ifndef QT_BOOTSTRAPPED -#include "qcryptographichash.h" -#endif QT_BEGIN_NAMESPACE -template <class Char, class Integral> -void _q_toHex(Char *&dst, Integral value) +// 16 bytes (a uint, two shorts and a uchar[8]), each represented by two hex +// digits; plus four dashes and a pair of enclosing brace: 16*2 + 4 + 2 = 38. +enum { MaxStringUuidLength = 38 }; + +template <class Integral> +void _q_toHex(char *&dst, Integral value) { value = qToBigEndian(value); const char* p = reinterpret_cast<const char*>(&value); for (uint i = 0; i < sizeof(Integral); ++i, dst += 2) { - dst[0] = Char(QtMiscUtils::toHexLower((p[i] >> 4) & 0xf)); - dst[1] = Char(QtMiscUtils::toHexLower(p[i] & 0xf)); + dst[0] = QtMiscUtils::toHexLower((p[i] >> 4) & 0xf); + dst[1] = QtMiscUtils::toHexLower(p[i] & 0xf); } } -template <class Char, class Integral> -bool _q_fromHex(const Char *&src, Integral &value) +template <class Integral> +bool _q_fromHex(const char *&src, Integral &value) { value = 0; @@ -79,51 +83,72 @@ bool _q_fromHex(const Char *&src, Integral &value) return true; } -template <class Char> -void _q_uuidToHex(Char *&dst, const uint &d1, const ushort &d2, const ushort &d3, const uchar (&d4)[8]) +static char *_q_uuidToHex(const QUuid &uuid, char *dst, QUuid::StringFormat mode = QUuid::WithBraces) { - *dst++ = Char('{'); - _q_toHex(dst, d1); - *dst++ = Char('-'); - _q_toHex(dst, d2); - *dst++ = Char('-'); - _q_toHex(dst, d3); - *dst++ = Char('-'); + if ((mode & QUuid::WithoutBraces) == 0) + *dst++ = '{'; + _q_toHex(dst, uuid.data1); + if ((mode & QUuid::Id128) != QUuid::Id128) + *dst++ = '-'; + _q_toHex(dst, uuid.data2); + if ((mode & QUuid::Id128) != QUuid::Id128) + *dst++ = '-'; + _q_toHex(dst, uuid.data3); + if ((mode & QUuid::Id128) != QUuid::Id128) + *dst++ = '-'; for (int i = 0; i < 2; i++) - _q_toHex(dst, d4[i]); - *dst++ = Char('-'); + _q_toHex(dst, uuid.data4[i]); + if ((mode & QUuid::Id128) != QUuid::Id128) + *dst++ = '-'; for (int i = 2; i < 8; i++) - _q_toHex(dst, d4[i]); - *dst = Char('}'); + _q_toHex(dst, uuid.data4[i]); + if ((mode & QUuid::WithoutBraces) == 0) + *dst++ = '}'; + return dst; } -template <class Char> -bool _q_uuidFromHex(const Char *&src, uint &d1, ushort &d2, ushort &d3, uchar (&d4)[8]) +/*! + \internal + + Parses the string representation of a UUID (with optional surrounding "{}") + by reading at most MaxStringUuidLength (38) characters from \a src, which + may be \c nullptr. Stops at the first invalid character (which includes a + premature NUL). + + Returns the successfully parsed QUuid, or a null QUuid in case of failure. +*/ +Q_NEVER_INLINE +static QUuid _q_uuidFromHex(const char *src) { - if (*src == Char('{')) - src++; - if (!_q_fromHex(src, d1) - || *src++ != Char('-') - || !_q_fromHex(src, d2) - || *src++ != Char('-') - || !_q_fromHex(src, d3) - || *src++ != Char('-') - || !_q_fromHex(src, d4[0]) - || !_q_fromHex(src, d4[1]) - || *src++ != Char('-') - || !_q_fromHex(src, d4[2]) - || !_q_fromHex(src, d4[3]) - || !_q_fromHex(src, d4[4]) - || !_q_fromHex(src, d4[5]) - || !_q_fromHex(src, d4[6]) - || !_q_fromHex(src, d4[7])) { - return false; + uint d1; + ushort d2, d3; + uchar d4[8]; + + if (src) { + if (*src == '{') + src++; + if (Q_LIKELY( _q_fromHex(src, d1) + && *src++ == '-' + && _q_fromHex(src, d2) + && *src++ == '-' + && _q_fromHex(src, d3) + && *src++ == '-' + && _q_fromHex(src, d4[0]) + && _q_fromHex(src, d4[1]) + && *src++ == '-' + && _q_fromHex(src, d4[2]) + && _q_fromHex(src, d4[3]) + && _q_fromHex(src, d4[4]) + && _q_fromHex(src, d4[5]) + && _q_fromHex(src, d4[6]) + && _q_fromHex(src, d4[7]))) { + return QUuid(d1, d2, d3, d4[0], d4[1], d4[2], d4[3], d4[4], d4[5], d4[6], d4[7]); + } } - return true; + return QUuid(); } -#ifndef QT_BOOTSTRAPPED static QUuid createFromName(const QUuid &ns, const QByteArray &baseData, QCryptographicHash::Algorithm algorithm, int version) { QByteArray hashResult; @@ -146,7 +171,6 @@ static QUuid createFromName(const QUuid &ns, const QByteArray &baseData, QCrypto return result; } -#endif /*! \class QUuid @@ -287,6 +311,22 @@ static QUuid createFromName(const QUuid &ns, const QByteArray &baseData, QCrypto */ /*! + \enum QUuid::StringFormat + \since 5.11 + + This enum is used by toString(StringFormat) to control the formatting of the + string representation. The possible values are: + + \value WithBraces The default, toString() will return five hex fields, separated by + dashes and surrounded by braces. Example: + {00000000-0000-0000-0000-000000000000}. + \value WithoutBraces Only the five dash-separated fields, without the braces. Example: + 00000000-0000-0000-0000-000000000000. + \value Id128 Only the hex digits, without braces or dashes. Note that QUuid + cannot parse this back again as input. +*/ + +/*! \fn QUuid::QUuid(const GUID &guid) Casts a Windows \a guid to a Qt QUuid. @@ -331,7 +371,7 @@ static QUuid createFromName(const QUuid &ns, const QByteArray &baseData, QCrypto /*! Creates a QUuid object from the string \a text, which must be formatted as five hex fields separated by '-', e.g., - "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" where 'x' is a hex + "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" where each 'x' is a hex digit. The curly braces shown here are optional, but it is normal to include them. If the conversion fails, a null UUID is created. See toString() for an explanation of how the five hex fields map to the @@ -340,45 +380,76 @@ static QUuid createFromName(const QUuid &ns, const QByteArray &baseData, QCrypto \sa toString(), QUuid() */ QUuid::QUuid(const QString &text) + : QUuid(fromString(text)) { - if (text.length() < 36) { - *this = QUuid(); - return; - } +} - const ushort *data = reinterpret_cast<const ushort *>(text.unicode()); +/*! + \since 5.10 - if (*data == '{' && text.length() < 37) { - *this = QUuid(); - return; - } + Creates a QUuid object from the string \a text, which must be + formatted as five hex fields separated by '-', e.g., + "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" where each 'x' is a hex + digit. The curly braces shown here are optional, but it is normal to + include them. If the conversion fails, a null UUID is returned. See + toString() for an explanation of how the five hex fields map to the + public data members in QUuid. + + \sa toString(), QUuid() +*/ +QUuid QUuid::fromString(QStringView text) Q_DECL_NOTHROW +{ + if (text.size() > MaxStringUuidLength) + text = text.left(MaxStringUuidLength); // text.truncate(MaxStringUuidLength); + + char latin1[MaxStringUuidLength + 1]; + char *dst = latin1; + + for (QChar ch : text) + *dst++ = ch.toLatin1(); + + *dst++ = '\0'; // don't read garbage as potentially valid data - if (!_q_uuidFromHex(data, data1, data2, data3, data4)) { - *this = QUuid(); - return; + return _q_uuidFromHex(latin1); +} + +/*! + \since 5.10 + \overload + + Creates a QUuid object from the string \a text, which must be + formatted as five hex fields separated by '-', e.g., + "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" where each 'x' is a hex + digit. The curly braces shown here are optional, but it is normal to + include them. If the conversion fails, a null UUID is returned. See + toString() for an explanation of how the five hex fields map to the + public data members in QUuid. + + \sa toString(), QUuid() +*/ +QUuid QUuid::fromString(QLatin1String text) Q_DECL_NOTHROW +{ + if (Q_UNLIKELY(text.size() < MaxStringUuidLength - 2 + || (text.front() == QLatin1Char('{') && text.size() < MaxStringUuidLength - 1))) { + // Too short. Don't call _q_uuidFromHex(); QL1Ss need not be NUL-terminated, + // and we don't want to read trailing garbage as potentially valid data. + text = QLatin1String(); } + return _q_uuidFromHex(text.data()); } /*! \internal */ QUuid::QUuid(const char *text) + : QUuid(_q_uuidFromHex(text)) { - if (!text) { - *this = QUuid(); - return; - } - - if (!_q_uuidFromHex(text, data1, data2, data3, data4)) { - *this = QUuid(); - return; - } } /*! Creates a QUuid object from the QByteArray \a text, which must be formatted as five hex fields separated by '-', e.g., - "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" where 'x' is a hex + "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" where each 'x' is a hex digit. The curly braces shown here are optional, but it is normal to include them. If the conversion fails, a null UUID is created. See toByteArray() for an explanation of how the five hex fields map to the @@ -389,23 +460,8 @@ QUuid::QUuid(const char *text) \sa toByteArray(), QUuid() */ QUuid::QUuid(const QByteArray &text) + : QUuid(fromString(QLatin1String(text.data(), text.size()))) { - if (text.length() < 36) { - *this = QUuid(); - return; - } - - const char *data = text.constData(); - - if (*data == '{' && text.length() < 37) { - *this = QUuid(); - return; - } - - if (!_q_uuidFromHex(data, data1, data2, data3, data4)) { - *this = QUuid(); - return; - } } /*! @@ -452,12 +508,12 @@ QUuid QUuid::createUuidV3(const QUuid &ns, const QByteArray &baseData) { return createFromName(ns, baseData, QCryptographicHash::Md5, 3); } +#endif QUuid QUuid::createUuidV5(const QUuid &ns, const QByteArray &baseData) { return createFromName(ns, baseData, QCryptographicHash::Sha1, 5); } -#endif /*! Creates a QUuid object from the binary representation of the UUID, as @@ -548,12 +604,52 @@ QUuid QUuid::fromRfc4122(const QByteArray &bytes) */ QString QUuid::toString() const { - QString result(38, Qt::Uninitialized); - ushort *data = (ushort *)result.data(); + char latin1[MaxStringUuidLength]; + const auto end = _q_uuidToHex(*this, latin1); + Q_ASSERT(end - latin1 == MaxStringUuidLength); + Q_UNUSED(end); + return QString::fromLatin1(latin1, MaxStringUuidLength); +} - _q_uuidToHex(data, data1, data2, data3, data4); +/*! + \since 5.11 - return result; + Returns the string representation of this QUuid, with the formattiong + controlled by the \a mode parameter. From left to right, the five hex + fields are obtained from the four public data members in QUuid as follows: + + \table + \header + \li Field # + \li Source + + \row + \li 1 + \li data1 + + \row + \li 2 + \li data2 + + \row + \li 3 + \li data3 + + \row + \li 4 + \li data4[0] .. data4[1] + + \row + \li 5 + \li data4[2] .. data4[7] + + \endtable +*/ +QString QUuid::toString(QUuid::StringFormat mode) const +{ + char latin1[MaxStringUuidLength]; + const auto end = _q_uuidToHex(*this, latin1, mode); + return QString::fromLatin1(latin1, end - latin1); } /*! @@ -594,11 +690,52 @@ QString QUuid::toString() const */ QByteArray QUuid::toByteArray() const { - QByteArray result(38, Qt::Uninitialized); - char *data = result.data(); + QByteArray result(MaxStringUuidLength, Qt::Uninitialized); + const auto end = _q_uuidToHex(*this, const_cast<char*>(result.constData())); + Q_ASSERT(end - result.constData() == MaxStringUuidLength); + Q_UNUSED(end); + return result; +} + +/*! + \since 5.11 + + Returns the string representation of this QUuid, with the formattiong + controlled by the \a mode parameter. From left to right, the five hex + fields are obtained from the four public data members in QUuid as follows: - _q_uuidToHex(data, data1, data2, data3, data4); + \table + \header + \li Field # + \li Source + + \row + \li 1 + \li data1 + + \row + \li 2 + \li data2 + \row + \li 3 + \li data3 + + \row + \li 4 + \li data4[0] .. data4[1] + + \row + \li 5 + \li data4[2] .. data4[7] + + \endtable +*/ +QByteArray QUuid::toByteArray(QUuid::StringFormat mode) const +{ + QByteArray result(MaxStringUuidLength, Qt::Uninitialized); + const auto end = _q_uuidToHex(*this, const_cast<char*>(result.constData()), mode); + result.resize(end - result.constData()); return result; } @@ -883,17 +1020,10 @@ bool QUuid::operator>(const QUuid &other) const Q_DECL_NOTHROW /*! \fn QUuid QUuid::createUuid() - On any platform other than Windows, this function returns a new - UUID with variant QUuid::DCE and version QUuid::Random. If - the /dev/urandom device exists, then the numbers used to construct - the UUID will be of cryptographic quality, which will make the UUID - unique. Otherwise, the numbers of the UUID will be obtained from - the local pseudo-random number generator (qrand(), which is seeded - by qsrand()) which is usually not of cryptograhic quality, which - means that the UUID can't be guaranteed to be unique. - - On a Windows platform, a GUID is generated, which almost certainly - \e{will} be unique, on this or any other system, networked or not. + On any platform other than Windows, this function returns a new UUID with + variant QUuid::DCE and version QUuid::Random. On Windows, a GUID is + generated using the Windows API and will be of the type that the API + decides to create. \sa variant(), version() */ @@ -913,82 +1043,12 @@ QUuid QUuid::createUuid() #else // Q_OS_WIN -QT_BEGIN_INCLUDE_NAMESPACE -#include "qdatetime.h" -#include "qfile.h" -#include "qthreadstorage.h" -#include <stdlib.h> // for RAND_MAX -QT_END_INCLUDE_NAMESPACE - -#if !defined(QT_BOOTSTRAPPED) && defined(Q_OS_UNIX) -Q_GLOBAL_STATIC(QThreadStorage<QFile *>, devUrandomStorage); -#endif - QUuid QUuid::createUuid() { - QUuid result; + QUuid result(Qt::Uninitialized); uint *data = &(result.data1); - -#if defined(Q_OS_UNIX) - QFile *devUrandom; -# if !defined(QT_BOOTSTRAPPED) - devUrandom = devUrandomStorage()->localData(); - if (!devUrandom) { - devUrandom = new QFile(QLatin1String("/dev/urandom")); - devUrandom->open(QIODevice::ReadOnly | QIODevice::Unbuffered); - devUrandomStorage()->setLocalData(devUrandom); - } -# else - QFile file(QLatin1String("/dev/urandom")); - devUrandom = &file; - devUrandom->open(QIODevice::ReadOnly | QIODevice::Unbuffered); -# endif - enum { AmountToRead = 4 * sizeof(uint) }; - if (devUrandom->isOpen() - && devUrandom->read((char *) data, AmountToRead) == AmountToRead) { - // we got what we wanted, nothing more to do - ; - } else -#endif - { - static const int intbits = sizeof(int)*8; - static int randbits = 0; - if (!randbits) { - int r = 0; - int max = RAND_MAX; - do { ++r; } while ((max=max>>1)); - randbits = r; - } - - // Seed the PRNG once per thread with a combination of current time, a - // stack address and a serial counter (since thread stack addresses are - // re-used). -#ifndef QT_BOOTSTRAPPED - static QThreadStorage<int *> uuidseed; - if (!uuidseed.hasLocalData()) - { - int *pseed = new int; - static QBasicAtomicInt serial = Q_BASIC_ATOMIC_INITIALIZER(0); - qsrand(*pseed = QDateTime::currentSecsSinceEpoch() - + quintptr(&pseed) - + 2 + serial.fetchAndAddRelaxed(1)); - uuidseed.setLocalData(pseed); - } -#else - static bool seeded = false; - if (!seeded) - qsrand(QDateTime::currentSecsSinceEpoch() - + quintptr(&seeded)); -#endif - - int chunks = 16 / sizeof(uint); - while (chunks--) { - uint randNumber = 0; - for (int filled = 0; filled < intbits; filled += randbits) - randNumber |= qrand()<<filled; - *(data+chunks) = randNumber; - } - } + enum { AmountToRead = 4 }; + QRandomGenerator::system()->fillRange(data, AmountToRead); result.data4[0] = (result.data4[0] & 0x3F) | 0x80; // UV_DCE result.data3 = (result.data3 & 0x0FFF) | 0x4000; // UV_Random diff --git a/src/corelib/plugin/quuid.h b/src/corelib/plugin/quuid.h index 264f572993..08a1843640 100644 --- a/src/corelib/plugin/quuid.h +++ b/src/corelib/plugin/quuid.h @@ -42,7 +42,7 @@ #include <QtCore/qstring.h> -#if defined(Q_OS_WIN) +#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC) #ifndef GUID_DEFINED #define GUID_DEFINED typedef struct _GUID @@ -55,7 +55,7 @@ typedef struct _GUID #endif #endif -#if defined(Q_OS_DARWIN) || defined(Q_QDOC) +#if defined(Q_OS_DARWIN) || defined(Q_CLANG_QDOC) Q_FORWARD_DECLARE_CF_TYPE(CFUUID); Q_FORWARD_DECLARE_OBJC_CLASS(NSUUID); #endif @@ -65,6 +65,7 @@ QT_BEGIN_NAMESPACE class Q_CORE_EXPORT QUuid { + QUuid(Qt::Initialization) {} public: enum Variant { VarUnknown =-1, @@ -84,7 +85,14 @@ public: Sha1 = 5 // 0 1 0 1 }; -#if defined(Q_COMPILER_UNIFORM_INIT) && !defined(Q_QDOC) + enum StringFormat { + WithBraces = 0, + WithoutBraces = 1, + Id128 = 3 + }; + +#if defined(Q_COMPILER_UNIFORM_INIT) && !defined(Q_CLANG_QDOC) + Q_DECL_CONSTEXPR QUuid() Q_DECL_NOTHROW : data1(0), data2(0), data3(0), data4{0,0,0,0,0,0,0,0} {} Q_DECL_CONSTEXPR QUuid(uint l, ushort w1, ushort w2, uchar b1, uchar b2, uchar b3, @@ -116,10 +124,14 @@ public: #endif QUuid(const QString &); + static QUuid fromString(QStringView string) Q_DECL_NOTHROW; + static QUuid fromString(QLatin1String string) Q_DECL_NOTHROW; QUuid(const char *); QString toString() const; + QString toString(StringFormat mode) const; // ### Qt6: merge with previous QUuid(const QByteArray &); QByteArray toByteArray() const; + QByteArray toByteArray(StringFormat mode) const; // ### Qt6: merge with previous QByteArray toRfc4122() const; static QUuid fromRfc4122(const QByteArray &); bool isNull() const Q_DECL_NOTHROW; @@ -145,10 +157,10 @@ public: bool operator<(const QUuid &other) const Q_DECL_NOTHROW; bool operator>(const QUuid &other) const Q_DECL_NOTHROW; -#if defined(Q_OS_WIN) +#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC) // On Windows we have a type GUID that is used by the platform API, so we // provide convenience operators to cast from and to this type. -#if defined(Q_COMPILER_UNIFORM_INIT) && !defined(Q_QDOC) +#if defined(Q_COMPILER_UNIFORM_INIT) && !defined(Q_CLANG_QDOC) Q_DECL_CONSTEXPR QUuid(const GUID &guid) Q_DECL_NOTHROW : data1(guid.Data1), data2(guid.Data2), data3(guid.Data3), data4{guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], @@ -189,23 +201,25 @@ public: static QUuid createUuid(); #ifndef QT_BOOTSTRAPPED static QUuid createUuidV3(const QUuid &ns, const QByteArray &baseData); +#endif static QUuid createUuidV5(const QUuid &ns, const QByteArray &baseData); +#ifndef QT_BOOTSTRAPPED static inline QUuid createUuidV3(const QUuid &ns, const QString &baseData) { return QUuid::createUuidV3(ns, baseData.toUtf8()); } +#endif static inline QUuid createUuidV5(const QUuid &ns, const QString &baseData) { return QUuid::createUuidV5(ns, baseData.toUtf8()); } -#endif QUuid::Variant variant() const Q_DECL_NOTHROW; QUuid::Version version() const Q_DECL_NOTHROW; -#if defined(Q_OS_DARWIN) || defined(Q_QDOC) +#if defined(Q_OS_DARWIN) || defined(Q_CLANG_QDOC) static QUuid fromCFUUID(CFUUIDRef uuid); CFUUIDRef toCFUUID() const Q_DECL_CF_RETURNS_RETAINED; static QUuid fromNSUUID(const NSUUID *uuid); |