From 3f24047abb288111033bd4b7939f19983c9cef01 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 31 Oct 2022 19:46:56 -0700 Subject: [PATCH] Qt: Split out some helper functions --- src/platform/qt/ForwarderGenerator.cpp | 16 +++++++++++ src/platform/qt/ForwarderGenerator.h | 2 ++ src/platform/qt/ForwarderGeneratorVita.cpp | 32 ++++++---------------- src/platform/qt/utils.cpp | 24 ++++++++++++++-- src/platform/qt/utils.h | 6 ++++ 5 files changed, 53 insertions(+), 27 deletions(-) diff --git a/src/platform/qt/ForwarderGenerator.cpp b/src/platform/qt/ForwarderGenerator.cpp index 1c1c2ef94..691c9cf92 100644 --- a/src/platform/qt/ForwarderGenerator.cpp +++ b/src/platform/qt/ForwarderGenerator.cpp @@ -72,3 +72,19 @@ QString ForwarderGenerator::systemName(ForwarderGenerator::System system) { return {}; } + +QString ForwarderGenerator::base36(const QByteArray& bytes, int length) { + static const char* alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + QString buffer(length, 'X'); + quint32 running = 0; + for (int i = 0, j = 0; i < length; ++i) { + if (running < 36) { + running <<= 8; + running |= static_cast(bytes[j]); + ++j; + } + buffer[i] = alphabet[running % 36]; + running /= 36; + } + return buffer; +} diff --git a/src/platform/qt/ForwarderGenerator.h b/src/platform/qt/ForwarderGenerator.h index 1e8eedce4..0fdf85b2e 100644 --- a/src/platform/qt/ForwarderGenerator.h +++ b/src/platform/qt/ForwarderGenerator.h @@ -48,6 +48,8 @@ public: protected: ForwarderGenerator(int imageTypes, QObject* parent = nullptr); + static QString base36(const QByteArray&, int length); + private: QString m_title; QString m_romPath; diff --git a/src/platform/qt/ForwarderGeneratorVita.cpp b/src/platform/qt/ForwarderGeneratorVita.cpp index 1a52817c6..1f5897825 100644 --- a/src/platform/qt/ForwarderGeneratorVita.cpp +++ b/src/platform/qt/ForwarderGeneratorVita.cpp @@ -8,6 +8,7 @@ #include #include +#include "utils.h" #include "VFileDevice.h" #include @@ -77,29 +78,20 @@ bool ForwarderGeneratorVita::rebuild(const QString& source, const QString& targe } QString ForwarderGeneratorVita::dumpVpk(const QString& archive) { - bool gotFile = false; - VDir* inArchive = VFileDevice::openArchive(archive); if (!inArchive) { return {}; } - for (VDirEntry* dirent = inArchive->listNext(inArchive); dirent; dirent = inArchive->listNext(inArchive)) { + bool gotFile = extractMatchingFile(inArchive, [](VDirEntry* dirent) -> QString { if (dirent->type(dirent) != VFS_FILE) { - continue; + return {}; } QString filename(dirent->name(dirent)); if (!filename.endsWith(".vpk")) { - continue; + return {}; } - - VFile* outfile = VFileOpen("tmp.vpk", O_WRONLY | O_TRUNC | O_CREAT); - VFile* vpk = inArchive->openFile(inArchive, dirent->name(dirent), O_RDONLY); - VFileDevice::copyFile(vpk, outfile); - vpk->close(vpk); - outfile->close(outfile); - gotFile = true; - break; - } + return "tmp.vpk"; + }); inArchive->close(inArchive); if (gotFile) { @@ -156,16 +148,8 @@ bool ForwarderGeneratorVita::copyAssets(const QString& vpk, VDir* outdir) { } QString ForwarderGeneratorVita::makeSerial() const { - QByteArray hash = hashRom(); - quint32 hashBits = (hash[0] << 24) | (hash[1] << 16) | (hash[2] << 8) | hash[3]; - - QString serial("MFXXXXXXX"); - for (int i = 0; i < 7; ++i) { - static const char alphabet[37] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - serial[i + 2] = alphabet[hashBits % 36]; - hashBits /= 36; - } - + QString serial("MF"); + serial += base36(hashRom(), 7); return serial; } diff --git a/src/platform/qt/utils.cpp b/src/platform/qt/utils.cpp index b77652c6c..d6da29781 100644 --- a/src/platform/qt/utils.cpp +++ b/src/platform/qt/utils.cpp @@ -1,15 +1,17 @@ -/* Copyright (c) 2013-2017 Jeffrey Pfau +/* Copyright (c) 2013-2022 Jeffrey Pfau * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "utils.h" -#include - #include #include +#include "VFileDevice.h" + +#include + namespace QGBA { QString niceSizeFormat(size_t filesize) { @@ -111,4 +113,20 @@ QString romFilters(bool includeMvl) { return filters.join(";;"); } +bool extractMatchingFile(VDir* dir, std::function filter) { + for (VDirEntry* entry = dir->listNext(dir); entry; entry = dir->listNext(dir)) { + QString target = filter(entry); + if (target.isNull()) { + continue; + } + VFile* outfile = VFileOpen(target.toUtf8().constData(), O_WRONLY | O_TRUNC | O_CREAT); + VFile* infile = dir->openFile(dir, entry->name(entry), O_RDONLY); + VFileDevice::copyFile(infile, outfile); + infile->close(infile); + outfile->close(outfile); + return true; + } + return false; +} + } diff --git a/src/platform/qt/utils.h b/src/platform/qt/utils.h index 9ccc8803f..72ce74c30 100644 --- a/src/platform/qt/utils.h +++ b/src/platform/qt/utils.h @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -14,6 +15,10 @@ #include #include +#include + +struct VDir; +struct VDirEntry; namespace QGBA { @@ -68,5 +73,6 @@ constexpr const T& clamp(const T& v, const T& lo, const T& hi) { #endif QString romFilters(bool includeMvl = false); +bool extractMatchingFile(VDir* dir, std::function filter); }