diff options
Diffstat (limited to 'src/corelib/mimetypes/qmimedatabase.cpp')
-rw-r--r-- | src/corelib/mimetypes/qmimedatabase.cpp | 56 |
1 files changed, 29 insertions, 27 deletions
diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp index 6d6b322229..c55904c1d0 100644 --- a/src/corelib/mimetypes/qmimedatabase.cpp +++ b/src/corelib/mimetypes/qmimedatabase.cpp @@ -357,7 +357,7 @@ QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileNa // Pass 1) Try to match on the file name QMimeGlobMatchResult candidatesByName = findByFileName(fileName); - if (candidatesByName.m_allMatchingMimeTypes.count() == 1) { + if (candidatesByName.m_allMatchingMimeTypes.size() == 1) { const QMimeType mime = mimeTypeForName(candidatesByName.m_matchingMimeTypes.at(0)); if (mime.isValid()) return mime; @@ -386,7 +386,7 @@ QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileNa if (candidatesByName.m_matchingMimeTypes.contains(sniffedMime)) { return candidateByData; } - for (const QString &m : qAsConst(candidatesByName.m_allMatchingMimeTypes)) { + for (const QString &m : std::as_const(candidatesByName.m_allMatchingMimeTypes)) { if (inherits(m, sniffedMime)) { // We have magic + pattern pointing to this, so it's a pretty good match return mimeTypeForName(m); @@ -399,7 +399,7 @@ QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileNa } } - if (candidatesByName.m_allMatchingMimeTypes.count() > 1) { + if (candidatesByName.m_allMatchingMimeTypes.size() > 1) { candidatesByName.m_matchingMimeTypes.sort(); // make it deterministic const QMimeType mime = mimeTypeForName(candidatesByName.m_matchingMimeTypes.at(0)); if (mime.isValid()) @@ -444,31 +444,32 @@ QMimeType QMimeDatabasePrivate::mimeTypeForData(QIODevice *device) } QMimeType QMimeDatabasePrivate::mimeTypeForFile(const QString &fileName, - [[maybe_unused]] const QFileInfo *fileInfo, + const QFileInfo &fileInfo, QMimeDatabase::MatchMode mode) { + if (false) { #ifdef Q_OS_UNIX - // Cannot access statBuf.st_mode from the filesystem engine, so we have to stat again. - // In addition we want to follow symlinks. - const QByteArray nativeFilePath = QFile::encodeName(fileName); - QT_STATBUF statBuffer; - if (QT_STAT(nativeFilePath.constData(), &statBuffer) == 0) { - if (S_ISDIR(statBuffer.st_mode)) - return mimeTypeForName(directoryMimeType()); - if (S_ISCHR(statBuffer.st_mode)) - return mimeTypeForName(QStringLiteral("inode/chardevice")); - if (S_ISBLK(statBuffer.st_mode)) - return mimeTypeForName(QStringLiteral("inode/blockdevice")); - if (S_ISFIFO(statBuffer.st_mode)) - return mimeTypeForName(QStringLiteral("inode/fifo")); - if (S_ISSOCK(statBuffer.st_mode)) - return mimeTypeForName(QStringLiteral("inode/socket")); - } -#else - const bool isDirectory = fileInfo ? fileInfo->isDir() : QFileInfo(fileName).isDir(); - if (isDirectory) - return mimeTypeForName(directoryMimeType()); + } else if (fileInfo.isNativePath()) { + // If this is a local file, we'll want to do a stat() ourselves so we can + // detect additional inode types. In addition we want to follow symlinks. + const QByteArray nativeFilePath = QFile::encodeName(fileName); + QT_STATBUF statBuffer; + if (QT_STAT(nativeFilePath.constData(), &statBuffer) == 0) { + if (S_ISDIR(statBuffer.st_mode)) + return mimeTypeForName(directoryMimeType()); + if (S_ISCHR(statBuffer.st_mode)) + return mimeTypeForName(QStringLiteral("inode/chardevice")); + if (S_ISBLK(statBuffer.st_mode)) + return mimeTypeForName(QStringLiteral("inode/blockdevice")); + if (S_ISFIFO(statBuffer.st_mode)) + return mimeTypeForName(QStringLiteral("inode/fifo")); + if (S_ISSOCK(statBuffer.st_mode)) + return mimeTypeForName(QStringLiteral("inode/socket")); + } #endif + } else if (fileInfo.isDir()) { + return mimeTypeForName(directoryMimeType()); + } switch (mode) { case QMimeDatabase::MatchDefault: @@ -615,7 +616,7 @@ QMimeType QMimeDatabase::mimeTypeForFile(const QFileInfo &fileInfo, MatchMode mo { QMutexLocker locker(&d->mutex); - return d->mimeTypeForFile(fileInfo.filePath(), &fileInfo, mode); + return d->mimeTypeForFile(fileInfo.filePath(), fileInfo, mode); } /*! @@ -630,7 +631,8 @@ QMimeType QMimeDatabase::mimeTypeForFile(const QString &fileName, MatchMode mode if (mode == MatchExtension) { return d->mimeTypeForFileExtension(fileName); } else { - return d->mimeTypeForFile(fileName, nullptr, mode); + QFileInfo fileInfo(fileName); + return d->mimeTypeForFile(fileName, fileInfo, mode); } } @@ -652,7 +654,7 @@ QList<QMimeType> QMimeDatabase::mimeTypesForFileName(const QString &fileName) co const QStringList matches = d->mimeTypeForFileName(fileName); QList<QMimeType> mimes; - mimes.reserve(matches.count()); + mimes.reserve(matches.size()); for (const QString &mime : matches) mimes.append(d->mimeTypeForName(mime)); return mimes; |