File indexing completed on 2023-10-03 07:53:59
0001 /* This file is part of the KDE project 0002 0003 Copyright (C) 2007 by Javier Goday <jgoday@gmail.com> 0004 Copyright (C) 2009 by Dario Massarin <nekkar@libero.it> 0005 Copyright (C) 2010 by Matthias Fuchs <mat69@gmx.net> 0006 0007 This program is free software; you can redistribute it and/or 0008 modify it under the terms of the GNU General Public 0009 License as published by the Free Software Foundation; either 0010 version 2 of the License, or (at your option) any later version. 0011 */ 0012 0013 #include "kuiserverjobs.h" 0014 0015 #include "kget.h" 0016 #include "kgetkjobadapter.h" 0017 #include "settings.h" 0018 #include "transferhandler.h" 0019 0020 #include "kget_debug.h" 0021 #include <KUiServerJobTracker> 0022 #include <QDebug> 0023 0024 KUiServerJobs::KUiServerJobs(QObject *parent) 0025 : QObject(parent) 0026 , m_globalJob(nullptr) 0027 { 0028 } 0029 0030 KUiServerJobs::~KUiServerJobs() 0031 { 0032 while (m_registeredJobs.size()) { 0033 unregisterJob(m_registeredJobs.begin().value(), m_registeredJobs.begin().key()); 0034 } 0035 0036 delete m_globalJob; 0037 } 0038 0039 void KUiServerJobs::settingsChanged() 0040 { 0041 QList<TransferHandler *> transfers = KGet::allTransfers(); 0042 0043 foreach (TransferHandler *transfer, transfers) { 0044 if (shouldBeShown(transfer)) 0045 registerJob(transfer->kJobAdapter(), transfer); 0046 else 0047 unregisterJob(transfer->kJobAdapter(), transfer); 0048 } 0049 0050 // GlobalJob is associated to a virtual transfer pointer of value == nullptr 0051 if (shouldBeShown(nullptr)) 0052 registerJob(globalJob(), nullptr); 0053 else 0054 unregisterJob(globalJob(), nullptr); 0055 } 0056 0057 void KUiServerJobs::slotTransfersAdded(QList<TransferHandler *> transfers) 0058 { 0059 qCDebug(KGET_DEBUG); 0060 0061 foreach (TransferHandler *transfer, transfers) { 0062 if (shouldBeShown(transfer)) 0063 registerJob(transfer->kJobAdapter(), transfer); 0064 0065 if (shouldBeShown(nullptr)) { 0066 globalJob()->update(); 0067 registerJob(globalJob(), nullptr); 0068 } else 0069 unregisterJob(globalJob(), nullptr); 0070 } 0071 } 0072 0073 void KUiServerJobs::slotTransfersAboutToBeRemoved(const QList<TransferHandler *> &transfers) 0074 { 0075 qCDebug(KGET_DEBUG); 0076 0077 m_invalidTransfers << transfers; 0078 foreach (TransferHandler *transfer, transfers) { 0079 unregisterJob(transfer->kJobAdapter(), transfer); 0080 0081 if (shouldBeShown(nullptr)) { 0082 globalJob()->update(); 0083 registerJob(globalJob(), nullptr); 0084 } else { 0085 unregisterJob(globalJob(), nullptr); 0086 } 0087 } 0088 } 0089 0090 void KUiServerJobs::slotTransfersChanged(QMap<TransferHandler *, Transfer::ChangesFlags> transfers) 0091 { 0092 qCDebug(KGET_DEBUG); 0093 0094 if (!Settings::enableKUIServerIntegration()) 0095 return; 0096 0097 QMapIterator<TransferHandler *, Transfer::ChangesFlags> i(transfers); 0098 while (i.hasNext()) { 0099 i.next(); 0100 // if(!m_invalidTransfers.contains(i.key())) 0101 { 0102 TransferHandler *transfer = i.key(); 0103 if (shouldBeShown(transfer)) { 0104 registerJob(transfer->kJobAdapter(), transfer); 0105 } else { 0106 unregisterJob(transfer->kJobAdapter(), transfer); 0107 } 0108 } 0109 } 0110 0111 if (shouldBeShown(nullptr)) { 0112 globalJob()->update(); 0113 registerJob(globalJob(), nullptr); 0114 } else 0115 unregisterJob(globalJob(), nullptr); 0116 } 0117 0118 void KUiServerJobs::registerJob(KGetKJobAdapter *job, TransferHandler *transfer) 0119 { 0120 if (m_registeredJobs.contains(transfer) || !job) { 0121 return; 0122 } 0123 connect(job, &KGetKJobAdapter::requestStop, this, &KUiServerJobs::slotRequestStop); 0124 connect(job, &KGetKJobAdapter::requestSuspend, this, &KUiServerJobs::slotRequestSuspend); 0125 connect(job, &KGetKJobAdapter::requestResume, this, &KUiServerJobs::slotRequestResume); 0126 0127 KJob *j = job; 0128 registerJob(j, transfer); 0129 } 0130 0131 void KUiServerJobs::registerJob(KJob *job, TransferHandler *transfer) 0132 { 0133 if (m_registeredJobs.contains(transfer) || !job) 0134 return; 0135 0136 KIO::getJobTracker()->registerJob(job); 0137 m_registeredJobs[transfer] = job; 0138 } 0139 0140 bool KUiServerJobs::unregisterJob(KJob *job, TransferHandler *transfer) 0141 { 0142 if (!m_registeredJobs.contains(transfer) || !job) 0143 return false; 0144 0145 // Transfer should only be suspended, thus still show the job tracker 0146 if (m_suspendRequested.contains(transfer)) { 0147 m_suspendRequested.removeAll(transfer); 0148 return false; 0149 } 0150 0151 // unregister the job if it was a single adaptor 0152 if (job != m_globalJob) { 0153 disconnect(job); 0154 } 0155 KIO::getJobTracker()->unregisterJob(m_registeredJobs[transfer]); 0156 m_registeredJobs.remove(transfer); 0157 0158 return true; 0159 } 0160 0161 void KUiServerJobs::slotRequestStop(KJob *job, TransferHandler *transfer) 0162 { 0163 if (unregisterJob(job, transfer)) { 0164 if (transfer) { 0165 transfer->stop(); 0166 } else { 0167 foreach (TransferHandler *t, KGet::allTransfers()) { 0168 t->stop(); 0169 } 0170 } 0171 } 0172 } 0173 0174 bool KUiServerJobs::shouldBeShown(TransferHandler *transfer) 0175 { 0176 if (!Settings::enableKUIServerIntegration()) 0177 return false; 0178 0179 if (Settings::exportGlobalJob() && (transfer == nullptr) && existRunningTransfers()) 0180 return true; 0181 0182 if (!Settings::exportGlobalJob() && (transfer) && (transfer->status() == Job::Running)) 0183 return true; 0184 0185 return false; 0186 } 0187 0188 bool KUiServerJobs::existRunningTransfers() 0189 { 0190 foreach (TransferHandler *transfer, KGet::allTransfers()) { 0191 // if added to m_invalidTransfers it means that the job is about to be removed 0192 if ((transfer->status() == Job::Running) && !m_invalidTransfers.contains(transfer)) { 0193 return true; 0194 } 0195 } 0196 0197 return false; 0198 } 0199 0200 KGetGlobalJob *KUiServerJobs::globalJob() 0201 { 0202 if (!m_globalJob) { 0203 m_globalJob = new KGetGlobalJob(); 0204 connect(m_globalJob, &KGetGlobalJob::requestStop, this, &KUiServerJobs::slotRequestStop); 0205 } 0206 return m_globalJob; 0207 } 0208 0209 void KUiServerJobs::slotRequestSuspend(KJob *job, TransferHandler *transfer) 0210 { 0211 Q_UNUSED(job) 0212 if (transfer) { 0213 m_suspendRequested << transfer; 0214 transfer->stop(); 0215 } 0216 } 0217 0218 void KUiServerJobs::slotRequestResume(KJob *job, TransferHandler *transfer) 0219 { 0220 Q_UNUSED(job) 0221 if (transfer) { 0222 transfer->start(); 0223 } 0224 } 0225 0226 #include "moc_kuiserverjobs.cpp"