[VFS] Added fallback if conversion of 1252->UTF8 fails
This commit is contained in:
@@ -144,6 +144,11 @@ bool DiscImageDevice::ReadEntry(ParseState* state, const uint8_t* buffer,
|
|||||||
// Filename is stored as Windows-1252, convert it to UTF-8.
|
// Filename is stored as Windows-1252, convert it to UTF-8.
|
||||||
auto ansi_name = std::string(name_buffer, name_length);
|
auto ansi_name = std::string(name_buffer, name_length);
|
||||||
auto name = xe::win1252_to_utf8(ansi_name);
|
auto name = xe::win1252_to_utf8(ansi_name);
|
||||||
|
// Fallback to normal name if for whatever reason conversion from 1252 code
|
||||||
|
// page failed.
|
||||||
|
if (name.empty()) {
|
||||||
|
name = ansi_name;
|
||||||
|
}
|
||||||
|
|
||||||
auto entry = DiscImageEntry::Create(this, parent, name, mmap_.get());
|
auto entry = DiscImageEntry::Create(this, parent, name, mmap_.get());
|
||||||
entry->attributes_ = attributes | kFileAttributeReadOnly;
|
entry->attributes_ = attributes | kFileAttributeReadOnly;
|
||||||
|
|||||||
@@ -117,6 +117,11 @@ std::unique_ptr<XContentContainerEntry> StfsContainerDevice::ReadEntry(
|
|||||||
std::string ansi_name(reinterpret_cast<const char*>(dir_entry->name),
|
std::string ansi_name(reinterpret_cast<const char*>(dir_entry->name),
|
||||||
dir_entry->flags.name_length & 0x3F);
|
dir_entry->flags.name_length & 0x3F);
|
||||||
std::string name = xe::win1252_to_utf8(ansi_name);
|
std::string name = xe::win1252_to_utf8(ansi_name);
|
||||||
|
// Fallback to normal name if for whatever reason conversion from 1252 code
|
||||||
|
// page failed.
|
||||||
|
if (name.empty()) {
|
||||||
|
name = ansi_name;
|
||||||
|
}
|
||||||
|
|
||||||
auto entry = XContentContainerEntry::Create(this, parent, name, &files_);
|
auto entry = XContentContainerEntry::Create(this, parent, name, &files_);
|
||||||
|
|
||||||
|
|||||||
@@ -126,7 +126,11 @@ SvodContainerDevice::Result SvodContainerDevice::ReadEntry(
|
|||||||
|
|
||||||
// Read directory entry
|
// Read directory entry
|
||||||
auto& file = files_.at(entry_file);
|
auto& file = files_.at(entry_file);
|
||||||
xe::filesystem::Seek(file, entry_address, SEEK_SET);
|
if (!xe::filesystem::Seek(file, entry_address, SEEK_SET)) {
|
||||||
|
XELOGE("{} Failed: Cannot seek file {} with offset: {} ordinal: {}",
|
||||||
|
__func__, entry_file, entry_address, ordinal);
|
||||||
|
return Result::kReadError;
|
||||||
|
}
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
struct {
|
struct {
|
||||||
@@ -141,7 +145,7 @@ SvodContainerDevice::Result SvodContainerDevice::ReadEntry(
|
|||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
if (fread(&dir_entry, sizeof(dir_entry), 1, file) != 1) {
|
if (fread(&dir_entry, sizeof(dir_entry), 1, file) != 1) {
|
||||||
XELOGE("ReadEntrySVOD failed to read directory entry at 0x{X}",
|
XELOGE("ReadEntrySVOD failed to read directory entry at {:016X}",
|
||||||
entry_address);
|
entry_address);
|
||||||
return Result::kReadError;
|
return Result::kReadError;
|
||||||
}
|
}
|
||||||
@@ -149,7 +153,7 @@ SvodContainerDevice::Result SvodContainerDevice::ReadEntry(
|
|||||||
auto name_buffer = std::make_unique<char[]>(dir_entry.name_length);
|
auto name_buffer = std::make_unique<char[]>(dir_entry.name_length);
|
||||||
if (fread(name_buffer.get(), 1, dir_entry.name_length, file) !=
|
if (fread(name_buffer.get(), 1, dir_entry.name_length, file) !=
|
||||||
dir_entry.name_length) {
|
dir_entry.name_length) {
|
||||||
XELOGE("ReadEntrySVOD failed to read directory entry name at 0x{X}",
|
XELOGE("ReadEntrySVOD failed to read directory entry name at {:016X}",
|
||||||
entry_address);
|
entry_address);
|
||||||
return Result::kReadError;
|
return Result::kReadError;
|
||||||
}
|
}
|
||||||
@@ -158,6 +162,12 @@ SvodContainerDevice::Result SvodContainerDevice::ReadEntry(
|
|||||||
auto ansi_name = std::string(name_buffer.get(), dir_entry.name_length);
|
auto ansi_name = std::string(name_buffer.get(), dir_entry.name_length);
|
||||||
auto name = xe::win1252_to_utf8(ansi_name);
|
auto name = xe::win1252_to_utf8(ansi_name);
|
||||||
|
|
||||||
|
// Fallback to normal name if for whatever reason conversion from 1252 code
|
||||||
|
// page failed.
|
||||||
|
if (name.empty()) {
|
||||||
|
name = ansi_name;
|
||||||
|
}
|
||||||
|
|
||||||
// Read the left node
|
// Read the left node
|
||||||
if (dir_entry.node_l) {
|
if (dir_entry.node_l) {
|
||||||
auto node_result = ReadEntry(block, dir_entry.node_l, parent);
|
auto node_result = ReadEntry(block, dir_entry.node_l, parent);
|
||||||
|
|||||||
Reference in New Issue
Block a user