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.