Files
sphaira/sphaira/include/nro.hpp
2025-07-31 18:47:41 +01:00

90 lines
2.8 KiB
C++

#pragma once
#include <switch.h>
#include <vector>
#include <string>
#include <span>
#include <optional>
#include "fs.hpp"
namespace sphaira {
struct Hbini {
u64 timestamp{}; // timestamp of last launch
bool hidden{};
};
struct MiniNacp {
NacpLanguageEntry lang;
char display_version[0x10];
};
struct NroEntry {
fs::FsPath path{};
s64 size{};
MiniNacp nacp{};
u64 icon_size{};
u64 icon_offset{};
FsTimeStampRaw timestamp{};
Hbini hbini{};
int image{}; // nvg image
int x,y,w,h{}; // image
bool is_nacp_valid{};
std::optional<bool> has_star{std::nullopt};
auto GetName() const -> const char* {
return nacp.lang.name;
}
auto GetAuthor() const -> const char* {
return nacp.lang.author;
}
auto GetDisplayVersion() const -> const char* {
return nacp.display_version;
}
};
auto nro_verify(std::span<const u8> data) -> Result;
auto nro_parse(const fs::FsPath& path, NroEntry& entry) -> Result;
/**
* Scans a folder for all nro's.
*
* \param path path to the folder that is to be scanned.
* \param nros output of all scanned nros.
* \param nested if true, it will scan any folders for nros, ie path/folder/game.nro.
* \param scan_all_dir if true, when a folder is found, it will scan the entire
* folder for all nros, rather than stopping at the first
* nro found.
* this does nothing if nested=false.
*/
auto nro_scan(const fs::FsPath& path, std::vector<NroEntry>& nros, bool nested = true, bool scan_all_dir = true) -> Result;
auto nro_get_icon(const fs::FsPath& path, u64 size, u64 offset) -> std::vector<u8>;
auto nro_get_icon(const fs::FsPath& path) -> std::vector<u8>;
auto nro_get_nacp(const fs::FsPath& path, NacpStruct& nacp) -> Result;
// path is pre-appended to args, such that argv[0] == path
auto nro_launch(std::string path, std::string args = {}) -> Result;
// if the arg contains a space, it will wrap it in quotes
auto nro_add_arg(std::string arg) -> std::string;
// same as above but prefixes "sdmc" to keep compat with hbmenu
auto nro_add_arg_file(std::string arg) -> std::string;
// strips sdmc:
auto nro_normalise_path(const std::string& p) -> std::string;
// helpers to find nro entry, will be made methods soon once i convert vector into a struct.
auto nro_find(std::span<const NroEntry> array, std::string_view name, std::string_view author, const fs::FsPath& path) -> std::optional<NroEntry>;
auto nro_find_name(std::span<const NroEntry> array, std::string_view name) -> std::optional<NroEntry>;
auto nro_find_author(std::span<const NroEntry> array, std::string_view author) -> std::optional<NroEntry>;
auto nro_find_path(std::span<const NroEntry> array, const fs::FsPath& path) -> std::optional<NroEntry>;
} // namespace sphaira