Disable clipboardsharing in view only mode.
[kdenetwork.git] / kget / core / transfergrouphandler.cpp
blobecc6950bc6a550c3a0391904e96224a89a9cdcf4
1 /* This file is part of the KDE project
3 Copyright (C) 2005 Dario Massarin <nekkar@libero.it>
4 Copyright (C) 2008 Lukas Appelhans <l.appelhans@gmx.de>
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
12 #include "core/transfergrouphandler.h"
14 #include "core/kgetkjobadapter.h"
15 #include "core/transferhandler.h"
16 #include "core/transfertreemodel.h"
17 #include "core/transfer.h"
18 #include "core/observer.h"
19 #include "core/kget.h"
21 #include <kdebug.h>
22 #include <kmenu.h>
23 #include <kaction.h>
24 #include <kactioncollection.h>
25 #include <klocale.h>
26 #include <kicon.h>
28 TransferGroupHandler::TransferGroupHandler(TransferGroup * group, Scheduler * scheduler)
29 : Handler(scheduler),
30 m_group(group),
31 m_qobject(0)
33 addObserver(0);
36 TransferGroupHandler::~TransferGroupHandler()
40 void TransferGroupHandler::addObserver(TransferGroupObserver * observer)
42 kDebug(5001) << "TransferGroupHandler::addObserver";
43 m_observers.push_back(observer);
44 m_changesFlags[observer]=0xFFFFFFFF;
45 kDebug(5001) << " Now we have " << m_observers.size() << " observers";
48 void TransferGroupHandler::delObserver(TransferGroupObserver * observer)
50 m_observers.removeAll(observer);
51 m_changesFlags.remove(observer);
54 void TransferGroupHandler::start()
56 kDebug(5001) << "TransferGroupHandler::start()";
57 m_group->setStatus( JobQueue::Running );
60 void TransferGroupHandler::stop()
62 kDebug(5001) << "TransferGroupHandler::stop()";
63 m_group->setStatus( JobQueue::Stopped );
66 void TransferGroupHandler::move(QList<TransferHandler *> transfers, TransferHandler * after)
68 //Check that the given transfer (after) belongs to this group
69 if( after && (after->group() != this) )
70 return;
72 QList<TransferHandler *>::iterator it = transfers.begin();
73 QList<TransferHandler *>::iterator itEnd = transfers.end();
75 for( ; it!=itEnd ; ++it )
77 //Move the transfers in the JobQueue
78 if(after)
79 m_group->move( (*it)->m_transfer, after->m_transfer );
80 else
81 m_group->move( (*it)->m_transfer, 0 );
83 after = *it;
87 TransferHandler * TransferGroupHandler::operator[] (int i)
89 // kDebug(5001) << "TransferGroupHandler::operator[" << i << "]";
91 return (*m_group)[i]->handler();
94 void TransferGroupHandler::setName(const QString &name)
96 m_group->setName(name);
97 postGroupChangedEvent();
100 QVariant TransferGroupHandler::data(int column)
102 // kDebug(5001) << "TransferGroupHandler::data(" << column << ")";
104 switch(column)
106 case 0:
107 if (!m_group->supportsSpeedLimits() &&
108 (m_group->downloadLimit(Transfer::VisibleSpeedLimit) != 0 || m_group->uploadLimit(Transfer::VisibleSpeedLimit) != 0))
109 return name() + " - Does not supports SpeedLimits";//FIXME: Do a better text here
110 else
111 return name();
112 case 2:
113 if(m_group->size())
114 return i18np("1 Item", "%1 Items", m_group->size());
115 else
116 return QString();
117 /* if (totalSize() != 0)
118 return KIO::convertSize(totalSize());
119 else
120 return i18nc("not available", "n/a");*/
121 case 3:
122 // return QString::number(percent())+'%'; // display progressbar instead
123 return QVariant();
124 case 4:
125 if (downloadSpeed() == 0)
127 return QString();
129 else
130 return i18n("%1/s", KIO::convertSize(downloadSpeed()));
131 default:
132 return QVariant();
136 TransferGroup::ChangesFlags TransferGroupHandler::changesFlags(TransferGroupObserver * observer)
138 if( m_changesFlags.find(observer) != m_changesFlags.end() )
139 return m_changesFlags[observer];
140 else
142 kDebug(5001) << " TransferGroupHandler::changesFlags() doesn't see you as an observer! ";
144 return 0xFFFFFFFF;
148 void TransferGroupHandler::resetChangesFlags(TransferGroupObserver * observer)
150 if( m_changesFlags.find(observer) != m_changesFlags.end() )
151 m_changesFlags[observer] = 0;
152 else
153 kDebug(5001) << " TransferGroupHandler::resetchangesFlags() doesn't see you as an observer! ";
156 int TransferGroupHandler::indexOf(TransferHandler * transfer)
158 return m_group->indexOf(transfer->m_transfer);
161 const QList<TransferHandler *> TransferGroupHandler::transfers()
163 QList<TransferHandler *> transfers;
165 TransferGroup::iterator it = m_group->begin();
166 TransferGroup::iterator itEnd = m_group->end();
168 for( ; it!=itEnd ; ++it )
170 transfers.append((static_cast<Transfer *>(*it))->handler());
172 return transfers;
175 const QList<QAction *> & TransferGroupHandler::actions()
177 createActions();
179 return m_actions;
182 QObjectInterface * TransferGroupHandler::qObject()
184 if( !m_qobject )
185 m_qobject = new QObjectInterface(this);
187 return m_qobject;
190 void TransferGroupHandler::setGroupChange(ChangesFlags change, bool postEvent)
192 QMap<TransferGroupObserver *, ChangesFlags>::Iterator it = m_changesFlags.begin();
193 QMap<TransferGroupObserver *, ChangesFlags>::Iterator itEnd = m_changesFlags.end();
195 for( ; it!=itEnd; ++it )
196 *it |= change;
198 if(postEvent)
199 postGroupChangedEvent();
202 void TransferGroupHandler::postGroupChangedEvent()
204 //Here we have to copy the list and iterate on the copy itself, because
205 //a view can remove itself as a view while we are iterating over the
206 //observers list and this leads to crashes.
207 QList<TransferGroupObserver *> observers = m_observers;
209 QList<TransferGroupObserver *>::iterator it = observers.begin();
210 QList<TransferGroupObserver *>::iterator itEnd = observers.end();
212 for(; it!=itEnd; ++it)
214 if(*it)
215 (*it)->groupChangedEvent(this);
218 m_group->model()->postDataChangedEvent(this);
221 void TransferGroupHandler::postAddedTransferEvent(Transfer * transfer, Transfer * after)
223 kDebug(5001) << "TransferGroupHandler::postAddedTransferEvent";
224 kDebug(5001) << " number of observers = " << m_observers.size();
226 //Here we have to copy the list and iterate on the copy itself, because
227 //a view can remove itself as a view while we are iterating over the
228 //observers list and this leads to crashes.
229 QList<TransferGroupObserver *> observers = m_observers;
231 QList<TransferGroupObserver *>::iterator it = observers.begin();
232 QList<TransferGroupObserver *>::iterator itEnd = observers.end();
234 for(; it!=itEnd; ++it)
236 if(*it)
238 if(after)
239 (*it)->addedTransferEvent(transfer->handler(), after->handler());
240 else
241 (*it)->addedTransferEvent(transfer->handler(), 0);
246 void TransferGroupHandler::postRemovedTransferEvent(Transfer * transfer)
248 //Here we have to copy the list and iterate on the copy itself, because
249 //a view can remove itself as a view while we are iterating over the
250 //observers list and this leads to crashes.
251 QList<TransferGroupObserver *> observers = m_observers;
253 QList<TransferGroupObserver *>::iterator it = observers.begin();
254 QList<TransferGroupObserver *>::iterator itEnd = observers.end();
256 for(; it!=itEnd; ++it)
258 if(*it)
259 (*it)->removedTransferEvent(transfer->handler());
263 void TransferGroupHandler::postMovedTransferEvent(Transfer * transfer, Transfer * after)
265 //Here we have to copy the list and iterate on the copy itself, because
266 //a view can remove itself as a view while we are iterating over the
267 //observers list and this leads to crashes.
268 QList<TransferGroupObserver *> observers = m_observers;
270 QList<TransferGroupObserver *>::iterator it = observers.begin();
271 QList<TransferGroupObserver *>::iterator itEnd = observers.end();
273 for(; it!=itEnd; ++it)
275 if(*it)
277 if(after)
278 (*it)->movedTransferEvent(transfer->handler(), after->handler());
279 else
280 (*it)->movedTransferEvent(transfer->handler(), 0);
285 void TransferGroupHandler::postDeleteEvent()
287 //Here we have to copy the list and iterate on the copy itself, because
288 //a view can remove itself as a view while we are iterating over the
289 //observers list and this leads to crashes.
290 QList<TransferGroupObserver *> observers = m_observers;
292 QList<TransferGroupObserver *>::iterator it = observers.begin();
293 QList<TransferGroupObserver *>::iterator itEnd = observers.end();
295 for(; it!=itEnd; ++it)
297 if(*it)
298 (*it)->deleteEvent(this);
302 void TransferGroupHandler::createActions()
304 if( !m_actions.empty() )
305 return;
307 //Calling this function we make sure the QObjectInterface object
308 //has been created (if not it will create it)
309 qObject();
311 QAction *startAction = KGet::actionCollection()->addAction("transfer_group_start");
312 startAction->setText(i18nc("start transfergroup downloads", "Start"));
313 startAction->setIcon(KIcon("media-playback-start"));
314 QObject::connect(startAction, SIGNAL(triggered()), qObject(), SLOT(slotStart()));
315 m_actions.append(startAction);
317 QAction *stopAction = KGet::actionCollection()->addAction("transfer_group_stop");
318 stopAction->setText(i18nc("stop transfergroup downloads", "Stop"));
319 stopAction->setIcon(KIcon("media-playback-pause"));
320 QObject::connect(stopAction, SIGNAL(triggered()), qObject(), SLOT(slotStop()));
321 m_actions.append(stopAction);
327 QObjectInterface::QObjectInterface(TransferGroupHandler * handler)
328 : m_handler(handler)
333 void QObjectInterface::slotStart()
335 m_handler->start();
338 void QObjectInterface::slotStop()
340 m_handler->stop();
345 GenericTransferGroupObserver::GenericTransferGroupObserver() : QObject(),
346 m_adapters()
348 m_transferObserver = new GenericTransferObserver(this);
351 GenericTransferGroupObserver::~GenericTransferGroupObserver()
353 delete m_transferObserver;
356 void GenericTransferGroupObserver::groupChangedEvent(TransferGroupHandler * group)
358 TransferGroupHandler::ChangesFlags transferFlags = group->changesFlags(this);
359 if (transferFlags & TransferGroup::Gc_Percent)
360 KGet::calculateGlobalSpeedLimits();
361 group->resetChangesFlags(this);
364 void GenericTransferGroupObserver::addedTransferEvent(TransferHandler * transfer, TransferHandler * after)
366 Q_UNUSED(transfer);
367 Q_UNUSED(after);
368 KGet::calculateGlobalSpeedLimits();
370 if (transfer->percent() != 100) {
371 transfer->addObserver(m_transferObserver);
373 KGet::save();
376 registerTransferAsKJob(transfer);
379 void GenericTransferGroupObserver::removedTransferEvent(TransferHandler * transfer)
381 Q_UNUSED(transfer);
382 KGet::calculateGlobalSpeedLimits();
384 transfer->delObserver(m_transferObserver);
386 KGet::save();
387 if(m_adapters.contains(transfer)) {
388 KGet::unregisterKJob(m_adapters [transfer]);
389 m_adapters.remove(transfer);
393 void GenericTransferGroupObserver::movedTransferEvent(TransferHandler * transfer, TransferHandler * after)
395 Q_UNUSED(transfer);
396 Q_UNUSED(after);
397 KGet::calculateGlobalSpeedLimits();
399 KGet::save();
402 void GenericTransferGroupObserver::addTransferGroup(TransferGroupHandler *group)
404 foreach(TransferHandler *handler, group->transfers()) {
405 handler->addObserver(m_transferObserver);
406 registerTransferAsKJob(handler);
410 void GenericTransferGroupObserver::postTransferChanged(TransferHandler *transfer)
412 if(m_adapters.contains(transfer)) {
413 m_adapters[transfer]->slotUpdateDescription();
415 if(transfer->status() == Job::Finished) {
416 KGet::unregisterKJob(m_adapters [transfer]);
417 m_adapters.remove(transfer);
422 void GenericTransferGroupObserver::registerTransferAsKJob(TransferHandler *transfer)
424 KGetKJobAdapter *adapter = new KGetKJobAdapter(this, transfer);
425 KGet::registerKJob(adapter);
427 m_adapters [transfer] = adapter;
430 #include "transfergrouphandler.moc"