[Kernel] Improved TUs Support
- Changed name of config option to apply_title_update to better reflect what that option does - Mount TU package to UPDATE: partition - Simplified UserModule::title_id() - Splitted loading module into two parts to allow applying TUs and custom patches
This commit is contained in:
@@ -71,11 +71,18 @@ std::filesystem::path ContentManager::ResolvePackageRoot(
|
||||
}
|
||||
|
||||
std::filesystem::path ContentManager::ResolvePackagePath(
|
||||
const XCONTENT_AGGREGATE_DATA& data) {
|
||||
const XCONTENT_AGGREGATE_DATA& data, const uint32_t disc_number) {
|
||||
// Content path:
|
||||
// content_root/title_id/content_type/data_file_name/
|
||||
auto package_root = ResolvePackageRoot(data.content_type, data.title_id);
|
||||
return package_root / xe::to_path(data.file_name());
|
||||
std::string disc_directory = "";
|
||||
std::filesystem::path package_path =
|
||||
package_root / xe::to_path(data.file_name());
|
||||
|
||||
if (disc_number != -1) {
|
||||
package_path /= fmt::format("disc{:03}", disc_number);
|
||||
}
|
||||
return package_path;
|
||||
}
|
||||
|
||||
std::vector<XCONTENT_AGGREGATE_DATA> ContentManager::ListContent(
|
||||
@@ -108,8 +115,9 @@ std::vector<XCONTENT_AGGREGATE_DATA> ContentManager::ListContent(
|
||||
}
|
||||
|
||||
std::unique_ptr<ContentPackage> ContentManager::ResolvePackage(
|
||||
const std::string_view root_name, const XCONTENT_AGGREGATE_DATA& data) {
|
||||
auto package_path = ResolvePackagePath(data);
|
||||
const std::string_view root_name, const XCONTENT_AGGREGATE_DATA& data,
|
||||
const uint32_t disc_number) {
|
||||
auto package_path = ResolvePackagePath(data, disc_number);
|
||||
if (!std::filesystem::exists(package_path)) {
|
||||
return nullptr;
|
||||
}
|
||||
@@ -154,7 +162,8 @@ X_RESULT ContentManager::CreateContent(const std::string_view root_name,
|
||||
}
|
||||
|
||||
X_RESULT ContentManager::OpenContent(const std::string_view root_name,
|
||||
const XCONTENT_AGGREGATE_DATA& data) {
|
||||
const XCONTENT_AGGREGATE_DATA& data,
|
||||
const uint32_t disc_number) {
|
||||
auto global_lock = global_critical_region_.Acquire();
|
||||
|
||||
if (open_packages_.count(string_key(root_name))) {
|
||||
@@ -162,14 +171,14 @@ X_RESULT ContentManager::OpenContent(const std::string_view root_name,
|
||||
return X_ERROR_ALREADY_EXISTS;
|
||||
}
|
||||
|
||||
auto package_path = ResolvePackagePath(data);
|
||||
auto package_path = ResolvePackagePath(data, disc_number);
|
||||
if (!std::filesystem::exists(package_path)) {
|
||||
// Does not exist, must be created.
|
||||
return X_ERROR_FILE_NOT_FOUND;
|
||||
}
|
||||
|
||||
// Open package.
|
||||
auto package = ResolvePackage(root_name, data);
|
||||
auto package = ResolvePackage(root_name, data, disc_number);
|
||||
assert_not_null(package);
|
||||
|
||||
open_packages_.insert({string_key::create(root_name), package.release()});
|
||||
|
||||
@@ -146,13 +146,15 @@ class ContentManager {
|
||||
uint32_t title_id = -1);
|
||||
|
||||
std::unique_ptr<ContentPackage> ResolvePackage(
|
||||
const std::string_view root_name, const XCONTENT_AGGREGATE_DATA& data);
|
||||
const std::string_view root_name, const XCONTENT_AGGREGATE_DATA& data,
|
||||
const uint32_t disc_number = -1);
|
||||
|
||||
bool ContentExists(const XCONTENT_AGGREGATE_DATA& data);
|
||||
X_RESULT CreateContent(const std::string_view root_name,
|
||||
const XCONTENT_AGGREGATE_DATA& data);
|
||||
X_RESULT OpenContent(const std::string_view root_name,
|
||||
const XCONTENT_AGGREGATE_DATA& data);
|
||||
const XCONTENT_AGGREGATE_DATA& data,
|
||||
const uint32_t disc_number = -1);
|
||||
X_RESULT CloseContent(const std::string_view root_name);
|
||||
X_RESULT GetContentThumbnail(const XCONTENT_AGGREGATE_DATA& data,
|
||||
std::vector<uint8_t>* buffer);
|
||||
@@ -166,7 +168,8 @@ class ContentManager {
|
||||
private:
|
||||
std::filesystem::path ResolvePackageRoot(XContentType content_type,
|
||||
uint32_t title_id = -1);
|
||||
std::filesystem::path ResolvePackagePath(const XCONTENT_AGGREGATE_DATA& data);
|
||||
std::filesystem::path ResolvePackagePath(const XCONTENT_AGGREGATE_DATA& data,
|
||||
const uint32_t disc_number = -1);
|
||||
|
||||
KernelState* kernel_state_;
|
||||
std::filesystem::path root_path_;
|
||||
|
||||
Reference in New Issue
Block a user