File indexing completed on 2024-04-28 11:41:00

0001 /*
0002     kdiskfreespaceinfo.h
0003     SPDX-FileCopyrightText: 2008 Sebastian Trug <trueg@kde.org>
0004 
0005     Based on kdiskfreespace.h
0006     SPDX-FileCopyrightText: 2007 David Faure <faure@kde.org>
0007     SPDX-FileCopyrightText: 2008 Dirk Mueller <mueller@kde.org>
0008 
0009     SPDX-License-Identifier: LGPL-2.0-only
0010 */
0011 
0012 #include "kdiskfreespaceinfo.h"
0013 
0014 #include <QFile>
0015 #include <QSharedData>
0016 
0017 #include <kmountpoint.h>
0018 
0019 #ifdef Q_OS_WIN
0020 #include <QDir>
0021 #include <qt_windows.h>
0022 #else
0023 #include <sys/statvfs.h>
0024 #endif
0025 
0026 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 88)
0027 class KDiskFreeSpaceInfoPrivate : public QSharedData
0028 {
0029 public:
0030     bool m_valid = false;
0031     QString m_mountPoint;
0032     KIO::filesize_t m_size = 0;
0033     KIO::filesize_t m_available = 0;
0034 };
0035 
0036 KDiskFreeSpaceInfo::KDiskFreeSpaceInfo()
0037     : d(new KDiskFreeSpaceInfoPrivate)
0038 {
0039 }
0040 
0041 KDiskFreeSpaceInfo::KDiskFreeSpaceInfo(const KDiskFreeSpaceInfo &other)
0042 {
0043     d = other.d;
0044 }
0045 
0046 KDiskFreeSpaceInfo::~KDiskFreeSpaceInfo()
0047 {
0048 }
0049 
0050 KDiskFreeSpaceInfo &KDiskFreeSpaceInfo::operator=(const KDiskFreeSpaceInfo &other)
0051 {
0052     d = other.d;
0053     return *this;
0054 }
0055 
0056 bool KDiskFreeSpaceInfo::isValid() const
0057 {
0058     return d->m_valid;
0059 }
0060 
0061 QString KDiskFreeSpaceInfo::mountPoint() const
0062 {
0063     return d->m_mountPoint;
0064 }
0065 
0066 KIO::filesize_t KDiskFreeSpaceInfo::size() const
0067 {
0068     return d->m_size;
0069 }
0070 
0071 KIO::filesize_t KDiskFreeSpaceInfo::available() const
0072 {
0073     return d->m_available;
0074 }
0075 
0076 KIO::filesize_t KDiskFreeSpaceInfo::used() const
0077 {
0078     return d->m_size - d->m_available;
0079 }
0080 
0081 KDiskFreeSpaceInfo KDiskFreeSpaceInfo::freeSpaceInfo(const QString &path)
0082 {
0083     KDiskFreeSpaceInfo info;
0084 
0085     // determine the mount point
0086     KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByPath(path);
0087     if (mp) {
0088         info.d->m_mountPoint = mp->mountPoint();
0089     }
0090 
0091 #ifdef Q_OS_WIN
0092     quint64 availUser;
0093     QFileInfo fi(info.d->m_mountPoint);
0094     QString dir = QDir::toNativeSeparators(fi.absoluteDir().canonicalPath());
0095 
0096     if (GetDiskFreeSpaceExW((LPCWSTR)dir.utf16(), (PULARGE_INTEGER)&availUser, (PULARGE_INTEGER)&info.d->m_size, (PULARGE_INTEGER)&info.d->m_available) != 0) {
0097         info.d->m_valid = true;
0098     }
0099 #else
0100     struct statvfs statvfs_buf;
0101 
0102     // Prefer mountPoint if available, so that it even works with non-existing files.
0103     const QString pathArg = info.d->m_mountPoint.isEmpty() ? path : info.d->m_mountPoint;
0104     if (!statvfs(QFile::encodeName(pathArg).constData(), &statvfs_buf)) {
0105         const quint64 blksize = quint64(statvfs_buf.f_frsize); // cast to avoid overflow
0106         info.d->m_available = statvfs_buf.f_bavail * blksize;
0107         info.d->m_size = statvfs_buf.f_blocks * blksize;
0108         info.d->m_valid = true;
0109     }
0110 #endif
0111 
0112     return info;
0113 }
0114 #endif // Deprecation