• 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
  • transfer-plugins
  • multisegmentkio
transfermultisegkio.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) 2006 Manolo Valdes <nolis71cu@gmail.com>
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 "transfermultisegkio.h"
13 
14 #include "multisegkiosettings.h"
15 #include "core/kget.h"
16 #include "core/transferdatasource.h"
17 // #include "mirrors.h"
18 #include "core/filemodel.h"
19 #include "core/verifier.h"
20 #include "core/signature.h"
21 
22 #include <kiconloader.h>
23 #include <KIO/CopyJob>
24 #include <KIO/NetAccess>
25 #include <klocale.h>
26 #include <KMessageBox>
27 #include <kdebug.h>
28 
29 #include <QDomElement>
30 #include <QFile>
31 
32 TransferMultiSegKio::TransferMultiSegKio(TransferGroup *parent, TransferFactory *factory,
33  Scheduler *scheduler, const KUrl &source, const KUrl &dest,
34  const QDomElement *e)
35  : Transfer(parent, factory, scheduler, source, dest, e),
36  m_movingFile(false),
37  m_searchStarted(false),
38  m_verificationSearch(false),
39  m_dataSourceFactory(0),
40  m_fileModel(0)
41 {
42 }
43 
44 void TransferMultiSegKio::init()
45 {
46  Transfer::init();
47 
48  if (!m_dataSourceFactory) {
49  m_dataSourceFactory = new DataSourceFactory(this, m_dest);
50  connect(m_dataSourceFactory, SIGNAL(capabilitiesChanged()), this, SLOT(slotUpdateCapabilities()));
51  connect(m_dataSourceFactory, SIGNAL(dataSourceFactoryChange(Transfer::ChangesFlags)), this, SLOT(slotDataSourceFactoryChange(Transfer::ChangesFlags)));
52  connect(m_dataSourceFactory->verifier(), SIGNAL(verified(bool)), this, SLOT(slotVerified(bool)));
53  connect(m_dataSourceFactory, SIGNAL(log(QString,Transfer::LogLevel)), this, SLOT(setLog(QString,Transfer::LogLevel)));
54 
55  m_dataSourceFactory->addMirror(m_source, MultiSegKioSettings::segments());
56 
57  slotUpdateCapabilities();
58  }
59 }
60 
61 void TransferMultiSegKio::deinit(Transfer::DeleteOptions options)
62 {
63  if (options & Transfer::DeleteFiles)//if the transfer is not finished, we delete the *.part-file
64  {
65  m_dataSourceFactory->deinit();
66  }//TODO: Ask the user if he/she wants to delete the *.part-file? To discuss (boom1992)
67 }
68 
69 void TransferMultiSegKio::start()
70 {
71  kDebug(5001) << "Start TransferMultiSegKio";
72  if (status() == Running) {
73  return;
74  }
75 
76  m_dataSourceFactory->start();
77 
78  if (MultiSegKioSettings::useSearchEngines() && !m_searchStarted) {
79  m_searchStarted = true;
80  QDomDocument doc;
81  QDomElement element = doc.createElement("TransferDataSource");
82  element.setAttribute("type", "search");
83  doc.appendChild(element);
84 
85  TransferDataSource *mirrorSearch = KGet::createTransferDataSource(m_source, element, this);
86  if (mirrorSearch) {
87  connect(mirrorSearch, SIGNAL(data(QList<KUrl>)), this, SLOT(slotSearchUrls(QList<KUrl>)));
88  mirrorSearch->start();
89  }
90  }
91 }
92 
93 void TransferMultiSegKio::stop()
94 {
95  kDebug(5001);
96 
97  if ((status() == Stopped) || (status() == Finished)) {
98  return;
99  }
100 
101  if (m_dataSourceFactory)
102  {
103  m_dataSourceFactory->stop();
104  }
105 }
106 
107 bool TransferMultiSegKio::repair(const KUrl &file)
108 {
109  if (!file.isValid() || (m_dest == file))
110  {
111  if (m_dataSourceFactory && (m_dataSourceFactory->verifier()->status() == Verifier::NotVerified))
112  {
113  m_dataSourceFactory->repair();
114  return true;
115  }
116  }
117 
118  return false;
119 }
120 
121 bool TransferMultiSegKio::setDirectory(const KUrl& newDirectory)
122 {
123  KUrl newDest = newDirectory;
124  newDest.addPath(m_dest.fileName());
125  return setNewDestination(newDest);
126 }
127 
128 bool TransferMultiSegKio::setNewDestination(const KUrl &newDestination)
129 {
130  kDebug(5001) << "New destination: " << newDestination;
131  if (newDestination.isValid() && (newDestination != dest()) && m_dataSourceFactory)
132  {
133  m_movingFile = true;
134  stop();
135  m_dataSourceFactory->setNewDestination(newDestination);
136 
137  m_dest = newDestination;
138 
139  if (m_fileModel)
140  {
141  m_fileModel->setDirectory(directory());
142  }
143 
144  setTransferChange(Tc_FileName);
145  return true;
146  }
147  return false;
148 }
149 
150 void TransferMultiSegKio::load(const QDomElement *element)
151 {
152  kDebug(5001);
153 
154  Transfer::load(element);
155  m_dataSourceFactory->load(element);
156 }
157 
158 void TransferMultiSegKio::save(const QDomElement &element)
159 {
160  kDebug(5001);
161  Transfer::save(element);
162  m_dataSourceFactory->save(element);
163 }
164 
165 void TransferMultiSegKio::slotDataSourceFactoryChange(Transfer::ChangesFlags change)
166 {
167  if (change & Tc_FileName) {
168  QList<KUrl> urls = m_dataSourceFactory->mirrors().keys();
169  QString filename = urls.first().fileName();
170  if (filename.isEmpty())
171  return;
172  foreach (const KUrl url, urls) {
173  if (filename != url.fileName())
174  return;
175  }
176  KUrl path = m_dest.directory();
177  path.addPath(filename);
178  setNewDestination(path);
179  }
180  if (change & Tc_Source) {
181  m_source = KUrl();
182  QHash< KUrl, QPair<bool, int> >::const_iterator it = m_dataSourceFactory->mirrors().constBegin();
183  QHash< KUrl, QPair<bool, int> >::const_iterator end = m_dataSourceFactory->mirrors().constEnd();
184  for (; it != end; it++) {
185  if (it.value().first) {
186  m_source = it.key();
187  break;
188  }
189  }
190  }
191  if (change & Tc_Status) {
192  setStatus(m_dataSourceFactory->status());
193 
194  if (m_fileModel) {
195  QModelIndex statusIndex = m_fileModel->index(m_dest, FileItem::Status);
196  m_fileModel->setData(statusIndex, status());
197  }
198  }
199  if (change & Tc_TotalSize) {
200  m_totalSize = m_dataSourceFactory->size();
201  if (m_fileModel) {
202  QModelIndex sizeIndex = m_fileModel->index(m_dest, FileItem::Size);
203  m_fileModel->setData(sizeIndex, static_cast<qlonglong>(m_totalSize));
204  }
205  }
206  if (change & Tc_DownloadedSize) {
207  KIO::filesize_t processedSize = m_dataSourceFactory->downloadedSize();
208  //only start the verification search _after_ data has come in, that way only connections
209  //are requested if there is already a successful one
210  if ((processedSize != m_downloadedSize) && !m_verificationSearch && MultiSegKioSettings::useSearchVerification()) {
211  m_verificationSearch = true;
212  QDomDocument doc;
213  QDomElement element = doc.createElement("TransferDataSource");
214  element.setAttribute("type", "checksumsearch");
215  doc.appendChild(element);
216 
217  TransferDataSource *checksumSearch = KGet::createTransferDataSource(m_source, element, this);
218  if (checksumSearch) {
219  connect(checksumSearch, SIGNAL(data(QString,QString)), this, SLOT(slotChecksumFound(QString,QString)));
220  checksumSearch->start();
221  }
222  }
223  m_downloadedSize = m_dataSourceFactory->downloadedSize();
224  }
225  if (change & Tc_Percent) {
226  m_percent = m_dataSourceFactory->percent();
227  }
228  if (change & Tc_DownloadSpeed) {
229  kDebug(5001) << "speed:" << m_downloadSpeed;
230  m_downloadSpeed = m_dataSourceFactory->currentSpeed();
231  }
232 
233  setTransferChange(change, true);
234 }
235 
236 void TransferMultiSegKio::slotVerified(bool isVerified)
237 {
238  if (m_fileModel) {
239  QModelIndex checksumVerified = m_fileModel->index(m_dest, FileItem::ChecksumVerified);
240  m_fileModel->setData(checksumVerified, verifier()->status());
241  }
242 
243  if (!isVerified) {
244  QString text = i18n("The download (%1) could not be verified. Do you want to repair it?", m_dest.fileName());
245 
246  if (!verifier()->partialChunkLength()) {
247  text = i18n("The download (%1) could not be verified. Do you want to redownload it?", m_dest.fileName());
248  }
249  if (KMessageBox::warningYesNo(0,
250  text,
251  i18n("Verification failed.")) == KMessageBox::Yes) {
252  repair();
253  }
254  }
255 }
256 
257 void TransferMultiSegKio::slotSearchUrls(const QList<KUrl> &urls)
258 {
259  kDebug(5001) << "Found " << urls.size() << " urls.";
260 
261  foreach (const KUrl &url, urls)
262  {
263  m_dataSourceFactory->addMirror(url, MultiSegKioSettings::segments());
264  }
265 }
266 
267 void TransferMultiSegKio::slotChecksumFound(QString type, QString checksum)
268 {
269  m_dataSourceFactory->verifier()->addChecksum(type, checksum);
270 }
271 
272 QHash<KUrl, QPair<bool, int> > TransferMultiSegKio::availableMirrors(const KUrl &file) const
273 {
274  Q_UNUSED(file)
275 
276  return m_dataSourceFactory->mirrors();
277 }
278 
279 
280 void TransferMultiSegKio::setAvailableMirrors(const KUrl &file, const QHash<KUrl, QPair<bool, int> > &mirrors)
281 {
282  Q_UNUSED(file)
283 
284  m_dataSourceFactory->setMirrors(mirrors);
285 
286  m_source = KUrl();
287  QHash< KUrl, QPair<bool, int> >::const_iterator it = mirrors.begin();
288  QHash< KUrl, QPair<bool, int> >::const_iterator end = mirrors.end();
289  for (; it != end; it++) {
290  if (it.value().first) {
291  m_source = it.key();
292  break;
293  }
294  }
295  setTransferChange(Tc_Source, true);
296 }
297 
298 Verifier *TransferMultiSegKio::verifier(const KUrl &file)
299 {
300  Q_UNUSED(file)
301 
302  return m_dataSourceFactory->verifier();
303 }
304 
305 Signature *TransferMultiSegKio::signature(const KUrl &file)
306 {
307  Q_UNUSED(file)
308 
309  return m_dataSourceFactory->signature();
310 }
311 
312 FileModel *TransferMultiSegKio::fileModel()
313 {
314  if (!m_fileModel)
315  {
316  m_fileModel = new FileModel(QList<KUrl>() << m_dest, m_dest.upUrl(), this);
317  connect(m_fileModel, SIGNAL(rename(KUrl,KUrl)), this, SLOT(slotRename(KUrl,KUrl)));
318 
319  QModelIndex statusIndex = m_fileModel->index(m_dest, FileItem::Status);
320  m_fileModel->setData(statusIndex, m_dataSourceFactory->status());
321  QModelIndex sizeIndex = m_fileModel->index(m_dest, FileItem::Size);
322  m_fileModel->setData(sizeIndex, static_cast<qlonglong>(m_dataSourceFactory->size()));
323  QModelIndex checksumVerified = m_fileModel->index(m_dest, FileItem::ChecksumVerified);
324  m_fileModel->setData(checksumVerified, verifier()->status());
325  QModelIndex signatureVerified = m_fileModel->index(m_dest, FileItem::SignatureVerified);
326  m_fileModel->setData(signatureVerified, signature()->status());
327  }
328 
329  return m_fileModel;
330 }
331 
332 void TransferMultiSegKio::slotRename(const KUrl &oldUrl, const KUrl &newUrl)
333 {
334  Q_UNUSED(oldUrl)
335 
336  if (newUrl.isValid() && (newUrl != dest()) && m_dataSourceFactory)
337  {
338  m_movingFile = true;
339  stop();
340  m_dataSourceFactory->setNewDestination(newUrl);
341 
342  m_dest = newUrl;
343 
344  setTransferChange(Tc_FileName);
345  }
346 }
347 
348 void TransferMultiSegKio::slotUpdateCapabilities()
349 {
350  setCapabilities(m_dataSourceFactory->capabilities());
351 }
352 
353 #include "transfermultisegkio.moc"
Transfer::ChangesFlags
int ChangesFlags
Definition: transfer.h:100
DataSourceFactory::save
void save(const QDomElement &element)
Definition: datasourcefactory.cpp:1117
Transfer::Tc_FileName
Definition: transfer.h:52
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
Job::Finished
The job is stopped, but this also indicates that it stopped because an error occurred.
Definition: job.h:47
DataSourceFactory::setMirrors
void setMirrors(const QHash< KUrl, QPair< bool, int > > &mirrors)
Sets the mirrors that should be used/not used for downloading.
Definition: datasourcefactory.cpp:538
Transfer::m_downloadedSize
KIO::filesize_t m_downloadedSize
Definition: transfer.h:361
DataSourceFactory::size
KIO::filesize_t size() const
Definition: datasourcefactory.h:71
Transfer::LogLevel
LogLevel
Definition: transfer.h:81
TransferMultiSegKio::fileModel
FileModel * fileModel()
Definition: transfermultisegkio.cpp:312
DataSourceFactory::percent
ulong percent() const
Definition: datasourcefactory.h:74
TransferDataSource::start
virtual void start()=0
TransferMultiSegKio::repair
bool repair(const KUrl &file=KUrl())
Tries to repair file.
Definition: transfermultisegkio.cpp:107
Verifier::partialChunkLength
KIO::filesize_t partialChunkLength() const
Returns the length of the "best" partialChecksums.
Definition: verifier.cpp:532
DataSourceFactory
This class manages multiple DataSources and saves the received data to the file.
Definition: datasourcefactory.h:38
DataSourceFactory::start
void start()
Definition: datasourcefactory.cpp:193
DataSourceFactory::mirrors
QHash< KUrl, QPair< bool, int > > mirrors() const
Return all mirrors, where bool defines if the mirror is used, while in defines the number of paralell...
Definition: datasourcefactory.cpp:565
transfermultisegkio.h
TransferMultiSegKio::availableMirrors
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: transfermultisegkio.cpp:272
multisegkiosettings.h
TransferDataSource
This Class is an interface for inter-plugins data change.
Definition: transferdatasource.h:26
DataSourceFactory::repair
void repair()
Tries to repair a broken download, via completely redownloading it or only the borken parts...
Definition: datasourcefactory.cpp:889
MultiSegKioSettings::useSearchVerification
static bool useSearchVerification()
Get UseSearchVerification.
Definition: multisegkiosettings.h:87
DataSourceFactory::capabilities
Transfer::Capabilities capabilities() const
The capabilities the DataSourceFactory supports.
Definition: datasourcefactory.h:55
Verifier::status
VerificationStatus status() const
Definition: verifier.cpp:206
Transfer::m_totalSize
KIO::filesize_t m_totalSize
Definition: transfer.h:360
Transfer::log
const QStringList log() const
Transfer history.
TransferMultiSegKio::TransferMultiSegKio
TransferMultiSegKio(TransferGroup *parent, TransferFactory *factory, Scheduler *scheduler, const KUrl &src, const KUrl &dest, const QDomElement *e=0)
Definition: transfermultisegkio.cpp:32
Transfer::Tc_Status
Definition: transfer.h:53
FileModel
This model represents the files that are being downloaded.
Definition: filemodel.h:101
Transfer::m_downloadSpeed
int m_downloadSpeed
Definition: transfer.h:364
DataSourceFactory::downloadedSize
KIO::filesize_t downloadedSize() const
Definition: datasourcefactory.h:72
Job::Running
Definition: job.h:43
TransferMultiSegKio::start
void start()
Definition: transfermultisegkio.cpp:69
DataSourceFactory::addMirror
void addMirror(const KUrl &url, bool used, int numParalellConnections=1)
Add a mirror that can be used for downloading.
Definition: datasourcefactory.cpp:378
Transfer::load
virtual void load(const QDomElement *element)
Loads the transfer's info from the QDomElement.
Definition: transfer.cpp:244
TransferMultiSegKio::setDirectory
virtual bool setDirectory(const KUrl &newDirectory)
Move the download to the new destination.
Definition: transfermultisegkio.cpp:121
DataSourceFactory::verifier
Verifier * verifier()
Definition: datasourcefactory.cpp:1222
Transfer::save
virtual void save(const QDomElement &element)
Saves this transfer to the given QDomNode.
Definition: transfer.cpp:230
MultiSegKioSettings::useSearchEngines
static bool useSearchEngines()
Get UseSearchEngines.
Definition: multisegkiosettings.h:68
DataSourceFactory::load
void load(const QDomElement *e)
Definition: datasourcefactory.cpp:952
FileModel::setDirectory
void setDirectory(const KUrl &newDirectory)
Set the url to the directory the files are stored in, the filemodel stores its entries as relative pa...
Definition: filemodel.cpp:538
signature.h
TransferMultiSegKio::setAvailableMirrors
void setAvailableMirrors(const KUrl &file, const QHash< KUrl, QPair< bool, int > > &mirrors)
Set the mirrors, int the number of paralell connections to the mirror bool if the mirror should be us...
Definition: transfermultisegkio.cpp:280
verifier.h
MultiSegKioSettings::segments
static int segments()
Get Segments.
Definition: multisegkiosettings.h:30
Transfer::capabilitiesChanged
void capabilitiesChanged()
Emitted when the capabilities of the Transfer change.
transferdatasource.h
TransferMultiSegKio::save
void save(const QDomElement &element)
Definition: transfermultisegkio.cpp:158
Transfer::directory
virtual KUrl directory() const
Definition: transfer.h:159
Transfer::Tc_DownloadSpeed
Definition: transfer.h:56
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
FileItem::ChecksumVerified
Definition: filemodel.h:48
Job::Stopped
The job is being executed.
Definition: job.h:44
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
Verifier
Definition: verifier.h:68
KGet::createTransferDataSource
static TransferDataSource * createTransferDataSource(const KUrl &src, const QDomElement &type=QDomElement(), QObject *parent=0)
Scans for all the available plugins and creates the proper transfer DataSource object for transfers C...
Definition: kget.cpp:931
DataSourceFactory::currentSpeed
ulong currentSpeed() const
Definition: datasourcefactory.h:73
Job::status
Status status() const
Definition: job.h:93
Transfer::dest
const KUrl & dest() const
Definition: transfer.h:149
TransferMultiSegKio::setNewDestination
bool setNewDestination(const KUrl &newDestination)
Definition: transfermultisegkio.cpp:128
FileModel::setData
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
Definition: filemodel.cpp:390
DataSourceFactory::setNewDestination
bool setNewDestination(const KUrl &newDest)
Definition: datasourcefactory.cpp:823
FileItem::Status
Definition: filemodel.h:46
kget.h
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::Tc_TotalSize
Definition: transfer.h:54
TransferMultiSegKio::stop
void stop()
Definition: transfermultisegkio.cpp:93
FileItem::SignatureVerified
Definition: filemodel.h:49
Signature
Class to verify signatures.
Definition: signature.h:38
Transfer::Tc_Percent
Definition: transfer.h:55
Transfer::Tc_DownloadedSize
Definition: transfer.h:63
Transfer::m_percent
int m_percent
Definition: transfer.h:363
TransferMultiSegKio::signature
virtual Signature * signature(const KUrl &file=KUrl())
Definition: transfermultisegkio.cpp:305
Transfer::DeleteFiles
Definition: transfer.h:97
FileItem::Size
Definition: filemodel.h:47
TransferMultiSegKio::load
void load(const QDomElement *e)
Definition: transfermultisegkio.cpp:150
Verifier::addChecksum
void addChecksum(const QString &type, const QString &checksum, int verified=0)
Add a checksum that is later used in the verification process.
Definition: verifier.cpp:514
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
DataSourceFactory::deinit
void deinit()
Deletes the created (downloadInitialized() is true) file if the download was not finished Does not de...
Definition: datasourcefactory.cpp:112
TransferMultiSegKio::verifier
virtual Verifier * verifier(const KUrl &file=KUrl())
Definition: transfermultisegkio.cpp:298
Transfer::setLog
void setLog(const QString &message, Transfer::LogLevel level=Log_Info)
Set Transfer history.
Definition: transfer.cpp:201
DataSourceFactory::status
Job::Status status() const
Definition: datasourcefactory.h:152
Verifier::NotVerified
Definition: verifier.h:79
DataSourceFactory::stop
void stop()
Definition: datasourcefactory.cpp:327
DataSourceFactory::signature
Signature * signature()
Definition: datasourcefactory.cpp:1231
FileModel::index
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
Definition: filemodel.cpp:436
filemodel.h
Transfer::Tc_Source
Definition: transfer.h:51
Transfer
Definition: transfer.h:36
TransferMultiSegKio::slotChecksumFound
void slotChecksumFound(QString type, QString checksum)
Definition: transfermultisegkio.cpp:267
TransferMultiSegKio::deinit
virtual void deinit(Transfer::DeleteOptions options)
Definition: transfermultisegkio.cpp:61
TransferMultiSegKio::init
virtual void init()
This function is called after the creation of a Transfer In transfer plugins you can put here whateve...
Definition: transfermultisegkio.cpp:44
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:53:18 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