5#include <qplatformdefs.h>
13#include <private/qduplicatetracker_p.h>
14#include <private/qfilesystementry_p.h>
16#include <QtCore/QFile>
17#include <QtCore/QFileInfo>
18#include <QtCore/QStandardPaths>
19#include <QtCore/QBuffer>
21#include <QtCore/QDebug>
44 return staticQMimeDatabase();
57#ifdef QT_BUILD_INTERNAL
64bool QMimeDatabasePrivate::shouldCheck()
77#if defined(Q_OS_UNIX) && !defined(Q_OS_INTEGRITY)
81void QMimeDatabasePrivate::loadProviders()
85 const auto fdoIterator = std::find_if(mimeDirs.constBegin(), mimeDirs.constEnd(), [](
const QString &mimeDir) ->
bool {
86 return QFileInfo::exists(mimeDir +
"/packages/freedesktop.org.xml"_L1); }
91 Providers currentProviders;
92 std::swap(m_providers, currentProviders);
94 m_providers.reserve(mimeDirs.size() + (needInternalDB ? 1 : 0));
96 for (
const QString &mimeDir : mimeDirs) {
97 const QString cacheFile = mimeDir +
"/mime.cache"_L1;
99 const auto predicate = [mimeDir](
const std::unique_ptr<QMimeProviderBase> &prov)
101 return prov && prov->directory() == mimeDir;
103 const auto it = std::find_if(currentProviders.begin(), currentProviders.end(),
predicate);
104 if (
it == currentProviders.
end()) {
105 std::unique_ptr<QMimeProviderBase> provider;
106#if defined(QT_USE_MMAP)
110 if (!provider->isValid()) {
119 m_providers.push_back(std::move(provider));
121 auto provider = std::move(*
it);
122 provider->ensureLoaded();
123 if (!provider->isValid()) {
127 m_providers.push_back(std::move(provider));
132 if (needInternalDB) {
134 const auto isInternal = [](
const std::unique_ptr<QMimeProviderBase> &prov)
136 return prov && prov->isInternalDatabase();
138 const auto it = std::find_if(currentProviders.begin(), currentProviders.end(), isInternal);
139 if (
it == currentProviders.
end()) {
142 m_providers.push_back(std::move(*
it));
146 auto it = m_providers.begin();
147 (*it)->setOverrideProvider(
nullptr);
149 const auto end = m_providers.end();
151 (*it)->setOverrideProvider((
it - 1)->get());
154const QMimeDatabasePrivate::Providers &QMimeDatabasePrivate::providers()
159 if (m_providers.empty()) {
171 for (
const auto &provider : providers()) {
172 const QString ret = provider->resolveAlias(nameOrAlias);
186 for (
const auto &provider : providers()) {
187 if (provider->knowsMimeType(mimeName))
200 matchingMimeTypes.sort();
201 return matchingMimeTypes;
208 for (
const auto &provider : providers())
209 provider->addFileNameMatches(fileNameExcludingPath,
result);
216 for (
const auto &provider : providers()) {
217 auto comments = provider->localeComments(
name);
218 if (!comments.isEmpty())
229 const auto &providerList = providers();
232 for (
auto rit = providerList.rbegin(); rit != providerList.rend(); ++rit) {
233 auto *provider = rit->get();
234 if (provider->hasGlobDeleteAll(
name))
236 patterns += provider->globPatterns(
name);
244 for (
const auto &provider : providers()) {
245 QString genericIconName = provider->genericIcon(
name);
246 if (!genericIconName.
isEmpty())
247 return genericIconName;
255 for (
const auto &provider : providers()) {
263QString QMimeDatabasePrivate::fallbackParent(
const QString &mimeTypeName)
const
270 if (myGroup !=
"inode"_L1 &&
272 myGroup !=
"all"_L1 && myGroup !=
"fonts"_L1 && myGroup !=
"print"_L1 && myGroup !=
"uri"_L1
289 for (
const auto &provider : providers())
290 provider->addParents(mimeName,
result);
292 const QString parent = fallbackParent(mimeName);
303 for (
const auto &provider : providers())
304 provider->addAliases(mimeName,
result);
317 static const char bigEndianBOM[] =
"\xFE\xFF";
318 static const char littleEndianBOM[] =
"\xFF\xFE";
319 if (
data.startsWith(bigEndianBOM) ||
data.startsWith(littleEndianBOM))
323 const char *
p =
data.constData();
324 const char *e =
p +
qMin(128,
data.size());
325 for ( ;
p < e; ++
p) {
326 if (
static_cast<unsigned char>(*
p) < 32 && *
p != 9 && *
p !=10 && *
p != 13)
335 if (
data.isEmpty()) {
341 for (
const auto &provider : providers())
345 *accuracyPtr =
result.accuracy;
367 if (candidatesByName.m_allMatchingMimeTypes.size() == 1) {
371 candidatesByName = {};
376 const auto matchOnContent = [
this, &candidatesByName](
QIODevice *
device) {
386 int magicAccuracy = 0;
390 if (candidateByData.isValid() && magicAccuracy > 0) {
391 const QString sniffedMime = candidateByData.name();
393 if (candidatesByName.m_matchingMimeTypes.contains(sniffedMime)) {
394 return candidateByData;
396 for (
const QString &
m : std::as_const(candidatesByName.m_allMatchingMimeTypes)) {
402 if (candidatesByName.m_allMatchingMimeTypes.isEmpty()) {
404 return candidateByData;
409 if (candidatesByName.m_allMatchingMimeTypes.size() > 1) {
410 candidatesByName.m_matchingMimeTypes.sort();
420 return matchOnContent(
device);
423 return matchOnContent(&fallbackFile);
463 QT_STATBUF statBuffer;
464 if (QT_STAT(nativeFilePath.
constData(), &statBuffer) == 0) {
465 if (S_ISDIR(statBuffer.st_mode))
467 if (S_ISCHR(statBuffer.st_mode))
469 if (S_ISBLK(statBuffer.st_mode))
471 if (S_ISFIFO(statBuffer.st_mode))
473 if (S_ISSOCK(statBuffer.st_mode))
477 }
else if (fileInfo.
isDir()) {
498 for (
const auto &provider : providers())
499 provider->addAllMimeTypes(
result);
506 QDuplicateTracker<QString> seen;
507 std::stack<QString, QStringList> toCheck;
509 while (!toCheck.empty()) {
510 if (toCheck.top() == resolvedParent)
512 const QString mimeName = toCheck.top();
514 const auto parentList =
parents(mimeName);
515 for (
const QString &par : parentList) {
517 if (!seen.hasSeen(resolvedPar))
518 toCheck.push(resolvedPar);
574 d(staticQMimeDatabase())
667 QList<QMimeType> mimes;
683 return fileName.right(suffixLength);
735 if (scheme.
startsWith(
"http"_L1) || scheme ==
"mailto"_L1)
IOBluetoothDevice * device
\inmodule QtCore \reentrant
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
qint64 elapsed() const noexcept
Returns the number of milliseconds since this QElapsedTimer was last started.
void start() noexcept
\typealias QElapsedTimer::Duration Synonym for std::chrono::nanoseconds.
bool isValid() const noexcept
Returns false if the timer has never been started or invalidated by a call to invalidate().
bool isNativePath() const
bool isDir() const
Returns true if this object points to a directory or to a symbolic link to a directory.
QString filePath() const
Returns the path of the file system entry this QFileInfo refers to; the path may be absolute or relat...
bool exists() const
Returns true if the file system entry this QFileInfo refers to exists; otherwise returns false.
Q_AUTOTEST_EXPORT QString fileName() const
static QByteArray encodeName(const QString &fileName)
Converts fileName to an 8-bit encoding that you can use in native APIs.
\inmodule QtCore \reentrant
QString resolveAlias(const QString &nameOrAlias)
QStringList listAliases(const QString &mimeName)
QList< QMimeType > allMimeTypes()
QString genericIcon(const QString &name)
QMimeTypePrivate::LocaleHash localeComments(const QString &name)
bool mimeInherits(const QString &mime, const QString &parent)
QMimeType mimeTypeForFileExtension(const QString &fileName)
QMimeType mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device)
QMimeType mimeTypeForData(QIODevice *device)
QStringList mimeTypeForFileName(const QString &fileName)
bool inherits(const QString &mime, const QString &parent)
QMimeType mimeTypeForName(const QString &nameOrAlias)
QStringList mimeParents(const QString &mimeName)
QStringList globPatterns(const QString &name)
const QString & defaultMimeType() const
QString icon(const QString &name)
QMimeType mimeTypeForFile(const QString &fileName, const QFileInfo &fileInfo, QMimeDatabase::MatchMode mode)
QStringList parents(const QString &mimeName)
QMimeGlobMatchResult findByFileName(const QString &fileName)
QMimeType findByData(const QByteArray &data, int *priorityPtr)
QMimeType mimeTypeForName(const QString &nameOrAlias) const
Returns a MIME type for nameOrAlias or an invalid one if none found.
~QMimeDatabase()
Destroys the QMimeDatabase object.
QMimeType mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device) const
Returns a MIME type for the given fileName and device data.
QList< QMimeType > mimeTypesForFileName(const QString &fileName) const
Returns the MIME types for the file name fileName.
QMimeDatabase()
Constructs a QMimeDatabase object.
QMimeType mimeTypeForUrl(const QUrl &url) const
Returns a MIME type for url.
QMimeType mimeTypeForData(const QByteArray &data) const
Returns a MIME type for data.
QString suffixForFileName(const QString &fileName) const
Returns the suffix for the file fileName, as known by the MIME database.
MatchMode
This enum specifies how matching a file to a MIME type is performed.
QList< QMimeType > allMimeTypes() const
Returns the list of all available MIME types.
QMimeType mimeTypeForFile(const QString &fileName, MatchMode mode=MatchDefault) const
Returns a MIME type for the file named fileName using mode.
@ InternalDatabaseAvailable
bool tryLock(int timeout=0) noexcept
Attempts to lock the mutex.
static QStringList locateAll(StandardLocation type, const QString &fileName, LocateOptions options=LocateFile)
[0]
constexpr QStringView left(qsizetype n) const noexcept
\macro QT_RESTRICTED_CAST_FROM_ASCII
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
QString scheme() const
Returns the scheme of the URL.
QString toLocalFile() const
Returns the path of this URL formatted as a local file path.
QString path(ComponentFormattingOptions options=FullyDecoded) const
Returns the path of the URL.
QSet< QString >::iterator it
Combined button and popup list for selecting options.
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
static Q_CONSTINIT const int qmime_secondsBetweenChecks
static bool isTextFile(const QByteArray &data)
static QStringList locateMimeDirectories()
static QString directoryMimeType()
static QString plainTextMimeType()
constexpr const T & qMin(const T &a, const T &b)
static bool matches(const QJsonObject &object, const QString &osName, const QVersionNumber &kernelVersion, const QString &osRelease, const QOpenGLConfig::Gpu &gpu)
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
#define QStringLiteral(str)
Q_CORE_EXPORT bool qEnvironmentVariableIsEmpty(const char *varName) noexcept
QUrl url("example.com")
[constructor-url-reference]
application x qt windows mime
[2]
The QMimeGlobMatchResult class accumulates results from glob matching.
qsizetype m_knownSuffixLength