File indexing completed on 2025-02-09 04:24:38
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"