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.
11 #include "core/transferhandler.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"
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);
59 m_transfer
->setPolicy(Job::Start
);
63 void TransferHandler::stop()
65 if(m_transfer
->group()->status() == JobQueue::Stopped
)
67 m_transfer
->setPolicy(Job::None
);
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 << ")";
117 return dest().fileName();
121 if (totalSize() != 0)
122 return KIO::convertSize(totalSize());
124 return i18nc("not available", "n/a");
126 // return QString::number(percent())+'%'; // display progressbar instead
131 if (status() == Job::Running
)
132 return i18n("Stalled");
137 return i18n("%1/s", KIO::convertSize(speed()));
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
];
168 kDebug(5001) << " TransferHandler::changesFlags() doesn't see you as an observer! ";
174 void TransferHandler::resetChangesFlags(TransferObserver
* observer
)
176 if( m_changesFlags
.find(observer
) != m_changesFlags
.end() )
177 m_changesFlags
[observer
] = 0;
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
)
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);
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";