• 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
  • checksumsearch
checksumsearchtransferdatasource.cpp
Go to the documentation of this file.
1 /***************************************************************************
2 * Copyright (C) 2009 Matthias Fuchs <mat69@gmx.net> *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
18 ***************************************************************************/
19 
20 #include "checksumsearchtransferdatasource.h"
21 #include "checksumsearch.h"
22 #include "checksumsearchsettings.h"
23 
24 #include <QFile>
25 
26 #include <KDebug>
27 #include <KIO/DeleteJob>
28 #include <KIO/NetAccess>
29 #include <KStandardDirs>
30 
31 ChecksumSearchController ChecksumSearchTransferDataSource::s_controller;
32 
33 ChecksumSearchController::ChecksumSearchController(QObject *parent)
34  : QObject(parent)
35 {
36 }
37 
38 ChecksumSearchController::~ChecksumSearchController()
39 {
40 }
41 
42 void ChecksumSearchController::registerSearch(ChecksumSearchTransferDataSource *search, const KUrl &baseUrl)
43 {
44  if (m_finished.contains(baseUrl)) {
45  kDebug(5001) << "Already downloaded" << baseUrl;
46  const KUrl urlToFile = m_finished[baseUrl];
47  if (!urlToFile.isEmpty()) {
48  search->gotBaseUrl(m_finished[baseUrl]);
49  }
50  } else {
51  const bool alreadySearchedFor = m_searches.contains(baseUrl);
52  if (!m_searches.contains(baseUrl, search)) {
53  m_searches.insert(baseUrl, search);
54 
55  if (alreadySearchedFor) {
56  kDebug(5001) << "Search already started for" << baseUrl;
57  return;
58  }
59  kDebug(5001) << "Creating download for" << baseUrl;
60  static int files = 0;
61 
62  const KUrl dest = KUrl(KStandardDirs::locateLocal("appdata", "checksumsearch/") + QString::number(files++));
63  if (QFile::exists(dest.toLocalFile())) {
64  KIO::Job *del = KIO::del(dest, KIO::HideProgressInfo);
65  KIO::NetAccess::synchronousRun(del, 0);
66  }
67 
68  if (baseUrl.protocol() != "ftp" && baseUrl.protocol() != "sftp") {
69  kDebug(5001) << "Downloading" << baseUrl;
70  KIO::FileCopyJob *job = KIO::file_copy(baseUrl, dest, -1, KIO::HideProgressInfo);
71  job->addMetaData("errorPage", "false");
72  connect(job, SIGNAL(result(KJob*)), SLOT(slotResult(KJob*)));
73  m_jobs[job] = qMakePair(baseUrl, dest);
74  } else {
75  kDebug(5001) << "ftp, doing a listjob";
76  KIO::ListJob *job = KIO::listDir(baseUrl, KIO::HideProgressInfo);
77  connect(job, SIGNAL(entries(KIO::Job*,KIO::UDSEntryList)), this, SLOT(slotEntries(KIO::Job*,KIO::UDSEntryList)));
78  connect(job, SIGNAL(result(KJob*)), SLOT(slotResult(KJob*)));
79  m_jobs[job] = qMakePair(baseUrl, dest);
80  }
81  }
82  }
83 }
84 
85 void ChecksumSearchController::unregisterSearch(ChecksumSearchTransferDataSource *search, const KUrl &baseUrl)
86 {
87  if (baseUrl.isEmpty()) {
88  const QList<KUrl> keys = m_searches.keys(search);
89  foreach (const KUrl &key, keys) {
90  m_searches.remove(key, search);
91  }
92  } else {
93  m_searches.remove(baseUrl, search);
94  }
95 }
96 
97 void ChecksumSearchController::slotEntries(KIO::Job *job, const KIO::UDSEntryList &entries)
98 {
99  kDebug(5001);
100 
101  if (!m_jobs.contains(job)) {
102  return;
103  }
104 
105  const KUrl baseUrl = m_jobs[job].first;
106  const KUrl urlToFile = m_jobs[job].second;
107  QFile file(urlToFile.toLocalFile());
108  if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
109  kDebug(5001) << "Could not open file" << urlToFile;
110  }
111 
112  QTextStream out(&file);
113  foreach (const KIO::UDSEntry &entry, entries) {
114  if (!entry.isDir()) {
115  out << entry.stringValue(KIO::UDSEntry::UDS_NAME) << '\n';
116  }
117  }
118  file.close();
119 }
120 
121 void ChecksumSearchController::slotResult(KJob *job)
122 {
123  kDebug(5001);
124 
125  if (!m_jobs.contains(job)) {
126  return;
127  }
128 
129  const KUrl baseUrl = m_jobs[job].first;
130  const KUrl urlToFile = m_jobs[job].second;
131  m_jobs.remove(job);
132  if (job->error()) {
133  kDebug(5001) << "Error while getting baseurl:" << baseUrl << job->error() << job->errorString();
134  m_finished[baseUrl] = KUrl();
135  return;
136  }
137 
138  m_finished[baseUrl] = urlToFile;
139 
140  const QList<ChecksumSearchTransferDataSource*> searches = m_searches.values(baseUrl);
141  m_searches.remove(baseUrl);
142  foreach (ChecksumSearchTransferDataSource *search, searches) {
143  search->gotBaseUrl(urlToFile);
144  }
145 }
146 
147 ChecksumSearchTransferDataSource::ChecksumSearchTransferDataSource(const KUrl &srcUrl, QObject *parent)
148  : TransferDataSource(srcUrl, parent)
149 {
150 }
151 
152 ChecksumSearchTransferDataSource::~ChecksumSearchTransferDataSource()
153 {
154  s_controller.unregisterSearch(this, m_sourceUrl.upUrl());
155 }
156 
157 void ChecksumSearchTransferDataSource::start()
158 {
159  kDebug(5001);
160 
161  const KUrl baseUrl = m_sourceUrl.upUrl();
162  s_controller.registerSearch(this, baseUrl);
163 }
164 
165 void ChecksumSearchTransferDataSource::gotBaseUrl(const KUrl &urlToFile)
166 {
167  QFile file(urlToFile.toLocalFile());
168  if (!file.open(QIODevice::ReadOnly)) {
169  kDebug(5001) << "Could not open file" << urlToFile;
170  return;
171  }
172 
173  const QByteArray data = file.readAll();
174  file.close();
175 
176  QStringList changes = ChecksumSearchSettings::self()->searchStrings();
177  QList<int> modes = ChecksumSearchSettings::self()->urlChangeModeList();
178  QStringList types = ChecksumSearchSettings::self()->checksumTypeList();
179 
180  QList<KUrl> urls;
181 
182  for (int i = 0, k = 0; i < changes.size(); ++i) {
183  const ChecksumSearch::UrlChangeMode mode = static_cast<ChecksumSearch::UrlChangeMode>(modes.at(i));
184  const KUrl source = ChecksumSearch::createUrl(m_sourceUrl, changes.at(i), mode);
185  if (data.indexOf(source.fileName().toAscii()) != -1) {
186  urls.append(source);
187  ++k;
188  } else {
189  types.removeAt(k);
190  }
191  }
192 
193  kDebug(5001) << "Creating Checksumsearch for" << urls.count() << "urls.";
194 
195  if (urls.count() && types.count()) {
196  ChecksumSearch *search = new ChecksumSearch(urls, m_sourceUrl.fileName(), types);
197 
198  connect(search, SIGNAL(data(QString,QString)), this, SIGNAL(data(QString,QString)));
199  }
200 }
201 
202 void ChecksumSearchTransferDataSource::stop()
203 {
204  kDebug(5001);
205 }
206 
207 void ChecksumSearchTransferDataSource::addSegments(const QPair<KIO::fileoffset_t, KIO::fileoffset_t> &segmentSize, const QPair<int, int> &segmentRange)
208 {
209  Q_UNUSED(segmentSize)
210  Q_UNUSED(segmentRange)
211  kDebug(5001);
212 }
213 
214 #include "checksumsearchtransferdatasource.moc"
TransferDataSource::m_sourceUrl
KUrl m_sourceUrl
Definition: transferdatasource.h:242
ChecksumSearch::createUrl
static KUrl createUrl(const KUrl &src, const QString &change, UrlChangeMode mode)
Returns a modified url according to the parameters.
Definition: checksumsearch.cpp:166
checksumsearchsettings.h
ChecksumSearchTransferDataSource
Definition: checksumsearchtransferdatasource.h:68
ChecksumSearchTransferDataSource::addSegments
void addSegments(const QPair< KIO::fileoffset_t, KIO::fileoffset_t > &segmentSize, const QPair< int, int > &segmentRange)
Adds multiple continuous segments that should be downloaded by this TransferDataSource.
Definition: checksumsearchtransferdatasource.cpp:207
ChecksumSearchTransferDataSource::start
void start()
Definition: checksumsearchtransferdatasource.cpp:157
ChecksumSearchSettings::searchStrings
static QStringList searchStrings()
Get List of the available search engines.
Definition: checksumsearchsettings.h:30
ChecksumSearchController::ChecksumSearchController
ChecksumSearchController(QObject *parent=0)
Definition: checksumsearchtransferdatasource.cpp:33
ChecksumSearch::UrlChangeMode
UrlChangeMode
Used to define in whiche way the url should be changed to try and find Checksums. ...
Definition: checksumsearch.h:40
checksumsearch.h
checksumsearchtransferdatasource.h
ChecksumSearchTransferDataSource::ChecksumSearchTransferDataSource
ChecksumSearchTransferDataSource(const KUrl &srcUrl, QObject *parent)
Definition: checksumsearchtransferdatasource.cpp:147
TransferDataSource
This Class is an interface for inter-plugins data change.
Definition: transferdatasource.h:26
QObject
ChecksumSearchController::~ChecksumSearchController
~ChecksumSearchController()
Definition: checksumsearchtransferdatasource.cpp:38
ChecksumSearchSettings::checksumTypeList
static QStringList checksumTypeList()
Get List of the available search engine URLs.
Definition: checksumsearchsettings.h:68
ChecksumSearchSettings::urlChangeModeList
static QList< int > urlChangeModeList()
Get List of the available search engine URLs.
Definition: checksumsearchsettings.h:49
ChecksumSearch
Definition: checksumsearch.h:28
TransferDataSource::data
void data(KIO::fileoffset_t offset, const QByteArray &data, bool &worked)
Returns data in the forms of chucks.
ChecksumSearchTransferDataSource::stop
void stop()
Definition: checksumsearchtransferdatasource.cpp:202
ChecksumSearchController::registerSearch
void registerSearch(ChecksumSearchTransferDataSource *search, const KUrl &baseUrl)
Registers a search, downloads baseUrl if that has not be downloaded and then calls gotBaseUrl for any...
Definition: checksumsearchtransferdatasource.cpp:42
ChecksumSearchController
ChecksumSearchController downloads the baseUrl of files one want to get checksums for e...
Definition: checksumsearchtransferdatasource.h:35
ChecksumSearchSettings::self
static ChecksumSearchSettings * self()
Definition: checksumsearchsettings.cpp:17
ChecksumSearchTransferDataSource::~ChecksumSearchTransferDataSource
virtual ~ChecksumSearchTransferDataSource()
Definition: checksumsearchtransferdatasource.cpp:152
KJob
ChecksumSearchController::unregisterSearch
void unregisterSearch(ChecksumSearchTransferDataSource *search, const KUrl &baseUrl=KUrl())
Unregisters a search, do that e.g.
Definition: checksumsearchtransferdatasource.cpp:85
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