diff --git a/applets/kicker/plugin/recentusagemodel.cpp b/applets/kicker/plugin/recentusagemodel.cpp --- a/applets/kicker/plugin/recentusagemodel.cpp +++ b/applets/kicker/plugin/recentusagemodel.cpp @@ -243,15 +243,41 @@ url.setScheme(QStringLiteral("file")); } - const KFileItem fileItem(url); + // Save original scheme + QString savedScheme = url.scheme(); + + // Do not call the KFileItem constructor with a scheme to + // avoid initializing with scheme 'file', what would result + // in being a local file and calling QT_LSTAT on it in + // KFileItemPrivate::init(). The QT_LSTAT doesn't + // return any useful information for our purposes here. + url.setScheme(QString()); + KFileItem fileItem(url); + + // now set original scheme - this will not call QT_LSTAT + url.setScheme(savedScheme); + fileItem.setUrl(url); if (!url.isValid() || !(fileItem.isFile() || fileItem.isDir())) { return QVariant(); } if (role == Qt::DisplayRole) { return fileItem.text(); } else if (role == Qt::DecorationRole) { + // fileItem.iconName() would result in calling QT_LSTAT twice more + // (via KFileItem::currentMimeType() + // --> QMimeDatabase::mimeTypeForUrl() (url.isLocalFile() if scheme == "file") + // --> QMimeDatabase::mimeTypeForFile() with MatchMode mode = MatchDefault + // --> QFileInfo ... + // --> QMimeDatabase::mimeTypeForFile()) + // and reading the first 16k in QMimeDatabasePrivate::mimeTypeForFileNameAndData() + // if scheme is 'file', so empty it. + // We want MatchMode mode = MatchExtension + if (url.scheme() == "file") { + url.setScheme(QString()); + fileItem.setUrl(url); + } return QIcon::fromTheme(fileItem.iconName(), QIcon::fromTheme(QStringLiteral("unknown"))); } else if (role == Kicker::GroupRole) { return i18n("Documents");