diff --git a/sphaira/CMakeLists.txt b/sphaira/CMakeLists.txt index b29f8c1..2a8bbd2 100644 --- a/sphaira/CMakeLists.txt +++ b/sphaira/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.13) -set(sphaira_VERSION 0.13.0) +set(sphaira_VERSION 0.13.1) project(sphaira VERSION ${sphaira_VERSION} @@ -208,8 +208,8 @@ FetchContent_Declare(libnxtc ) FetchContent_Declare(nvjpg - GIT_REPOSITORY https://github.com/averne/oss-nvjpg.git - GIT_TAG 16c10a3 + GIT_REPOSITORY https://github.com/ITotalJustice/oss-nvjpg.git + GIT_TAG 45680e7 ) set(USE_NEW_ZSTD ON) diff --git a/sphaira/source/hasher.cpp b/sphaira/source/hasher.cpp index 8bdbcde..c009d83 100644 --- a/sphaira/source/hasher.cpp +++ b/sphaira/source/hasher.cpp @@ -2,6 +2,7 @@ #include "app.hpp" #include "threaded_file_transfer.hpp" #include +#include namespace sphaira::hash { namespace { @@ -16,11 +17,11 @@ struct FileSource final : BaseSource { m_is_file_based_emummc = App::IsFileBaseEmummc(); } - Result Size(s64* out) { + Result Size(s64* out) override { return m_file.GetSize(out); } - Result Read(void* buf, s64 off, s64 size, u64* bytes_read) { + Result Read(void* buf, s64 off, s64 size, u64* bytes_read) override { const auto rc = m_file.Read(off, buf, size, 0, bytes_read); if (m_fs->IsNative() && m_is_file_based_emummc) { svcSleepThread(2e+6); // 2ms @@ -38,12 +39,12 @@ private: struct MemSource final : BaseSource { MemSource(std::span data) : m_data{data} { } - Result Size(s64* out) { + Result Size(s64* out) override { *out = m_data.size(); R_SUCCEED(); } - Result Read(void* buf, s64 off, s64 size, u64* bytes_read) { + Result Read(void* buf, s64 off, s64 size, u64* bytes_read) override { size = std::min(size, m_data.size() - off); std::memcpy(buf, m_data.data() + off, size); *bytes_read = size; @@ -61,11 +62,11 @@ struct HashSource { }; struct HashCrc32 final : HashSource { - void Update(const void* buf, s64 size) { + void Update(const void* buf, s64 size) override { m_seed = crc32CalculateWithSeed(m_seed, buf, size); } - void Get(std::string& out) { + void Get(std::string& out) override { char str[CalculateHashStrLen(sizeof(m_seed))]; std::snprintf(str, sizeof(str), "%08x", m_seed); out = str; @@ -85,11 +86,11 @@ struct HashMd5 final : HashSource { mbedtls_md5_free(&m_ctx); } - void Update(const void* buf, s64 size) { + void Update(const void* buf, s64 size) override { mbedtls_md5_update_ret(&m_ctx, (const u8*)buf, size); } - void Get(std::string& out) { + void Get(std::string& out) override { u8 hash[16]; mbedtls_md5_finish_ret(&m_ctx, hash); @@ -110,11 +111,11 @@ struct HashSha1 final : HashSource { sha1ContextCreate(&m_ctx); } - void Update(const void* buf, s64 size) { + void Update(const void* buf, s64 size) override { sha1ContextUpdate(&m_ctx, buf, size); } - void Get(std::string& out) { + void Get(std::string& out) override { u8 hash[SHA1_HASH_SIZE]; sha1ContextGetHash(&m_ctx, hash); @@ -135,11 +136,11 @@ struct HashSha256 final : HashSource { sha256ContextCreate(&m_ctx); } - void Update(const void* buf, s64 size) { + void Update(const void* buf, s64 size) override { sha256ContextUpdate(&m_ctx, buf, size); } - void Get(std::string& out) { + void Get(std::string& out) override { u8 hash[SHA256_HASH_SIZE]; sha256ContextGetHash(&m_ctx, hash); diff --git a/sphaira/source/nro.cpp b/sphaira/source/nro.cpp index 6a4d186..89b9fc0 100644 --- a/sphaira/source/nro.cpp +++ b/sphaira/source/nro.cpp @@ -59,18 +59,20 @@ auto nro_parse_internal(fs::Fs* fs, const fs::FsPath& path, NroEntry& entry) -> std::strncpy(nacp.lang.name, file_name, file_name_len - 4); std::strcpy(nacp.lang.author, "Unknown"); std::strcpy(nacp.display_version, "Unknown"); + + entry.icon_offset = entry.icon_size = 0; entry.is_nacp_valid = false; } else { entry.size += sizeof(asset) + asset.icon.size + asset.nacp.size + asset.romfs.size; R_TRY(f.Read(data.header.size + asset.nacp.offset, &nacp.lang, sizeof(nacp.lang), FsReadOption_None, &bytes_read)); R_TRY(f.Read(data.header.size + asset.nacp.offset + offsetof(NacpStruct, display_version), nacp.display_version, sizeof(nacp.display_version), FsReadOption_None, &bytes_read)); + + // lazy load the icons + entry.icon_size = asset.icon.size; + entry.icon_offset = data.header.size + asset.icon.offset; entry.is_nacp_valid = true; } - // lazy load the icons - entry.icon_size = asset.icon.size; - entry.icon_offset = data.header.size + asset.icon.offset; - R_SUCCEED(); }