Changeset View
Changeset View
Standalone View
Standalone View
krusader/FileSystem/filesystem.cpp
Show All 37 Lines | |||||
38 | #include <QEventLoop> | 38 | #include <QEventLoop> | ||
39 | #include <QList> | 39 | #include <QList> | ||
40 | // QtWidgets | 40 | // QtWidgets | ||
41 | #include <QApplication> | 41 | #include <QApplication> | ||
42 | #include <qplatformdefs.h> | 42 | #include <qplatformdefs.h> | ||
43 | 43 | | |||
44 | #include <KConfigCore/KSharedConfig> | 44 | #include <KConfigCore/KSharedConfig> | ||
45 | #include <KI18n/KLocalizedString> | 45 | #include <KI18n/KLocalizedString> | ||
46 | #include <KIO/DirectorySizeJob> | | |||
47 | #include <KIO/JobUiDelegate> | 46 | #include <KIO/JobUiDelegate> | ||
48 | 47 | | |||
49 | #include "../defaults.h" | 48 | #include "../defaults.h" | ||
50 | #include "../krglobal.h" | 49 | #include "../krglobal.h" | ||
51 | #include "../JobMan/jobman.h" | 50 | #include "../JobMan/jobman.h" | ||
52 | #include "../JobMan/krjob.h" | 51 | #include "../JobMan/krjob.h" | ||
53 | #include "krpermhandler.h" | 52 | #include "krpermhandler.h" | ||
54 | 53 | | |||
▲ Show 20 Lines • Show All 209 Lines • ▼ Show 20 Line(s) | 260 | for (int k = 0; k != fileList.size(); k++) { | |||
264 | QFileInfo qfiP = fileList[k]; | 263 | QFileInfo qfiP = fileList[k]; | ||
265 | if (qfiP.fileName() != "." && qfiP.fileName() != "..") | 264 | if (qfiP.fileName() != "." && qfiP.fileName() != "..") | ||
266 | calcSpaceLocal(path + '/' + qfiP.fileName(), totalSize, totalFiles, totalDirs, | 265 | calcSpaceLocal(path + '/' + qfiP.fileName(), totalSize, totalFiles, totalDirs, | ||
267 | stop); | 266 | stop); | ||
268 | } | 267 | } | ||
269 | } | 268 | } | ||
270 | } | 269 | } | ||
271 | 270 | | |||
272 | // TODO called from another thread, creating KIO jobs does not work here | | |||
273 | void FileSystem::calcSpaceKIO(const QUrl &url, KIO::filesize_t *totalSize, unsigned long *totalFiles, | 271 | void FileSystem::calcSpaceKIO(const QUrl &url, KIO::filesize_t *totalSize, unsigned long *totalFiles, | ||
274 | unsigned long *totalDirs, bool *stop) | 272 | unsigned long *totalDirs, bool *stop) | ||
275 | { | 273 | { | ||
276 | return; | | |||
277 | | ||||
278 | if (stop && *stop) | 274 | if (stop && *stop) | ||
279 | return; | 275 | return; | ||
280 | 276 | | |||
281 | _calcKdsBusy = stop; | | |||
282 | _calcKdsTotalSize = totalSize; | 277 | _calcKdsTotalSize = totalSize; | ||
283 | _calcKdsTotalFiles = totalFiles; | 278 | _calcKdsTotalFiles = totalFiles; | ||
284 | _calcKdsTotalDirs = totalDirs; | 279 | _calcKdsTotalDirs = totalDirs; | ||
285 | 280 | | |||
286 | _calcStatBusy = true; | 281 | KIO::StatJob *statJob = KIO::stat(url, KIO::HideProgressInfo); | ||
287 | KIO::StatJob *statJob = KIO::stat(url, KIO::HideProgressInfo); // thread problem here | | |||
288 | connect(statJob, &KIO::Job::result, this, &FileSystem::slotCalcStatResult); | 282 | connect(statJob, &KIO::Job::result, this, &FileSystem::slotCalcStatResult); | ||
289 | 283 | | |||
290 | while (!(*stop) && _calcStatBusy) { | 284 | QEventLoop eventLoop; | ||
291 | usleep(1000); | 285 | connect(statJob, &KJob::finished, &eventLoop, &QEventLoop::quit); | ||
292 | } | 286 | eventLoop.exec(); // blocking until quit() | ||
293 | 287 | | |||
294 | if (_calcEntry.count() == 0) | 288 | if (_calcEntry.count() == 0) | ||
295 | return; // statJob failed | 289 | return; // statJob failed | ||
296 | 290 | | |||
297 | const KFileItem kfi(_calcEntry, url, true); | 291 | const KFileItem kfi(_calcEntry, url, true); | ||
298 | if (kfi.isFile() || kfi.isLink()) { | 292 | if (kfi.isFile() || kfi.isLink()) { | ||
299 | (*totalFiles)++; | 293 | (*totalFiles)++; | ||
300 | *totalSize += kfi.size(); | 294 | *totalSize += kfi.size(); | ||
301 | return; | 295 | return; | ||
302 | } | 296 | } | ||
303 | 297 | | |||
298 | // URL should be a directory | ||||
299 | | ||||
304 | KIO::DirectorySizeJob *directorySizeJob = KIO::directorySize(url); | 300 | KIO::DirectorySizeJob *directorySizeJob = KIO::directorySize(url); | ||
305 | connect(directorySizeJob, &KIO::Job::result, this, &FileSystem::slotCalcKdsResult); | 301 | connect(directorySizeJob, &KIO::Job::result, this, &FileSystem::slotCalcKdsResult); | ||
306 | 302 | | |||
307 | while (!(*stop)) { | 303 | connect(directorySizeJob, &KJob::finished, &eventLoop, &QEventLoop::quit); | ||
308 | // we are in a separate thread - so sleeping is OK | 304 | eventLoop.exec(); // blocking until quit() | ||
309 | usleep(1000); | | |||
310 | } | | |||
311 | } | 305 | } | ||
312 | 306 | | |||
313 | FileItem *FileSystem::createLocalFileItem(const QString &name, const QString &directory, bool virt) | 307 | FileItem *FileSystem::createLocalFileItem(const QString &name, const QString &directory, bool virt) | ||
314 | { | 308 | { | ||
315 | const QDir dir = QDir(directory); | 309 | const QDir dir = QDir(directory); | ||
316 | const QString path = dir.filePath(name); | 310 | const QString path = dir.filePath(name); | ||
317 | const QByteArray filePath = path.toLocal8Bit(); | 311 | const QByteArray filePath = path.toLocal8Bit(); | ||
318 | 312 | | |||
▲ Show 20 Lines • Show All 82 Lines • ▼ Show 20 Line(s) | |||||
401 | void FileSystem::slotCalcKdsResult(KJob *job) | 395 | void FileSystem::slotCalcKdsResult(KJob *job) | ||
402 | { | 396 | { | ||
403 | if (!job->error()) { | 397 | if (!job->error()) { | ||
404 | KIO::DirectorySizeJob *kds = static_cast<KIO::DirectorySizeJob *>(job); | 398 | KIO::DirectorySizeJob *kds = static_cast<KIO::DirectorySizeJob *>(job); | ||
405 | *_calcKdsTotalSize += kds->totalSize(); | 399 | *_calcKdsTotalSize += kds->totalSize(); | ||
406 | *_calcKdsTotalFiles += kds->totalFiles(); | 400 | *_calcKdsTotalFiles += kds->totalFiles(); | ||
407 | *_calcKdsTotalDirs += kds->totalSubdirs(); | 401 | *_calcKdsTotalDirs += kds->totalSubdirs(); | ||
408 | } | 402 | } | ||
409 | *_calcKdsBusy = true; | | |||
410 | } | 403 | } | ||
411 | 404 | | |||
412 | void FileSystem::slotCalcStatResult(KJob *job) | 405 | void FileSystem::slotCalcStatResult(KJob *job) | ||
413 | { | 406 | { | ||
414 | _calcEntry = job->error() ? KIO::UDSEntry() : static_cast<KIO::StatJob *>(job)->statResult(); | 407 | _calcEntry = job->error() ? KIO::UDSEntry() : static_cast<KIO::StatJob *>(job)->statResult(); | ||
415 | _calcStatBusy = false; | | |||
416 | } | 408 | } | ||
417 | 409 | | |||
418 | // ==== private ==== | 410 | // ==== private ==== | ||
419 | 411 | | |||
420 | void FileSystem::clear(FileItemDict &fileItems) | 412 | void FileSystem::clear(FileItemDict &fileItems) | ||
421 | { | 413 | { | ||
422 | QHashIterator<QString, FileItem *> lit(fileItems); | 414 | QHashIterator<QString, FileItem *> lit(fileItems); | ||
423 | while (lit.hasNext()) { | 415 | while (lit.hasNext()) { | ||
424 | delete lit.next().value(); | 416 | delete lit.next().value(); | ||
425 | } | 417 | } | ||
426 | fileItems.clear(); | 418 | fileItems.clear(); | ||
427 | } | 419 | } |