From 1f7c4ab7f6c5b65d6569a1981b04c1d2ac33b713 Mon Sep 17 00:00:00 2001 From: archshift Date: Mon, 10 Nov 2014 14:36:32 -0800 Subject: Use std::u16string for conversion between UTF-8 and UTF-16, FS:USER functions --- src/core/file_sys/archive.h | 99 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) (limited to 'src/core/file_sys') diff --git a/src/core/file_sys/archive.h b/src/core/file_sys/archive.h index aeabf09a..38145eed 100644 --- a/src/core/file_sys/archive.h +++ b/src/core/file_sys/archive.h @@ -7,11 +7,13 @@ #include #include "common/common_types.h" +#include "common/string_util.h" #include "common/bit_field.h" #include "core/file_sys/file.h" #include "core/file_sys/directory.h" +#include "core/mem_map.h" #include "core/hle/kernel/kernel.h" //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -19,6 +21,15 @@ namespace FileSys { +// Path string type +enum LowPathType : u32 { + Invalid = 0, + Empty = 1, + Binary = 2, + Char = 3, + Wchar = 4 +}; + union Mode { u32 hex; BitField<0, 1, u32> read_flag; @@ -26,6 +37,94 @@ union Mode { BitField<2, 1, u32> create_flag; }; +class Path { +public: + + Path(): + type(Invalid) + { + } + + Path(LowPathType type, u32 size, u32 pointer): + type(type) + { + switch (type) { + case Binary: + { + u8* data = Memory::GetPointer(pointer); + binary = std::vector(data, data + size); + break; + } + case Char: + { + const char* data = reinterpret_cast(Memory::GetPointer(pointer)); + string = std::string(data, size - 1); // Data is always null-terminated. + break; + } + case Wchar: + { + const char16_t* data = reinterpret_cast(Memory::GetPointer(pointer)); + u16str = std::u16string(data, size/2 - 1); // Data is always null-terminated. + break; + } + } + } + + LowPathType GetType() const { + return type; + } + + const std::string AsString() const { + switch (GetType()) { + case Char: + return string; + case Wchar: + return Common::UTF16ToUTF8(u16str); + case Empty: + return {}; + default: + ERROR_LOG(KERNEL, "LowPathType cannot be converted to string!"); + return {}; + } + } + + const std::u16string AsU16Str() const { + switch (GetType()) { + case Char: + return Common::UTF8ToUTF16(string); + case Wchar: + return u16str; + case Empty: + return {}; + default: + ERROR_LOG(KERNEL, "LowPathType cannot be converted to u16string!"); + return {}; + } + } + + const std::vector AsBinary() const { + switch (GetType()) { + case Binary: + return binary; + case Char: + return std::vector(string.begin(), string.end()); + case Wchar: + return std::vector(u16str.begin(), u16str.end()); + case Empty: + return {}; + default: + ERROR_LOG(KERNEL, "LowPathType cannot be converted to binary!"); + return {}; + } + } + +private: + LowPathType type; + std::vector binary; + std::string string; + std::u16string u16str; +}; + class Archive : NonCopyable { public: /// Supported archive types -- cgit v1.2.3