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"
24 #include <kactioncollection.h>
28 TransferGroupHandler::TransferGroupHandler(TransferGroup
* group
, Scheduler
* scheduler
)
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) )
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
79 m_group
->move( (*it
)->m_transfer
, after
->m_transfer
);
81 m_group
->move( (*it
)->m_transfer
, 0 );
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 << ")";
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
114 return i18np("1 Item", "%1 Items", m_group
->size());
117 /* if (totalSize() != 0)
118 return KIO::convertSize(totalSize());
120 return i18nc("not available", "n/a");*/
122 // return QString::number(percent())+'%'; // display progressbar instead
125 if (downloadSpeed() == 0)
130 return i18n("%1/s", KIO::convertSize(downloadSpeed()));
136 TransferGroup::ChangesFlags
TransferGroupHandler::changesFlags(TransferGroupObserver
* observer
)
138 if( m_changesFlags
.find(observer
) != m_changesFlags
.end() )
139 return m_changesFlags
[observer
];
142 kDebug(5001) << " TransferGroupHandler::changesFlags() doesn't see you as an observer! ";
148 void TransferGroupHandler::resetChangesFlags(TransferGroupObserver
* observer
)
150 if( m_changesFlags
.find(observer
) != m_changesFlags
.end() )
151 m_changesFlags
[observer
] = 0;
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());
175 const QList
<QAction
*> & TransferGroupHandler::actions()
182 QObjectInterface
* TransferGroupHandler::qObject()
185 m_qobject
= new QObjectInterface(this);
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
)
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
)
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
)
239 (*it
)->addedTransferEvent(transfer
->handler(), after
->handler());
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
)
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
)
278 (*it
)->movedTransferEvent(transfer
->handler(), after
->handler());
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
)
298 (*it
)->deleteEvent(this);
302 void TransferGroupHandler::createActions()
304 if( !m_actions
.empty() )
307 //Calling this function we make sure the QObjectInterface object
308 //has been created (if not it will create it)
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
)
333 void QObjectInterface::slotStart()
338 void QObjectInterface::slotStop()
345 GenericTransferGroupObserver::GenericTransferGroupObserver() : QObject(),
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
)
368 KGet::calculateGlobalSpeedLimits();
370 if (transfer
->percent() != 100) {
371 transfer
->addObserver(m_transferObserver
);
376 registerTransferAsKJob(transfer
);
379 void GenericTransferGroupObserver::removedTransferEvent(TransferHandler
* transfer
)
382 KGet::calculateGlobalSpeedLimits();
384 transfer
->delObserver(m_transferObserver
);
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
)
397 KGet::calculateGlobalSpeedLimits();
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"