[XAM] Trim content name when resolving its path
This commit is contained in:
parent
a8421bbce1
commit
a7acce50a6
|
@ -79,9 +79,8 @@ std::filesystem::path ContentManager::ResolvePackagePath(
|
||||||
// Content path:
|
// Content path:
|
||||||
// content_root/title_id/content_type/data_file_name/
|
// content_root/title_id/content_type/data_file_name/
|
||||||
auto package_root = ResolvePackageRoot(data.content_type, data.title_id);
|
auto package_root = ResolvePackageRoot(data.content_type, data.title_id);
|
||||||
std::string disc_directory = "";
|
std::string final_name = xe::string_util::trim(data.file_name());
|
||||||
std::filesystem::path package_path =
|
std::filesystem::path package_path = package_root / xe::to_path(final_name);
|
||||||
package_root / xe::to_path(data.file_name());
|
|
||||||
|
|
||||||
if (disc_number != -1) {
|
if (disc_number != -1) {
|
||||||
package_path /= fmt::format("disc{:03}", disc_number);
|
package_path /= fmt::format("disc{:03}", disc_number);
|
||||||
|
@ -89,6 +88,23 @@ std::filesystem::path ContentManager::ResolvePackagePath(
|
||||||
return package_path;
|
return package_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::filesystem::path ContentManager::ResolvePackageHeaderPath(
|
||||||
|
const std::string_view file_name, XContentType content_type,
|
||||||
|
uint32_t title_id) {
|
||||||
|
if (title_id == kCurrentlyRunningTitleId) {
|
||||||
|
title_id = kernel_state_->title_id();
|
||||||
|
}
|
||||||
|
auto title_id_str = fmt::format("{:08X}", title_id);
|
||||||
|
auto content_type_str = fmt::format("{:08X}", uint32_t(content_type));
|
||||||
|
std::string final_name =
|
||||||
|
xe::string_util::trim(std::string(file_name)) + ".header";
|
||||||
|
|
||||||
|
// Header root path:
|
||||||
|
// content_root/title_id/Headers/content_type/
|
||||||
|
return root_path_ / title_id_str / kGameContentHeaderDirName /
|
||||||
|
content_type_str / final_name;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<XCONTENT_AGGREGATE_DATA> ContentManager::ListContent(
|
std::vector<XCONTENT_AGGREGATE_DATA> ContentManager::ListContent(
|
||||||
uint32_t device_id, XContentType content_type, uint32_t title_id) {
|
uint32_t device_id, XContentType content_type, uint32_t title_id) {
|
||||||
std::vector<XCONTENT_AGGREGATE_DATA> result;
|
std::vector<XCONTENT_AGGREGATE_DATA> result;
|
||||||
|
@ -165,23 +181,20 @@ bool ContentManager::ContentExists(const XCONTENT_AGGREGATE_DATA& data) {
|
||||||
|
|
||||||
X_RESULT ContentManager::WriteContentHeaderFile(
|
X_RESULT ContentManager::WriteContentHeaderFile(
|
||||||
const XCONTENT_AGGREGATE_DATA* data) {
|
const XCONTENT_AGGREGATE_DATA* data) {
|
||||||
auto title_id = fmt::format("{:08X}", kernel_state_->title_id());
|
auto header_path = ResolvePackageHeaderPath(
|
||||||
auto content_type =
|
data->file_name(), data->content_type, data->title_id);
|
||||||
fmt::format("{:08X}", load_and_swap<uint32_t>(&data->content_type));
|
auto parent_path = header_path.parent_path();
|
||||||
auto header_path =
|
|
||||||
root_path_ / title_id / kGameContentHeaderDirName / content_type;
|
|
||||||
|
|
||||||
if (!std::filesystem::exists(header_path)) {
|
if (!std::filesystem::exists(parent_path)) {
|
||||||
if (!std::filesystem::create_directories(header_path)) {
|
if (!std::filesystem::create_directories(parent_path)) {
|
||||||
return X_STATUS_ACCESS_DENIED;
|
return X_STATUS_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto header_filename = data->file_name() + ".header";
|
|
||||||
|
|
||||||
xe::filesystem::CreateEmptyFile(header_path / header_filename);
|
xe::filesystem::CreateEmptyFile(header_path);
|
||||||
|
|
||||||
if (std::filesystem::exists(header_path / header_filename)) {
|
if (std::filesystem::exists(header_path)) {
|
||||||
auto file = xe::filesystem::OpenFile(header_path / header_filename, "wb");
|
auto file = xe::filesystem::OpenFile(header_path, "wb");
|
||||||
fwrite(data, 1, sizeof(XCONTENT_AGGREGATE_DATA), file);
|
fwrite(data, 1, sizeof(XCONTENT_AGGREGATE_DATA), file);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
return X_STATUS_SUCCESS;
|
return X_STATUS_SUCCESS;
|
||||||
|
@ -193,15 +206,8 @@ X_RESULT ContentManager::ReadContentHeaderFile(const std::string_view file_name,
|
||||||
XContentType content_type,
|
XContentType content_type,
|
||||||
XCONTENT_AGGREGATE_DATA& data,
|
XCONTENT_AGGREGATE_DATA& data,
|
||||||
const uint32_t title_id) {
|
const uint32_t title_id) {
|
||||||
auto title_id_str = fmt::format("{:08X}", title_id);
|
auto header_file_path =
|
||||||
if (title_id == -1) {
|
ResolvePackageHeaderPath(file_name, content_type, title_id);
|
||||||
title_id_str = fmt::format("{:08X}", kernel_state_->title_id());
|
|
||||||
}
|
|
||||||
|
|
||||||
auto content_type_directory = fmt::format("{:08X}", content_type);
|
|
||||||
auto header_file_path = root_path_ / title_id_str /
|
|
||||||
kGameContentHeaderDirName / content_type_directory /
|
|
||||||
file_name;
|
|
||||||
constexpr uint32_t header_size = sizeof(XCONTENT_AGGREGATE_DATA);
|
constexpr uint32_t header_size = sizeof(XCONTENT_AGGREGATE_DATA);
|
||||||
|
|
||||||
if (std::filesystem::exists(header_file_path)) {
|
if (std::filesystem::exists(header_file_path)) {
|
||||||
|
|
|
@ -175,6 +175,9 @@ class ContentManager {
|
||||||
uint32_t title_id = -1);
|
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);
|
const uint32_t disc_number = -1);
|
||||||
|
std::filesystem::path ResolvePackageHeaderPath(
|
||||||
|
const std::string_view file_name, XContentType content_type,
|
||||||
|
uint32_t title_id = -1);
|
||||||
|
|
||||||
KernelState* kernel_state_;
|
KernelState* kernel_state_;
|
||||||
std::filesystem::path root_path_;
|
std::filesystem::path root_path_;
|
||||||
|
|
Loading…
Reference in New Issue