[VFS] Improved initial loading time during "Install Content"

This commit is contained in:
Gliniak
2025-04-19 16:54:25 +02:00
parent 56703e52e2
commit 5ba6c2b840
3 changed files with 57 additions and 30 deletions

View File

@@ -108,11 +108,32 @@ bool XContentContainerDevice::Initialize() {
return Read() == Result::kSuccess;
}
XContentContainerHeader* XContentContainerDevice::ReadContainerHeader(
FILE* host_file) {
XContentContainerHeader* header = new XContentContainerHeader();
std::unique_ptr<XContentContainerHeader>
XContentContainerDevice::ReadContainerHeader(
const std::filesystem::path& file_path) {
if (!std::filesystem::exists(file_path)) {
return {};
}
if (std::filesystem::file_size(file_path) < sizeof(XContentContainerHeader)) {
return {};
}
auto header_file = xe::filesystem::OpenFile(file_path, "rb");
if (!header_file) {
return {};
}
return ReadContainerHeader(header_file);
}
std::unique_ptr<XContentContainerHeader>
XContentContainerDevice::ReadContainerHeader(FILE* host_file) {
std::unique_ptr<XContentContainerHeader> header =
std::make_unique<XContentContainerHeader>();
// Read header & check signature
if (fread(header, sizeof(XContentContainerHeader), 1, host_file) != 1) {
if (fread(header.get(), sizeof(XContentContainerHeader), 1, host_file) != 1) {
return nullptr;
}
return header;
@@ -173,18 +194,17 @@ XContentContainerDevice::Result XContentContainerDevice::ReadHeaderAndVerify(
return Result::kTooSmall;
}
const XContentContainerHeader* header = ReadContainerHeader(header_file);
auto header = ReadContainerHeader(header_file);
if (header == nullptr) {
return Result::kReadError;
}
std::memcpy(header_.get(), header, sizeof(XContentContainerHeader));
if (!header_->content_header.is_magic_valid()) {
if (!header->content_header.is_magic_valid()) {
// Unexpected format.
return Result::kFileMismatch;
}
header_ = std::move(header);
return Result::kSuccess;
}

View File

@@ -35,6 +35,12 @@ class XContentContainerDevice : public Device {
const std::string_view mount_path,
const std::filesystem::path& host_path);
static std::unique_ptr<XContentContainerHeader> ReadContainerHeader(
const std::filesystem::path& file_path);
static std::unique_ptr<XContentContainerHeader> ReadContainerHeader(
FILE* host_file);
~XContentContainerDevice() override;
bool Initialize() override;
@@ -117,9 +123,6 @@ class XContentContainerDevice : public Device {
size_t files_total_size_;
std::unique_ptr<Entry> root_entry_;
std::unique_ptr<XContentContainerHeader> header_;
private:
static XContentContainerHeader* ReadContainerHeader(FILE* host_file);
};
} // namespace vfs