X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/37deaaef2c39a4c4b410cd0313a55a4072d2b2ff..38c34eeca:/src/kitemviews/private/kdirectorycontentscounterworker.cpp diff --git a/src/kitemviews/private/kdirectorycontentscounterworker.cpp b/src/kitemviews/private/kdirectorycontentscounterworker.cpp index 1e4a0b3b4..e227c1bc6 100644 --- a/src/kitemviews/private/kdirectorycontentscounterworker.cpp +++ b/src/kitemviews/private/kdirectorycontentscounterworker.cpp @@ -1,22 +1,9 @@ -/*************************************************************************** - * Copyright (C) 2011 by Peter Penz * - * Copyright (C) 2013 by Frank Reininghaus * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ +/* + * SPDX-FileCopyrightText: 2011 Peter Penz + * SPDX-FileCopyrightText: 2013 Frank Reininghaus + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ #include "kdirectorycontentscounterworker.h" @@ -30,24 +17,23 @@ #include "dolphin_detailsmodesettings.h" -KDirectoryContentsCounterWorker::KDirectoryContentsCounterWorker(QObject* parent) : - QObject(parent) +KDirectoryContentsCounterWorker::KDirectoryContentsCounterWorker(QObject *parent) + : QObject(parent) { qRegisterMetaType(); } #ifndef Q_OS_WIN -KDirectoryContentsCounterWorker::CountResult walkDir(const QString &dirPath, - const bool countHiddenFiles, - const bool countDirectoriesOnly, - QT_DIRENT *dirEntry, - const uint allowedRecursiveLevel) +KDirectoryContentsCounterWorker::CountResult +walkDir(const QString &dirPath, const bool countHiddenFiles, const bool countDirectoriesOnly, const uint allowedRecursiveLevel) { int count = -1; long size = -1; auto dir = QT_OPENDIR(QFile::encodeName(dirPath)); if (dir) { count = 0; + size = 0; + QT_DIRENT *dirEntry; QT_STATBUF buf; while ((dirEntry = QT_READDIR(dir))) { @@ -65,31 +51,25 @@ KDirectoryContentsCounterWorker::CountResult walkDir(const QString &dirPath, // If only directories are counted, consider an unknown file type and links also // as directory instead of trying to do an expensive stat() // (see bugs 292642 and 299997). - const bool countEntry = !countDirectoriesOnly || - dirEntry->d_type == DT_DIR || - dirEntry->d_type == DT_LNK || - dirEntry->d_type == DT_UNKNOWN; + const bool countEntry = !countDirectoriesOnly || dirEntry->d_type == DT_DIR || dirEntry->d_type == DT_LNK || dirEntry->d_type == DT_UNKNOWN; if (countEntry) { ++count; } if (allowedRecursiveLevel > 0) { - - bool linkFound = false; QString nameBuf = QStringLiteral("%1/%2").arg(dirPath, dirEntry->d_name); - if (dirEntry->d_type == DT_REG || dirEntry->d_type == DT_LNK) { + if (dirEntry->d_type == DT_REG) { if (QT_STAT(nameBuf.toLocal8Bit(), &buf) == 0) { - if (S_ISDIR(buf.st_mode)) { - // was a dir link, recurse - linkFound = true; - } size += buf.st_size; } } - if (dirEntry->d_type == DT_DIR || linkFound) { - // recursion for dirs and dir links - size += walkDir(nameBuf, countHiddenFiles, countDirectoriesOnly, dirEntry, allowedRecursiveLevel - 1).size; + if (dirEntry->d_type == DT_DIR) { + // recursion for dirs + auto subdirResult = walkDir(nameBuf, countHiddenFiles, countDirectoriesOnly, allowedRecursiveLevel - 1); + if (subdirResult.size > 0) { + size += subdirResult.size; + } } } } @@ -99,7 +79,7 @@ KDirectoryContentsCounterWorker::CountResult walkDir(const QString &dirPath, } #endif -KDirectoryContentsCounterWorker::CountResult KDirectoryContentsCounterWorker::subItemsCount(const QString& path, Options options) +KDirectoryContentsCounterWorker::CountResult KDirectoryContentsCounterWorker::subItemsCount(const QString &path, Options options) { const bool countHiddenFiles = options & CountHiddenFiles; const bool countDirectoriesOnly = options & CountDirectoriesOnly; @@ -115,21 +95,19 @@ KDirectoryContentsCounterWorker::CountResult KDirectoryContentsCounterWorker::su } else { filters |= QDir::AllEntries; } - return {dir.entryList(filters).count(), 0}; + return {static_cast(dir.entryList(filters).count()), 0}; #else const uint maxRecursiveLevel = DetailsModeSettings::directorySizeCount() ? 1 : DetailsModeSettings::recursiveDirectorySizeLimit(); - QT_DIRENT *dirEntry = nullptr; - - auto res = walkDir(QFile::encodeName(path), countHiddenFiles, countDirectoriesOnly, dirEntry, maxRecursiveLevel); + auto res = walkDir(path, countHiddenFiles, countDirectoriesOnly, maxRecursiveLevel); return res; #endif } -void KDirectoryContentsCounterWorker::countDirectoryContents(const QString& path, Options options) +void KDirectoryContentsCounterWorker::countDirectoryContents(const QString &path, Options options) { auto res = subItemsCount(path, options); - emit result(path, res.count, res.size); + Q_EMIT result(path, res.count, res.size); }