File indexing completed on 2024-06-16 10:06:22

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     if (m_mimeData->hasUrls()) {
0051         const QList<QUrl> urls = KUrlMimeData::urlsFromMimeData(m_mimeData, KUrlMimeData::PreferLocalUrls);
0052         if (!urls.isEmpty()) {
0053             KIO::CopyJob *copyJob;
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     } else {
0080         q->setError(KIO::ERR_NO_CONTENT);
0081         q->emitResult();
0082     }
0083 }
0084 
0085 void PasteJob::slotResult(KJob *job)
0086 {
0087     if (job->error()) {
0088         KIO::Job::slotResult(job); // will set the error and emit result(this)
0089         return;
0090     }
0091     KIO::SimpleJob *simpleJob = qobject_cast<KIO::SimpleJob *>(job);
0092     if (simpleJob) {
0093         Q_EMIT itemCreated(simpleJob->url());
0094     }
0095 
0096     removeSubjob(job);
0097     emitResult();
0098 }
0099 
0100 PasteJob *KIO::paste(const QMimeData *mimeData, const QUrl &destDir, JobFlags flags)
0101 {
0102     return PasteJobPrivate::newJob(mimeData, destDir, flags, true /*clipboard*/);
0103 }
0104 
0105 #include "moc_pastejob.cpp"