mirror of
https://github.com/J-D-K/JKSV.git
synced 2026-08-23 02:45:15 -05:00
File mode progress.
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
#include "data/DataContext.hpp"
|
||||
|
||||
#include "config/config.hpp"
|
||||
#include "error.hpp"
|
||||
#include "fs/fs.hpp"
|
||||
#include "logging/error.hpp"
|
||||
#include "logging/logger.hpp"
|
||||
#include "strings/strings.hpp"
|
||||
#include "stringutil.hpp"
|
||||
@@ -128,7 +128,7 @@ bool data::DataContext::title_is_loaded(uint64_t applicationID)
|
||||
void data::DataContext::load_title(uint64_t applicationID)
|
||||
{
|
||||
std::scoped_lock titleGuard{m_titleMutex, m_iconQueueMutex};
|
||||
m_titleInfo.emplace(applicationID, applicationID);
|
||||
m_titleInfo.try_emplace(applicationID, applicationID);
|
||||
m_iconQueue.push_back(&m_titleInfo.at(applicationID));
|
||||
}
|
||||
|
||||
@@ -171,7 +171,8 @@ void data::DataContext::import_svi_files(sys::Task *task)
|
||||
|
||||
task->set_status(statusLoadingSvi);
|
||||
|
||||
for (const fslib::DirectoryEntry &entry : sviDir.list())
|
||||
auto controlData = std::make_unique<NsApplicationControlData>();
|
||||
for (const fslib::DirectoryEntry &entry : sviDir)
|
||||
{
|
||||
const fslib::Path target{sviPath / entry};
|
||||
fslib::File sviFile{target, FsOpenMode_Read};
|
||||
@@ -180,7 +181,6 @@ void data::DataContext::import_svi_files(sys::Task *task)
|
||||
|
||||
uint32_t magic{};
|
||||
uint64_t applicationID{};
|
||||
auto controlData = std::make_unique<NsApplicationControlData>();
|
||||
const bool magicRead = sviFile.read(&magic, SIZE_UINT32) == SIZE_UINT32;
|
||||
const bool idRead = sviFile.read(&applicationID, SIZE_UINT64) == SIZE_UINT64;
|
||||
const bool exists = DataContext::title_is_loaded(applicationID);
|
||||
@@ -190,8 +190,7 @@ void data::DataContext::import_svi_files(sys::Task *task)
|
||||
if (!dataRead) { continue; }
|
||||
|
||||
std::scoped_lock multiGuard{m_iconQueueMutex, m_titleMutex};
|
||||
data::TitleInfo newTitle{applicationID, controlData};
|
||||
m_titleInfo.emplace(applicationID, std::move(newTitle));
|
||||
m_titleInfo.try_emplace(applicationID, applicationID, *controlData);
|
||||
m_iconQueue.push_back(&m_titleInfo.at(applicationID));
|
||||
}
|
||||
}
|
||||
@@ -214,8 +213,8 @@ bool data::DataContext::read_cache(sys::Task *task)
|
||||
const char *statusLoadingCache = strings::get_by_name(strings::names::DATA_LOADING_STATUS, 4);
|
||||
task->set_status(statusLoadingCache);
|
||||
|
||||
auto controlData = std::make_unique<NsApplicationControlData>();
|
||||
do {
|
||||
auto controlData = std::make_unique<NsApplicationControlData>();
|
||||
const bool dataRead = cacheZip.read(controlData.get(), SIZE_CTRL_DATA) == SIZE_CTRL_DATA;
|
||||
if (!dataRead) { continue; }
|
||||
|
||||
@@ -228,8 +227,7 @@ bool data::DataContext::read_cache(sys::Task *task)
|
||||
|
||||
std::scoped_lock multiGuard{m_iconQueueMutex, m_titleMutex};
|
||||
|
||||
data::TitleInfo newTitle{applicationID, controlData};
|
||||
m_titleInfo.emplace(applicationID, std::move(newTitle));
|
||||
m_titleInfo.try_emplace(applicationID, applicationID, *controlData);
|
||||
m_iconQueue.push_back(&m_titleInfo.at(applicationID));
|
||||
} while (cacheZip.next_file());
|
||||
m_cacheIsValid = true;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "data/TitleInfo.hpp"
|
||||
|
||||
#include "config/config.hpp"
|
||||
#include "error.hpp"
|
||||
#include "graphics/colors.hpp"
|
||||
#include "graphics/gfxutil.hpp"
|
||||
#include "logging/error.hpp"
|
||||
#include "logging/logger.hpp"
|
||||
#include "stringutil.hpp"
|
||||
|
||||
@@ -11,28 +11,25 @@
|
||||
|
||||
data::TitleInfo::TitleInfo(uint64_t applicationID)
|
||||
: m_applicationID(applicationID)
|
||||
, m_data(std::make_unique<NsApplicationControlData>())
|
||||
{
|
||||
static constexpr size_t SIZE_CTRL_DATA = sizeof(NsApplicationControlData);
|
||||
|
||||
uint64_t controlSize{};
|
||||
NacpLanguageEntry *entry{};
|
||||
NsApplicationControlData *data = m_data.get();
|
||||
|
||||
// This will filter from even trying to fetch control data for system titles.
|
||||
const bool isSystem = applicationID & 0x8000000000000000;
|
||||
const bool getError = !isSystem && error::libnx(nsGetApplicationControlData(NsApplicationControlSource_Storage,
|
||||
m_applicationID,
|
||||
data,
|
||||
&m_data,
|
||||
SIZE_CTRL_DATA,
|
||||
&controlSize));
|
||||
const bool entryError = !getError && error::libnx(nacpGetLanguageEntry(&data->nacp, &entry));
|
||||
const bool entryError = !getError && error::libnx(nacpGetLanguageEntry(&m_data.nacp, &entry));
|
||||
if (isSystem || getError)
|
||||
{
|
||||
const std::string appIDHex = stringutil::get_formatted_string("%04X", m_applicationID & 0xFFFF);
|
||||
char *name = data->nacp.lang[SetLanguage_ENUS].name; // I'm hoping this is enough?
|
||||
char *name = m_data.nacp.lang[SetLanguage_ENUS].name; // I'm hoping this is enough?
|
||||
|
||||
std::memset(data, 0x00, SIZE_CTRL_DATA);
|
||||
std::snprintf(name, TitleInfo::SIZE_PATH_SAFE, "%016lX", m_applicationID);
|
||||
TitleInfo::get_create_path_safe_title();
|
||||
}
|
||||
@@ -44,48 +41,29 @@ data::TitleInfo::TitleInfo(uint64_t applicationID)
|
||||
}
|
||||
|
||||
// To do: Make this safer...
|
||||
data::TitleInfo::TitleInfo(uint64_t applicationID, std::unique_ptr<NsApplicationControlData> &controlData)
|
||||
data::TitleInfo::TitleInfo(uint64_t applicationID, NsApplicationControlData &controlData)
|
||||
: m_applicationID(applicationID)
|
||||
, m_data(std::move(controlData))
|
||||
{
|
||||
m_hasData = true;
|
||||
m_data = controlData;
|
||||
|
||||
NacpLanguageEntry *entry{};
|
||||
const bool entryError = error::libnx(nacpGetLanguageEntry(&m_data->nacp, &entry));
|
||||
const bool entryError = error::libnx(nacpGetLanguageEntry(&m_data.nacp, &entry));
|
||||
if (entryError) { std::snprintf(entry->name, TitleInfo::SIZE_PATH_SAFE, "%016lX", m_applicationID); }
|
||||
|
||||
TitleInfo::get_create_path_safe_title();
|
||||
}
|
||||
|
||||
data::TitleInfo::TitleInfo(data::TitleInfo &&titleInfo) { *this = std::move(titleInfo); }
|
||||
|
||||
data::TitleInfo &data::TitleInfo::operator=(data::TitleInfo &&titleInfo)
|
||||
{
|
||||
m_applicationID = titleInfo.m_applicationID;
|
||||
m_data = std::move(titleInfo.m_data);
|
||||
m_hasData = titleInfo.m_hasData;
|
||||
std::memcpy(m_pathSafeTitle, titleInfo.m_pathSafeTitle, TitleInfo::SIZE_PATH_SAFE);
|
||||
m_icon = titleInfo.m_icon;
|
||||
|
||||
titleInfo.m_applicationID = 0;
|
||||
titleInfo.m_data = nullptr;
|
||||
titleInfo.m_hasData = false;
|
||||
std::memset(titleInfo.m_pathSafeTitle, 0x00, TitleInfo::SIZE_PATH_SAFE);
|
||||
titleInfo.m_icon = nullptr;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
uint64_t data::TitleInfo::get_application_id() const { return m_applicationID; }
|
||||
|
||||
NsApplicationControlData *data::TitleInfo::get_control_data() { return m_data.get(); }
|
||||
NsApplicationControlData *data::TitleInfo::get_control_data() { return &m_data; }
|
||||
|
||||
bool data::TitleInfo::has_control_data() const { return m_hasData; }
|
||||
|
||||
const char *data::TitleInfo::get_title()
|
||||
{
|
||||
NacpLanguageEntry *entry{};
|
||||
const bool entryError = error::libnx(nacpGetLanguageEntry(&m_data->nacp, &entry));
|
||||
const bool entryError = error::libnx(nacpGetLanguageEntry(&m_data.nacp, &entry));
|
||||
if (entryError) { return nullptr; }
|
||||
return entry->name;
|
||||
}
|
||||
@@ -95,16 +73,16 @@ const char *data::TitleInfo::get_path_safe_title() const { return m_pathSafeTitl
|
||||
const char *data::TitleInfo::get_publisher()
|
||||
{
|
||||
NacpLanguageEntry *entry{};
|
||||
const bool entryError = error::libnx(nacpGetLanguageEntry(&m_data->nacp, &entry));
|
||||
const bool entryError = error::libnx(nacpGetLanguageEntry(&m_data.nacp, &entry));
|
||||
if (entryError) { return nullptr; }
|
||||
return entry->author;
|
||||
}
|
||||
|
||||
uint64_t data::TitleInfo::get_save_data_owner_id() const { return m_data->nacp.save_data_owner_id; }
|
||||
uint64_t data::TitleInfo::get_save_data_owner_id() const { return m_data.nacp.save_data_owner_id; }
|
||||
|
||||
int64_t data::TitleInfo::get_save_data_size(uint8_t saveType) const
|
||||
{
|
||||
const NacpStruct &nacp = m_data->nacp;
|
||||
const NacpStruct &nacp = m_data.nacp;
|
||||
switch (saveType)
|
||||
{
|
||||
case FsSaveDataType_Account: return nacp.user_account_save_data_size;
|
||||
@@ -118,7 +96,7 @@ int64_t data::TitleInfo::get_save_data_size(uint8_t saveType) const
|
||||
|
||||
int64_t data::TitleInfo::get_save_data_size_max(uint8_t saveType) const
|
||||
{
|
||||
const NacpStruct &nacp = m_data->nacp;
|
||||
const NacpStruct &nacp = m_data.nacp;
|
||||
switch (saveType)
|
||||
{
|
||||
case FsSaveDataType_Account: return std::max(nacp.user_account_save_data_size, nacp.user_account_save_data_size_max);
|
||||
@@ -132,7 +110,7 @@ int64_t data::TitleInfo::get_save_data_size_max(uint8_t saveType) const
|
||||
|
||||
int64_t data::TitleInfo::get_journal_size(uint8_t saveType) const
|
||||
{
|
||||
const NacpStruct &nacp = m_data->nacp;
|
||||
const NacpStruct &nacp = m_data.nacp;
|
||||
switch (saveType)
|
||||
{
|
||||
case FsSaveDataType_Account: return nacp.user_account_save_data_journal_size;
|
||||
@@ -146,7 +124,7 @@ int64_t data::TitleInfo::get_journal_size(uint8_t saveType) const
|
||||
|
||||
int64_t data::TitleInfo::get_journal_size_max(uint8_t saveType) const
|
||||
{
|
||||
const NacpStruct &nacp = m_data->nacp;
|
||||
const NacpStruct &nacp = m_data.nacp;
|
||||
switch (saveType)
|
||||
{
|
||||
case FsSaveDataType_Account:
|
||||
@@ -162,7 +140,7 @@ int64_t data::TitleInfo::get_journal_size_max(uint8_t saveType) const
|
||||
|
||||
bool data::TitleInfo::has_save_data_type(uint8_t saveType) const
|
||||
{
|
||||
const NacpStruct &nacp = m_data->nacp;
|
||||
const NacpStruct &nacp = m_data.nacp;
|
||||
switch (saveType)
|
||||
{
|
||||
case FsSaveDataType_Account: return nacp.user_account_save_data_size > 0 || nacp.user_account_save_data_size_max > 0;
|
||||
@@ -197,7 +175,7 @@ void data::TitleInfo::get_create_path_safe_title()
|
||||
}
|
||||
|
||||
const bool useTitleId = config::get_by_key(config::keys::USE_TITLE_IDS);
|
||||
const bool entryError = !useTitleId && error::libnx(nacpGetLanguageEntry(&m_data->nacp, &entry));
|
||||
const bool entryError = !useTitleId && error::libnx(nacpGetLanguageEntry(&m_data.nacp, &entry));
|
||||
const bool sanitized =
|
||||
!useTitleId && !entryError && stringutil::sanitize_string_for_path(entry->name, m_pathSafeTitle, SIZE_PATH_SAFE);
|
||||
if (useTitleId || entryError || !sanitized)
|
||||
@@ -214,7 +192,7 @@ void data::TitleInfo::load_icon()
|
||||
if (m_hasData)
|
||||
{
|
||||
const std::string textureName = stringutil::get_formatted_string("%016llX", m_applicationID);
|
||||
m_icon = sdl::TextureManager::load(textureName, m_data->icon, SIZE_ICON);
|
||||
m_icon = sdl::TextureManager::load(textureName, m_data.icon, SIZE_ICON);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
|
||||
#include "config/config.hpp"
|
||||
#include "data/data.hpp"
|
||||
#include "error.hpp"
|
||||
#include "fs/fs.hpp"
|
||||
#include "graphics/colors.hpp"
|
||||
#include "graphics/gfxutil.hpp"
|
||||
#include "logging/error.hpp"
|
||||
#include "logging/logger.hpp"
|
||||
#include "sdl.hpp"
|
||||
#include "stringutil.hpp"
|
||||
@@ -164,15 +164,12 @@ void data::User::load_user_data()
|
||||
|
||||
while (infoReader.read())
|
||||
{
|
||||
const int64_t readCount = infoReader.get_read_count();
|
||||
|
||||
for (int64_t i = 0; i < readCount; i++)
|
||||
for (const FsSaveDataInfo &saveInfo : infoReader)
|
||||
{
|
||||
const FsSaveDataInfo &saveInfo = infoReader[i];
|
||||
const uint64_t saveInfoAppID = saveInfo.application_id;
|
||||
const uint64_t saveInfoSysID = saveInfo.system_save_data_id;
|
||||
const uint64_t applicationID = saveInfoAppID != 0 ? saveInfoAppID : saveInfoSysID;
|
||||
const uint8_t saveDataType = saveInfo.save_data_type;
|
||||
const uint64_t saveInfoAppID = saveInfo.application_id;
|
||||
const uint64_t saveInfoSysID = saveInfo.system_save_data_id;
|
||||
const uint64_t applicationID = saveInfoAppID != 0 ? saveInfoAppID : saveInfoSysID;
|
||||
const uint8_t saveDataType = saveInfo.save_data_type;
|
||||
const bool isSystemSave = saveDataType == FsSaveDataType_System || saveDataType == FsSaveDataType_SystemBcat;
|
||||
|
||||
const bool isBlacklisted = config::is_blacklisted(applicationID);
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
|
||||
#include "appstates/DataLoadingState.hpp"
|
||||
#include "data/DataContext.hpp"
|
||||
#include "logging/error.hpp"
|
||||
#include "error.hpp"
|
||||
#include "logging/logger.hpp"
|
||||
#include "strings/strings.hpp"
|
||||
|
||||
#include <switch.h>
|
||||
|
||||
Reference in New Issue
Block a user