From d2eba577b8e339d8bd38159edc0e9f444321b5f4 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Tue, 11 Oct 2022 13:45:18 +0300 Subject: [PATCH] ark: implement overwrite query for libarchive plugin Signed-off-by: Ivailo Monev --- ark/plugins/libarchive/libarchivehandler.cpp | 38 ++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/ark/plugins/libarchive/libarchivehandler.cpp b/ark/plugins/libarchive/libarchivehandler.cpp index 92b59650..80ccfbea 100644 --- a/ark/plugins/libarchive/libarchivehandler.cpp +++ b/ark/plugins/libarchive/libarchivehandler.cpp @@ -110,6 +110,44 @@ bool LibArchiveInterface::copyFiles(const QVariantList& files, const QString &de fileslist.append(variant.toString()); } } + + bool autoskip = false; + QStringList::iterator it = fileslist.begin(); + while (it != fileslist.end()) { + const QString fullpath = destinationDirectory + QLatin1Char('/') + (*it); + if (QFile::exists(fullpath)) { + if (autoskip) { + it = fileslist.erase(it); + it++; + continue; + } + + Kerfuffle::OverwriteQuery overwritequery(fullpath); + overwritequery.setNoRenameMode(true); + emit userQuery(&overwritequery); + overwritequery.waitForResponse(); + + if (overwritequery.responseCancelled()) { + return false; + } else if (overwritequery.responseOverwriteAll()) { + // KArchive will overwrite + break; + } else if (overwritequery.responseOverwrite()) { + it++; + continue; + } else if (overwritequery.responseRename()) { + Q_ASSERT(false); + } else if (overwritequery.responseSkip()) { + it = fileslist.erase(it); + continue; + } else if (overwritequery.responseAutoSkip()) { + autoskip = true; + it = fileslist.erase(it); + } + } + it++; + } + connect(&karchive, SIGNAL(progress(qreal)), this, SLOT(emitProgress(qreal))); if (!karchive.extract(fileslist, destinationDirectory, preservePaths)) { emit error(karchive.errorString()); -- 2.11.0