• 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
transfer.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE project
2 
3  Copyright (C) 2004 Dario Massarin <nekkar@libero.it>
4  Copyright (C) 2008 - 2011 Lukas Appelhans <l.appelhans@gmx.de>
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/transfer.h"
13 
14 #include "settings.h"
15 
16 #include "core/transferhandler.h"
17 #include "core/plugin/transferfactory.h"
18 #include "core/scheduler.h"
19 
20 #include <kiconloader.h>
21 #include <klocale.h>
22 
23 #include <QDomElement>
24 #include <QTime>
25 
26 #ifdef HAVE_NEPOMUK
27 #include "nepomukhandler.h"
28 #endif
29 
30 struct StatusStrings
31 {
32  const char * context;
33  const char * name;
34 };
35 
36 const StatusStrings STATUSTEXTS[] = {
37  {"", I18N_NOOP("Downloading....")},
38  {I18N_NOOP2_NOSTRIP("transfer state: delayed", "Delayed")},
39  {I18N_NOOP2_NOSTRIP("transfer state: stopped", "Stopped")},
40  {I18N_NOOP2_NOSTRIP("transfer state: aborted", "Aborted")},
41  {I18N_NOOP2_NOSTRIP("transfer state: finished", "Finished")},
42  {"", ""},//TODO: Add FinishedKeepAlive status
43  {I18N_NOOP2_NOSTRIP("changing the destination of the file", "Changing destination")}
44 };
45 const QStringList STATUSICONS = QStringList() << "media-playback-start" << "view-history" << "process-stop" << "dialog-error" << "dialog-ok" << "media-playback-start" << "media-playback-pause";
46 
47 Transfer::Transfer(TransferGroup * parent, TransferFactory * factory,
48  Scheduler * scheduler, const KUrl & source, const KUrl & dest,
49  const QDomElement * e)
50  : Job(scheduler, parent),
51  m_source(source), m_dest(dest),
52  m_totalSize(0), m_downloadedSize(0), m_uploadedSize(0),
53  m_percent(0), m_downloadSpeed(0), m_uploadSpeed(0),
54  m_uploadLimit(0), m_downloadLimit(0), m_isSelected(false),
55  m_capabilities(0), m_visibleUploadLimit(0), m_visibleDownloadLimit(0),
56  m_ratio(0), m_handler(0), m_factory(factory)
57 #ifdef HAVE_NEPOMUK
58  , m_nepomukHandler(0)
59 #endif
60 {
61  Q_UNUSED(e)
62 }
63 
64 Transfer::~Transfer()
65 {
66 }
67 
68 void Transfer::setCapabilities(Capabilities capabilities)
69 {
70  if (m_capabilities != capabilities) {
71  m_capabilities = capabilities;
72  emit capabilitiesChanged();
73  }
74 }
75 
76 void Transfer::create()
77 {
78 #ifdef HAVE_NEPOMUK
79  if (!m_nepomukHandler)
80  m_nepomukHandler = new NepomukHandler(this);
81 #endif
82 
83  init();
84 }
85 
86 void Transfer::destroy(DeleteOptions options)
87 {
88  deinit(options);
89 
90 #ifdef HAVE_NEPOMUK
91  nepomukHandler()->deinit();
92 #endif //HAVE_NEPOMUK
93 }
94 
95 void Transfer::init()//TODO think about e, maybe not have it at all in the constructor?
96 {
97 
98 }
99 
100 #ifdef HAVE_NEPOMUK
101 void Transfer::setNepomukHandler(NepomukHandler *handler)
102 {
103  delete(m_nepomukHandler);
104  m_nepomukHandler = handler;
105 }
106 #endif //HAVE_NEPOMUK
107 
108 bool Transfer::setDirectory(const KUrl& newDirectory)
109 {
110  Q_UNUSED(newDirectory)
111 
112  //the standard implemention always returns false
113  return false;
114 }
115 
116 int Transfer::elapsedTime() const
117 {
118  if (status() == Job::Running)
119  return m_runningTime.elapsed() / 1000;
120 
121  return m_runningSeconds;
122 }
123 
124 int Transfer::averageDownloadSpeed() const
125 {
126  const int runningSeconds = elapsedTime();
127  if (runningSeconds)
128  {
129  return m_totalSize / runningSeconds;
130  }
131 
132  return 0;
133 }
134 
135 QHash<KUrl, QPair<bool, int> > Transfer::availableMirrors(const KUrl &file) const
136 {
137  Q_UNUSED(file)
138 
139  QHash<KUrl, QPair<bool, int> > available;
140  available[m_source] = QPair<bool, int>(true, 1);
141  return available;
142 }
143 
144 void Transfer::setUploadLimit(int ulLimit, SpeedLimit limit)
145 {
146  if (limit == Transfer::VisibleSpeedLimit)
147  m_visibleUploadLimit = ulLimit;
148  if (ulLimit < m_uploadLimit || m_uploadLimit == 0)
149  m_uploadLimit = ulLimit;
150  else
151  m_uploadLimit = ulLimit;
152 
153  setSpeedLimits(m_uploadLimit, m_downloadLimit);
154 }
155 
156 void Transfer::setDownloadLimit(int dlLimit, SpeedLimit limit)
157 {
158  if (limit == Transfer::VisibleSpeedLimit)
159  m_visibleDownloadLimit = dlLimit;
160  if (dlLimit < m_downloadLimit || m_downloadLimit == 0)
161  m_downloadLimit = dlLimit;
162  else
163  m_downloadLimit = dlLimit;
164 
165  setSpeedLimits(m_uploadLimit, m_downloadLimit);
166 }
167 
168 int Transfer::uploadLimit(SpeedLimit limit) const
169 {
170  if (limit == Transfer::VisibleSpeedLimit)
171  return m_visibleUploadLimit;
172 
173  return m_uploadLimit;
174 }
175 
176 int Transfer::downloadLimit(SpeedLimit limit) const
177 {
178  if (limit == Transfer::VisibleSpeedLimit)
179  return m_visibleDownloadLimit;
180 
181  return m_downloadLimit;
182 }
183 
184 void Transfer::setMaximumShareRatio(double ratio)
185 {
186  m_ratio = ratio;
187  checkShareRatio();
188 }
189 
190 void Transfer::checkShareRatio()
191 {
192  if (m_downloadedSize == 0 || m_ratio == 0)
193  return;
194 
195  if (m_uploadedSize / m_downloadedSize >= m_ratio)
196  setDownloadLimit(1, Transfer::InvisibleSpeedLimit);//If we set it to 0 we would have no limit xD
197  else
198  setDownloadLimit(0, Transfer::InvisibleSpeedLimit);
199 }
200 
201 void Transfer::setLog(const QString& message, Transfer::LogLevel level)
202 {
203  QString msg("<font color=\"blue\">" + QTime::currentTime().toString() + "</font> : ");
204  if (level == Log_Error)
205  {
206  msg += "<font color=\"red\">" + message + "</font>";
207  }
208  if (level == Log_Warning)
209  {
210  msg += "<font color=\"yellow\">" + message + "</font>";
211  } else {
212  msg += message;
213  }
214  m_log << msg;
215 }
216 
217 TransferHandler * Transfer::handler()
218 {
219  if(!m_handler)
220  m_handler = m_factory->createTransferHandler(this, scheduler());
221 
222  return m_handler;
223 }
224 
225 TransferTreeModel * Transfer::model()
226 {
227  return group()->model();
228 }
229 
230 void Transfer::save(const QDomElement &element)
231 {
232  QDomElement e = element;
233  e.setAttribute("Source", m_source.url());
234  e.setAttribute("Dest", m_dest.url());
235  e.setAttribute("TotalSize", m_totalSize);
236  e.setAttribute("DownloadedSize", m_downloadedSize);
237  e.setAttribute("UploadedSize", m_uploadedSize);
238  e.setAttribute("DownloadLimit", m_visibleDownloadLimit);
239  e.setAttribute("UploadLimit", m_visibleUploadLimit);
240  e.setAttribute("ElapsedTime", status() == Job::Running ? m_runningTime.elapsed() / 1000 : m_runningSeconds);
241  e.setAttribute("Policy", policy() == Job::Start ? "Start" : (policy() == Job::Stop ? "Stop" : "None"));
242 }
243 
244 void Transfer::load(const QDomElement *element)
245 {
246  if (!element)
247  {
248  setStatus(status(), i18nc("transfer state: stopped", "Stopped"), SmallIcon("process-stop"));
249  setStartStatus(status());
250  return;
251  }
252 
253  const QDomElement e = *element;
254 
255  m_source = KUrl(e.attribute("Source"));
256  m_dest = KUrl(e.attribute("Dest"));
257 
258  m_totalSize = e.attribute("TotalSize").toULongLong();
259  m_downloadedSize = e.attribute("DownloadedSize").toULongLong();
260  m_uploadedSize = e.attribute("UploadedSize").toULongLong();
261  m_percent = (m_totalSize ? ((100.0 * m_downloadedSize) / m_totalSize) : 0);
262 
263  if ((m_totalSize == m_downloadedSize) && (m_totalSize != 0)) {
264  setStartStatus(Job::Finished);
265  setStatus(startStatus());
266  } else {
267  setStatus(status(), i18nc("transfer state: stopped", "Stopped"), SmallIcon("process-stop"));
268  setStartStatus(status());
269  }
270  setUploadLimit(e.attribute("UploadLimit").toInt(), Transfer::VisibleSpeedLimit);
271  setDownloadLimit(e.attribute("DownloadLimit").toInt(), Transfer::VisibleSpeedLimit);
272  m_runningSeconds = e.attribute("ElapsedTime").toInt();
273  if (Settings::startupAction() == 1)
274  {
275  setPolicy(Job::Start);
276  }
277  else if (Settings::startupAction() == 2)
278  {
279  setPolicy(Job::Stop);
280  }
281  else
282  {
283  if (e.attribute("Policy") == "Start")
284  setPolicy(Job::Start);
285  else if (e.attribute("Policy") == "Stop")
286  setPolicy(Job::Stop);
287  else
288  setPolicy(Job::None);
289  }
290 }
291 
292 void Transfer::setStatus(Job::Status jobStatus, const QString &text, const QPixmap &pix)
293 {
294  const bool statusChanged = (status() != jobStatus);
295  QString statusText = text;
296  if (statusText.isEmpty()) {
297  statusText = i18nc(STATUSTEXTS[jobStatus].context, STATUSTEXTS[jobStatus].name);
298  }
299 
300  //always prefer pix, if it is set
301  if (!pix.isNull()) {
302  m_statusPixmap = pix;
303  } else if (statusChanged || m_statusPixmap.isNull()) {
304  m_statusPixmap = SmallIcon(STATUSICONS[jobStatus]);
305  }
306 
307  m_statusText = statusText;
308 
309  if (jobStatus == Job::Running && status() != Job::Running)
310  {
311  m_runningTime.restart();
312  m_runningTime.addSecs(m_runningSeconds);
313  }
314  if (jobStatus != Job::Running && status() == Job::Running)
315  m_runningSeconds = m_runningTime.elapsed() / 1000;
327  Job::setStatus(jobStatus);
328 
329 #ifdef HAVE_NEPOMUK
330  const bool loadedFinished = ((startStatus() == Job::Finished) || (startStatus() == Job::FinishedKeepAlive));
331  const bool isFinished = ((jobStatus == Job::Finished) || (jobStatus == Job::FinishedKeepAlive));
332  if (!loadedFinished && statusChanged && isFinished) {
333  m_nepomukHandler->saveFileProperties();
334  }
335 #endif
336 }
337 
338 void Transfer::setTransferChange(ChangesFlags change, bool postEvent)
339 {
340  if (change & Tc_DownloadedSize || change & Tc_Status) {
341  change = change | Tc_RemainingTime;
342  }
343  handler()->setTransferChange(change, postEvent);
344 }
345 
346 QString Transfer::statusText(Job::Status status)
347 {
348  return i18nc(STATUSTEXTS[status].context, STATUSTEXTS[status].name);
349 }
350 
351 QPixmap Transfer::statusPixmap(Job::Status status)
352 {
353  return SmallIcon(STATUSICONS[status]);
354 }
Transfer::ChangesFlags
int ChangesFlags
Definition: transfer.h:100
TransferHandler
Class TransferHandler:
Definition: transferhandler.h:48
Transfer::statusPixmap
QPixmap statusPixmap() const
Definition: transfer.h:173
Transfer::m_dest
KUrl m_dest
Definition: transfer.h:357
TransferGroup
class TransferGroup:
Definition: transfergroup.h:46
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
Job::Finished
The job is stopped, but this also indicates that it stopped because an error occurred.
Definition: job.h:47
Transfer::setSpeedLimits
virtual void setSpeedLimits(int uploadLimit, int downloadLimit)
Function used to set the SpeedLimits to the transfer.
Definition: transfer.h:353
Transfer::VisibleSpeedLimit
Definition: transfer.h:90
Transfer::capabilities
Capabilities capabilities() const
Returns the capabilities this Transfer supports.
Definition: transfer.h:111
Transfer::m_downloadedSize
KIO::filesize_t m_downloadedSize
Definition: transfer.h:361
Job::Status
Status
The status property describes the current job status.
Definition: job.h:42
Job::Stop
The scheduler should start this job even if its queue isn't in a Running status.
Definition: job.h:60
Transfer::LogLevel
LogLevel
Definition: transfer.h:81
Transfer::elapsedTime
virtual int elapsedTime() const
Definition: transfer.cpp:116
Transfer::setDirectory
virtual bool setDirectory(const KUrl &newDirectory)
Move the download to the new destination.
Definition: transfer.cpp:108
Transfer::Log_Warning
Definition: transfer.h:84
Job::FinishedKeepAlive
The job exited from its Running state successfully.
Definition: job.h:48
Transfer::Tc_RemainingTime
Definition: transfer.h:57
Job
Definition: job.h:35
nepomukhandler.h
Transfer::uploadLimit
int uploadLimit(SpeedLimit limit) const
Definition: transfer.cpp:168
Transfer::destroy
void destroy(DeleteOptions options)
This functions gets called whenever a Transfer is going to be deleted.
Definition: transfer.cpp:86
Transfer::averageDownloadSpeed
int averageDownloadSpeed() const
Definition: transfer.cpp:124
Job::scheduler
Scheduler * scheduler() const
Definition: job.h:106
Transfer::group
TransferGroup * group() const
The owner group.
Definition: transfer.h:257
Transfer::setDownloadLimit
void setDownloadLimit(int dlLimit, SpeedLimit limit)
Set the Transfer's UploadLimit, which are displayed in the GUI.
Definition: transfer.cpp:156
Job::setStartStatus
void setStartStatus(Status jobStatus)
Definition: job.cpp:48
TransferTreeModel
Definition: transfertreemodel.h:108
Job::policy
Policy policy() const
Definition: job.h:95
Transfer::m_uploadLimit
int m_uploadLimit
Definition: transfer.h:367
scheduler.h
Transfer::m_totalSize
KIO::filesize_t m_totalSize
Definition: transfer.h:360
Transfer::Tc_Status
Definition: transfer.h:53
TransferGroup::model
TransferTreeModel * model()
Definition: transfergroup.h:288
transferfactory.h
Transfer::availableMirrors
virtual QHash< KUrl, QPair< bool, int > > availableMirrors(const KUrl &file) const
The mirrors that are available bool if it is used, int how many paralell connections are allowed to t...
Definition: transfer.cpp:135
Job::Running
Definition: job.h:43
Job::startStatus
Status startStatus() const
Definition: job.h:94
Transfer::load
virtual void load(const QDomElement *element)
Loads the transfer's info from the QDomElement.
Definition: transfer.cpp:244
Job::setStatus
void setStatus(Status jobStatus)
Definition: job.cpp:34
Transfer::save
virtual void save(const QDomElement &element)
Saves this transfer to the given QDomNode.
Definition: transfer.cpp:230
Transfer::deinit
virtual void deinit(DeleteOptions options)
This function is called before the deletion of a Transfer In transfer plugins you can put here whatev...
Definition: transfer.h:138
Job::None
The scheduler shouldn't never start this job, even if if its queue is in a Running status...
Definition: job.h:62
Transfer::InvisibleSpeedLimit
Definition: transfer.h:91
STATUSTEXTS
const StatusStrings STATUSTEXTS[]
Definition: transfer.cpp:36
Transfer::SpeedLimit
SpeedLimit
Definition: transfer.h:88
Transfer::capabilitiesChanged
void capabilitiesChanged()
Emitted when the capabilities of the Transfer change.
Transfer::checkShareRatio
void checkShareRatio()
Recalculate the share ratio.
Definition: transfer.cpp:190
Transfer::setTransferChange
virtual void setTransferChange(ChangesFlags change, bool postEvent=false)
Makes the TransferHandler associated with this transfer know that a change in this transfer has occur...
Definition: transfer.cpp:338
transferhandler.h
Transfer::m_log
QStringList m_log
Definition: transfer.h:359
Transfer::init
virtual void init()
This function is called after the creation of a Transfer In transfer plugins you can put here whateve...
Definition: transfer.cpp:95
Transfer::statusText
QString statusText() const
Definition: transfer.h:172
STATUSICONS
const QStringList STATUSICONS
Definition: transfer.cpp:45
Transfer::~Transfer
virtual ~Transfer()
Definition: transfer.cpp:64
Transfer::setMaximumShareRatio
void setMaximumShareRatio(double ratio)
Set the maximum share-ratio.
Definition: transfer.cpp:184
settings.h
Job::status
Status status() const
Definition: job.h:93
Transfer::handler
TransferHandler * handler()
Definition: transfer.cpp:217
Job::setPolicy
void setPolicy(Policy jobPolicy)
Definition: job.cpp:54
Transfer::Transfer
Transfer(TransferGroup *parent, TransferFactory *factory, Scheduler *scheduler, const KUrl &src, const KUrl &dest, const QDomElement *e=0)
Definition: transfer.cpp:47
Transfer::setStatus
void setStatus(Job::Status jobStatus, const QString &text=QString(), const QPixmap &pix=QPixmap())
Sets the Job status to jobStatus, the status text to text and the status pixmap to pix...
Definition: transfer.cpp:292
transfer.h
Transfer::Tc_DownloadedSize
Definition: transfer.h:63
Transfer::Log_Error
Definition: transfer.h:85
Transfer::m_percent
int m_percent
Definition: transfer.h:363
NepomukHandler
Definition: nepomukhandler.h:24
TransferFactory::createTransferHandler
virtual TransferHandler * createTransferHandler(Transfer *transfer, Scheduler *scheduler)
Definition: transferfactory.cpp:39
Settings::startupAction
static int startupAction()
Get StartupAction.
Definition: settings.h:525
TransferFactory
TransferFactory.
Definition: transferfactory.h:52
Transfer::m_source
KUrl m_source
Definition: transfer.h:356
Transfer::setCapabilities
void setCapabilities(Capabilities capabilities)
Sets the capabilities and automatically emits capabilitiesChanged.
Definition: transfer.cpp:68
Transfer::create
void create()
This functions gets called whenever a Transfer gets created.
Definition: transfer.cpp:76
Transfer::m_downloadLimit
int m_downloadLimit
Definition: transfer.h:368
Transfer::setLog
void setLog(const QString &message, Transfer::LogLevel level=Log_Info)
Set Transfer history.
Definition: transfer.cpp:201
Transfer::model
TransferTreeModel * model()
Definition: transfer.cpp:225
Transfer::downloadLimit
int downloadLimit(SpeedLimit limit) const
Definition: transfer.cpp:176
Job::Start
Definition: job.h:58
Transfer::m_uploadedSize
KIO::filesize_t m_uploadedSize
Definition: transfer.h:362
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