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"