diff --git a/kerfuffle/CMakeLists.txt b/kerfuffle/CMakeLists.txt --- a/kerfuffle/CMakeLists.txt +++ b/kerfuffle/CMakeLists.txt @@ -60,6 +60,7 @@ KF5::Pty KF5::I18n KF5::WidgetsAddons + ${LibArchive_LIBRARIES} PRIVATE Qt5::Concurrent KF5::KIOCore diff --git a/kerfuffle/queries.h b/kerfuffle/queries.h --- a/kerfuffle/queries.h +++ b/kerfuffle/queries.h @@ -30,6 +30,8 @@ #include "kerfuffle_export.h" +#include + #include #include #include @@ -67,7 +69,8 @@ void setResponse(const QVariant &response); - QueryData m_data; + QueryData m_data; + struct archive_entry *m_entry; private: QWaitCondition m_responseCondition; @@ -82,6 +85,7 @@ { public: explicit OverwriteQuery(const QString& filename); + explicit OverwriteQuery(struct archive_entry *entry); void execute() override; bool responseCancelled(); bool responseOverwriteAll(); @@ -97,7 +101,8 @@ bool multiMode(); private: bool m_noRenameMode; - bool m_multiMode; + bool m_multiMode; + bool m_from_archive; }; /* ************************************** diff --git a/kerfuffle/queries.cpp b/kerfuffle/queries.cpp --- a/kerfuffle/queries.cpp +++ b/kerfuffle/queries.cpp @@ -28,6 +28,8 @@ #include "queries.h" #include "ark_debug.h" +#include + #include #include #include @@ -36,6 +38,8 @@ #include #include #include +#include +#include #include #include #include @@ -68,16 +72,27 @@ OverwriteQuery::OverwriteQuery(const QString &filename) : m_noRenameMode(false), - m_multiMode(true) + m_multiMode(true), + m_from_archive(false) { m_data[QStringLiteral("filename")] = filename; } +OverwriteQuery::OverwriteQuery(struct archive_entry *entry) : + m_noRenameMode(false), + m_multiMode(true), + m_from_archive(true) +{ + m_data[QStringLiteral("filename")] = QDir::fromNativeSeparators(QFile::decodeName(archive_entry_pathname(entry))); + m_entry = entry; +} + void OverwriteQuery::execute() { // If we are being called from the KPart, the cursor is probably Qt::WaitCursor // at the moment (#231974) QApplication::setOverrideCursor(QCursor(Qt::ArrowCursor)); + QPointer dialog ; KIO::RenameDialog_Options options = KIO::RenameDialog_Overwrite | KIO::RenameDialog_Skip; if (m_noRenameMode) { @@ -87,15 +102,36 @@ options = options | KIO::RenameDialog_MultipleItems; } - QUrl sourceUrl = QUrl::fromLocalFile(QDir::cleanPath(m_data.value(QStringLiteral("filename")).toString())); QUrl destUrl = QUrl::fromLocalFile(QDir::cleanPath(m_data.value(QStringLiteral("filename")).toString())); - - QPointer dialog = new KIO::RenameDialog( - nullptr, - i18nc("@title:window", "File Already Exists"), - sourceUrl, - destUrl, - options); + if (m_from_archive) { + QUrl sourceUrl = QUrl(QDir::cleanPath(m_data.value(QStringLiteral("filename")).toString())); + KIO::filesize_t size_src = archive_entry_size(m_entry); + QDateTime date_src = QDateTime::fromSecsSinceEpoch(archive_entry_ctime(m_entry)); + QDateTime mdate_src = QDateTime::fromSecsSinceEpoch(archive_entry_mtime(m_entry)); + dialog = new KIO::RenameDialog( + nullptr, + i18nc("@title:window", "File Already Exists"), + sourceUrl, + destUrl, + options, + size_src, + KIO::filesize_t(-1), + date_src, + QDateTime(), + mdate_src, + QDateTime() + ); + } + else { + QUrl sourceUrl = QUrl::fromLocalFile(QDir::cleanPath(m_data.value(QStringLiteral("filename")).toString())); + dialog = new KIO::RenameDialog( + nullptr, + i18nc("@title:window", "File Already Exists"), + sourceUrl, + destUrl, + options + ); + } dialog.data()->exec(); m_data[QStringLiteral("newFilename")] = dialog.data()->newDestUrl().toDisplayString(QUrl::PreferLocalFile); diff --git a/plugins/libarchive/libarchiveplugin.cpp b/plugins/libarchive/libarchiveplugin.cpp --- a/plugins/libarchive/libarchiveplugin.cpp +++ b/plugins/libarchive/libarchiveplugin.cpp @@ -303,7 +303,7 @@ archive_entry_clear(entry); continue; } else if (!overwriteAll && !skipAll) { - Kerfuffle::OverwriteQuery query(entryName); + Kerfuffle::OverwriteQuery query(entry); emit userQuery(&query); query.waitForResponse();