File indexing completed on 2024-04-21 03:55:52

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 2014 David Faure <faure@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "pastejob.h"
0009 #include "pastejob_p.h"
0010 
0011 #include "paste.h"
0012 
0013 #include <QMimeData>
0014 #include <QTimer>
0015 
0016 #include <KIO/CopyJob>
0017 #include <KIO/FileUndoManager>
0018 #include <KJobWidgets>
0019 #include <KLocalizedString>
0020 #include <KUrlMimeData>
0021 
0022 using namespace KIO;
0023 
0024 extern KIO::Job *pasteMimeDataImpl(const QMimeData *mimeData, const QUrl &destUrl, const QString &dialogText, QWidget *widget, bool clipboard);
0025 
0026 PasteJob::PasteJob(PasteJobPrivate &dd)
0027     : Job(dd)
0028 {
0029     Q_D(PasteJob);
0030 
0031     QTimer::singleShot(0, this, [d]() {
0032         d->slotStart();
0033     });
0034 }
0035 
0036 PasteJob::~PasteJob()
0037 {
0038 }
0039 
0040 void PasteJobPrivate::slotStart()
0041 {
0042     Q_Q(PasteJob);
0043     if (!m_mimeData) {
0044         q->setError(KIO::ERR_NO_CONTENT);
0045         q->emitResult();
0046         return;
0047     }
0048     const bool move = KIO::isClipboardDataCut(m_mimeData);
0049     KIO::Job *job = nullptr;
0050     KIO::CopyJob *copyJob = nullptr;
0051     if (m_mimeData->hasUrls()) {
0052         const QList<QUrl> urls = KUrlMimeData::urlsFromMimeData(m_mimeData, KUrlMimeData::PreferLocalUrls);
0053         if (!urls.isEmpty()) {
0054             if (move) {
0055                 copyJob = KIO::move(urls, m_destDir, m_flags);
0056             } else {
0057                 copyJob = KIO::copy(urls, m_destDir, m_flags);
0058             }
0059             QObject::connect(copyJob, &KIO::CopyJob::copyingDone, q, [this](KIO::Job *job, const QUrl &src, const QUrl &dest) {
0060                 slotCopyingDone(job, src, dest);
0061             });
0062 
0063             QObject::connect(copyJob, &KIO::CopyJob::copyingLinkDone, q, [this](KIO::Job *job, const QUrl &from, const QString &target, const QUrl &to) {
0064                 slotCopyingLinkDone(job, from, target, to);
0065             });
0066 
0067             KIO::FileUndoManager::self()->recordJob(move ? KIO::FileUndoManager::Move : KIO::FileUndoManager::Copy, QList<QUrl>(), m_destDir, copyJob);
0068             job = copyJob;
0069         }
0070     } else {
0071         const QString dialogText = m_clipboard ? i18n("Filename for clipboard content:") : i18n("Filename for dropped contents:");
0072         job = pasteMimeDataImpl(m_mimeData, m_destDir, dialogText, KJobWidgets::window(q), m_clipboard);
0073         if (KIO::SimpleJob *simpleJob = qobject_cast<KIO::SimpleJob *>(job)) {
0074             KIO::FileUndoManager::self()->recordJob(KIO::FileUndoManager::Put, QList<QUrl>(), simpleJob->url(), job);
0075         }
0076     }
0077     if (job) {
0078         q->addSubjob(job);
0079         if (copyJob) {
0080             Q_EMIT q->copyJobStarted(copyJob);
0081         }
0082     } else {
0083         q->setError(KIO::ERR_NO_CONTENT);
0084         q->emitResult();
0085     }
0086 }
0087 
0088 void PasteJob::slotResult(KJob *job)
0089 {
0090     if (job->error()) {
0091         KIO::Job::slotResult(job); // will set the error and emit result(this)
0092         return;
0093     }
0094     KIO::SimpleJob *simpleJob = qobject_cast<KIO::SimpleJob *>(job);
0095     if (simpleJob) {
0096         Q_EMIT itemCreated(simpleJob->url());
0097     }
0098 
0099     removeSubjob(job);
0100     emitResult();
0101 }
0102 
0103 PasteJob *KIO::paste(const QMimeData *mimeData, const QUrl &destDir, JobFlags flags)
0104 {
0105     return PasteJobPrivate::newJob(mimeData, destDir, flags, true /*clipboard*/);
0106 }
0107 
0108 #include "moc_pastejob.cpp"