From ccb22bc8e12bce57394f9312e1c84d80e53fb1fb Mon Sep 17 00:00:00 2001 From: David Korth Date: Thu, 29 May 2025 23:18:54 -0400 Subject: [PATCH] [qrvthtool] FormatSize: Consolidate the size formatting code into a single file. This consolidates the code and translations from BankEntryView and SelectDeviceDialog, [locale] Update localizations for this change. --- locale/rvthtool_1337.ts | 309 +++++++++---------- locale/rvthtool_de.ts | 307 +++++++++--------- locale/rvthtool_en.ts | 309 +++++++++---------- locale/rvthtool_es.ts | 307 +++++++++--------- src/qrvthtool/CMakeLists.txt | 2 + src/qrvthtool/FormatSize.cpp | 109 +++++++ src/qrvthtool/FormatSize.hpp | 22 ++ src/qrvthtool/widgets/BankEntryView.cpp | 97 +----- src/qrvthtool/windows/SelectDeviceDialog.cpp | 109 +------ 9 files changed, 722 insertions(+), 849 deletions(-) create mode 100644 src/qrvthtool/FormatSize.cpp create mode 100644 src/qrvthtool/FormatSize.hpp diff --git a/locale/rvthtool_1337.ts b/locale/rvthtool_1337.ts index 5f4d733..e3a330b 100644 --- a/locale/rvthtool_1337.ts +++ b/locale/rvthtool_1337.ts @@ -136,8 +136,91 @@ TMD Sig: 7md 516: + + + + + + Unknown + unkn0wn + + + + + Debug + d3bu6 + + + + + Retail + r3741l + + + + realsigned + r34l516n3d + + + + INVALID + 1nv4l1d + + + + fakesigned + f4k3516n3d + + + + [DELETED] + [d3l373d] + + + + vWii + vw11 + + + + Empty + 3mp7y + + + + GameCube + 64m3cub3 + + + + Wii (Single-Layer) + w11 (51n6l3-l4y3r) + + + + Wii (Dual-Layer) + w11 (du4l-l4y3r) + + + + Wii (DL Bank 2) + w11 (dl b4nk 2) + + + + None + n0n3 + + + + Korean + k0r34n + + + + FormatSize - + byte(s) by73 @@ -145,100 +228,40 @@ - + KiB k1b - + MiB m1b - + + GiB + 61b + + + + TiB + 71b + + + + PiB + p1b + + + + EiB + 31b + + + %1 %2 %1 == localized value, %2 == suffix (e.g. MiB) - - - - - - - - Unknown - unkn0wn - - - - - Debug - d3bu6 - - - - - Retail - r3741l - - - - realsigned - r34l516n3d - - - - INVALID - 1nv4l1d - - - - fakesigned - f4k3516n3d - - - - [DELETED] - [d3l373d] - - - - vWii - vw11 - - - - Empty - 3mp7y - - - - GameCube - 64m3cub3 - - - - Wii (Single-Layer) - w11 (51n6l3-l4y3r) - - - - Wii (Dual-Layer) - w11 (du4l-l4y3r) - - - - Wii (DL Bank 2) - w11 (dl b4nk 2) - - - - None - n0n3 - - - - Korean - k0r34n + %1 %2 @@ -400,43 +423,41 @@ n0 rv7-h r34d3r d15k 1m463 l04d3d. - + RVT-H Reader rv7-h r34d3r - + RVT-H Reader Disk Image rv7-h r34d3r d15k 1m463 - + Disc Image d15c 1m463 - + SDK Disc Image 5dk d15c 1m463 - + %1 [%2] [%3] - + %1 [%2] - Recryption Key: r3cryp710n k3y: - Set the encryption key to use when extracting disc images. Default is None, which retains the original key. @@ -464,115 +485,115 @@ d3f4ul7 15 n0n3, wh1ch r3741n5 7h3 0r161n4l k3y. d3bu6 (r34l516n3d) - + Cancel the current operation. c4nc3l 7h3 curr3n7 0p3r4710n. - + Opening RVT-H Reader device '%1'... 0p3n1n6 rv7-h r34d3r d3v1c3 '%1'... - + Opening disc image file '%1'... 0p3n1n6 d15c 1m463 f1l3 '%1'... - + An error occurred while opening '%1': %2 4n 3rr0r 0ccurr3d wh1l3 0p3n1n6 '%1': %2 - + NHCD table is missing. nhcd 74bl3 15 m1551n6. - + This appears to be a PC MBR-partitioned HDD. 7h15 4pp34r5 70 b3 4 pc mbr-p4r71710n3d hdd. - + This appears to be a PC GPT-partitioned HDD. 7h15 4pp34r5 70 b3 4 pc 6p7-p4r71710n3d hdd. - + Using defaults. Writing will be disabled. u51n6 d3f4ul75. wr171n6 w1ll b3 d154bl3d. - + All Supported Files 4ll 5upp0r73d f1l35 - + RVT-H Reader Disk Image Files rv7-h r34d3r d15k 1m463 f1l35 - + GameCube/Wii Disc Image Files 64m3cub3/w11 d15c 1m463 f1l35 - - - + + + All Files 4ll f1l35 - + Open RVT-H Reader Disk Image 0p3n rv7-h r34d3r d15k 1m463 - + Extract Disc Image 3x7r4c7 d15c 1m463 - - + + GameCube/Wii Disc Images 64m3cub3/w11 d15c 1m4635 - + Extracting Bank %1 to %2: 3x7r4c71n6 b4nk %1 70 %2: - + Import Disc Image 1mp0r7 d15c 1m463 - + Importing %1 to Bank %2: 1mp0r71n6 %1 70 b4nk %2: - + Bank %1 deleted. b4nk %1 d3l373d. - + ERROR deleting Bank %1: %2 3rr0r d3l371n6 b4nk %1: %2 - + Bank %1 undeleted. b4nk %1 und3l373d. - + ERROR undeleting Bank %1: %2 3rr0r und3l371n6 b4nk %1: %2 @@ -641,76 +662,38 @@ d3f4ul7 15 n0n3, wh1ch r3741n5 7h3 0r161n4l k3y. Select RVT-H Reader Device 53l3c7 rv7-h r34d3r d3v1c3 - - - byte(s) - - by73 - by735 - - - - KiB - k1b - - - - MiB - m1b - - - - GiB - 61b - - - - TiB - 71b - - - - PiB - p1b - - - - EiB - 31b - - - + ERROR enumerating RVT-H Reader devices: 3rr0r 3num3r471n6 rv7-h r34d3r d3v1c35: - + Try rerunning qrvthtool as Administrator. 7ry r3runn1n6 qrv7h700l 45 4dm1n157r470r. - + Try rerunning qrvthtool using an Administrator account. 7ry r3runn1n6 qrv7h700l u51n6 4n 4dm1n157r470r 4cc0un7. - + Try rerunning qrvthtool as root. 7ry r3runn1n6 qrv7h700l 45 r007. - + No RVT-H Reader devices found. n0 rv7-h r34d3r d3v1c35 f0und. - + ERROR: Device querying is not supported in this build. 3rr0r: d3v1c3 qu3ry1n6 15 n07 5upp0r73d 1n 7h15 bu1ld. - + &Refresh &r3fr35h diff --git a/locale/rvthtool_de.ts b/locale/rvthtool_de.ts index 034946d..99d17c3 100644 --- a/locale/rvthtool_de.ts +++ b/locale/rvthtool_de.ts @@ -136,8 +136,91 @@ TMD Sig: + + + + + + Unknown + + + + + + Debug + + + + + + Retail + + + + + realsigned + + + + + INVALID + + + + + fakesigned + + + + + Empty + + + + + GameCube + + + + + Wii (Single-Layer) + + + + + Wii (Dual-Layer) + + + + + Wii (DL Bank 2) + + + + + [DELETED] + + + + + None + + + + + Korean + + + + + vWii + + + + + FormatSize - + byte(s) @@ -145,101 +228,41 @@ - + KiB - + MiB - + + GiB + + + + + TiB + + + + + PiB + + + + + EiB + + + + %1 %2 %1 == localized value, %2 == suffix (e.g. MiB) - - - - - - Unknown - - - - - - Debug - - - - - - Retail - - - - - realsigned - - - - - INVALID - - - - - fakesigned - - - - - Empty - - - - - GameCube - - - - - Wii (Single-Layer) - - - - - Wii (Dual-Layer) - - - - - Wii (DL Bank 2) - - - - - [DELETED] - - - - - None - - - - - Korean - - - - - vWii - - LanguageMenu @@ -400,43 +423,41 @@ - + RVT-H Reader - + RVT-H Reader Disk Image - + Disc Image - + SDK Disc Image - + %1 [%2] [%3] - + %1 [%2] - Recryption Key: - Set the encryption key to use when extracting disc images. Default is None, which retains the original key. @@ -463,115 +484,115 @@ Default is None, which retains the original key. - + Cancel the current operation. - + Opening RVT-H Reader device '%1'... - + Opening disc image file '%1'... - + An error occurred while opening '%1': %2 - + NHCD table is missing. - + This appears to be a PC MBR-partitioned HDD. - + This appears to be a PC GPT-partitioned HDD. - + Using defaults. Writing will be disabled. - + All Supported Files - + RVT-H Reader Disk Image Files - + GameCube/Wii Disc Image Files - - - + + + All Files - + Open RVT-H Reader Disk Image - + Extract Disc Image - - + + GameCube/Wii Disc Images - + Extracting Bank %1 to %2: - + Import Disc Image - + Importing %1 to Bank %2: - + Bank %1 deleted. - + ERROR deleting Bank %1: %2 - + Bank %1 undeleted. - + ERROR undeleting Bank %1: %2 @@ -640,76 +661,38 @@ Default is None, which retains the original key. Select RVT-H Reader Device - - - byte(s) - - - - - - - KiB - - - - - MiB - - - - - GiB - - - - - TiB - - - - - PiB - - - - - EiB - - - - + ERROR enumerating RVT-H Reader devices: - + Try rerunning qrvthtool as Administrator. - + Try rerunning qrvthtool using an Administrator account. - + Try rerunning qrvthtool as root. - + No RVT-H Reader devices found. - + ERROR: Device querying is not supported in this build. - + &Refresh diff --git a/locale/rvthtool_en.ts b/locale/rvthtool_en.ts index 6f3d078..0c7d91b 100644 --- a/locale/rvthtool_en.ts +++ b/locale/rvthtool_en.ts @@ -136,8 +136,91 @@ TMD Sig: + + + + + + Unknown + + + + + + Debug + + + + + + Retail + + + + + realsigned + + + + + INVALID + + + + + fakesigned + + + + + [DELETED] + + + + + vWii + + + + + Empty + + + + + GameCube + + + + + Wii (Single-Layer) + + + + + Wii (Dual-Layer) + + + + + Wii (DL Bank 2) + + + + + None + + + + + Korean + + + + + FormatSize - + byte(s) byte @@ -145,100 +228,40 @@ - + KiB - + MiB - + + GiB + + + + + TiB + + + + + PiB + + + + + EiB + + + + %1 %2 %1 == localized value, %2 == suffix (e.g. MiB) - - - - - - - - Unknown - - - - - - Debug - - - - - - Retail - - - - - realsigned - - - - - INVALID - - - - - fakesigned - - - - - [DELETED] - - - - - vWii - - - - - Empty - - - - - GameCube - - - - - Wii (Single-Layer) - - - - - Wii (Dual-Layer) - - - - - Wii (DL Bank 2) - - - - - None - - - - - Korean - + %1 %2 @@ -400,43 +423,41 @@ - + RVT-H Reader - + RVT-H Reader Disk Image - + Disc Image - + SDK Disc Image - + %1 [%2] [%3] - + %1 [%2] - Recryption Key: - Set the encryption key to use when extracting disc images. Default is None, which retains the original key. @@ -463,115 +484,115 @@ Default is None, which retains the original key. - + Cancel the current operation. - + Opening RVT-H Reader device '%1'... - + Opening disc image file '%1'... - + An error occurred while opening '%1': %2 - + NHCD table is missing. - + This appears to be a PC MBR-partitioned HDD. - + This appears to be a PC GPT-partitioned HDD. - + Using defaults. Writing will be disabled. - + All Supported Files - + RVT-H Reader Disk Image Files - + GameCube/Wii Disc Image Files - - - + + + All Files - + Open RVT-H Reader Disk Image - + Extract Disc Image - - + + GameCube/Wii Disc Images - + Extracting Bank %1 to %2: - + Import Disc Image - + Importing %1 to Bank %2: - + Bank %1 deleted. - + ERROR deleting Bank %1: %2 - + Bank %1 undeleted. - + ERROR undeleting Bank %1: %2 @@ -640,76 +661,38 @@ Default is None, which retains the original key. Select RVT-H Reader Device - - - byte(s) - - byte - bytes - - - - KiB - - - - - MiB - - - - - GiB - - - - - TiB - - - - - PiB - - - - - EiB - - - - + ERROR enumerating RVT-H Reader devices: - + Try rerunning qrvthtool as Administrator. - + Try rerunning qrvthtool using an Administrator account. - + Try rerunning qrvthtool as root. - + No RVT-H Reader devices found. - + ERROR: Device querying is not supported in this build. - + &Refresh diff --git a/locale/rvthtool_es.ts b/locale/rvthtool_es.ts index dcbf3ae..c76e74c 100644 --- a/locale/rvthtool_es.ts +++ b/locale/rvthtool_es.ts @@ -136,8 +136,91 @@ TMD Sig: + + + + + + Unknown + + + + + + Debug + + + + + + Retail + + + + + realsigned + + + + + INVALID + + + + + fakesigned + + + + + Empty + + + + + GameCube + + + + + Wii (Single-Layer) + + + + + Wii (Dual-Layer) + + + + + Wii (DL Bank 2) + + + + + [DELETED] + + + + + None + + + + + Korean + + + + + vWii + + + + + FormatSize - + byte(s) @@ -145,101 +228,41 @@ - + KiB - + MiB - + + GiB + + + + + TiB + + + + + PiB + + + + + EiB + + + + %1 %2 %1 == localized value, %2 == suffix (e.g. MiB) - - - - - - Unknown - - - - - - Debug - - - - - - Retail - - - - - realsigned - - - - - INVALID - - - - - fakesigned - - - - - Empty - - - - - GameCube - - - - - Wii (Single-Layer) - - - - - Wii (Dual-Layer) - - - - - Wii (DL Bank 2) - - - - - [DELETED] - - - - - None - - - - - Korean - - - - - vWii - - LanguageMenu @@ -400,43 +423,41 @@ - + RVT-H Reader - + RVT-H Reader Disk Image - + Disc Image - + SDK Disc Image - + %1 [%2] [%3] - + %1 [%2] - Recryption Key: - Set the encryption key to use when extracting disc images. Default is None, which retains the original key. @@ -463,115 +484,115 @@ Default is None, which retains the original key. - + Cancel the current operation. - + Opening RVT-H Reader device '%1'... - + Opening disc image file '%1'... - + An error occurred while opening '%1': %2 - + NHCD table is missing. - + This appears to be a PC MBR-partitioned HDD. - + This appears to be a PC GPT-partitioned HDD. - + Using defaults. Writing will be disabled. - + All Supported Files - + RVT-H Reader Disk Image Files - + GameCube/Wii Disc Image Files - - - + + + All Files - + Open RVT-H Reader Disk Image - + Extract Disc Image - - + + GameCube/Wii Disc Images - + Extracting Bank %1 to %2: - + Import Disc Image - + Importing %1 to Bank %2: - + Bank %1 deleted. - + ERROR deleting Bank %1: %2 - + Bank %1 undeleted. - + ERROR undeleting Bank %1: %2 @@ -640,76 +661,38 @@ Default is None, which retains the original key. Select RVT-H Reader Device - - - byte(s) - - - - - - - KiB - - - - - MiB - - - - - GiB - - - - - TiB - - - - - PiB - - - - - EiB - - - - + ERROR enumerating RVT-H Reader devices: - + Try rerunning qrvthtool as Administrator. - + Try rerunning qrvthtool using an Administrator account. - + Try rerunning qrvthtool as root. - + No RVT-H Reader devices found. - + ERROR: Device querying is not supported in this build. - + &Refresh diff --git a/src/qrvthtool/CMakeLists.txt b/src/qrvthtool/CMakeLists.txt index 077b25b..912ff28 100644 --- a/src/qrvthtool/CMakeLists.txt +++ b/src/qrvthtool/CMakeLists.txt @@ -153,6 +153,7 @@ SET(qrvthtool_SRCS WorkerObject.cpp MessageSound.cpp PathFuncs.cpp + FormatSize.cpp config/ConfigStore.cpp config/ConfigDefaults.cpp @@ -177,6 +178,7 @@ SET(qrvthtool_H WorkerObject.hpp MessageSound.hpp PathFuncs.hpp + FormatSize.hpp config/ConfigStore.hpp config/ConfigDefaults.hpp diff --git a/src/qrvthtool/FormatSize.cpp b/src/qrvthtool/FormatSize.cpp new file mode 100644 index 0000000..acb6b38 --- /dev/null +++ b/src/qrvthtool/FormatSize.cpp @@ -0,0 +1,109 @@ +/*************************************************************************** + * RVT-H Tool (qrvthtool) * + * FormatSize.hpp: Format file sizes. * + * * + * Copyright (c) 2014-2025 by David Korth. * + * SPDX-License-Identifier: GPL-2.0-or-later * + ***************************************************************************/ + +#include "FormatSize.hpp" + +// Qt includes +#include +#include + +static inline int calc_frac_part(off64_t size, off64_t mask) +{ + float f = (float)(size & (mask - 1)) / (float)mask; + int frac_part = (int)(f * 1000.0f); + + // MSVC added round() and roundf() in MSVC 2013. + // Use our own rounding code instead. + int round_adj = (frac_part % 10 > 5); + frac_part /= 10; + frac_part += round_adj; + return frac_part; +} + +/** + * Format a file size. + * @param size [in] File size + * @return Formatted file size + */ +QString formatSize(off64_t size) +{ + // frac_part is always 0 to 100. + // If whole_part >= 10, frac_part is divided by 10. + int whole_part, frac_part; + + // TODO: Optimize this? + const QLocale sysLocale = QLocale::system(); + QString suffix; + if (size < 0) { + // Invalid size. Print the value as-is. + whole_part = (int)size; + frac_part = 0; + } else if (size < (2LL << 10)) { + // tr: Bytes (< 1,024) + suffix = QCoreApplication::translate("FormatSize", "byte(s)", nullptr, size); + whole_part = (int)size; + frac_part = 0; + } else if (size < (2LL << 20)) { + // tr: Kilobytes + suffix = QCoreApplication::translate("FormatSize", "KiB"); + whole_part = (int)(size >> 10); + frac_part = calc_frac_part(size, (1LL << 10)); + } else if (size < (2LL << 30)) { + // tr: Megabytes + suffix = QCoreApplication::translate("FormatSize", "MiB"); + whole_part = (int)(size >> 20); + frac_part = calc_frac_part(size, (1LL << 20)); + } else if (size < (2LL << 40)) { + // tr: Gigabytes + suffix = QCoreApplication::translate("FormatSize", "GiB"); + whole_part = (int)(size >> 30); + frac_part = calc_frac_part(size, (1LL << 30)); + } else if (size < (2LL << 50)) { + // tr: Terabytes + suffix = QCoreApplication::translate("FormatSize", "TiB"); + whole_part = (int)(size >> 40); + frac_part = calc_frac_part(size, (1LL << 40)); + } else if (size < (2LL << 60)) { + // tr: Petabytes + suffix = QCoreApplication::translate("FormatSize", "PiB"); + whole_part = (int)(size >> 50); + frac_part = calc_frac_part(size, (1LL << 50)); + } else /*if (size < (2ULL << 70))*/ { + // tr: Exabytes + suffix = QCoreApplication::translate("FormatSize", "EiB"); + whole_part = (int)(size >> 60); + frac_part = calc_frac_part(size, (1LL << 60)); + } + + QString s_value = sysLocale.toString(whole_part); + if (size >= (2LL << 10)) { + // KiB or larger. There is a fractional part. + int frac_digits = 2; + if (whole_part >= 10) { + int round_adj = (frac_part % 10 > 5); + frac_part /= 10; + frac_part += round_adj; + frac_digits = 1; + } + + char fdigit[12]; + snprintf(fdigit, sizeof(fdigit), "%0*d", frac_digits, frac_part); + s_value += sysLocale.decimalPoint(); + s_value += QLatin1String(fdigit); + } + + if (!suffix.isEmpty()) { + // Suffix is present. + //: %1 == localized value, %2 == suffix (e.g. MiB) + return QCoreApplication::translate("FormatSize", "%1 %2") + .arg(s_value, suffix); + } + + // No suffix. + return s_value; +} diff --git a/src/qrvthtool/FormatSize.hpp b/src/qrvthtool/FormatSize.hpp new file mode 100644 index 0000000..78538bc --- /dev/null +++ b/src/qrvthtool/FormatSize.hpp @@ -0,0 +1,22 @@ +/*************************************************************************** + * RVT-H Tool (qrvthtool) * + * FormatSize.hpp: Format file sizes. * + * * + * Copyright (c) 2014-2025 by David Korth. * + * SPDX-License-Identifier: GPL-2.0-or-later * + ***************************************************************************/ + +#pragma once + +// C includes (C++ namespace) +#include + +// Qt includes +#include + +/** + * Format a file size. + * @param size [in] File size + * @return Formatted file size + */ +QString formatSize(off64_t size); diff --git a/src/qrvthtool/widgets/BankEntryView.cpp b/src/qrvthtool/widgets/BankEntryView.cpp index 578a4ae..6e1d540 100644 --- a/src/qrvthtool/widgets/BankEntryView.cpp +++ b/src/qrvthtool/widgets/BankEntryView.cpp @@ -8,8 +8,10 @@ #include "BankEntryView.hpp" -// For LBA_TO_BYTES() +// for LBA_TO_BYTES() #include "nhcd_structs.h" +// for formatSize() +#include "../FormatSize.hpp" // C includes (C++ namespace) #include @@ -40,16 +42,6 @@ public: const RvtH_BankEntry *bankEntry; - static inline int calc_frac_part(quint64 size, quint64 mask); - - /** - * Format a file size. - * TODO: Move to a common file so other files can use this? - * @param size File size - * @return Formatted file size - */ - static QString formatFileSize(quint64 size); - /** * Get a string for ticket/TMD status. * @param sig_type Signature type @@ -69,87 +61,6 @@ BankEntryViewPrivate::BankEntryViewPrivate(BankEntryView *q) , bankEntry(nullptr) { } -inline int BankEntryViewPrivate::calc_frac_part(quint64 size, quint64 mask) -{ - float f = static_cast(size & (mask - 1)) / static_cast(mask); - unsigned int frac_part = static_cast(f * 1000.0f); - - // MSVC added round() and roundf() in MSVC 2013. - // Use our own rounding code instead. - unsigned int round_adj = (frac_part % 10 > 5); - frac_part /= 10; - frac_part += round_adj; - return frac_part; -} - -/** - * Format a file size. - * TODO: Move to a common file so other files can use this? - * @param size File size - * @return Formatted file size - */ -QString BankEntryViewPrivate::formatFileSize(quint64 size) -{ - QLocale locale(QLocale::system()); - - // Localized suffix. - QString suffix; - // frac_part is always 0 to 100. - // If whole_part >= 10, frac_part is divided by 10. - unsigned int whole_part, frac_part; - - // TODO: Optimize this? - if (size < (2ULL << 10)) { - // tr: Bytes (< 1,024) - suffix = BankEntryView::tr("byte(s)", "", (int)size); - whole_part = static_cast(size); - frac_part = 0; - } else if (size < (2ULL << 20)) { - // tr: Kilobytes - suffix = BankEntryView::tr("KiB"); - whole_part = static_cast(size >> 10); - frac_part = calc_frac_part(size, (1ULL << 10)); - } else { - // tr: Megabytes - suffix = BankEntryView::tr("MiB"); - whole_part = static_cast(size >> 20); - frac_part = calc_frac_part(size, (1ULL << 20)); - } - - // Localize the whole part. - QString s_value = locale.toString(whole_part); - - if (size >= (2LL << 10)) { - // Fractional part. - int frac_digits = 2; - if (whole_part >= 10) { - unsigned int round_adj = (frac_part % 10 > 5); - frac_part /= 10; - frac_part += round_adj; - frac_digits = 1; - } - - // Get the localized decimal point. - s_value += locale.decimalPoint(); - - // Append the fractional part using the required number of digits. - char buf[16]; - snprintf(buf, sizeof(buf), "%0*u", frac_digits, frac_part); - s_value += QLatin1String(buf); - } - - if (!suffix.isEmpty()) { - //: %1 == localized value, %2 == suffix (e.g. MiB) - return BankEntryView::tr("%1 %2").arg(s_value, suffix); - } else { - return s_value; - } - - // Should not get here... - assert(!"Invalid code path."); - return QStringLiteral("QUACK"); -} - /** * Get a string for ticket/TMD status. * @param sig_type Signature type @@ -251,7 +162,7 @@ void BankEntryViewPrivate::updateWidgetDisplay(void) ui.lblTypeTitle->show(); // Size - ui.lblSize->setText(formatFileSize(LBA_TO_BYTES(bankEntry->lba_len))); + ui.lblSize->setText(formatSize(LBA_TO_BYTES(bankEntry->lba_len))); ui.lblSize->show(); ui.lblSizeTitle->show(); diff --git a/src/qrvthtool/windows/SelectDeviceDialog.cpp b/src/qrvthtool/windows/SelectDeviceDialog.cpp index 9d4ab12..9477873 100644 --- a/src/qrvthtool/windows/SelectDeviceDialog.cpp +++ b/src/qrvthtool/windows/SelectDeviceDialog.cpp @@ -14,6 +14,8 @@ // for the RVT-H Reader icon #include "../RvtHModel.hpp" +// for formatSize() +#include "../FormatSize.hpp" #ifdef _WIN32 # include "libwiicrypto/win32/Win32_sdk.h" @@ -64,15 +66,6 @@ public: #endif /* _WIN32 */ private: - static inline int calc_frac_part(int64_t size, int64_t mask); - - /** - * Format a block device size. - * @param size [in] Block device size - * @return Formatted block device size. - */ - static QString format_size(int64_t size); - /** * Add a device to the list. * @param queryData DeviceQueryData @@ -129,102 +122,6 @@ SelectDeviceDialogPrivate::~SelectDeviceDialogPrivate() #endif /* _WIN32 */ } -inline int SelectDeviceDialogPrivate::calc_frac_part(int64_t size, int64_t mask) -{ - float f = (float)(size & (mask - 1)) / (float)mask; - int frac_part = (int)(f * 1000.0f); - - // MSVC added round() and roundf() in MSVC 2013. - // Use our own rounding code instead. - int round_adj = (frac_part % 10 > 5); - frac_part /= 10; - frac_part += round_adj; - return frac_part; -} - -/** - * Format a block device size. - * @param size [in] Block device size - * @return Formatted block device size. - */ -QString SelectDeviceDialogPrivate::format_size(int64_t size) -{ - QString sbuf; - sbuf.reserve(16); - - // frac_part is always 0 to 100. - // If whole_part >= 10, frac_part is divided by 10. - int whole_part, frac_part; - - // TODO: Optimize this? - const QLocale sysLocale = QLocale::system(); - QString suffix; - if (size < 0) { - // Invalid size. Print the value as-is. - whole_part = (int)size; - frac_part = 0; - } else if (size < (2LL << 10)) { - // tr: Bytes (< 1,024) - suffix = SelectDeviceDialog::tr("byte(s)", nullptr, size); - whole_part = (int)size; - frac_part = 0; - } else if (size < (2LL << 20)) { - // tr: Kilobytes - suffix = SelectDeviceDialog::tr("KiB"); - whole_part = (int)(size >> 10); - frac_part = calc_frac_part(size, (1LL << 10)); - } else if (size < (2LL << 30)) { - // tr: Megabytes - suffix = SelectDeviceDialog::tr("MiB"); - whole_part = (int)(size >> 20); - frac_part = calc_frac_part(size, (1LL << 20)); - } else if (size < (2LL << 40)) { - // tr: Gigabytes - suffix = SelectDeviceDialog::tr("GiB"); - whole_part = (int)(size >> 30); - frac_part = calc_frac_part(size, (1LL << 30)); - } else if (size < (2LL << 50)) { - // tr: Terabytes - suffix = SelectDeviceDialog::tr("TiB"); - whole_part = (int)(size >> 40); - frac_part = calc_frac_part(size, (1LL << 40)); - } else if (size < (2LL << 60)) { - // tr: Petabytes - suffix = SelectDeviceDialog::tr("PiB"); - whole_part = (int)(size >> 50); - frac_part = calc_frac_part(size, (1LL << 50)); - } else /*if (size < (2ULL << 70))*/ { - // tr: Exabytes - suffix = SelectDeviceDialog::tr("EiB"); - whole_part = (int)(size >> 60); - frac_part = calc_frac_part(size, (1LL << 60)); - } - - sbuf = sysLocale.toString(whole_part); - if (size >= (2LL << 10)) { - // KiB or larger. There is a fractional part. - int frac_digits = 2; - if (whole_part >= 10) { - int round_adj = (frac_part % 10 > 5); - frac_part /= 10; - frac_part += round_adj; - frac_digits = 1; - } - - char fdigit[12]; - snprintf(fdigit, sizeof(fdigit), "%0*d", frac_digits, frac_part); - sbuf += sysLocale.decimalPoint(); - sbuf += QLatin1String(fdigit); - } - - if (!suffix.isEmpty()) { - sbuf += QChar(L' '); - sbuf += suffix; - } - - return sbuf; -} - /** * Add a device to the list. * @param queryData DeviceQueryData @@ -234,7 +131,7 @@ void SelectDeviceDialogPrivate::addDevice(const DeviceQueryData &queryData) // Create the string. QString text = queryData.device_name + QChar(L'\n') + queryData.usb_serial + QChar(L'\n') + - format_size(queryData.size); + formatSize(static_cast(queryData.size)); // Create the QListWidgetItem. // TODO: Verify that QListWidget takes ownership.