diff --git a/src/core/kfileitem.h b/src/core/kfileitem.h --- a/src/core/kfileitem.h +++ b/src/core/kfileitem.h @@ -115,6 +115,8 @@ */ KFileItem(const QUrl &url, const QString &mimeType = QString(), mode_t mode = KFileItem::Unknown); // KF6 TODO: explicit! + KFileItem(const QUrl &url, bool skipStat); + /** * Copy constructor */ diff --git a/src/core/kfileitem.cpp b/src/core/kfileitem.cpp --- a/src/core/kfileitem.cpp +++ b/src/core/kfileitem.cpp @@ -51,7 +51,8 @@ mode_t mode, mode_t permissions, const QUrl &itemOrDirUrl, bool urlIsDirectory, - bool delayedMimeTypes) + bool delayedMimeTypes, + bool skipStat) : m_entry(entry), m_url(itemOrDirUrl), m_strName(), @@ -67,7 +68,8 @@ m_delayedMimeTypes(delayedMimeTypes), m_useIconNameCache(false), m_hidden(Auto), - m_slow(SlowUnknown) + m_slow(SlowUnknown), + m_bSkipStat(skipStat) { if (entry.count() != 0) { readUDSEntry(urlIsDirectory); @@ -174,6 +176,11 @@ // For special case like link to dirs over FTP QString m_guessedMimeType; mutable QString m_access; + + /** + * True if stat() should be skipped + */ + bool m_bSkipStat: 1; }; void KFileItemPrivate::init() @@ -184,7 +191,7 @@ // stat() local files if needed // TODO: delay this until requested if (m_fileMode == KFileItem::Unknown || m_permissions == KFileItem::Unknown || m_entry.count() == 0) { - if (m_url.isLocalFile()) { + if (m_url.isLocalFile() && !m_bSkipStat) { /* directories may not have a slash at the end if * we want to stat() them; it requires that we * change into it .. which may not be allowed @@ -457,27 +464,34 @@ KFileItem::KFileItem(const KIO::UDSEntry &entry, const QUrl &itemOrDirUrl, bool delayedMimeTypes, bool urlIsDirectory) - : d(new KFileItemPrivate(entry, KFileItem::Unknown, KFileItem::Unknown, itemOrDirUrl, urlIsDirectory, delayedMimeTypes)) + : d(new KFileItemPrivate(entry, KFileItem::Unknown, KFileItem::Unknown, itemOrDirUrl, urlIsDirectory, delayedMimeTypes, false)) { } KFileItem::KFileItem(mode_t mode, mode_t permissions, const QUrl &url, bool delayedMimeTypes) : d(new KFileItemPrivate(KIO::UDSEntry(), mode, permissions, - url, false, delayedMimeTypes)) + url, false, delayedMimeTypes, false)) { } KFileItem::KFileItem(const QUrl &url, const QString &mimeType, mode_t mode) : d(new KFileItemPrivate(KIO::UDSEntry(), mode, KFileItem::Unknown, - url, false, false)) + url, false, false, false)) { d->m_bMimeTypeKnown = !mimeType.isEmpty(); if (d->m_bMimeTypeKnown) { QMimeDatabase db; d->m_mimeType = db.mimeTypeForName(mimeType); } } +KFileItem::KFileItem(const QUrl &url, bool skipStat) + : d(new KFileItemPrivate(KIO::UDSEntry(), KFileItem::Unknown, KFileItem::Unknown, + url, false, false, skipStat)) +{ +} + + // Default implementations for: // - Copy constructor // - Move constructor @@ -730,7 +744,16 @@ } else { bool isLocalUrl; const QUrl url = mostLocalUrl(&isLocalUrl); - d->m_mimeType = db.mimeTypeForUrl(url); + + if (d->m_bSkipStat) { + const QString scheme = url.scheme(); + if (scheme.startsWith(QLatin1String("http")) || scheme == QLatin1String("mailto")) + d->m_mimeType = db.mimeTypeForName(QLatin1String("application/octet-stream")); + + d->m_mimeType = db.mimeTypeForFile(url.path(), QMimeDatabase::MatchMode::MatchExtension); + } else { + d->m_mimeType = db.mimeTypeForUrl(url); + } // was: d->m_mimeType = KMimeType::findByUrl( url, d->m_fileMode, isLocalUrl ); // => we are no longer using d->m_fileMode for remote URLs. Q_ASSERT(d->m_mimeType.isValid()); @@ -1499,7 +1522,16 @@ } } else { // ## d->m_fileMode isn't used anymore (for remote urls) - d->m_mimeType = db.mimeTypeForUrl(url); + if (d->m_bSkipStat) { + const QString scheme = url.scheme(); + if (scheme.startsWith(QLatin1String("http")) || scheme == QLatin1String("mailto")) + d->m_mimeType = db.mimeTypeForName(QLatin1String("application/octet-stream")); + + d->m_mimeType = db.mimeTypeForFile(url.path(), QMimeDatabase::MatchMode::MatchExtension); + } + else { + d->m_mimeType = db.mimeTypeForUrl(url); + } d->m_bMimeTypeKnown = true; } }