1/*
2 This file is part of the KDE libraries
3 SPDX-FileCopyrightText: 2014 David Faure <faure@kde.org>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8#include "restorejob.h"
9
10#include "job_p.h"
11#include "kiocoredebug.h"
12#include <kdirnotify.h>
13
14#include <QTimer>
15
16using namespace KIO;
17
18class KIO::RestoreJobPrivate : public KIO::JobPrivate
19{
20public:
21 RestoreJobPrivate(const QList<QUrl> &urls, JobFlags flags)
22 : JobPrivate()
23 , m_urls(urls)
24 , m_urlsIterator(m_urls.constBegin())
25 , m_progress(0)
26 , m_flags(flags)
27 {
28 }
29 QList<QUrl> m_urls;
30 QList<QUrl>::const_iterator m_urlsIterator;
31 int m_progress;
32 JobFlags m_flags;
33
34 void slotStart();
35 Q_DECLARE_PUBLIC(RestoreJob)
36
37 static inline RestoreJob *newJob(const QList<QUrl> &urls, JobFlags flags)
38 {
39 RestoreJob *job = new RestoreJob(*new RestoreJobPrivate(urls, flags));
40 job->setUiDelegate(KIO::createDefaultJobUiDelegate());
41 if (!(flags & HideProgressInfo)) {
42 KIO::getJobTracker()->registerJob(job);
43 }
44 return job;
45 }
46};
47
48RestoreJob::RestoreJob(RestoreJobPrivate &dd)
49 : Job(dd)
50{
51 Q_D(RestoreJob);
52 QTimer::singleShot(interval: 0, receiver: this, slot: [d]() {
53 d->slotStart();
54 });
55}
56
57RestoreJob::~RestoreJob()
58{
59}
60
61void RestoreJobPrivate::slotStart()
62{
63 Q_Q(RestoreJob);
64 if (m_urlsIterator == m_urls.constBegin()) { // first time: emit total
65 q->setTotalAmount(unit: KJob::Files, amount: m_urls.count());
66 }
67
68 if (m_urlsIterator != m_urls.constEnd()) {
69 const QUrl &url = *m_urlsIterator;
70 Q_ASSERT(url.scheme() == QLatin1String("trash"));
71 QByteArray packedArgs;
72 QDataStream stream(&packedArgs, QIODevice::WriteOnly);
73 stream << int(3) << url;
74 KIO::Job *job = KIO::special(url, data: packedArgs, flags: m_flags);
75 q->addSubjob(job);
76 q->setProcessedAmount(unit: KJob::Files, amount: q->processedAmount(unit: KJob::Files) + 1);
77 } else {
78#ifndef KIO_ANDROID_STUB
79 org::kde::KDirNotify::emitFilesRemoved(fileList: m_urls);
80#endif
81 q->emitResult();
82 }
83}
84
85void RestoreJob::slotResult(KJob *job)
86{
87 Q_D(RestoreJob);
88 if (job->error()) {
89 qCDebug(KIO_CORE) << job->errorString();
90 KIO::Job::slotResult(job); // will set the error and emit result(this)
91 return;
92 }
93 removeSubjob(job);
94 // Move on to next one
95 ++d->m_urlsIterator;
96 ++d->m_progress;
97 emitPercent(processedAmount: d->m_progress, totalAmount: d->m_urls.count());
98 d->slotStart();
99}
100
101RestoreJob *KIO::restoreFromTrash(const QList<QUrl> &urls, JobFlags flags)
102{
103 return RestoreJobPrivate::newJob(urls, flags);
104}
105
106#include "moc_restorejob.cpp"
107

source code of kio/src/core/restorejob.cpp