• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdenetwork API Reference
  • KDE Home
  • Contact Us
 

kget

  • sources
  • kde-4.12
  • kdenetwork
  • kget
  • core
transfergroup.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE project
2 
3  Copyright (C) 2005 Dario Massarin <nekkar@libero.it>
4  Copyright (C) 2010 Matthias Fuchs <mat69@gmx.net>
5 
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.
10 */
11 
12 #include "core/transfergroup.h"
13 
14 #include "core/transfergrouphandler.h"
15 #include "core/kget.h"
16 
17 #include <KDebug>
18 #include <KMessageBox>
19 #include <KLocale>
20 #include <KStandardDirs>
21 #include <kio/global.h>
22 
23 #include <QFile>
24 #include <QDateTime>
25 #include <QDomElement>
26 
27 
28 TransferGroup::TransferGroup(TransferTreeModel * model, Scheduler * parent, const QString & name)
29  : JobQueue(parent),
30  m_model(model), m_name(name),
31  m_totalSize(0), m_downloadedSize(0), m_uploadedSize(0),
32  m_percent(0), m_downloadSpeed(0), m_uploadSpeed(0),
33  m_downloadLimit(0), m_uploadLimit(0),
34  m_visibleDownloadLimit(0), m_visibleUploadLimit(0),
35  m_iconName("bookmark-new-list"), m_defaultFolder()
36 {
37  m_handler = new TransferGroupHandler(parent, this);
38 }
39 
40 TransferGroup::~TransferGroup()
41 {
42 }
43 
44 int TransferGroup::downloadSpeed()
45 {
46  m_downloadSpeed = 0;
47  foreach(Job *job, runningJobs())
48  {
49  Transfer *transfer = static_cast<Transfer*>(job);
50  if (transfer)
51  m_downloadSpeed += transfer->downloadSpeed();
52  }
53  return m_downloadSpeed;
54 }
55 
56 int TransferGroup::uploadSpeed()
57 {
58  m_uploadSpeed = 0;
59  foreach(Job *job, runningJobs())
60  {
61  Transfer *transfer = static_cast<Transfer*>(job);
62  if (transfer)
63  m_uploadSpeed += transfer->uploadSpeed();
64  }
65  return m_uploadSpeed;
66 }
67 
68 #ifdef HAVE_NEPOMUK
69 
70 void TransferGroup::setTags(const QList< Nepomuk2::Tag >& tags)
71 {
72  m_tags.clear();
73 
74  foreach( const Nepomuk2::Tag &tag, tags) {
75  m_tags.insert(tag.uri(), tag);
76  }
77 }
78 
79 #endif //HAVE_NEPOMUK
80 
81 bool TransferGroup::supportsSpeedLimits()
82 {
83  QList<Job*> jobs = runningJobs();
84  foreach (Job *job, jobs) {
85  Transfer * transfer = static_cast<Transfer*>(job);
86  if (!(transfer->capabilities() & Transfer::Cap_SpeedLimit)) {
87  return false;
88  }
89  }
90 
91  //empty jobs can't support a speed limit
92  return !jobs.isEmpty();
93 }
94 
95 void TransferGroup::setStatus(Status queueStatus)
96 {
97  JobQueue::setStatus(queueStatus);
98 
99  m_handler->setGroupChange(Gc_Status, true);
100 }
101 
102 void TransferGroup::append(Transfer * transfer)
103 {
104  JobQueue::append(transfer);
105 
106  calculateSpeedLimits();
107 }
108 
109 void TransferGroup::append(const QList<Transfer*> &transfers)
110 {
111  QList<Job*> jobs;
112  foreach (Transfer *transfer, transfers) {
113  jobs << transfer;
114  }
115  JobQueue::append(jobs);
116 
117  calculateSpeedLimits();
118 }
119 
120 
121 void TransferGroup::prepend(Transfer * transfer)
122 {
123  JobQueue::prepend(transfer);
124 
125  calculateSpeedLimits();
126 }
127 
128 void TransferGroup::insert(Transfer * transfer, Transfer * after)
129 {
130  JobQueue::insert(transfer, after);
131 
132  calculateSpeedLimits();
133 }
134 
135 void TransferGroup::remove(Transfer * transfer)
136 {
137  JobQueue::remove(transfer);
138 
139  calculateSpeedLimits();
140 }
141 
142 void TransferGroup::remove(const QList<Transfer*> &transfers)
143 {
144  QList<Job*> jobs;
145  foreach (Transfer *transfer, transfers) {
146  jobs << transfer;
147  }
148  JobQueue::remove(jobs);
149 
150  calculateSpeedLimits();
151 }
152 
153 void TransferGroup::move(Transfer * transfer, Transfer * after)
154 {
155  if(transfer == after)
156  return;
157 
158  JobQueue::move(transfer, after);
159 }
160 
161 Transfer * TransferGroup::findTransfer(const KUrl &src)
162 {
163  iterator it = begin();
164  iterator itEnd = end();
165 
166  for(; it!=itEnd ; ++it)
167  {
168  Transfer * t = (Transfer *) *it;
169  if( t->source().url() == src.url() )
170  return t;
171  }
172  return 0;
173 }
174 
175 Transfer *TransferGroup::findTransferByDestination(const KUrl &dest)
176 {
177  iterator it = begin();
178  iterator itEnd = end();
179 
180  for(; it!=itEnd ; ++it) {
181  Transfer *t = (Transfer *) *it;
182  if(t->dest().url() == dest.url()) {
183  return t;
184  }
185  }
186  return 0;
187 }
188 
189 void TransferGroup::setUploadLimit(int ulLimit, Transfer::SpeedLimit limit)
190 {
191  if (limit == Transfer::VisibleSpeedLimit) {
192  m_visibleUploadLimit = ulLimit;
193  if (ulLimit < m_uploadLimit || m_uploadLimit == 0)
194  m_uploadLimit = ulLimit;
195  } else {
196  m_uploadLimit = ulLimit;
197  }
198 
199  calculateUploadLimit();
200 }
201 
202 void TransferGroup::setDownloadLimit(int dlLimit, Transfer::SpeedLimit limit)
203 {
204  if (limit == Transfer::VisibleSpeedLimit) {
205  m_visibleDownloadLimit = dlLimit;
206  if (dlLimit < m_downloadLimit || m_downloadLimit == 0)
207  m_downloadLimit = dlLimit;
208  } else {
209  m_downloadLimit = dlLimit;
210  }
211 
212  calculateDownloadLimit();
213 }
214 
215 int TransferGroup::uploadLimit(Transfer::SpeedLimit limit) const
216 {
217  if (limit == Transfer::VisibleSpeedLimit)
218  return m_visibleUploadLimit;
219 
220  return m_uploadLimit;
221 }
222 
223 int TransferGroup::downloadLimit(Transfer::SpeedLimit limit) const
224 {
225  if (limit == Transfer::VisibleSpeedLimit)
226  return m_visibleDownloadLimit;
227 
228  return m_downloadLimit;
229 }
230 
231 void TransferGroup::calculateSpeedLimits()
232 {
233  kDebug(5001) << "We will calculate the new SpeedLimits now";
234  calculateDownloadLimit();
235  calculateUploadLimit();
236 }
237 
238 void TransferGroup::calculateDownloadLimit()
239 {
240  kDebug(5001) << "Calculate new DownloadLimit of " + QString::number(m_downloadLimit);
241  if (supportsSpeedLimits())
242  {
243  const QList<Job*> running = runningJobs();
244  int n = running.count();
245  int pool = 0;//We create a pool where we have some KiB/s to go to other transfer's...
246  QList<Transfer*> transfersNeedSpeed;
247  foreach (Job *job, running) {
248  Transfer * transfer = static_cast<Transfer*>(job);
249  if (transfer)
250  {
251  if (m_downloadLimit == 0 && transfer->downloadLimit(Transfer::VisibleSpeedLimit) != 0)
252  continue;
253  else if (m_downloadLimit == 0 && transfer->downloadLimit(Transfer::VisibleSpeedLimit) == 0)
254  transfer->setDownloadLimit(0, Transfer::InvisibleSpeedLimit);
255  else if (transfer->downloadLimit(Transfer::VisibleSpeedLimit) < m_downloadLimit / n
256  && transfer->downloadLimit(Transfer::VisibleSpeedLimit) != 0)
257  /*If the transfer's visible download limit is under the new one,
258  we move the KiB/s which are different to the pool*/
259  pool = pool + (m_downloadLimit / n - transfer->downloadLimit(Transfer::VisibleSpeedLimit));
260  else if (transfer->downloadSpeed() + 10 < m_downloadLimit / n)
261  {
262  /*When the downloadSpeed of the transfer is under the new downloadLimit + 10 then we
263  set the downloadLimit to the downloadSpeed + 10*/
264  pool = pool + m_downloadLimit / n - transfer->downloadSpeed() + 10;
265  transfer->setDownloadLimit(transfer->downloadSpeed() + 10, Transfer::InvisibleSpeedLimit);
266  }
267  else
268  {
269  transfer->setDownloadLimit(m_downloadLimit / n, Transfer::InvisibleSpeedLimit);
270  transfersNeedSpeed.append(transfer);
271  }
272  }
273  }
274  foreach (Transfer *transfer, transfersNeedSpeed)
275  {
276  transfer->setDownloadLimit(m_downloadLimit / n + pool / transfersNeedSpeed.count(), Transfer::InvisibleSpeedLimit);
277  }
278  }
279 }
280 
281 void TransferGroup::calculateUploadLimit()
282 {
283  kDebug(5001) << "Calculate new Upload Limit of " + QString::number(m_uploadLimit);
284  if (supportsSpeedLimits())
285  {
286  const QList<Job*> running = runningJobs();
287  int n = running.count();
288  int pool = 0;//We create a pool where we have some KiB/s to go to other transfer's...
289  QList<Transfer*> transfersNeedSpeed;
290  foreach (Job *job, running) {
291  Transfer * transfer = static_cast<Transfer*>(job);
292  if (transfer)
293  {
294  if (m_uploadLimit == 0 && transfer->uploadLimit(Transfer::VisibleSpeedLimit) != 0)
295  continue;
296  else if (m_uploadLimit == 0 && transfer->uploadLimit(Transfer::VisibleSpeedLimit) == 0)
297  transfer->setUploadLimit(0, Transfer::InvisibleSpeedLimit);
298  else if (transfer->uploadLimit(Transfer::VisibleSpeedLimit) < m_uploadLimit / n
299  && transfer->uploadLimit(Transfer::VisibleSpeedLimit) != 0)
300  /*If the transfer's visible upload limit is under the new one,
301  we move the KiB/s which are different to the pool*/
302  pool = pool + (m_uploadLimit / n - transfer->uploadLimit(Transfer::VisibleSpeedLimit));
303  else if (transfer->uploadSpeed() + 10 < m_uploadLimit / n)
304  {
305  /*When the uploadSpeed of the transfer is under the new uploadLimit + 10 then we
306  set the uploadLimit to the uploadSpeed + 10*/
307  pool = pool + m_uploadLimit / n - transfer->uploadSpeed() + 10;
308  transfer->setUploadLimit(transfer->uploadSpeed() + 10, Transfer::InvisibleSpeedLimit);
309  }
310  else
311  {
312  transfer->setUploadLimit(m_uploadLimit / n, Transfer::InvisibleSpeedLimit);
313  transfersNeedSpeed.append(transfer);
314  }
315  }
316  }
317  foreach (Transfer *transfer, transfersNeedSpeed)
318  {
319  transfer->setUploadLimit(m_uploadLimit / n + pool / transfersNeedSpeed.count(), Transfer::InvisibleSpeedLimit);
320  }
321  }
322 }
323 
324 void TransferGroup::save(QDomElement e) // krazy:exclude=passbyvalue
325 {
326  //kDebug(5001) << " --> " << name();
327 
328  e.setAttribute("Name", m_name);
329  e.setAttribute("DefaultFolder", m_defaultFolder);
330  e.setAttribute("DownloadLimit", m_visibleDownloadLimit);
331  e.setAttribute("UploadLimit", m_visibleUploadLimit);
332  e.setAttribute("Icon", m_iconName);
333  e.setAttribute("Status", status() == JobQueue::Running ? "Running" : "Stopped");
334  e.setAttribute("RegExpPattern", m_regExp.pattern());
335 
336 #ifdef HAVE_NEPOMUK
337  QDomElement tags = e.ownerDocument().createElement("Tags");
338  for(QMap<QUrl, Nepomuk2::Tag>::const_iterator i = m_tags.constBegin(); i != m_tags.constEnd(); i++)
339  {
340  QDomElement tag = e.ownerDocument().createElement("Tag");
341  QDomText text = e.ownerDocument().createTextNode(i.key().toString());
342  tag.appendChild(text);
343  tags.appendChild(tag);
344  }
345  e.appendChild(tags);
346 #endif //HAVE_NEPOMUK
347 
348  iterator it = begin();
349  iterator itEnd = end();
350 
351  for( ; it!=itEnd; ++it )
352  {
353  Transfer* transfer = static_cast<Transfer*>(*it);
354  kDebug(5001) << " --> " << name() << " transfer: " << transfer->source();
355  QDomElement t = e.ownerDocument().createElement("Transfer");
356  e.appendChild(t);
357  transfer->save(t);
358  }
359 }
360 
361 void TransferGroup::load(const QDomElement & e)
362 {
363  kDebug(5001) << "TransferGroup::load";
364 
365  m_name = e.attribute("Name");
366  m_defaultFolder = e.attribute("DefaultFolder");
367  m_visibleDownloadLimit = e.attribute("DownloadLimit").toInt();
368  m_visibleUploadLimit = e.attribute("UploadLimit").toInt();
369  if (!e.attribute("Icon").isEmpty())
370  m_iconName = e.attribute("Icon");
371 
372  if (e.attribute("Status") == "Running")
373  setStatus(JobQueue::Running);
374  else
375  setStatus(JobQueue::Stopped);
376 
377  m_regExp.setPattern(e.attribute("RegExpPattern"));
378 
379 #ifdef HAVE_NEPOMUK
380  QDomNodeList tagsNodeList = e.elementsByTagName("Tags").at(0).toElement().elementsByTagName("Tag");
381  for( uint i = 0; i < tagsNodeList.length(); ++i )
382  {
383  QString tag = tagsNodeList.item(i).toElement().text();
384  if (!tag.isEmpty())
385  {
386  m_tags.insert(tag, Nepomuk2::Tag(tag));
387  }
388  }
389 #endif //HAVE_NEPOMUK
390 
391  QDomNodeList nodeList = e.elementsByTagName("Transfer");
392  int nItems = nodeList.length();
393 
394  QList<QDomElement> elements;
395  for (int i = 0; i < nItems; ++i) {
396  elements << nodeList.item(i).toElement();
397  }
398 
399  kDebug(5001) << "TransferGroup::load ->" << "add" << nItems << "transfers";
400  KGet::addTransfers(elements, name());
401 }
TransferGroup::downloadLimit
int downloadLimit(Transfer::SpeedLimit limit) const
Definition: transfergroup.cpp:223
Transfer::source
const KUrl & source() const
Definition: transfer.h:148
JobQueue::runningJobs
const QList< Job * > runningJobs()
Definition: jobqueue.cpp:29
TransferGroup::move
void move(Transfer *transfer, Transfer *after)
Moves a transfer in the list.
Definition: transfergroup.cpp:153
TransferGroup::TransferGroup
TransferGroup(TransferTreeModel *model, Scheduler *parent, const QString &name=QString())
Definition: transfergroup.cpp:28
Scheduler
Scheduler class: what handle all the jobs in kget.
Definition: scheduler.h:32
Transfer::setUploadLimit
void setUploadLimit(int ulLimit, SpeedLimit limit)
Set the Transfer's UploadLimit.
Definition: transfer.cpp:144
TransferGroup::~TransferGroup
virtual ~TransferGroup()
Definition: transfergroup.cpp:40
TransferGroupHandler
Definition: transfergrouphandler.h:30
Transfer::VisibleSpeedLimit
Definition: transfer.h:90
Transfer::capabilities
Capabilities capabilities() const
Returns the capabilities this Transfer supports.
Definition: transfer.h:111
TransferGroup::remove
void remove(Transfer *transfer)
Removes the given transfer from the list of the transfers.
Definition: transfergroup.cpp:135
TransferGroup::setDownloadLimit
void setDownloadLimit(int dlLimit, Transfer::SpeedLimit limit)
Set a Download-Limit for the group.
Definition: transfergroup.cpp:202
Job
Definition: job.h:35
Transfer::uploadLimit
int uploadLimit(SpeedLimit limit) const
Definition: transfer.cpp:168
TransferGroup::name
const QString & name()
Definition: transfergroup.h:163
JobQueue::move
void move(Job *job, Job *after)
Moves a job in the queue.
Definition: jobqueue.cpp:123
JobQueue::Running
Definition: jobqueue.h:36
Transfer::setDownloadLimit
void setDownloadLimit(int dlLimit, SpeedLimit limit)
Set the Transfer's UploadLimit, which are displayed in the GUI.
Definition: transfer.cpp:156
JobQueue::Status
Status
Definition: jobqueue.h:36
TransferGroup::setStatus
void setStatus(Status queueStatus)
This function is reimplemented by JobQueue::setStatus.
Definition: transfergroup.cpp:95
TransferTreeModel
Definition: transfertreemodel.h:108
TransferGroup::append
void append(Transfer *transfer)
Appends a new transfer to the list of the transfers.
Definition: transfergroup.cpp:102
Transfer::downloadSpeed
int downloadSpeed() const
Definition: transfer.h:179
TransferGroup::load
void load(const QDomElement &e)
Adds all the groups in the given QDomNode * to the group.
Definition: transfergroup.cpp:361
TransferGroup::calculateSpeedLimits
void calculateSpeedLimits()
Calculates the whole SpeedLimits.
Definition: transfergroup.cpp:231
TransferGroup::prepend
void prepend(Transfer *transfer)
Prepends a new transfer to the list of the transfers.
Definition: transfergroup.cpp:121
TransferGroup::calculateDownloadLimit
void calculateDownloadLimit()
Calculates the DownloadLimits.
Definition: transfergroup.cpp:238
JobQueue::remove
void remove(Job *job)
removes a job from the current queue
Definition: jobqueue.cpp:107
TransferGroup::uploadLimit
int uploadLimit(Transfer::SpeedLimit limit) const
Definition: transfergroup.cpp:215
transfergrouphandler.h
TransferGroup::setUploadLimit
void setUploadLimit(int ulLimit, Transfer::SpeedLimit limit)
Set a Upload-Limit for the group.
Definition: transfergroup.cpp:189
Transfer::save
virtual void save(const QDomElement &element)
Saves this transfer to the given QDomNode.
Definition: transfer.cpp:230
TransferGroup::save
void save(QDomElement e)
Saves this group object to the given QDomNode.
Definition: transfergroup.cpp:324
JobQueue::begin
iterator begin()
Definition: jobqueue.h:57
transfergroup.h
Transfer::InvisibleSpeedLimit
Definition: transfer.h:91
Transfer::SpeedLimit
SpeedLimit
Definition: transfer.h:88
TransferGroup::supportsSpeedLimits
bool supportsSpeedLimits()
Definition: transfergroup.cpp:81
JobQueue::insert
void insert(Job *job, Job *after)
inserts a job to the current queue after the given job
Definition: jobqueue.cpp:98
JobQueue::append
void append(Job *job)
appends a job to the current queue
Definition: jobqueue.cpp:77
JobQueue::Stopped
Definition: jobqueue.h:36
JobQueue::status
Status status() const
Definition: jobqueue.h:52
TransferGroup::findTransfer
Transfer * findTransfer(const KUrl &src)
Finds the first transfer with source src.
Definition: transfergroup.cpp:161
Transfer::uploadSpeed
int uploadSpeed() const
Definition: transfer.h:181
Transfer::dest
const KUrl & dest() const
Definition: transfer.h:149
JobQueue
Definition: jobqueue.h:32
KGet::addTransfers
static QList< TransferHandler * > addTransfers(const QList< QDomElement > &elements, const QString &groupName=QString())
Adds new transfers to the KGet, it is assumed that this takes place because of loading that results i...
Definition: kget.cpp:264
TransferGroup::insert
void insert(Transfer *transfer, Transfer *after)
inserts a transfer to the current group after the given transfer
Definition: transfergroup.cpp:128
TransferGroup::Gc_Status
Definition: transfergroup.h:55
kget.h
Transfer::Cap_SpeedLimit
Definition: transfer.h:72
JobQueue::setStatus
virtual void setStatus(Status queueStatus)
Sets the JobQueue status.
Definition: jobqueue.cpp:44
TransferGroup::downloadSpeed
int downloadSpeed()
Definition: transfergroup.cpp:44
JobQueue::end
iterator end()
Definition: jobqueue.h:62
JobQueue::prepend
void prepend(Job *job)
prepends a job to the current queue
Definition: jobqueue.cpp:91
TransferGroup::calculateUploadLimit
void calculateUploadLimit()
Calculates the DownloadLimits.
Definition: transfergroup.cpp:281
Transfer::downloadLimit
int downloadLimit(SpeedLimit limit) const
Definition: transfer.cpp:176
TransferGroup::uploadSpeed
int uploadSpeed()
Definition: transfergroup.cpp:56
TransferGroup::findTransferByDestination
Transfer * findTransferByDestination(const KUrl &dest)
Finds the first transfer with destination dest.
Definition: transfergroup.cpp:175
Transfer
Definition: transfer.h:36
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:53:17 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kget

Skip menu "kget"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal