• 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
kget.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) 2007-2009 Lukas Appelhans <l.appelhans@gmx.de>
5  Copyright (C) 2008 Urs Wolfer <uwolfer @ kde.org>
6  Copyright (C) 2008 Dario Freddi <drf54321@gmail.com>
7  Copyright (C) 2009 Matthias Fuchs <mat69@gmx.net>
8 
9  This program is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public
11  License as published by the Free Software Foundation; either
12  version 2 of the License, or (at your option) any later version.
13 */
14 
15 #include "core/kget.h"
16 
17 #include "mainwindow.h"
18 #include "core/mostlocalurl.h"
19 #include "core/transfer.h"
20 #include "core/transferdatasource.h"
21 #include "core/transfergroup.h"
22 #include "core/transfergrouphandler.h"
23 #include "core/transfertreemodel.h"
24 #include "core/transfertreeselectionmodel.h"
25 #include "core/plugin/plugin.h"
26 #include "core/plugin/transferfactory.h"
27 #include "core/kuiserverjobs.h"
28 #include "core/transfergroupscheduler.h"
29 #include "settings.h"
30 #include "core/transferhistorystore.h"
31 #include <iostream>
32 #include <kinputdialog.h>
33 #include <kfiledialog.h>
34 #include <kmessagebox.h>
35 #include <klocale.h>
36 #include <kstandarddirs.h>
37 #include <kservicetypetrader.h>
38 #include <kiconloader.h>
39 #include <kactioncollection.h>
40 #include <kio/renamedialog.h>
41 #include <KSharedConfig>
42 #include <KPluginInfo>
43 #include <KComboBox>
44 #include <KConfigDialog>
45 #include <KSaveFile>
46 #include <KWindowSystem>
47 
48 #include <QTextStream>
49 #include <QDomElement>
50 #include <QApplication>
51 #include <QClipboard>
52 #include <QAbstractItemView>
53 #include <QTimer>
54 
55 #ifdef HAVE_NEPOMUK
56  #include <Nepomuk2/ResourceManager>
57  #include "nepomukcontroller.h"
58 #endif
59 
60 #ifdef HAVE_KWORKSPACE
61  #include <QDBusConnection>
62  #include <QDBusInterface>
63  #include <QDBusPendingCall>
64  #include <kworkspace/kworkspace.h>
65  #include <solid/powermanagement.h>
66 #endif
67 
68 
69 KGet::TransferData::TransferData(const KUrl &source, const KUrl &destination, const QString& group, bool doStart, const QDomElement *element)
70  : src(source),
71  dest(destination),
72  groupName(group),
73  start(doStart),
74  e(element)
75 {
76 }
77 
88 KGet* KGet::self( MainWindow * mainWindow )
89 {
90  if(mainWindow)
91  {
92  m_mainWindow = mainWindow;
93  m_jobManager = new KUiServerJobs(m_mainWindow);
94  }
95 
96  static KGet *m = new KGet();
97 
98  return m;
99 }
100 
101 bool KGet::addGroup(const QString& groupName)
102 {
103  kDebug(5001);
104 
105  // Check if a group with that name already exists
106  if (m_transferTreeModel->findGroup(groupName))
107  return false;
108 
109  TransferGroup * group = new TransferGroup(m_transferTreeModel, m_scheduler, groupName);
110  m_transferTreeModel->addGroup(group);
111 
112  return true;
113 }
114 
115 void KGet::delGroup(TransferGroupHandler *group, bool askUser)
116 {
117  TransferGroup *g = group->m_group;
118 
119  if (askUser) {
120  QWidget *configDialog = KConfigDialog::exists("preferences");
121  if (KMessageBox::warningYesNo(configDialog ? configDialog : m_mainWindow,
122  i18n("Are you sure that you want to remove the group named %1?", g->name()),
123  i18n("Remove Group"),
124  KStandardGuiItem::remove(), KStandardGuiItem::cancel()) != KMessageBox::Yes)
125  return;
126  }
127 
128  m_transferTreeModel->delGroup(g);
129  g->deleteLater();
130 }
131 
132 void KGet::delGroups(QList<TransferGroupHandler*> groups, bool askUser)
133 {
134  if (groups.isEmpty())
135  return;
136  if (groups.count() == 1) {
137  KGet::delGroup(groups.first(), askUser);
138  return;
139  }
140  bool del = !askUser;
141  if (askUser) {
142  QStringList names;
143  foreach (TransferGroupHandler * handler, groups)
144  names << handler->name();
145  QWidget * configDialog = KConfigDialog::exists("preferences");
146  del = KMessageBox::warningYesNoList(configDialog ? configDialog : m_mainWindow,
147  i18n("Are you sure that you want to remove the following groups?"),
148  names,
149  i18n("Remove groups"),
150  KStandardGuiItem::remove(), KStandardGuiItem::cancel()) == KMessageBox::Yes;
151  }
152  if (del) {
153  foreach (TransferGroupHandler * handler, groups)
154  KGet::delGroup(handler, false);
155  }
156 }
157 
158 void KGet::renameGroup(const QString& oldName, const QString& newName)
159 {
160  TransferGroup *group = m_transferTreeModel->findGroup(oldName);
161 
162  if(group)
163  {
164  group->handler()->setName(newName);
165  }
166 }
167 
168 QStringList KGet::transferGroupNames()
169 {
170  QStringList names;
171 
172  foreach(TransferGroup *group, m_transferTreeModel->transferGroups()) {
173  names << group->name();
174  }
175 
176  return names;
177 }
178 
179 TransferHandler * KGet::addTransfer(KUrl srcUrl, QString destDir, QString suggestedFileName, // krazy:exclude=passbyvalue
180  QString groupName, bool start)
181 {
182  srcUrl = mostLocalUrl(srcUrl);
183  // Note: destDir may actually be a full path to a file :-(
184  kDebug(5001) << "Source:" << srcUrl.url() << ", dest: " << destDir << ", sugg file: " << suggestedFileName << endl;
185 
186  KUrl destUrl; // the final destination, including filename
187 
188  if ( srcUrl.isEmpty() )
189  {
190  //No src location: we let the user insert it manually
191  srcUrl = urlInputDialog();
192  if( srcUrl.isEmpty() )
193  return 0;
194  }
195 
196  if ( !isValidSource( srcUrl ) )
197  return 0;
198 
199  // when we get a destination directory and suggested filename, we don't
200  // need to ask for it again
201  bool confirmDestination = false;
202  if (destDir.isEmpty())
203  {
204  confirmDestination = true;
205  QList<TransferGroupHandler*> list = groupsFromExceptions(srcUrl);
206  if (!list.isEmpty()) {
207  destDir = list.first()->defaultFolder();
208  groupName = list.first()->name();
209  }
210 
211  } else {
212  // check whether destDir is actually already the path to a file
213  KUrl targetUrl = KUrl(destDir);
214  QString directory = targetUrl.directory(KUrl::ObeyTrailingSlash);
215  QString fileName = targetUrl.fileName(KUrl::ObeyTrailingSlash);
216  if (QFileInfo(directory).isDir() && !fileName.isEmpty()) {
217  destDir = directory;
218  suggestedFileName = fileName;
219  }
220  }
221 
222  if (suggestedFileName.isEmpty())
223  {
224  confirmDestination = true;
225  suggestedFileName = srcUrl.fileName(KUrl::ObeyTrailingSlash);
226  if (suggestedFileName.isEmpty())
227  {
228  // simply use the full url as filename
229  suggestedFileName = KUrl::toPercentEncoding( srcUrl.prettyUrl(), "/" );
230  }
231  }
232 
233  // now ask for confirmation of the entire destination url (dir + filename)
234  if (confirmDestination || !isValidDestDirectory(destDir))
235  {
236  do
237  {
238  destUrl = destFileInputDialog(destDir, suggestedFileName);
239  if (destUrl.isEmpty())
240  return 0;
241 
242  destDir = destUrl.directory(KUrl::ObeyTrailingSlash);
243  } while (!isValidDestDirectory(destDir));
244  } else {
245  destUrl = KUrl();
246  destUrl.setDirectory(destDir);
247  destUrl.addPath(suggestedFileName);
248  }
249  destUrl = getValidDestUrl(destUrl, srcUrl);
250 
251  if (destUrl == KUrl())
252  return 0;
253 
254  TransferHandler *transfer = createTransfer(srcUrl, destUrl, groupName, start);
255  if (transfer) {
256  KGet::showNotification(m_mainWindow, "added",
257  i18n("<p>The following transfer has been added to the download list:</p><p style=\"font-size: small;\">%1</p>", transfer->source().pathOrUrl()),
258  "kget", i18n("Download added"));
259  }
260 
261  return transfer;
262 }
263 
264 QList<TransferHandler*> KGet::addTransfers(const QList<QDomElement> &elements, const QString &groupName)
265 {
266  QList<TransferData> data;
267 
268  foreach(const QDomElement &e, elements) {
269  //We need to read these attributes now in order to know which transfer
270  //plugin to use.
271  KUrl srcUrl = KUrl(e.attribute("Source"));
272  KUrl destUrl = KUrl(e.attribute("Dest"));
273  data << TransferData(srcUrl, destUrl, groupName, false, &e);
274 
275  kDebug(5001) << "src=" << srcUrl << " dest=" << destUrl << " group=" << groupName;
276  }
277 
278  return createTransfers(data);
279 }
280 
281 const QList<TransferHandler *> KGet::addTransfer(KUrl::List srcUrls, QString destDir, QString groupName, bool start)
282 {
283  KUrl::List urlsToDownload;
284 
285  KUrl::List::Iterator it = srcUrls.begin();
286  KUrl::List::Iterator itEnd = srcUrls.end();
287 
288  QList<TransferHandler *> addedTransfers;
289 
290  for(; it!=itEnd ; ++it)
291  {
292  *it = mostLocalUrl(*it);
293  if ( isValidSource( *it ) )
294  urlsToDownload.append( *it );
295  }
296 
297  if ( urlsToDownload.count() == 0 )
298  return addedTransfers;
299 
300  if ( urlsToDownload.count() == 1 )
301  {
302  // just one file -> ask for filename
303  TransferHandler * newTransfer = addTransfer(srcUrls.first(), destDir, srcUrls.first().fileName(), groupName, start);
304 
305  if (newTransfer) {
306  addedTransfers.append(newTransfer);
307  }
308 
309  return addedTransfers;
310  }
311 
312  KUrl destUrl;
313 
314  // multiple files -> ask for directory, not for every single filename
315  if (!isValidDestDirectory(destDir))//TODO: Move that after the for-loop
316  destDir = destDirInputDialog();
317 
318  it = urlsToDownload.begin();
319  itEnd = urlsToDownload.end();
320 
321  QList<TransferData> data;
322  for ( ; it != itEnd; ++it )
323  {
324  if (destDir.isEmpty())
325  {
326  //TODO only use groupsFromExceptions if that is allowed in the settings
327  QList<TransferGroupHandler*> list = groupsFromExceptions(*it);
328  if (!list.isEmpty()) {
329  destDir = list.first()->defaultFolder();
330  groupName = list.first()->name();
331  }
332  }
333  destUrl = getValidDestUrl(KUrl(destDir), *it);
334 
335  if (destUrl == KUrl())
336  continue;
337 
338  data << TransferData(*it, destUrl, groupName, start);
339  }
340 
341  QList<TransferHandler*> transfers = createTransfers(data);
342  if (!transfers.isEmpty()) {
343  QString urls = transfers[0]->source().pathOrUrl();
344  for (int i = 1; i < transfers.count(); ++i) {
345  urls += '\n' + transfers[i]->source().pathOrUrl();
346  }
347 
348  QString message;
349  if (transfers.count() == 1) {
350  message = i18n("<p>The following transfer has been added to the download list:</p>");
351  } else {
352  message = i18n("<p>The following transfers have been added to the download list:</p>");
353  }
354  const QString content = QString("<p style=\"font-size: small;\">%1</p>").arg(urls);
355  KGet::showNotification(m_mainWindow, "added", message + content, "kget", i18n("Download added"));
356  }
357 
358  return transfers;
359 }
360 
361 
362 bool KGet::delTransfer(TransferHandler * transfer, DeleteMode mode)
363 {
364  return delTransfers(QList<TransferHandler*>() << transfer, mode);
365 }
366 
367 bool KGet::delTransfers(const QList<TransferHandler*> &handlers, DeleteMode mode)
368 {
369  if (!m_store) {
370  m_store = TransferHistoryStore::getStore();
371  }
372  QList<Transfer*> transfers;
373  QList<TransferHistoryItem> historyItems;
374  foreach (TransferHandler *handler, handlers) {
375  Transfer *transfer = handler->m_transfer;
376  transfers << transfer;
377  historyItems << TransferHistoryItem(*transfer);
378 
379  // TransferHandler deinitializations
380  handler->destroy();
381  // Transfer deinitializations (the deinit function is called by the destroy() function)
382  if (mode == AutoDelete) {
383  Transfer::DeleteOptions o = Transfer::DeleteTemporaryFiles;
384  if (transfer->status() != Job::Finished && transfer->status() != Job::FinishedKeepAlive)
385  o |= Transfer::DeleteFiles;
386  transfer->destroy(o);
387  } else {
388  transfer->destroy((Transfer::DeleteTemporaryFiles | Transfer::DeleteFiles));
389  }
390  }
391  m_store->saveItems(historyItems);
392 
393  m_transferTreeModel->delTransfers(transfers);
394  qDeleteAll(transfers);
395  return true;
396 }
397 
398 
399 void KGet::moveTransfer(TransferHandler * transfer, const QString& groupName)
400 {
401  Q_UNUSED(transfer)
402  Q_UNUSED(groupName)
403 }
404 
405 void KGet::redownloadTransfer(TransferHandler * transfer)
406 {
407  QString group = transfer->group()->name();
408  QString src = transfer->source().url();
409  QString dest = transfer->dest().url();
410  QString destFile = transfer->dest().fileName();
411 
412  KGet::delTransfer(transfer);
413  KGet::addTransfer(src, dest, destFile, group, true);
414 }
415 
416 QList<TransferHandler *> KGet::selectedTransfers()
417 {
418 // kDebug(5001) << "KGet::selectedTransfers";
419 
420  QList<TransferHandler *> selectedTransfers;
421 
422  QModelIndexList selectedIndexes = m_selectionModel->selectedRows();
423  //sort the indexes as this can speed up operations like deleting etc.
424  qSort(selectedIndexes.begin(), selectedIndexes.end());
425 
426  foreach(const QModelIndex &currentIndex, selectedIndexes)
427  {
428  ModelItem * item = m_transferTreeModel->itemFromIndex(currentIndex);
429  if (!item->isGroup())
430  selectedTransfers.append(item->asTransfer()->transferHandler());
431  }
432 
433  return selectedTransfers;
434 
435 
436 // This is the code that was used in the old selectedTransfers function
437 /* QList<TransferGroup *>::const_iterator it = m_transferTreeModel->transferGroups().begin();
438  QList<TransferGroup *>::const_iterator itEnd = m_transferTreeModel->transferGroups().end();
439 
440  for( ; it!=itEnd ; ++it )
441  {
442  TransferGroup::iterator it2 = (*it)->begin();
443  TransferGroup::iterator it2End = (*it)->end();
444 
445  for( ; it2!=it2End ; ++it2 )
446  {
447  Transfer * transfer = (Transfer*) *it2;
448 
449  if( transfer->isSelected() )
450  selectedTransfers.append( transfer->handler() );
451  }
452  }
453  return selectedTransfers;*/
454 }
455 
456 QList<TransferHandler *> KGet::finishedTransfers()
457 {
458  QList<TransferHandler *> finishedTransfers;
459 
460  foreach(TransferHandler *transfer, allTransfers())
461  {
462  if (transfer->status() == Job::Finished) {
463  finishedTransfers << transfer;
464  }
465  }
466  return finishedTransfers;
467 }
468 
469 QList<TransferGroupHandler *> KGet::selectedTransferGroups()
470 {
471  QList<TransferGroupHandler *> selectedTransferGroups;
472 
473  QModelIndexList selectedIndexes = m_selectionModel->selectedRows();
474 
475  foreach(const QModelIndex &currentIndex, selectedIndexes)
476  {
477  ModelItem * item = m_transferTreeModel->itemFromIndex(currentIndex);
478  if (item->isGroup()) {
479  TransferGroupHandler *group = item->asGroup()->groupHandler();
480  selectedTransferGroups.append(group);
481  }
482  }
483 
484  return selectedTransferGroups;
485 }
486 
487 TransferTreeModel * KGet::model()
488 {
489  return m_transferTreeModel;
490 }
491 
492 TransferTreeSelectionModel * KGet::selectionModel()
493 {
494  return m_selectionModel;
495 }
496 
497 #ifdef HAVE_NEPOMUK
498 NepomukController *KGet::nepomukController()
499 {
500  if (!m_nepomukController) {
501  m_nepomukController = new NepomukController;
502  }
503 
504  return m_nepomukController;
505 }
506 #endif
507 
508 void KGet::load( QString filename ) // krazy:exclude=passbyvalue
509 {
510  kDebug(5001) << "(" << filename << ")";
511 
512  if(filename.isEmpty())
513  filename = KStandardDirs::locateLocal("appdata", "transfers.kgt");
514 
515  QString tmpFile;
516 
517  //Try to save the transferlist to a temporary location
518  if(!KIO::NetAccess::download(KUrl(filename), tmpFile, 0)) {
519  if (m_transferTreeModel->transferGroups().isEmpty()) //Create the default group
520  addGroup(i18n("My Downloads"));
521  return;
522  }
523 
524  QFile file(tmpFile);
525  QDomDocument doc;
526 
527  kDebug(5001) << "file:" << filename;
528 
529  if(doc.setContent(&file))
530  {
531  QDomElement root = doc.documentElement();
532 
533  QDomNodeList nodeList = root.elementsByTagName("TransferGroup");
534  int nItems = nodeList.length();
535 
536  for( int i = 0 ; i < nItems ; i++ )
537  {
538  TransferGroup * foundGroup = m_transferTreeModel->findGroup( nodeList.item(i).toElement().attribute("Name") );
539 
540  kDebug(5001) << "KGet::load -> group = " << nodeList.item(i).toElement().attribute("Name");
541 
542  if( !foundGroup )
543  {
544  kDebug(5001) << "KGet::load -> group not found";
545 
546  TransferGroup * newGroup = new TransferGroup(m_transferTreeModel, m_scheduler);
547 
548  m_transferTreeModel->addGroup(newGroup);
549 
550  newGroup->load(nodeList.item(i).toElement());
551  }
552  else
553  {
554  kDebug(5001) << "KGet::load -> group found";
555 
556  //A group with this name already exists.
557  //Integrate the group's transfers with the ones read from file
558  foundGroup->load(nodeList.item(i).toElement());
559  }
560  }
561  }
562  else
563  {
564  kWarning(5001) << "Error reading the transfers file";
565  }
566 
567  if (m_transferTreeModel->transferGroups().isEmpty()) //Create the default group
568  addGroup(i18n("My Downloads"));
569 
570  new GenericObserver(m_mainWindow);
571 }
572 
573 void KGet::save( QString filename, bool plain ) // krazy:exclude=passbyvalue
574 {
575  if ( !filename.isEmpty()
576  && QFile::exists( filename )
577  && (KMessageBox::questionYesNoCancel(0,
578  i18n("The file %1 already exists.\nOverwrite?", filename),
579  i18n("Overwrite existing file?"), KStandardGuiItem::yes(),
580  KStandardGuiItem::no(), KStandardGuiItem::cancel(), "QuestionFilenameExists" )
581  != KMessageBox::Yes) )
582  return;
583 
584  if(filename.isEmpty())
585  filename = KStandardDirs::locateLocal("appdata", "transfers.kgt");
586 
587  KSaveFile file(filename);
588  if ( !file.open( QIODevice::WriteOnly ) )
589  {
590  //kWarning(5001)<<"Unable to open output file when saving";
591  KGet::showNotification(m_mainWindow, "error",
592  i18n("Unable to save to: %1", filename));
593  return;
594  }
595 
596  if (plain) {
597  QTextStream out(&file);
598  foreach(TransferHandler *handler, allTransfers()) {
599  out << handler->source().prettyUrl() << endl;
600  }
601  }
602  else {
603  QDomDocument doc(QString("KGetTransfers"));
604  QDomElement root = doc.createElement("Transfers");
605  doc.appendChild(root);
606 
607  foreach (TransferGroup * group, m_transferTreeModel->transferGroups())
608  {
609  QDomElement e = doc.createElement("TransferGroup");
610  root.appendChild(e);
611  group->save(e);
612  //KGet::delGroup((*it)->name());
613  }
614 
615  QTextStream stream( &file );
616  doc.save( stream, 2 );
617  }
618  file.finalize();
619 }
620 
621 QList<TransferFactory*> KGet::factories()
622 {
623  return m_transferFactories;
624 }
625 
626 TransferFactory * KGet::factory(TransferHandler * transfer)
627 {
628  return transfer->m_transfer->factory();
629 }
630 
631 KActionCollection * KGet::actionCollection()
632 {
633  return m_mainWindow->actionCollection();
634 }
635 
636 void KGet::setSchedulerRunning(bool running)
637 {
638  if(running)
639  {
640  m_scheduler->stop(); //stopall first, to have a clean startingpoint
641  m_scheduler->start();
642  }
643  else
644  m_scheduler->stop();
645 }
646 
647 bool KGet::schedulerRunning()
648 {
649  return (m_scheduler->hasRunningJobs());
650 }
651 
652 void KGet::setSuspendScheduler(bool isSuspended)
653 {
654  m_scheduler->setIsSuspended(isSuspended);
655 }
656 
657 QList<TransferHandler*> KGet::allTransfers()
658 {
659  QList<TransferHandler*> transfers;
660 
661  foreach (TransferGroup *group, KGet::m_transferTreeModel->transferGroups())
662  {
663  transfers << group->handler()->transfers();
664  }
665  return transfers;
666 }
667 
668 QList<TransferGroupHandler*> KGet::allTransferGroups()
669 {
670  QList<TransferGroupHandler*> transfergroups;
671 
672  foreach (TransferGroup *group, KGet::m_transferTreeModel->transferGroups())
673  {
674  kDebug() << group->name();
675  transfergroups << group->handler();
676  }
677  return transfergroups;
678 }
679 
680 TransferHandler * KGet::findTransfer(const KUrl &src)
681 {
682  Transfer *transfer = KGet::m_transferTreeModel->findTransfer(src);
683  if (transfer)
684  {
685  return transfer->handler();
686  }
687  return 0;
688 }
689 
690 TransferGroupHandler * KGet::findGroup(const QString &name)
691 {
692  TransferGroup *group = KGet::m_transferTreeModel->findGroup(name);
693  if (group)
694  {
695  return group->handler();
696  }
697  return 0;
698 }
699 
700 void KGet::checkSystemTray()
701 {
702  kDebug(5001);
703  bool running = false;
704 
705  foreach (TransferHandler *handler, KGet::allTransfers())
706  {
707  if (handler->status() == Job::Running)
708  {
709  running = true;
710  break;
711  }
712  }
713 
714  m_mainWindow->setSystemTrayDownloading(running);
715 }
716 
717 void KGet::settingsChanged()
718 {
719  kDebug(5001);
720 
721  foreach (TransferFactory *factory, m_transferFactories)
722  {
723  factory->settingsChanged();
724  }
725 
726  m_jobManager->settingsChanged();
727  m_scheduler->settingsChanged();
728 }
729 
730 QList<TransferGroupHandler*> KGet::groupsFromExceptions(const KUrl &filename)
731 {
732  QList<TransferGroupHandler*> handlers;
733  foreach (TransferGroupHandler * handler, allTransferGroups()) {
734  const QStringList patterns = handler->regExp().pattern().split(',');//FIXME 4.5 add a tooltip: "Enter a list of foo separated by ," and then do split(i18nc("used as separator in a list, translate to the same thing you translated \"Enter a list of foo separated by ,\"", ","))
735  if (matchesExceptions(filename, patterns)) {
736  handlers.append(handler);
737  }
738  }
739 
740  return handlers;
741 }
742 
743 bool KGet::matchesExceptions(const KUrl &sourceUrl, const QStringList &patterns)
744 {
745  foreach (const QString &pattern, patterns) {
746  const QString trimmedPattern = pattern.trimmed();
747  if (trimmedPattern.isEmpty()) {
748  continue;
749  }
750  QRegExp regExp = QRegExp(trimmedPattern);
751 
752  //try with Regular Expression first
753  regExp.setPatternSyntax(QRegExp::RegExp2);
754  regExp.setCaseSensitivity(Qt::CaseInsensitive);
755  if (regExp.exactMatch(sourceUrl.url())) {
756  return true;
757  }
758 
759  //now try with wildcards
760  if (!regExp.pattern().isEmpty() && !regExp.pattern().contains('*')) {
761  regExp.setPattern('*' + regExp.pattern());
762  }
763 
764  regExp.setPatternSyntax(QRegExp::Wildcard);
765  regExp.setCaseSensitivity(Qt::CaseInsensitive);
766 
767  if (regExp.exactMatch(sourceUrl.url())) {
768  return true;
769  }
770  }
771 
772  return false;
773 }
774 
775 void KGet::setGlobalDownloadLimit(int limit)
776 {
777  m_scheduler->setDownloadLimit(limit);
778 }
779 
780 void KGet::setGlobalUploadLimit(int limit)
781 {
782  m_scheduler->setUploadLimit(limit);
783 }
784 
785 void KGet::calculateGlobalSpeedLimits()
786 {
787  //if (m_scheduler->downloadLimit())//TODO: Remove this and the both other hacks in the 2 upper functions with a better replacement
788  m_scheduler->calculateDownloadLimit();
789  //if (m_scheduler->uploadLimit())
790  m_scheduler->calculateUploadLimit();
791 }
792 
793 void KGet::calculateGlobalDownloadLimit()
794 {
795  m_scheduler->calculateDownloadLimit();
796 }
797 
798 void KGet::calculateGlobalUploadLimit()
799 {
800  m_scheduler->calculateUploadLimit();
801 }
802 
803 // ------ STATIC MEMBERS INITIALIZATION ------
804 TransferTreeModel * KGet::m_transferTreeModel;
805 TransferTreeSelectionModel * KGet::m_selectionModel;
806 QList<TransferFactory *> KGet::m_transferFactories;
807 TransferGroupScheduler * KGet::m_scheduler = 0;
808 MainWindow * KGet::m_mainWindow = 0;
809 KUiServerJobs * KGet::m_jobManager = 0;
810 TransferHistoryStore * KGet::m_store = 0;
811 bool KGet::m_hasConnection = true;
812 #ifdef HAVE_NEPOMUK
813  NepomukController *KGet::m_nepomukController = 0;
814 #endif
815 
816 // ------ PRIVATE FUNCTIONS ------
817 KGet::KGet()
818 {
819 #ifdef HAVE_NEPOMUK
820  Nepomuk2::ResourceManager::instance()->init();
821 #endif
822 
823  m_scheduler = new TransferGroupScheduler();
824  m_transferTreeModel = new TransferTreeModel(m_scheduler);
825  m_selectionModel = new TransferTreeSelectionModel(m_transferTreeModel);
826 
827  QObject::connect(m_transferTreeModel, SIGNAL(transfersAddedEvent(QList<TransferHandler*>)),
828  m_jobManager, SLOT(slotTransfersAdded(QList<TransferHandler*>)));
829  QObject::connect(m_transferTreeModel, SIGNAL(transfersAboutToBeRemovedEvent(QList<TransferHandler*>)),
830  m_jobManager, SLOT(slotTransfersAboutToBeRemoved(QList<TransferHandler*>)));
831  QObject::connect(m_transferTreeModel, SIGNAL(transfersChangedEvent(QMap<TransferHandler*,Transfer::ChangesFlags>)),
832  m_jobManager, SLOT(slotTransfersChanged(QMap<TransferHandler*,Transfer::ChangesFlags>)));
833 
834  //check if there is a connection
835  const Solid::Networking::Status status = Solid::Networking::status();
836  KGet::setHasNetworkConnection((status == Solid::Networking::Connected) || (status == Solid::Networking::Unknown));
837 
838  //Load all the available plugins
839  loadPlugins();
840 }
841 
842 KGet::~KGet()
843 {
844  kDebug();
845  delete m_transferTreeModel;
846  delete m_jobManager; //This one must always be before the scheduler otherwise the job manager can't remove the notifications when deleting.
847  delete m_scheduler;
848  delete m_store;
849 
850 #ifdef HAVE_NEPOMUK
851  delete m_nepomukController;
852 #endif
853 }
854 
855 TransferHandler * KGet::createTransfer(const KUrl &src, const KUrl &dest, const QString& groupName,
856  bool start, const QDomElement * e)
857 {
858  QList<TransferHandler*> transfer = createTransfers(QList<TransferData>() << TransferData(src, dest, groupName, start, e));
859  return (transfer.isEmpty() ? 0 : transfer.first());
860 }
861 
862 QList<TransferHandler*> KGet::createTransfers(const QList<TransferData> &dataItems)
863 {
864  QList<TransferHandler*> handlers;
865  if (dataItems.isEmpty()) {
866  return handlers;
867  }
868 
869  QList<bool> start;
870  QHash<TransferGroup*, QList<Transfer*> > groups;
871 
872  QStringList urlsFailed;
873  foreach (const TransferData &data, dataItems) {
874  kDebug(5001) << "srcUrl=" << data.src << " destUrl=" << data.dest << " group=" << data.groupName;
875 
876  TransferGroup *group = m_transferTreeModel->findGroup(data.groupName);
877  if (!group) {
878  kDebug(5001) << "KGet::createTransfer -> group not found";
879  group = m_transferTreeModel->transferGroups().first();
880  }
881 
882  Transfer *newTransfer = 0;
883  foreach (TransferFactory *factory, m_transferFactories) {
884  kDebug(5001) << "Trying plugin n.plugins=" << m_transferFactories.size();
885  if ((newTransfer = factory->createTransfer(data.src, data.dest, group, m_scheduler, data.e))) {
886  // kDebug(5001) << "KGet::createTransfer -> CREATING NEW TRANSFER ON GROUP: _" << group->name() << "_";
887  newTransfer->create();
888  newTransfer->load(data.e);
889  handlers << newTransfer->handler();
890  groups[group] << newTransfer;
891  start << data.start;
892  break;
893  }
894  }
895  if (!newTransfer) {
896  urlsFailed << data.src.url();
897  kWarning(5001) << "Warning! No plugin found to handle" << data.src;
898  }
899  }
900 
901  //show urls that failed
902  if (!urlsFailed.isEmpty()) {
903  QString message = i18np("<p>The following URL cannot be downloaded, its protocol is not supported by KGet:</p>",
904  "<p>The following URLs cannot be downloaded, their protocols are not supported by KGet:</p>",
905  urlsFailed.count());
906 
907  QString content = urlsFailed.takeFirst();
908  foreach (const QString &url, urlsFailed) {
909  content += '\n' + url;
910  }
911  content = QString("<p style=\"font-size: small;\">%1</p>").arg(content);
912 
913  KGet::showNotification(m_mainWindow, "error", message + content, "dialog-error", i18n("Protocol unsupported"));
914  }
915 
916  //add the created transfers to the model and start them if specified
917  QHash<TransferGroup*, QList<Transfer*> >::const_iterator it;
918  QHash<TransferGroup*, QList<Transfer*> >::const_iterator itEnd = groups.constEnd();
919  for (it = groups.constBegin(); it != itEnd; ++it) {
920  KGet::model()->addTransfers(it.value(), it.key());
921  }
922  for (int i = 0; i < handlers.count(); ++i) {
923  if (start[i]) {
924  handlers[i]->start();
925  }
926  }
927 
928  return handlers;//TODO implement error message if it is 0, or should the addTransfers stuff do that, in case if the numer of returned items does not match the number of sent data?
929 }
930 
931 TransferDataSource * KGet::createTransferDataSource(const KUrl &src, const QDomElement &type, QObject *parent)
932 {
933  kDebug(5001);
934 
935  TransferDataSource *dataSource;
936  foreach (TransferFactory *factory, m_transferFactories)
937  {
938  dataSource = factory->createTransferDataSource(src, type, parent);
939  if(dataSource)
940  return dataSource;
941  }
942  return 0;
943 }
944 
945 QString KGet::generalDestDir(bool preferXDGDownloadDir)
946 {
947  QString dir = Settings::lastDirectory();
948 
949  if (preferXDGDownloadDir) {
950  dir = KGlobalSettings::downloadPath();
951  }
952 
953  return dir;
954 }
955 
956 KUrl KGet::urlInputDialog()
957 {
958  QString newtransfer;
959  bool ok = false;
960 
961  KUrl clipboardUrl = KUrl(QApplication::clipboard()->text(QClipboard::Clipboard).trimmed());
962  if (clipboardUrl.isValid())
963  newtransfer = clipboardUrl.url();
964 
965  while (!ok)
966  {
967  newtransfer = KInputDialog::getText(i18n("New Download"), i18n("Enter URL:"), newtransfer, &ok, 0);
968  newtransfer = newtransfer.trimmed(); //Remove any unnecessary space at the beginning and/or end
969 
970  if (!ok)
971  {
972  //user pressed cancel
973  return KUrl();
974  }
975 
976  KUrl src = KUrl(newtransfer);
977  if(src.isValid())
978  return src;
979  else
980  ok = false;
981  }
982  return KUrl();
983 }
984 
985 QString KGet::destDirInputDialog()
986 {
987  QString destDir = KFileDialog::getExistingDirectory(generalDestDir());
988  Settings::setLastDirectory(destDir);
989 
990  return destDir;
991 }
992 
993 KUrl KGet::destFileInputDialog(QString destDir, const QString& suggestedFileName) // krazy:exclude=passbyvalue
994 {
995  if (destDir.isEmpty())
996  destDir = generalDestDir();
997 
998  // Use the destination name if not empty...
999  KUrl startLocation(destDir);
1000  if (!suggestedFileName.isEmpty()) {
1001  startLocation.addPath(suggestedFileName);
1002  }
1003 
1004  KUrl destUrl = KFileDialog::getSaveUrl(startLocation, QString(), m_mainWindow, i18n("Save As"));
1005  if (!destUrl.isEmpty()) {
1006  Settings::setLastDirectory(destUrl.directory(KUrl::ObeyTrailingSlash));
1007  }
1008 
1009  return destUrl;
1010 }
1011 
1012 bool KGet::isValidSource(const KUrl &source)
1013 {
1014  // Check if the URL is well formed
1015  if (!source.isValid()) {
1016  KGet::showNotification(m_mainWindow, "error",
1017  i18n("Malformed URL:\n%1", source.prettyUrl()));
1018 
1019  return false;
1020  }
1021  // Check if the URL contains the protocol
1022  if (source.protocol().isEmpty()){
1023  KGet::showNotification(m_mainWindow, "error",
1024  i18n("Malformed URL, protocol missing:\n%1", source.prettyUrl()));
1025 
1026  return false;
1027  }
1028  // Check if a transfer with the same url already exists
1029  Transfer * transfer = m_transferTreeModel->findTransfer( source );
1030  if (transfer)
1031  {
1032  if (transfer->status() == Job::Finished) {
1033  // transfer is finished, ask if we want to download again
1034  if (KMessageBox::questionYesNoCancel(0,
1035  i18n("You have already completed a download from the location: \n\n%1\n\nDownload it again?", source.prettyUrl()),
1036  i18n("Download it again?"), KStandardGuiItem::yes(),
1037  KStandardGuiItem::no(), KStandardGuiItem::cancel())
1038  == KMessageBox::Yes) {
1039  transfer->stop();
1040  KGet::delTransfer(transfer->handler());
1041  return true;
1042  }
1043  else
1044  return false;
1045  }
1046  else {
1047  if (KMessageBox::warningYesNoCancel(0,
1048  i18n("You have a download in progress from the location: \n\n%1\n\nDelete it and download again?", source.prettyUrl()),
1049  i18n("Delete it and download again?"), KStandardGuiItem::yes(),
1050  KStandardGuiItem::no(), KStandardGuiItem::cancel())
1051  == KMessageBox::Yes) {
1052  transfer->stop();
1053  KGet::delTransfer(transfer->handler());
1054  return true;
1055  }
1056  else
1057  return false;
1058  }
1059  return false;
1060  }
1061  return true;
1062 }
1063 
1064 bool KGet::isValidDestDirectory(const QString & destDir)
1065 {
1066  kDebug(5001) << destDir;
1067  if (!QFileInfo(destDir).isDir())
1068  {
1069  if (QFileInfo(KUrl(destDir).directory()).isWritable())
1070  return (!destDir.isEmpty());
1071  if (!QFileInfo(KUrl(destDir).directory()).isWritable() && !destDir.isEmpty())
1072  KMessageBox::error(0, i18n("Directory is not writable"));
1073  }
1074  else
1075  {
1076  if (QFileInfo(destDir).isWritable())
1077  return (!destDir.isEmpty());
1078  if (!QFileInfo(destDir).isWritable() && !destDir.isEmpty())
1079  KMessageBox::error(0, i18n("Directory is not writable"));
1080  }
1081  return false;
1082 }
1083 
1084 KUrl KGet::getValidDestUrl(const KUrl& destDir, const KUrl &srcUrl)
1085 {
1086  kDebug() << "Source Url" << srcUrl << "Destination" << destDir;
1087  if ( !isValidDestDirectory(destDir.toLocalFile()) )
1088  return KUrl();
1089 
1090  KUrl destUrl = destDir;
1091 
1092  if (QFileInfo(destUrl.toLocalFile()).isDir())
1093  {
1094  QString filename = srcUrl.fileName();
1095  if (filename.isEmpty())
1096  filename = KUrl::toPercentEncoding( srcUrl.prettyUrl(), "/" );
1097  destUrl.adjustPath( KUrl::AddTrailingSlash );
1098  destUrl.setFileName( filename );
1099  }
1100 
1101  Transfer * existingTransferDest = m_transferTreeModel->findTransferByDestination(destUrl);
1102  QPointer<KIO::RenameDialog> dlg = 0;
1103 
1104  if (existingTransferDest) {
1105  if (existingTransferDest->status() == Job::Finished) {
1106  if (KMessageBox::questionYesNoCancel(0,
1107  i18n("You have already downloaded that file from another location.\n\nDownload and delete the previous one?"),
1108  i18n("File already downloaded. Download anyway?"), KStandardGuiItem::yes(),
1109  KStandardGuiItem::no(), KStandardGuiItem::cancel())
1110  == KMessageBox::Yes) {
1111  existingTransferDest->stop();
1112  KGet::delTransfer(existingTransferDest->handler());
1113  //start = true;
1114  } else
1115  return KUrl();
1116  } else {
1117  dlg = new KIO::RenameDialog( m_mainWindow, i18n("You are already downloading the same file"/*, destUrl.prettyUrl()*/), srcUrl,
1118  destUrl, KIO::M_MULTI );
1119  }
1120  } else if (srcUrl == destUrl) {
1121  dlg = new KIO::RenameDialog(m_mainWindow, i18n("File already exists"), srcUrl,
1122  destUrl, KIO::M_MULTI);
1123  } else if (destUrl.isLocalFile() && QFile::exists(destUrl.toLocalFile())) {
1124  dlg = new KIO::RenameDialog( m_mainWindow, i18n("File already exists"), srcUrl,
1125  destUrl, KIO::M_OVERWRITE );
1126  }
1127 
1128  if (dlg) {
1129  int result = dlg->exec();
1130 
1131  if (result == KIO::R_RENAME || result == KIO::R_OVERWRITE)
1132  destUrl = dlg->newDestUrl();
1133  else {
1134  delete(dlg);
1135  return KUrl();
1136  }
1137 
1138  delete(dlg);
1139  }
1140 
1141  return destUrl;
1142 }
1143 
1144 void KGet::loadPlugins()
1145 {
1146  m_transferFactories.clear();
1147  // Add versioning constraint
1148  QString
1149  str = "[X-KDE-KGet-framework-version] == ";
1150  str += QString::number( FrameworkVersion );
1151  str += " and ";
1152  str += "[X-KDE-KGet-rank] > 0";
1153  str += " and ";
1154  str += "[X-KDE-KGet-plugintype] == ";
1155 
1156 
1157  //TransferFactory plugins
1158  KService::List offers = KServiceTypeTrader::self()->query( "KGet/Plugin", str + "'TransferFactory'" );
1159 
1160  //Here we use a QMap only to easily sort the plugins by rank
1161  QMap<int, KService::Ptr> services;
1162  QMap<int, KService::Ptr>::ConstIterator it;
1163 
1164  for ( int i = 0; i < offers.count(); ++i )
1165  {
1166  services[ offers[i]->property( "X-KDE-KGet-rank" ).toInt() ] = offers[i];
1167  kDebug(5001) << " TransferFactory plugin found:" << endl <<
1168  " rank = " << offers[i]->property( "X-KDE-KGet-rank" ).toInt() << endl <<
1169  " plugintype = " << offers[i]->property( "X-KDE-KGet-plugintype" ) << endl;
1170  }
1171 
1172  //I must fill this pluginList before and my m_transferFactories list after.
1173  //This because calling the KLibLoader::globalLibrary() erases the static
1174  //members of this class (why?), such as the m_transferFactories list.
1175  QList<KGetPlugin *> pluginList;
1176 
1177  const KConfigGroup plugins = KConfigGroup(KGlobal::config(), "Plugins");
1178 
1179  foreach (KService::Ptr service, services)
1180  {
1181  KPluginInfo info(service);
1182  info.load(plugins);
1183 
1184  if( !info.isPluginEnabled() ) {
1185  kDebug(5001) << "TransferFactory plugin (" << service->library()
1186  << ") found, but not enabled";
1187  continue;
1188  }
1189 
1190  KGetPlugin * plugin;
1191  if( (plugin = createPluginFromService(service)) != 0 )
1192  {
1193  const QString pluginName = info.name();
1194 
1195  pluginList.prepend(plugin);
1196  kDebug(5001) << "TransferFactory plugin (" << (service)->library()
1197  << ") found and added to the list of available plugins";
1198  }
1199  else
1200  {
1201  kDebug(5001) << "Error loading TransferFactory plugin ("
1202  << service->library() << ")";
1203  }
1204  }
1205 
1206  foreach (KGetPlugin *plugin, pluginList)
1207  {
1208  m_transferFactories.append(qobject_cast<TransferFactory *>(plugin));
1209  }
1210 
1211  kDebug(5001) << "Number of factories = " << m_transferFactories.size();
1212 }
1213 
1214 
1215 void KGet::setHasNetworkConnection(bool hasConnection)
1216 {
1217  kDebug(5001) << "Existing internet connection:" << hasConnection << "old:" << m_hasConnection;
1218  if (hasConnection == m_hasConnection) {
1219  return;
1220  }
1221  m_hasConnection = hasConnection;
1222  const bool initialState = m_scheduler->hasRunningJobs();
1223  m_scheduler->setHasNetworkConnection(hasConnection);
1224  const bool finalState = m_scheduler->hasRunningJobs();
1225 
1226  if (initialState != finalState) {
1227  if (hasConnection) {
1228  KGet::showNotification(m_mainWindow, "notification",
1229  i18n("Internet connection established, resuming transfers."),
1230  "dialog-info");
1231 
1232  } else {
1233  KGet::showNotification(m_mainWindow, "notification",
1234  i18n("No internet connection, stopping transfers."),
1235  "dialog-info");
1236  }
1237  }
1238 }
1239 
1240 KGetPlugin * KGet::createPluginFromService( const KService::Ptr &service )
1241 {
1242  //try to load the specified library
1243  KPluginFactory *factory = KPluginLoader(service->library()).factory();
1244 
1245  if (!factory)
1246  {
1247  KGet::showNotification(m_mainWindow, "error",
1248  i18n("Plugin loader could not load the plugin: %1.", service->library()),
1249  "dialog-info");
1250  kError(5001) << "KPluginFactory could not load the plugin:" << service->library();
1251  return 0;
1252  }
1253  KGetPlugin * plugin = factory->create< TransferFactory >(KGet::m_mainWindow);
1254 
1255  return plugin;
1256 }
1257 
1258 bool KGet::safeDeleteFile( const KUrl& url )
1259 {
1260  if ( url.isLocalFile() )
1261  {
1262  QFileInfo info( url.toLocalFile() );
1263  if ( info.isDir() )
1264  {
1265  KGet::showNotification(m_mainWindow, "notification",
1266  i18n("Not deleting\n%1\nas it is a directory.", url.prettyUrl()),
1267  "dialog-info");
1268  return false;
1269  }
1270  KIO::NetAccess::del( url, 0L );
1271  return true;
1272  }
1273 
1274  else
1275  KGet::showNotification(m_mainWindow, "notification",
1276  i18n("Not deleting\n%1\nas it is not a local file.", url.prettyUrl()),
1277  "dialog-info");
1278  return false;
1279 }
1280 
1281 KNotification *KGet::showNotification(QWidget *parent, const QString &eventType,
1282  const QString &text, const QString &icon, const QString &title, const KNotification::NotificationFlags &flags)
1283 {
1284  return KNotification::event(eventType, title, text, KIcon(icon).pixmap(KIconLoader::SizeMedium), parent, flags);
1285 }
1286 
1287 GenericObserver::GenericObserver(QObject *parent)
1288  : QObject(parent),
1289  m_save(0),
1290  m_finishAction(0)
1291 {
1292  connect(KGet::model(), SIGNAL(groupRemovedEvent(TransferGroupHandler*)), SLOT(groupRemovedEvent(TransferGroupHandler*)));
1293  connect(KGet::model(), SIGNAL(transfersAddedEvent(QList<TransferHandler*>)),
1294  SLOT(transfersAddedEvent(QList<TransferHandler*>)));
1295  connect(KGet::model(), SIGNAL(groupAddedEvent(TransferGroupHandler*)), SLOT(groupAddedEvent(TransferGroupHandler*)));
1296  connect(KGet::model(), SIGNAL(transfersRemovedEvent(QList<TransferHandler*>)),
1297  SLOT(transfersRemovedEvent(QList<TransferHandler*>)));
1298  connect(KGet::model(), SIGNAL(transfersChangedEvent(QMap<TransferHandler*,Transfer::ChangesFlags>)),
1299  SLOT(transfersChangedEvent(QMap<TransferHandler*,Transfer::ChangesFlags>)));
1300  connect(KGet::model(), SIGNAL(groupsChangedEvent(QMap<TransferGroupHandler*,TransferGroup::ChangesFlags>)),
1301  SLOT(groupsChangedEvent(QMap<TransferGroupHandler*,TransferGroup::ChangesFlags>)));
1302  connect(KGet::model(), SIGNAL(transferMovedEvent(TransferHandler*,TransferGroupHandler*)),
1303  SLOT(transferMovedEvent(TransferHandler*,TransferGroupHandler*)));
1304  connect(Solid::Networking::notifier(), SIGNAL(statusChanged(Solid::Networking::Status)),
1305  this, SLOT(slotNetworkStatusChanged(Solid::Networking::Status)));
1306 
1307 }
1308 
1309 GenericObserver::~GenericObserver()
1310 {
1311 }
1312 
1313 void GenericObserver::groupAddedEvent(TransferGroupHandler *handler)
1314 {
1315  Q_UNUSED(handler)
1316  KGet::save();
1317 }
1318 
1319 void GenericObserver::groupRemovedEvent(TransferGroupHandler *handler)
1320 {
1321  Q_UNUSED(handler)
1322  KGet::save();
1323 }
1324 
1325 void GenericObserver::transfersAddedEvent(const QList<TransferHandler*> &handlers)
1326 {
1327  Q_UNUSED(handlers)
1328  requestSave();
1329  KGet::calculateGlobalSpeedLimits();
1330  KGet::checkSystemTray();
1331 }
1332 
1333 void GenericObserver::transfersRemovedEvent(const QList<TransferHandler*> &handlers)
1334 {
1335  Q_UNUSED(handlers)
1336  requestSave();
1337  KGet::calculateGlobalSpeedLimits();
1338  KGet::checkSystemTray();
1339 }
1340 
1341 void GenericObserver::transferMovedEvent(TransferHandler *transfer, TransferGroupHandler *group)
1342 {
1343  Q_UNUSED(transfer)
1344  Q_UNUSED(group)
1345  requestSave();
1346  KGet::calculateGlobalSpeedLimits();
1347 }
1348 
1349 void GenericObserver::requestSave()
1350 {
1351  if (!m_save) {
1352  m_save = new QTimer(this);
1353  m_save->setInterval(5000);
1354  connect(m_save, SIGNAL(timeout()), this, SLOT(slotSave()));
1355  }
1356 
1357  //save regularly if there are running jobs
1358  m_save->setSingleShot(!KGet::m_scheduler->hasRunningJobs());
1359 
1360  if (!m_save->isActive()) {
1361  m_save->start();
1362  }
1363 }
1364 
1365 void GenericObserver::slotSave()
1366 {
1367  KGet::save();
1368 }
1369 
1370 void GenericObserver::transfersChangedEvent(QMap<TransferHandler*, Transfer::ChangesFlags> transfers)
1371 {
1372  bool checkSysTray = false;
1373  bool allFinished = true;
1374  QMap<TransferHandler*, Transfer::ChangesFlags>::const_iterator it;
1375  QMap<TransferHandler*, Transfer::ChangesFlags>::const_iterator itEnd = transfers.constEnd();
1376  for (it = transfers.constBegin(); it != itEnd; ++it)
1377  {
1378  TransferHandler::ChangesFlags transferFlags = *it;
1379  TransferHandler *transfer = it.key();
1380 
1381  if (transferFlags & Transfer::Tc_Status) {
1382  if ((transfer->status() == Job::Finished) && (transfer->startStatus() != Job::Finished)) {
1383  KGet::showNotification(KGet::m_mainWindow, "finished",
1384  i18n("<p>The following file has finished downloading:</p><p style=\"font-size: small;\">%1</p>", transfer->dest().fileName()),
1385  "kget", i18n("Download completed"));
1386  } else if (transfer->status() == Job::Running) {
1387  KGet::showNotification(KGet::m_mainWindow, "started",
1388  i18n("<p>The following transfer has been started:</p><p style=\"font-size: small;\">%1</p>", transfer->source().pathOrUrl()),
1389  "kget", i18n("Download started"));
1390  } else if (transfer->status() == Job::Aborted && transfer->error().type != Job::AutomaticRetry) {
1391  KNotification * notification = KNotification::event("error", i18n("Error"), i18n("<p>There has been an error in the following transfer:</p><p style=\"font-size: small;\">%1</p>"
1392  "<p>The error message is:</p><p style=\"font-size: small;\">%2</p>", transfer->source().pathOrUrl(), transfer->error().text),
1393  transfer->error().pixmap, KGet::m_mainWindow, KNotification::CloseOnTimeout);
1394  if (transfer->error().type == Job::ManualSolve) {
1395  m_notifications.insert(notification, transfer);
1396  notification->setActions(QStringList() << i18n("Resolve"));
1397  connect(notification, SIGNAL(action1Activated()), SLOT(slotResolveTransferError()));
1398  connect(notification, SIGNAL(closed()), SLOT(slotNotificationClosed()));
1399  }
1400  }
1401  }
1402 
1403  if (transferFlags & Transfer::Tc_Status) {
1404  checkSysTray = true;
1405  requestSave();
1406  }
1407 
1408  if (transferFlags & Transfer::Tc_Percent) {
1409  transfer->group()->setGroupChange(TransferGroup::Gc_Percent, true);
1410  transfer->checkShareRatio();
1411  }
1412 
1413  if (transferFlags & Transfer::Tc_DownloadSpeed) {
1414  transfer->group()->setGroupChange(TransferGroup::Gc_DownloadSpeed, true);
1415  }
1416 
1417  if (transferFlags & Transfer::Tc_UploadSpeed) {
1418  transfer->group()->setGroupChange(TransferGroup::Gc_UploadSpeed, true);
1419  }
1420 
1421  if ((transfer->status() == Job::Finished) || (transfer->status() == Job::FinishedKeepAlive)) {
1422  requestSave();
1423  } else {
1424  allFinished = false;
1425  }
1426  }
1427  allFinished = allFinished && allTransfersFinished();
1428 
1429  if (checkSysTray)
1430  KGet::checkSystemTray();
1431 
1432  //only perform after finished actions if actually the status changed (that is the
1433  //case if checkSysTray is set to true)
1434  if (checkSysTray && Settings::afterFinishActionEnabled() && allFinished)
1435  {
1436  kDebug(5001) << "All finished";
1437  KNotification *notification = 0;
1438 
1439  if (!m_finishAction) {
1440  m_finishAction = new QTimer(this);
1441  m_finishAction->setSingleShot(true);
1442  m_finishAction->setInterval(10000);
1443  connect(m_finishAction, SIGNAL(timeout()), this, SLOT(slotAfterFinishAction()));
1444  }
1445 
1446  switch (Settings::afterFinishAction()) {
1447  case KGet::Quit:
1448  notification = KGet::showNotification(KGet::m_mainWindow, "notification", i18n("KGet is now closing, as all downloads have completed."), "kget", "KGet", KNotification::Persistent | KNotification::CloseWhenWidgetActivated);
1449  break;
1450 #ifdef HAVE_KWORKSPACE
1451  case KGet::Shutdown:
1452  notification = KGet::showNotification(KGet::m_mainWindow, "notification", i18n("The computer will now turn off, as all downloads have completed."), "system-shutdown", i18nc("Shutting down computer", "Shutdown"), KNotification::Persistent | KNotification::CloseWhenWidgetActivated);
1453  break;
1454  case KGet::Hibernate:
1455  notification = KGet::showNotification(KGet::m_mainWindow, "notification", i18n("The computer will now suspend to disk, as all downloads have completed."), "system-suspend-hibernate", i18nc("Hibernating computer", "Hibernating"), KNotification::Persistent | KNotification::CloseWhenWidgetActivated);
1456  break;
1457  case KGet::Suspend:
1458  notification = KGet::showNotification(KGet::m_mainWindow, "notification", i18n("The computer will now suspend to RAM, as all downloads have completed."), "system-suspend", i18nc("Suspending computer", "Suspending"), KNotification::Persistent | KNotification::CloseWhenWidgetActivated);
1459  break;
1460 #endif
1461  default:
1462  break;
1463  }
1464 
1465  if (notification) {
1466  notification->setActions(QStringList() << i18nc("abort the proposed action", "Abort"));
1467  connect(notification, SIGNAL(action1Activated()), this, SLOT(slotAbortAfterFinishAction()));
1468  connect(m_finishAction, SIGNAL(timeout()), notification, SLOT(close()));
1469 
1470  if (!m_finishAction->isActive()) {
1471  m_finishAction->start();
1472  }
1473  }
1474  } else if (allFinished) {
1475  KGet::showNotification(KGet::m_mainWindow, "finishedall",
1476  i18n("<p>All transfers have been finished.</p>"),
1477  "kget", i18n("Downloads completed"));
1478  }
1479 }
1480 
1481 void GenericObserver::slotResolveTransferError()
1482 {
1483  KNotification * notification = static_cast<KNotification*>(QObject::sender());
1484  if (notification) {
1485  TransferHandler * handler = m_notifications[notification];
1486  kDebug() << "Resolve error for" << handler->source().pathOrUrl() << "with id" << handler->error().id;
1487  handler->resolveError(handler->error().id);
1488  m_notifications.remove(notification);
1489  }
1490 }
1491 
1492 void GenericObserver::slotNotificationClosed()
1493 {
1494  kDebug() << "Remove notification";
1495  KNotification * notification = static_cast<KNotification*>(QObject::sender());
1496  if (notification)
1497  m_notifications.remove(notification);
1498 }
1499 
1500 void GenericObserver::slotNetworkStatusChanged(const Solid::Networking::Status &status)
1501 {
1502  KGet::setHasNetworkConnection((status == Solid::Networking::Connected) || (status == Solid::Networking::Unknown));
1503 }
1504 
1505 void GenericObserver::groupsChangedEvent(QMap<TransferGroupHandler*, TransferGroup::ChangesFlags> groups)
1506 {
1507  bool recalculate = false;
1508  foreach (const TransferGroup::ChangesFlags &flags, groups)
1509  {
1510  if (flags & TransferGroup::Gc_Percent || flags & TransferGroup::Gc_Status) {
1511  recalculate = true;
1512  break;
1513  }
1514  }
1515  kDebug() << "Recalculate limits?" << recalculate;
1516  if (recalculate)
1517  KGet::calculateGlobalSpeedLimits();
1518 }
1519 
1520 bool GenericObserver::allTransfersFinished()
1521 {
1522  bool quitFlag = true;
1523 
1524  // if all the downloads had state finished from
1525  // the beginning
1526  bool allWereFinished = true;
1527 
1528  foreach(TransferGroup *transferGroup, KGet::model()->transferGroups()) {
1529  foreach(TransferHandler *transfer, transferGroup->handler()->transfers()) {
1530  if ((transfer->status() != Job::Finished) && (transfer->status() != Job::FinishedKeepAlive)) {
1531  quitFlag = false;
1532  }
1533  if ((transfer->status() == Job::Finished || transfer->status() == Job::FinishedKeepAlive) &&
1534  (transfer->startStatus() != Job::Finished && transfer->startStatus() != Job::FinishedKeepAlive)) {
1535  allWereFinished = false;
1536  }
1537  }
1538  }
1539 
1540  // if the only downloads in the queue
1541  // are those that are already finished
1542  // before the current KGet instance
1543  // we don't want to quit
1544  if (allWereFinished)
1545  {
1546  return false;
1547  }
1548 
1549  // otherwise, we did some downloads right now, let quitFlag decide
1550  return quitFlag;
1551 }
1552 
1553 void GenericObserver::slotAfterFinishAction()
1554 {
1555  kDebug(5001);
1556 
1557  switch (Settings::afterFinishAction()) {
1558  case KGet::Quit:
1559  kDebug(5001) << "Quit Kget.";
1560  QTimer::singleShot(0, KGet::m_mainWindow, SLOT(slotQuit()));
1561  break;
1562  #ifdef HAVE_KWORKSPACE
1563  case KGet::Shutdown:
1564  QTimer::singleShot(0, KGet::m_mainWindow, SLOT(slotQuit()));
1565  KWorkSpace::requestShutDown(KWorkSpace::ShutdownConfirmNo,
1566  KWorkSpace::ShutdownTypeHalt,
1567  KWorkSpace::ShutdownModeForceNow);
1568  break;
1569  case KGet::Hibernate: {
1570  QDBusMessage call;
1571  call = QDBusMessage::createMethodCall("org.kde.Solid.PowerManagement",
1572  "/org/kde/Solid/PowerManagement",
1573  "org.kde.Solid.PowerManagement",
1574  "suspendToRam");
1575  QDBusConnection::sessionBus().asyncCall(call);
1576  break;
1577  }
1578  case KGet::Suspend: {
1579  QDBusMessage call;
1580  call = QDBusMessage::createMethodCall("org.kde.Solid.PowerManagement",
1581  "/org/kde/Solid/PowerManagement",
1582  "org.kde.Solid.PowerManagement",
1583  "suspendToDisk");
1584  QDBusConnection::sessionBus().asyncCall(call);
1585  break;
1586  }
1587  #endif
1588  default:
1589  break;
1590  }
1591 }
1592 
1593 void GenericObserver::slotAbortAfterFinishAction()
1594 {
1595  kDebug(5001);
1596 
1597  m_finishAction->stop();
1598 }
1599 
1600 #include "kget.moc"
Scheduler::stop
void stop()
Stops globally the execution of the jobs.
Definition: scheduler.cpp:239
TransferGroupScheduler::setUploadLimit
void setUploadLimit(int limit)
Sets a upload limit to the scheduler.
Definition: transfergroupscheduler.cpp:119
KGet::generalDestDir
static QString generalDestDir(bool preferXDGDownloadDir=false)
Returns a download directory.
Definition: kget.cpp:945
KGet::redownloadTransfer
static void redownloadTransfer(TransferHandler *transfer)
Redownload a transfer.
Definition: kget.cpp:405
TransferHandler::status
Job::Status status() const
Definition: transferhandler.h:64
TransferTreeModel::findTransfer
Transfer * findTransfer(const KUrl &src)
Definition: transfertreemodel.cpp:467
KGet::addTransfer
static TransferHandler * addTransfer(KUrl srcUrl, QString destDir=QString(), QString suggestedFileName=QString(), QString groupName=QString(), bool start=false)
Adds a new transfer to the KGet.
Definition: kget.cpp:179
TransferFactory::settingsChanged
virtual void settingsChanged()
Definition: transferfactory.h:72
KGet::transferGroupNames
static QStringList transferGroupNames()
Definition: kget.cpp:168
Job::Error::pixmap
QPixmap pixmap
Definition: job.h:76
TransferHandler
Class TransferHandler:
Definition: transferhandler.h:48
KGet::renameGroup
static void renameGroup(const QString &oldName, const QString &newName)
Changes the name of the group.
Definition: kget.cpp:158
Transfer::Tc_UploadSpeed
Definition: transfer.h:59
kt::no
static KIcon no
Definition: peerviewmodel.cpp:33
TransferGroup
class TransferGroup:
Definition: transfergroup.h:46
Scheduler::setIsSuspended
void setIsSuspended(bool isSuspended)
Can be used to suspend the scheduler before doing lenghty operations and activating it later again...
Definition: scheduler.cpp:39
Job::Finished
The job is stopped, but this also indicates that it stopped because an error occurred.
Definition: job.h:47
GenericObserver::transfersChangedEvent
void transfersChangedEvent(QMap< TransferHandler *, Transfer::ChangesFlags > transfers)
Definition: kget.cpp:1370
FrameworkVersion
const int FrameworkVersion
Bump this number whenever the plugin framework gets incompatible with older versions.
Definition: plugin.h:55
TransferHandler::checkShareRatio
void checkShareRatio()
Recalculate the share ratio.
Definition: transferhandler.h:205
TransferGroupHandler
Definition: transfergrouphandler.h:30
Job::AutomaticRetry
Definition: job.h:69
KGet::loadPlugins
static void loadPlugins()
Definition: kget.cpp:1144
KGet::settingsChanged
static void settingsChanged()
This will be called when the settings have been changed.
Definition: kget.cpp:717
transfertreemodel.h
Job::ManualSolve
Definition: job.h:70
ModelItem::asGroup
GroupModelItem * asGroup()
Definition: transfertreemodel.cpp:74
TransferHistoryItem
Definition: transferhistorystore.h:23
transferhistorystore.h
KGet::selectedTransferGroups
static QList< TransferGroupHandler * > selectedTransferGroups()
Definition: kget.cpp:469
KGet::~KGet
~KGet()
Definition: kget.cpp:842
Job::FinishedKeepAlive
The job exited from its Running state successfully.
Definition: job.h:48
KGet::delTransfers
static bool delTransfers(const QList< TransferHandler * > &transfers, DeleteMode mode=AutoDelete)
Removes multiple transfers from the KGet.
Definition: kget.cpp:367
TransferData
KGet::setGlobalDownloadLimit
static void setGlobalDownloadLimit(int limit)
Sets the global download limit.
Definition: kget.cpp:775
Job::Error::type
ErrorType type
Definition: job.h:77
GenericObserver::groupsChangedEvent
void groupsChangedEvent(QMap< TransferGroupHandler *, TransferGroup::ChangesFlags > groups)
Definition: kget.cpp:1505
KGet::start
bool start
Definition: kget.h:462
QWidget
KGet::calculateGlobalDownloadLimit
static void calculateGlobalDownloadLimit()
Recalculates the global download-limit.
Definition: kget.cpp:793
plugin.h
TransferTreeModel::findGroup
TransferGroup * findGroup(const QString &groupName)
Definition: transfertreemodel.cpp:457
TransferGroup::name
const QString & name()
Definition: transfergroup.h:163
mostlocalurl.h
Settings::lastDirectory
static QString lastDirectory()
Get LastDirectory.
Definition: settings.h:943
TransferHistoryStore
Definition: transferhistorystore.h:53
TransferDataSource
This Class is an interface for inter-plugins data change.
Definition: transferdatasource.h:26
QObject
mostLocalUrl
KUrl mostLocalUrl(const KUrl &url)
Synchronous.
Definition: mostlocalurl.cpp:27
KGet::matchesExceptions
static bool matchesExceptions(const KUrl &sourceUrl, const QStringList &patterns)
Returns true if sourceUrl matches any of the patterns.
Definition: kget.cpp:743
TransferTreeModel::transferGroups
QList< TransferGroup * > transferGroups()
Definition: transfertreemodel.cpp:447
TransferTreeModel
Definition: transfertreemodel.h:108
Settings::afterFinishActionEnabled
static bool afterFinishActionEnabled()
Get AfterFinishActionEnabled.
Definition: settings.h:411
TransferGroupScheduler::setDownloadLimit
void setDownloadLimit(int limit)
Sets a download limit to the scheduler.
Definition: transfergroupscheduler.cpp:113
KGet::dest
KUrl dest
Definition: kget.h:460
TransferGroupScheduler::calculateUploadLimit
void calculateUploadLimit()
Calculates the DownloadLimits.
Definition: transfergroupscheduler.cpp:74
KGet::e
const QDomElement * e
Definition: kget.h:463
KGet::allTransferGroups
static QList< TransferGroupHandler * > allTransferGroups()
Gets all transfer-groups.
Definition: kget.cpp:668
kuiserverjobs.h
TransferGroup::load
void load(const QDomElement &e)
Adds all the groups in the given QDomNode * to the group.
Definition: transfergroup.cpp:361
transfergroupscheduler.h
Scheduler::start
void start()
Starts globally the execution of the jobs.
Definition: scheduler.cpp:234
Transfer::Tc_Status
Definition: transfer.h:53
KGet::allTransfers
static QList< TransferHandler * > allTransfers()
Gets all transfers.
Definition: kget.cpp:657
TransferTreeModel::itemFromIndex
ModelItem * itemFromIndex(const QModelIndex &index) const
Definition: transfertreemodel.cpp:391
TransferGroup::Gc_UploadSpeed
Definition: transfergroup.h:58
transferfactory.h
KGet::setGlobalUploadLimit
static void setGlobalUploadLimit(int limit)
Sets the global upload limit.
Definition: kget.cpp:780
TransferHandler::error
Job::Error error() const
Definition: transferhandler.h:65
Job::Running
Definition: job.h:43
KGet::calculateGlobalUploadLimit
static void calculateGlobalUploadLimit()
Recalculates the global upload-limit.
Definition: kget.cpp:798
TransferHandler::dest
const KUrl & dest() const
Definition: transferhandler.h:98
Transfer::load
virtual void load(const QDomElement *element)
Loads the transfer's info from the QDomElement.
Definition: transfer.cpp:244
KGet::save
static void save(QString filename=QString(), bool plain=false)
Exports all the transfers and groups to the given file.
Definition: kget.cpp:573
TransferGroupScheduler::calculateDownloadLimit
void calculateDownloadLimit()
Calculates the DownloadLimits.
Definition: transfergroupscheduler.cpp:33
KGet::GenericObserver
friend class GenericObserver
Definition: kget.h:71
KGet::DeleteMode
DeleteMode
Definition: kget.h:81
KGet::model
static TransferTreeModel * model()
Definition: kget.cpp:487
TransferGroupHandler::name
const QString & name()
Definition: transfergrouphandler.h:83
KGet::addGroup
static bool addGroup(const QString &groupName)
Adds a new group to the KGet.
Definition: kget.cpp:101
KGet::selectionModel
static TransferTreeSelectionModel * selectionModel()
Definition: kget.cpp:492
transfergrouphandler.h
TransferTreeModel::addTransfers
void addTransfers(const QList< Transfer * > &transfers, TransferGroup *group)
Definition: transfertreemodel.cpp:246
Job::stop
virtual void stop()=0
KGet::groupName
QString groupName
Definition: kget.h:461
TransferTreeModel::delTransfers
void delTransfers(const QList< Transfer * > &transfers)
Definition: transfertreemodel.cpp:284
KGet::TransferTreeModel
friend class TransferTreeModel
Definition: kget.h:72
transfertreeselectionmodel.h
TransferGroup::save
void save(QDomElement e)
Saves this group object to the given QDomNode.
Definition: transfergroup.cpp:324
mainwindow.h
TransferHandler::ChangesFlags
Transfer::ChangesFlags ChangesFlags
Definition: transferhandler.h:58
KGet::moveTransfer
static void moveTransfer(TransferHandler *transfer, const QString &groupName)
Moves a transfer to a new group.
Definition: kget.cpp:399
Transfer::DeleteTemporaryFiles
Definition: transfer.h:96
KGet::finishedTransfers
static QList< TransferHandler * > finishedTransfers()
Definition: kget.cpp:456
TransferGroupScheduler
TransferGroupScheduler class: what handle all the transfers in kget.
Definition: transfergroupscheduler.h:23
TransferHandler::source
const KUrl & source() const
Definition: transferhandler.h:93
KGet::setSuspendScheduler
static void setSuspendScheduler(bool isSuspended)
true suspends the scheduler, any events that would result in a reschedule are ignored false wakes up ...
Definition: kget.cpp:652
KGet::findGroup
static TransferGroupHandler * findGroup(const QString &name)
Get the group with the given name.
Definition: kget.cpp:690
KGet::load
static void load(QString filename=QString())
Imports the transfers and groups included in the provided xml file.
Definition: kget.cpp:508
KGet::actionCollection
static KActionCollection * actionCollection()
Definition: kget.cpp:631
TransferGroupHandler::setName
void setName(const QString &name)
Set the group name.
Definition: transfergrouphandler.cpp:78
Scheduler::setHasNetworkConnection
void setHasNetworkConnection(bool hasConnection)
The JobQueues will be informed of changes in the network connection If there is no network connection...
Definition: scheduler.cpp:50
GroupModelItem::groupHandler
TransferGroupHandler * groupHandler()
Definition: transfertreemodel.cpp:178
GenericObserver::transfersRemovedEvent
void transfersRemovedEvent(const QList< TransferHandler * > &handlers)
Definition: kget.cpp:1333
Transfer::factory
TransferFactory * factory() const
Definition: transfer.h:272
transfergroup.h
TransferHandler::startStatus
Job::Status startStatus() const
Definition: transferhandler.h:66
TransferHandler::resolveError
void resolveError(int errorId)
Definition: transferhandler.h:70
Job::Error::id
int id
Definition: job.h:74
TransferGroup::Gc_Percent
Definition: transfergroup.h:57
TransferHistoryStore::saveItems
virtual void saveItems(const QList< TransferHistoryItem > &items)
Definition: transferhistorystore.h:78
KGetPlugin
Base class for kget plugins.
Definition: plugin.h:61
nepomukcontroller.h
GenericObserver::~GenericObserver
virtual ~GenericObserver()
Definition: kget.cpp:1309
GenericObserver::transferMovedEvent
void transferMovedEvent(TransferHandler *, TransferGroupHandler *)
Definition: kget.cpp:1341
TransferTreeModel::delGroup
void delGroup(TransferGroup *group)
Definition: transfertreemodel.cpp:219
KGet::groupsFromExceptions
static QList< TransferGroupHandler * > groupsFromExceptions(const KUrl &filename)
Definition: kget.cpp:730
NepomukController
Definition: nepomukcontroller.h:44
transferdatasource.h
Job::Aborted
The job is stopped.
Definition: job.h:45
TransferHandler::group
TransferGroupHandler * group() const
Definition: transferhandler.h:88
Transfer::Tc_DownloadSpeed
Definition: transfer.h:56
TransferTreeSelectionModel
Definition: transfertreeselectionmodel.h:16
ModelItem
Definition: transfertreemodel.h:59
KGet::AutoDelete
Definition: kget.h:82
TransferGroup::Gc_DownloadSpeed
Definition: transfergroup.h:59
GenericObserver::transfersAddedEvent
void transfersAddedEvent(const QList< TransferHandler * > &handlers)
Definition: kget.cpp:1325
GenericObserver::GenericObserver
GenericObserver(QObject *parent=0)
Definition: kget.cpp:1287
KGet::src
KUrl src
Definition: kget.h:459
MainWindow::setSystemTrayDownloading
virtual void setSystemTrayDownloading(bool running)
Definition: mainwindow.cpp:1106
Scheduler::settingsChanged
void settingsChanged()
This function gets called by the KGet class whenever the settings have changed.
Definition: scheduler.cpp:109
TransferTreeModel::addGroup
void addGroup(TransferGroup *group)
Definition: transfertreemodel.cpp:204
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
KGet::selectedTransfers
static QList< TransferHandler * > selectedTransfers()
Definition: kget.cpp:416
settings.h
Job::status
Status status() const
Definition: job.h:93
KGet::delGroups
static void delGroups(QList< TransferGroupHandler * > groups, bool askUser=true)
Removes specific groups from the KGet.
Definition: kget.cpp:132
Transfer::handler
TransferHandler * handler()
Definition: transfer.cpp:217
TransferTreeModel::findTransferByDestination
Transfer * findTransferByDestination(const KUrl &dest)
Definition: transfertreemodel.cpp:483
TransferGroupHandler::regExp
QRegExp regExp()
Definition: transfergrouphandler.h:145
TransferGroup::handler
TransferGroupHandler * handler() const
Definition: transfergroup.h:283
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
TransferGroupHandler::transfers
const QList< TransferHandler * > transfers()
Definition: transfergrouphandler.cpp:134
TransferGroup::Gc_Status
Definition: transfergroup.h:55
KGet::self
static KGet * self(MainWindow *mainWindow=0)
This is our KGet class.
Definition: kget.cpp:88
kget.h
KGet::Hibernate
Definition: kget.h:78
Settings::afterFinishAction
static int afterFinishAction()
Get AfterFinishAction.
Definition: settings.h:430
KGet::showNotification
static KNotification * showNotification(QWidget *parent, const QString &eventType, const QString &text, const QString &icon=QString("dialog-error"), const QString &title=i18n("KGet"), const KNotification::NotificationFlags &flags=KNotification::CloseOnTimeout)
Shows a knotification.
Definition: kget.cpp:1281
ModelItem::asTransfer
TransferModelItem * asTransfer()
Definition: transfertreemodel.cpp:79
transfer.h
KGet::calculateGlobalSpeedLimits
static void calculateGlobalSpeedLimits()
Recalculates the global speedlimits.
Definition: kget.cpp:785
KGet::findTransfer
static TransferHandler * findTransfer(const KUrl &src)
Get the transfer with the given url.
Definition: kget.cpp:680
TransferGroup::ChangesFlags
int ChangesFlags
Definition: transfergroup.h:64
Transfer::Tc_Percent
Definition: transfer.h:55
KUiServerJobs::settingsChanged
void settingsChanged()
Definition: kuiserverjobs.cpp:38
KGet::Suspend
Definition: kget.h:79
kt::yes
static KIcon yes
Definition: peerviewmodel.cpp:33
KGet::TransferData
TransferData(const KUrl &src, const KUrl &dest, const QString &groupName=QString(), bool start=false, const QDomElement *e=0)
KGet::delGroup
static void delGroup(TransferGroupHandler *group, bool askUser=true)
Removes a group from the KGet.
Definition: kget.cpp:115
TransferHistoryStore::getStore
static TransferHistoryStore * getStore()
Definition: transferhistorystore.cpp:150
KGet
This is our KGet class.
Definition: kget.h:67
Transfer::DeleteFiles
Definition: transfer.h:97
Job::Error::text
QString text
Definition: job.h:75
GenericObserver::groupAddedEvent
void groupAddedEvent(TransferGroupHandler *handler)
Definition: kget.cpp:1313
GenericObserver::groupRemovedEvent
void groupRemovedEvent(TransferGroupHandler *handler)
Definition: kget.cpp:1319
TransferFactory
TransferFactory.
Definition: transferfactory.h:52
Transfer::create
void create()
This functions gets called whenever a Transfer gets created.
Definition: transfer.cpp:76
KGet::checkSystemTray
static void checkSystemTray()
Run this function for enabling the systemTray (will be automatically done, if there is download runni...
Definition: kget.cpp:700
TransferModelItem::transferHandler
TransferHandler * transferHandler()
Definition: transfertreemodel.cpp:138
TransferFactory::createTransferDataSource
virtual TransferDataSource * createTransferDataSource(const KUrl &srcUrl, const QDomElement &type, QObject *parent)
Returns a Data Source.
Definition: transferfactory.cpp:64
KGet::Shutdown
Definition: kget.h:77
KGet::factories
static QList< TransferFactory * > factories()
Definition: kget.cpp:621
KGet::setSchedulerRunning
static void setSchedulerRunning(bool running=true)
if running == true starts the scheduler if running == false stops the scheduler
Definition: kget.cpp:636
Scheduler::hasRunningJobs
bool hasRunningJobs() const
Definition: scheduler.cpp:89
MainWindow
The main window of KGet.
Definition: mainwindow.h:41
Settings::setLastDirectory
static void setLastDirectory(const QString &v)
Set LastDirectory.
Definition: settings.h:933
KGet::factory
static TransferFactory * factory(TransferHandler *transfer)
Definition: kget.cpp:626
KGet::delTransfer
static bool delTransfer(TransferHandler *transfer, DeleteMode mode=AutoDelete)
Removes a transfer from the KGet.
Definition: kget.cpp:362
TransferFactory::createTransfer
virtual Transfer * createTransfer(const KUrl &srcUrl, const KUrl &destUrl, TransferGroup *parent, Scheduler *scheduler, const QDomElement *n=0)
Definition: transferfactory.cpp:26
KGet::schedulerRunning
static bool schedulerRunning()
Returns true if the scheduler has running jobs.
Definition: kget.cpp:647
ModelItem::isGroup
virtual bool isGroup()
Definition: transfertreemodel.cpp:69
Transfer
Definition: transfer.h:36
KGet::Quit
Definition: kget.h:76
KUiServerJobs
Definition: kuiserverjobs.h:29
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