[VFS] Improved initial loading time during "Install Content"
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user