From 5608827429a024d1ab273e704a525c6218a2052e Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Mon, 5 Dec 2016 18:50:52 +0800 Subject: [PATCH 1/5] Simplify function call --- src/base/utils/fs.cpp | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/src/base/utils/fs.cpp b/src/base/utils/fs.cpp index 1a758f755..361a14680 100644 --- a/src/base/utils/fs.cpp +++ b/src/base/utils/fs.cpp @@ -310,26 +310,10 @@ qlonglong Utils::Fs::freeDiskSpaceOnPath(QString path) } #endif #else - typedef BOOL (WINAPI *GetDiskFreeSpaceEx_t)(LPCTSTR, - PULARGE_INTEGER, - PULARGE_INTEGER, - PULARGE_INTEGER); - GetDiskFreeSpaceEx_t pGetDiskFreeSpaceEx = - (GetDiskFreeSpaceEx_t)::GetProcAddress(::GetModuleHandleW(L"kernel32.dll"), "GetDiskFreeSpaceExW"); - if (pGetDiskFreeSpaceEx) { - ULARGE_INTEGER bytesFree, bytesTotal; - unsigned long long *ret; - if (pGetDiskFreeSpaceEx((LPCTSTR)(toNativePath(dir_path.path())).utf16(), &bytesFree, &bytesTotal, NULL)) { - ret = (unsigned long long*)&bytesFree; - return *ret; - } - else { - return -1; - } - } - else { + ULARGE_INTEGER bytesFree; + if (GetDiskFreeSpaceExW((LPCTSTR)(toNativePath(dir_path.path())).utf16(), &bytesFree, NULL, NULL) == 0) return -1; - } + return qlonglong(bytesFree.QuadPart); #endif } From e1c9e3b9ed93da7fa205bd5c4e3590f2a28ba715 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Mon, 5 Dec 2016 18:52:21 +0800 Subject: [PATCH 2/5] Fix memory leak call unicode version of the function directly --- src/base/utils/fs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/base/utils/fs.cpp b/src/base/utils/fs.cpp index 361a14680..cd4f355c5 100644 --- a/src/base/utils/fs.cpp +++ b/src/base/utils/fs.cpp @@ -363,8 +363,8 @@ QString Utils::Fs::QDesktopServicesDataLocation() { QString result; #ifdef Q_OS_WIN - LPWSTR path=new WCHAR[256]; - if (SHGetSpecialFolderPath(0, path, CSIDL_LOCAL_APPDATA, FALSE)) + wchar_t path[MAX_PATH + 1] = {L'\0'}; + if (SHGetSpecialFolderPathW(0, path, CSIDL_LOCAL_APPDATA, FALSE)) result = fromNativePath(QString::fromWCharArray(path)); if (!QCoreApplication::applicationName().isEmpty()) result += QLatin1String("/") + qApp->applicationName(); From 7f2f78a816331b647d7e81587201c0a5e335de05 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Mon, 5 Dec 2016 19:43:43 +0800 Subject: [PATCH 3/5] Simplify #if expression --- src/base/utils/fs.cpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/base/utils/fs.cpp b/src/base/utils/fs.cpp index cd4f355c5..5cb910243 100644 --- a/src/base/utils/fs.cpp +++ b/src/base/utils/fs.cpp @@ -283,9 +283,13 @@ qlonglong Utils::Fs::freeDiskSpaceOnPath(QString path) } Q_ASSERT(dir_path.exists()); -#ifndef Q_OS_WIN +#if defined(Q_OS_WIN) + ULARGE_INTEGER bytesFree; + if (GetDiskFreeSpaceExW((LPCTSTR)(toNativePath(dir_path.path())).utf16(), &bytesFree, NULL, NULL) == 0) + return -1; + return qlonglong(bytesFree.QuadPart); +#elif defined(Q_OS_HAIKU) unsigned long long available; -#ifdef Q_OS_HAIKU const QString statfs_path = dir_path.path() + "/."; dev_t device = dev_for_path (qPrintable(statfs_path)); if (device >= 0) { @@ -297,6 +301,7 @@ qlonglong Utils::Fs::freeDiskSpaceOnPath(QString path) } return -1; #else + unsigned long long available; struct statfs stats; const QString statfs_path = dir_path.path() + "/."; const int ret = statfs(qPrintable(statfs_path), &stats); @@ -309,12 +314,6 @@ qlonglong Utils::Fs::freeDiskSpaceOnPath(QString path) return -1; } #endif -#else - ULARGE_INTEGER bytesFree; - if (GetDiskFreeSpaceExW((LPCTSTR)(toNativePath(dir_path.path())).utf16(), &bytesFree, NULL, NULL) == 0) - return -1; - return qlonglong(bytesFree.QuadPart); -#endif } QString Utils::Fs::branchPath(const QString& file_path, QString* removed) @@ -362,14 +361,13 @@ QString Utils::Fs::expandPathAbs(const QString& path) QString Utils::Fs::QDesktopServicesDataLocation() { QString result; -#ifdef Q_OS_WIN +#if defined(Q_OS_WIN) wchar_t path[MAX_PATH + 1] = {L'\0'}; if (SHGetSpecialFolderPathW(0, path, CSIDL_LOCAL_APPDATA, FALSE)) result = fromNativePath(QString::fromWCharArray(path)); if (!QCoreApplication::applicationName().isEmpty()) result += QLatin1String("/") + qApp->applicationName(); -#else -#ifdef Q_OS_MAC +#elif defined(Q_OS_MAC) FSRef ref; OSErr err = FSFindFolder(kUserDomain, kApplicationSupportFolderType, false, &ref); if (err) @@ -386,7 +384,6 @@ QString Utils::Fs::QDesktopServicesDataLocation() xdgDataHome += QLatin1String("/data/") + qApp->applicationName(); result = xdgDataHome; -#endif #endif if (!result.endsWith("/")) result += "/"; From 0b313e0bc3796d597e664454dd8254aad1b6eaa1 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Mon, 5 Dec 2016 20:20:01 +0800 Subject: [PATCH 4/5] Remove unused variable --- src/base/utils/fs.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/base/utils/fs.cpp b/src/base/utils/fs.cpp index 5cb910243..e37a750ef 100644 --- a/src/base/utils/fs.cpp +++ b/src/base/utils/fs.cpp @@ -372,7 +372,6 @@ QString Utils::Fs::QDesktopServicesDataLocation() OSErr err = FSFindFolder(kUserDomain, kApplicationSupportFolderType, false, &ref); if (err) return QString(); - QString path; QByteArray ba(2048, 0); if (FSRefMakePath(&ref, reinterpret_cast(ba.data()), ba.size()) == noErr) result = QString::fromUtf8(ba).normalized(QString::NormalizationForm_C); From 5cf86d36773dd5b210ad78a1c7ded304096d4436 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Thu, 8 Dec 2016 01:14:55 +0800 Subject: [PATCH 5/5] Change Utils::Fs::freeDiskSpaceOnPath() signature refactor the function internals --- src/base/utils/fs.cpp | 61 +++++++++++++++++++------------------------ src/base/utils/fs.h | 2 +- 2 files changed, 28 insertions(+), 35 deletions(-) diff --git a/src/base/utils/fs.cpp b/src/base/utils/fs.cpp index e37a750ef..5bc3c23c4 100644 --- a/src/base/utils/fs.cpp +++ b/src/base/utils/fs.cpp @@ -269,50 +269,43 @@ bool Utils::Fs::isValidFileSystemName(const QString &name, bool allowSeparators) return !name.contains(regex); } -qlonglong Utils::Fs::freeDiskSpaceOnPath(QString path) +qulonglong Utils::Fs::freeDiskSpaceOnPath(const QString &path) { - if (path.isEmpty()) return -1; - QDir dir_path(path); - if (!dir_path.exists()) { + if (path.isEmpty()) return 0; + + QDir dirPath(path); + if (!dirPath.exists()) { QStringList parts = path.split("/"); - while (parts.size() > 1 && !QDir(parts.join("/")).exists()) { + while (parts.size() > 1 && !QDir(parts.join("/")).exists()) parts.removeLast(); - } - dir_path = QDir(parts.join("/")); - if (!dir_path.exists()) return -1; + + dirPath = QDir(parts.join("/")); + if (!dirPath.exists()) return 0; } - Q_ASSERT(dir_path.exists()); + Q_ASSERT(dirPath.exists()); #if defined(Q_OS_WIN) ULARGE_INTEGER bytesFree; - if (GetDiskFreeSpaceExW((LPCTSTR)(toNativePath(dir_path.path())).utf16(), &bytesFree, NULL, NULL) == 0) - return -1; - return qlonglong(bytesFree.QuadPart); + LPCWSTR nativePath = reinterpret_cast((toNativePath(dirPath.path())).utf16()); + if (GetDiskFreeSpaceExW(nativePath, &bytesFree, NULL, NULL) == 0) + return 0; + return bytesFree.QuadPart; #elif defined(Q_OS_HAIKU) - unsigned long long available; - const QString statfs_path = dir_path.path() + "/."; - dev_t device = dev_for_path (qPrintable(statfs_path)); - if (device >= 0) { - fs_info info; - if (fs_stat_dev(device, &info) == B_OK) { - available = ((unsigned long long)(info.free_blocks * info.block_size)); - return available; - } - } - return -1; + const QString statfsPath = dirPath.path() + "/."; + dev_t device = dev_for_path(qPrintable(statfsPath)); + if (device < 0) + return 0; + fs_info info; + if (fs_stat_dev(device, &info) != B_OK) + return 0; + return ((qulonglong) info.free_blocks * (qulonglong) info.block_size); #else - unsigned long long available; struct statfs stats; - const QString statfs_path = dir_path.path() + "/."; - const int ret = statfs(qPrintable(statfs_path), &stats); - if (ret == 0) { - available = ((unsigned long long)stats.f_bavail) - * ((unsigned long long)stats.f_bsize); - return available; - } - else { - return -1; - } + const QString statfsPath = dirPath.path() + "/."; + const int ret = statfs(qPrintable(statfsPath), &stats); + if (ret != 0) + return 0; + return ((qulonglong) stats.f_bavail * (qulonglong) stats.f_bsize); #endif } diff --git a/src/base/utils/fs.h b/src/base/utils/fs.h index 673845505..c58b8e89b 100644 --- a/src/base/utils/fs.h +++ b/src/base/utils/fs.h @@ -50,7 +50,7 @@ namespace Utils bool sameFiles(const QString& path1, const QString& path2); QString toValidFileSystemName(const QString &name, bool allowSeparators = false); bool isValidFileSystemName(const QString& name, bool allowSeparators = false); - qlonglong freeDiskSpaceOnPath(QString path); + qulonglong freeDiskSpaceOnPath(const QString &path); QString branchPath(const QString& file_path, QString* removed = 0); bool sameFileNames(const QString& first, const QString& second); QString expandPath(const QString& path);