Use KIO::filesize_t to be able to handle big filesizes (now 4GB DVD image filesizes...
[kdenetwork.git] / kget / core / transferhandler.cpp
blobdb8e227934f8ba99570cfc273d3ec0f08f903b01
1 /* This file is part of the KDE project
3 Copyright (C) 2005 Dario Massarin <nekkar@libero.it>
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9 */
11 #include "core/transferhandler.h"
13 #include "core/job.h"
14 #include "core/jobqueue.h"
15 #include "core/transfergroup.h"
16 #include "core/transfergrouphandler.h"
17 #include "core/transfertreemodel.h"
18 #include "core/plugin/transferfactory.h"
19 #include "core/observer.h"
21 #include <kdebug.h>
22 #include <klocale.h>
24 #include <QVariant>
26 TransferHandler::TransferHandler(Transfer * transfer, Scheduler * scheduler)
27 : m_transfer(transfer), m_scheduler(scheduler)
32 TransferHandler::~TransferHandler()
36 void TransferHandler::addObserver(TransferObserver * observer)
38 m_observers.push_back(observer);
39 m_changesFlags[observer]=0xFFFFFFFF;
40 kDebug(5001) << "TransferHandler: OBSERVERS++ = " << m_observers.size();
43 void TransferHandler::delObserver(TransferObserver * observer)
45 m_observers.removeAll(observer);
46 m_changesFlags.remove(observer);
47 kDebug(5001) << "TransferHandler: OBSERVERS-- = " << m_observers.size();
50 void TransferHandler::start()
52 if(m_transfer->group()->status() == JobQueue::Running)
54 m_transfer->setPolicy(Job::None);
55 m_transfer->group()->move(m_transfer, 0);
57 else
59 m_transfer->setPolicy(Job::Start);
63 void TransferHandler::stop()
65 if(m_transfer->group()->status() == JobQueue::Stopped)
67 m_transfer->setPolicy(Job::None);
69 else
71 m_transfer->setPolicy(Job::Stop);
75 int TransferHandler::elapsedTime() const
77 return m_transfer->elapsedTime();
80 int TransferHandler::remainingTime() const
82 return m_transfer->remainingTime();
85 bool TransferHandler::isResumable() const
87 return m_transfer->isResumable();
90 KIO::filesize_t TransferHandler::totalSize() const
92 return m_transfer->totalSize();
95 KIO::filesize_t TransferHandler::processedSize() const
97 return m_transfer->processedSize();
100 int TransferHandler::percent() const
102 return m_transfer->percent();
105 int TransferHandler::speed() const
107 return m_transfer->speed();
110 QVariant TransferHandler::data(int column)
112 // kDebug(5001) << "TransferHandler::data(" << column << ")";
114 switch(column)
116 case 0:
117 return dest().fileName();
118 case 1:
119 return statusText();
120 case 2:
121 if (totalSize() != 0)
122 return KIO::convertSize(totalSize());
123 else
124 return i18nc("not available", "n/a");
125 case 3:
126 // return QString::number(percent())+'%'; // display progressbar instead
127 return QVariant();
128 case 4:
129 if (speed()==0)
131 if (status() == Job::Running)
132 return i18n("Stalled");
133 else
134 return QString();
136 else
137 return i18n("%1/s", KIO::convertSize(speed()));
138 default:
139 return QVariant();
143 KMenu * TransferHandler::popupMenu(QList<TransferHandler *> transfers)
145 return m_transfer->factory()->createPopupMenu(transfers);
148 void TransferHandler::setSelected( bool select )
150 if( (select && !isSelected()) || (!select && isSelected()) )
152 m_transfer->m_isSelected = select;
153 setTransferChange( Transfer::Tc_Selection, true );
157 bool TransferHandler::isSelected() const
159 return m_transfer->m_isSelected;
162 Transfer::ChangesFlags TransferHandler::changesFlags(TransferObserver * observer) const
164 if( m_changesFlags.find(observer) != m_changesFlags.end() )
165 return m_changesFlags[observer];
166 else
168 kDebug(5001) << " TransferHandler::changesFlags() doesn't see you as an observer! ";
170 return 0xFFFFFFFF;
174 void TransferHandler::resetChangesFlags(TransferObserver * observer)
176 if( m_changesFlags.find(observer) != m_changesFlags.end() )
177 m_changesFlags[observer] = 0;
178 else
179 kDebug(5001) << " TransferHandler::resetchangesFlags() doesn't see you as an observer! ";
182 void TransferHandler::setTransferChange(ChangesFlags change, bool postEvent)
184 QMap<TransferObserver *, ChangesFlags>::Iterator it = m_changesFlags.begin();
185 QMap<TransferObserver *, ChangesFlags>::Iterator itEnd = m_changesFlags.end();
187 for( ; it!=itEnd; ++it )
188 *it |= change;
190 if(postEvent)
191 postTransferChangedEvent();
194 void TransferHandler::postTransferChangedEvent()
196 // kDebug(5001) << "TransferHandler::postTransferChangedEvent() ENTERING";
198 // Here we have to copy the list and iterate on the copy itself, because
199 // a view can remove itself as a view while we are iterating over the
200 // observers list and this leads to crashes.
201 QList<TransferObserver *> observers = m_observers;
203 QList<TransferObserver *>::iterator it = observers.begin();
204 QList<TransferObserver *>::iterator itEnd = observers.end();
206 // Notify the observers
207 for(; it!=itEnd; ++it)
209 (*it)->transferChangedEvent(this);
212 // Notify the group
213 m_transfer->group()->transferChangedEvent(m_transfer);
215 // Notify the TransferTreeModel
216 m_transfer->model()->postDataChangedEvent(this);
218 //kDebug(5001) << "TransferHandler::postTransferChangedEvent() LEAVING";
221 void TransferHandler::postDeleteEvent()
223 kDebug(5001) << "TransferHandler::postDeleteEvent() ENTERING";
225 //Here we have to copy the list and iterate on the copy itself, because
226 //a view can remove itself as a view while we are iterating over the
227 //observers list and this leads to crashes.
228 QList<TransferObserver *> observers = m_observers;
230 QList<TransferObserver *>::iterator it = observers.begin();
231 QList<TransferObserver *>::iterator itEnd = observers.end();
233 for(; it!=itEnd; ++it)
235 (*it)->deleteEvent(this);
237 kDebug(5001) << "TransferHandler::postDeleteEvent() LEAVING";