summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2022-02-22 14:46:39 +0100
committerEike Ziller <eike.ziller@qt.io>2022-02-23 08:44:23 +0100
commit3ab49ee04087536835c9cdc0b00e4a7d26c7395c (patch)
treedf99896b4f28006f36c3f7c20b336b8eef08eabf /src
parentfa2830dc6eda34d0591c3aae96288b6236ceeaa0 (diff)
MimeDatabase::mimeTypeForFileNameAndData: Do not open file unnecessarily
If the file extension already matches uniquely, we do not need to do any actual file operation. Pick-to: 6.3 Change-Id: Ide8b82eefbcd13348b78b28b66230a91e1e3c5d8 Reviewed-by: David Faure <david.faure@kdab.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/mimetypes/qmimedatabase.cpp8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp
index 67d062bb9e..2bf64c9422 100644
--- a/src/corelib/mimetypes/qmimedatabase.cpp
+++ b/src/corelib/mimetypes/qmimedatabase.cpp
@@ -399,11 +399,15 @@ QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileNa
// Extension is unknown, or matches multiple mimetypes.
// Pass 2) Match on content, if we can read the data
const auto matchOnContent = [this, &candidatesByName](QIODevice *device) {
+ const bool openedByUs = !device->isOpen() && device->open(QIODevice::ReadOnly);
if (device->isOpen()) {
// Read 16K in one go (QIODEVICE_BUFFERSIZE in qiodevice_p.h).
// This is much faster than seeking back and forth into QIODevice.
const QByteArray data = device->peek(16384);
+ if (openedByUs)
+ device->close();
+
int magicAccuracy = 0;
QMimeType candidateByData(findByData(data, &magicAccuracy));
@@ -441,7 +445,6 @@ QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileNa
return matchOnContent(device);
QFile fallbackFile(fileName);
- fallbackFile.open(QIODevice::ReadOnly); // error handling: matchOnContent() will check isOpen()
return matchOnContent(&fallbackFile);
}
@@ -780,10 +783,7 @@ QMimeType QMimeDatabase::mimeTypeForFileNameAndData(const QString &fileName, QIO
if (fileName.endsWith(QLatin1Char('/')))
return d->mimeTypeForName(directoryMimeType());
- const bool openedByUs = !device->isOpen() && device->open(QIODevice::ReadOnly);
const QMimeType result = d->mimeTypeForFileNameAndData(fileName, device);
- if (openedByUs)
- device->close();
return result;
}