OSDN Git Service

ark: implement overwrite query for libarchive plugin
authorIvailo Monev <xakepa10@gmail.com>
Tue, 11 Oct 2022 10:45:18 +0000 (13:45 +0300)
committerIvailo Monev <xakepa10@gmail.com>
Tue, 11 Oct 2022 10:45:18 +0000 (13:45 +0300)
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
ark/plugins/libarchive/libarchivehandler.cpp

index 92b5965..80ccfbe 100644 (file)
@@ -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());