[Kernel/VFS] Write more fields in STFS headers when creating
This commit is contained in:
parent
72daead6af
commit
833e36e051
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include "xenia/base/filesystem.h"
|
#include "xenia/base/filesystem.h"
|
||||||
#include "xenia/base/string.h"
|
#include "xenia/base/string.h"
|
||||||
|
#include "xenia/emulator.h"
|
||||||
#include "xenia/kernel/kernel_state.h"
|
#include "xenia/kernel/kernel_state.h"
|
||||||
#include "xenia/kernel/user_module.h"
|
#include "xenia/kernel/user_module.h"
|
||||||
#include "xenia/kernel/xam/content_package.h"
|
#include "xenia/kernel/xam/content_package.h"
|
||||||
|
@ -194,16 +195,42 @@ X_RESULT ContentManager::CreateContent(std::string root_name,
|
||||||
return X_ERROR_FUNCTION_FAILED; // failed to create headers file :(
|
return X_ERROR_FUNCTION_FAILED; // failed to create headers file :(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set headers using data from XCONTENT_DATA
|
// Setup package headers!
|
||||||
|
{
|
||||||
|
// TODO: set publisher from XDBF info (but most saves don't have this set?)
|
||||||
|
|
||||||
|
// Set header defaults...
|
||||||
vfs::StfsHeader* header = new vfs::StfsHeader();
|
vfs::StfsHeader* header = new vfs::StfsHeader();
|
||||||
// TODO: set title_id, title_name & publisher from XDBF info
|
header->set_defaults();
|
||||||
|
|
||||||
|
// Try copying execution info from XEX opt headers
|
||||||
|
auto exe_module = kernel_state_->GetExecutableModule();
|
||||||
|
if (exe_module) {
|
||||||
|
xex2_opt_execution_info* exec_info = 0;
|
||||||
|
exe_module->GetOptHeader(XEX_HEADER_EXECUTION_INFO, &exec_info);
|
||||||
|
if (exec_info) {
|
||||||
|
memcpy(&header->metadata.execution_info, exec_info,
|
||||||
|
sizeof(xex2_opt_execution_info));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy game title in the games default language
|
||||||
|
// TODO: should this get the title in the users chosen lang instead?
|
||||||
|
header->metadata.set_title_name(kernel_state_->emulator()->game_title());
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
// Set package profile id (should be the offline XUID, 0xE0....)
|
||||||
|
// header->metadata.profile_id = kernel_state_->user_profile()->xuid();
|
||||||
|
|
||||||
|
// Now copy data from XCONTENT_DATA into package headers
|
||||||
header->metadata.content_type = (xe::vfs::XContentType)data.content_type;
|
header->metadata.content_type = (xe::vfs::XContentType)data.content_type;
|
||||||
header->metadata.set_display_name(data.display_name,
|
header->metadata.set_display_name(data.display_name,
|
||||||
(XLanguage)cvars::user_language);
|
(XLanguage)cvars::user_language);
|
||||||
// TODO: set display name locale that's currently in use
|
|
||||||
fwrite(header, sizeof(vfs::StfsHeader), 1, file);
|
fwrite(header, sizeof(vfs::StfsHeader), 1, file);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
delete header;
|
delete header;
|
||||||
|
}
|
||||||
|
|
||||||
if (!package->Mount(root_name)) {
|
if (!package->Mount(root_name)) {
|
||||||
return X_ERROR_DEVICE_NOT_CONNECTED;
|
return X_ERROR_DEVICE_NOT_CONNECTED;
|
||||||
|
|
|
@ -381,6 +381,21 @@ struct StfsHeader {
|
||||||
XContentMetadata metadata;
|
XContentMetadata metadata;
|
||||||
XContentInstaller installer;
|
XContentInstaller installer;
|
||||||
uint8_t padding[0x2F2];
|
uint8_t padding[0x2F2];
|
||||||
|
|
||||||
|
void set_defaults() {
|
||||||
|
memset(this, 0, sizeof(StfsHeader));
|
||||||
|
|
||||||
|
header.magic = xe::vfs::XContentPackageType::kPackageTypeCon;
|
||||||
|
header.licenses[0].licensee_id =
|
||||||
|
-1; // X360 gamesaves seem to set licenses like this
|
||||||
|
header.header_size = 0x971A;
|
||||||
|
|
||||||
|
metadata.metadata_version = 2;
|
||||||
|
memcpy(metadata.console_id, "XENIA", 5);
|
||||||
|
|
||||||
|
// Saves always have this set? How do titles choose this?
|
||||||
|
metadata.flags.bits.device_transfer = true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
static_assert_size(StfsHeader, 0xB000);
|
static_assert_size(StfsHeader, 0xB000);
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
Loading…
Reference in New Issue