diff --git a/kerfuffle/archiveentry.h b/kerfuffle/archiveentry.h --- a/kerfuffle/archiveentry.h +++ b/kerfuffle/archiveentry.h @@ -67,6 +67,7 @@ Q_PROPERTY(QString version MEMBER m_version) Q_PROPERTY(QDateTime timestamp MEMBER m_timestamp) Q_PROPERTY(bool isDirectory MEMBER m_isDirectory WRITE setIsDirectory) + Q_PROPERTY(bool isExecutable MEMBER m_isExecutable WRITE setIsExecutable) Q_PROPERTY(bool isPasswordProtected MEMBER m_isPasswordProtected) public: @@ -88,6 +89,8 @@ QString name() const; void setIsDirectory(const bool isDirectory); bool isDir() const; + void setIsExecutable(const bool isExecutable); + bool isExecutable() const; int row() const; Entry *find(const QString &name) const; Entry *findByPath(const QStringList & pieces, int index = 0) const; @@ -123,6 +126,7 @@ QString m_version; QDateTime m_timestamp; bool m_isDirectory; + bool m_isExecutable; bool m_isPasswordProtected; }; diff --git a/kerfuffle/archiveentry.cpp b/kerfuffle/archiveentry.cpp --- a/kerfuffle/archiveentry.cpp +++ b/kerfuffle/archiveentry.cpp @@ -34,6 +34,7 @@ , m_size(0) , m_compressedSize(0) , m_isDirectory(false) + , m_isExecutable(false) , m_isPasswordProtected(false) { if (!fullPath.isEmpty()) @@ -135,6 +136,16 @@ return m_isDirectory; } +void Archive::Entry::setIsExecutable(const bool isExecutable) +{ + m_isExecutable = isExecutable; +} + +bool Archive::Entry::isExecutable() const +{ + return m_isExecutable; +} + int Archive::Entry::row() const { if (getParent()) { diff --git a/part/infopanel.cpp b/part/infopanel.cpp --- a/part/infopanel.cpp +++ b/part/infopanel.cpp @@ -180,7 +180,11 @@ mimeType = db.mimeTypeForFile(entry->fullPath(), QMimeDatabase::MatchExtension); } - m_typeValueLabel->setText(mimeType.comment()); + if (entry->isExecutable() && mimeType.isDefault()) { + m_typeValueLabel->setText(db.mimeTypeForName(QStringLiteral("application/x-executable")).comment()); + } else { + m_typeValueLabel->setText(mimeType.comment()); + } if (!entry->property("owner").toString().isEmpty()) { m_ownerLabel->show(); diff --git a/plugins/libarchive/libarchiveplugin.cpp b/plugins/libarchive/libarchiveplugin.cpp --- a/plugins/libarchive/libarchiveplugin.cpp +++ b/plugins/libarchive/libarchiveplugin.cpp @@ -456,6 +456,12 @@ e->setProperty("group", static_cast(archive_entry_gid(aentry))); } + const mode_t mode = archive_entry_mode(aentry); + if (mode != 0) { + e->setProperty("permissions", QString::number(mode)); + } + e->setProperty("isExecutable", mode & (S_IXUSR | S_IXGRP | S_IXOTH)); + e->compressedSizeIsSet = false; e->setProperty("size", (qlonglong)archive_entry_size(aentry)); e->setProperty("isDirectory", S_ISDIR(archive_entry_mode(aentry)));