• 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
  • ui
  • metalinkcreator
filehandler.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 "filehandler.h"
21 #include "core/verifier.h"
22 
23 #include <QtCore/QDir>
24 
25 FileHandlerThread::FileHandlerThread(QObject *parent)
26  : QThread(parent),
27  abort(false)
28 {
29 }
30 
31 FileHandlerThread::~FileHandlerThread()
32 {
33  mutex.lock();
34  abort = true;
35  mutex.unlock();
36 
37  wait();
38 }
39 
40 void FileHandlerThread::setData(const QList<FileData> &files, const QStringList &types, bool createPartial, const KGetMetalink::Resources &tempResources, const KGetMetalink::CommonData &tempCommonData)
41 {
42  QMutexLocker locker(&mutex);
43  m_files.append(files);
44  m_types.append(types);
45  m_createPartial.append(createPartial);
46  m_tempResources.append(tempResources);
47  m_tempCommonDatas.append(tempCommonData);
48 
49  if (!isRunning()) {
50  start();
51  }
52 }
53 
54 void FileHandlerThread::run()
55 {
56  mutex.lock();
57  bool run = m_files.count();
58  mutex.unlock();
59 
60  while (run && !abort) {
61  mutex.lock();
62  QList<FileData> files = m_files.takeFirst();
63  QStringList types = m_types.takeFirst();
64  bool createPartial = m_createPartial.takeFirst();
65  KGetMetalink::Resources tempResources = m_tempResources.takeFirst();
66  KGetMetalink::CommonData commonData = m_tempCommonDatas.takeFirst();
67  mutex.unlock();
68 
69  while (files.count() && !abort) {
70  //take the first file and try to handle it
71  FileData data = files.takeFirst();
72  const KUrl url = data.url;
73  KGetMetalink::File file = data.file;
74  file.data = commonData;
75 
76  foreach (const KGetMetalink::Url &metalinkUrl, tempResources.urls) {
77  KGetMetalink::Url mirror = metalinkUrl;
78  mirror.url.addPath(file.name);
79 
80  //if the url has already been added, remove it and readd it
81  for (int i = 0; i < file.resources.urls.count(); ++i) {
82  if (file.resources.urls[i].url == mirror.url) {
83  file.resources.urls.removeAt(i);
84  break;
85  }
86  }
87  file.resources.urls.append(mirror);
88  }
89 
90  foreach (const QString &type, types) {
91  if (abort) {
92  return;
93  }
94 
95  const QString hash = Verifier::checksum(url, type, &abort);
96  if (!hash.isEmpty()) {
97  file.verification.hashes[type] = hash;
98  }
99  }
100 
101  if (createPartial) {
102  foreach (const QString &type, types) {
103  if (abort) {
104  return;
105  }
106 
107  const PartialChecksums partialChecksums = Verifier::partialChecksums(url, type, 0, &abort);
108  if (partialChecksums.isValid()) {
109  KGetMetalink::Pieces pieces;
110  pieces.type = type;
111  pieces.length = partialChecksums.length();
112  pieces.hashes = partialChecksums.checksums();
113  file.verification.pieces.append(pieces);
114  }
115  }
116  }
117  if (!abort) {
118  emit fileResult(file);
119  }
120  }
121  mutex.lock();
122  run = m_files.count();
123  mutex.unlock();
124  }
125 }
126 
127 DirectoryHandler::DirectoryHandler(QObject *parent)
128  : QObject(parent),
129  m_allJobsStarted(false)
130 {
131 }
132 
133 DirectoryHandler::~DirectoryHandler()
134 {
135 }
136 
137 QList<FileData> DirectoryHandler::takeFiles()
138 {
139  QList<FileData> files = m_files;
140  m_files.clear();
141 
142  return files;
143 }
144 
145 void DirectoryHandler::slotFiles(const QList<KUrl> &files)
146 {
147  if (files.isEmpty()) {
148  return;
149  }
150 
151  m_allJobsStarted = false;
152 
153  foreach (const KUrl &url, files) {
154  QDir dir(url.path());
155  if (dir.exists()) {
156  KIO::ListJob *listJob = KIO::listRecursive(url);
157  m_jobs[listJob] = url;
158 
159  connect(listJob, SIGNAL(entries(KIO::Job*,KIO::UDSEntryList)), this, SLOT(slotDirEntries(KIO::Job*,KIO::UDSEntryList)));
160  connect(listJob, SIGNAL(result(KJob*)), this, SLOT(slotFinished(KJob*)));
161  } else {
162  FileData data;
163  data.url = url;
164  data.file.name = url.fileName();
165  QFile localFile(url.path());
166  data.file.size = localFile.size();
167 
168  m_files.append(data);
169  }
170  }
171 
172  m_allJobsStarted = true;
173  evaluateFileProcess();
174 }
175 
176 void DirectoryHandler::slotDirEntries(KIO::Job *j, const KIO::UDSEntryList &entries)
177 {
178  KJob *job = j;
179  if (!m_jobs.contains(job)) {
180  return;
181  }
182 
183  const KUrl baseUrl = m_jobs[job];
184  const QString baseDir = baseUrl.fileName() + '/';
185 
186  foreach (const KIO::UDSEntry &entry, entries) {
187  //skip all found dirs
188  if (!entry.isDir()) {
189  const QString name = entry.stringValue(KIO::UDSEntry::UDS_NAME);
190  FileData data;
191  data.url = baseUrl;
192  data.url.addPath(name);
193  data.file.name = baseDir + name;
194  data.file.size = entry.numberValue(KIO::UDSEntry::UDS_SIZE, -1);
195 
196  m_files.append(data);
197  }
198  }
199 }
200 
201 void DirectoryHandler::slotFinished(KJob *job)
202 {
203  if (m_jobs.contains(job)) {
204  m_jobs.remove(job);
205  evaluateFileProcess();
206  }
207 }
208 
209 void DirectoryHandler::evaluateFileProcess()
210 {
211  //all jobs finished
212  if (m_jobs.isEmpty() && m_allJobsStarted && !m_files.isEmpty()) {
213  emit finished();
214  }
215 }
216 
217 #include "filehandler.moc"
FileData
Definition: filehandler.h:28
DirectoryHandler::slotFiles
void slotFiles(const QList< KUrl > &files)
The files the FileHandler should handle, the urls can also be urls to directories then the files of t...
Definition: filehandler.cpp:145
FileData::url
KUrl url
Definition: filehandler.h:30
KGetMetalink::File::resources
Resources resources
Definition: metalinker.h:272
FileHandlerThread::FileHandlerThread
FileHandlerThread(QObject *parent=0)
Definition: filehandler.cpp:25
KGetMetalink::Url
Definition: metalinker.h:156
DirectoryHandler::finished
void finished()
DirectoryHandler::~DirectoryHandler
~DirectoryHandler()
Definition: filehandler.cpp:133
FileData::file
KGetMetalink::File file
Definition: filehandler.h:31
DirectoryHandler::takeFiles
QList< FileData > takeFiles()
Returns the handled files and clears the member, call this after finished is emitted.
Definition: filehandler.cpp:137
PartialChecksums::length
KIO::filesize_t length() const
Definition: verifier.h:55
QObject
mirror
Definition: mirrors.h:17
KGetMetalink::File
Definition: metalinker.h:239
filehandler.h
KGetMetalink::Pieces::hashes
QStringList hashes
Definition: metalinker.h:221
PartialChecksums::isValid
bool isValid() const
Definition: verifier.h:53
FileHandlerThread::fileResult
void fileResult(const KGetMetalink::File file)
PartialChecksums::checksums
QStringList checksums() const
Definition: verifier.h:58
KGetMetalink::Resources::urls
QList< Url > urls
Definition: metalinker.h:202
KGetMetalink::Url::url
KUrl url
Definition: metalinker.h:187
verifier.h
Verifier::partialChecksums
static PartialChecksums partialChecksums(const KUrl &dest, const QString &type, KIO::filesize_t length=0, bool *abortPtr=0)
Create partial checksums of type for file dest.
Definition: verifier.cpp:448
KGetMetalink::CommonData
Files, File and Metadata contain this Metadata not as member and only for compatibility.
Definition: metalinker.h:93
KGetMetalink::Pieces::type
QString type
Definition: metalinker.h:219
KGetMetalink::Pieces
Definition: metalinker.h:206
KGetMetalink::File::name
QString name
Definition: metalinker.h:268
KGetMetalink::Verification::hashes
QHash< QString, QString > hashes
Definition: metalinker.h:234
FileHandlerThread::~FileHandlerThread
~FileHandlerThread()
Definition: filehandler.cpp:31
KGetMetalink::Resources
Definition: metalinker.h:190
KGetMetalink::File::verification
Verification verification
Definition: metalinker.h:269
KGetMetalink::Verification::pieces
QList< Pieces > pieces
Definition: metalinker.h:235
FileHandlerThread::run
void run()
Definition: filehandler.cpp:54
KGetMetalink::Pieces::length
KIO::filesize_t length
Definition: metalinker.h:220
DirectoryHandler::DirectoryHandler
DirectoryHandler(QObject *parent)
Definition: filehandler.cpp:127
QThread
Verifier::checksum
static QString checksum(const KUrl &dest, const QString &type, bool *abortPtr)
Creates the checksum type of the file dest.
Definition: verifier.cpp:398
KJob
KGetMetalink::File::size
KIO::filesize_t size
Definition: metalinker.h:270
FileHandlerThread::setData
void setData(const QList< FileData > &files, const QStringList &types, bool createPartial, const KGetMetalink::Resources &tempResources, const KGetMetalink::CommonData &tempCommonData)
Definition: filehandler.cpp:40
KGetMetalink::File::data
CommonData data
Definition: metalinker.h:271
PartialChecksums
Definition: verifier.h:40
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