aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/file_sys
diff options
context:
space:
mode:
authorGravatar archshift <admin@archshift.com>2014-11-10 14:36:32 -0800
committerGravatar archshift <admin@archshift.com>2014-11-12 19:30:17 -0800
commit1f7c4ab7f6c5b65d6569a1981b04c1d2ac33b713 (patch)
tree61693418f0cbfeddf4e416bae0d265691bf0dfa9 /src/core/file_sys
parent0ad5964c8b6d7141c6f2a542901a97a280edc545 (diff)
Use std::u16string for conversion between UTF-8 and UTF-16, FS:USER functions
Diffstat (limited to 'src/core/file_sys')
-rw-r--r--src/core/file_sys/archive.h99
1 files changed, 99 insertions, 0 deletions
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 <memory>
#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<u8>(data, data + size);
+ break;
+ }
+ case Char:
+ {
+ const char* data = reinterpret_cast<const char*>(Memory::GetPointer(pointer));
+ string = std::string(data, size - 1); // Data is always null-terminated.
+ break;
+ }
+ case Wchar:
+ {
+ const char16_t* data = reinterpret_cast<const char16_t*>(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<u8> AsBinary() const {
+ switch (GetType()) {
+ case Binary:
+ return binary;
+ case Char:
+ return std::vector<u8>(string.begin(), string.end());
+ case Wchar:
+ return std::vector<u8>(u16str.begin(), u16str.end());
+ case Empty:
+ return {};
+ default:
+ ERROR_LOG(KERNEL, "LowPathType cannot be converted to binary!");
+ return {};
+ }
+ }
+
+private:
+ LowPathType type;
+ std::vector<u8> binary;
+ std::string string;
+ std::u16string u16str;
+};
+
class Archive : NonCopyable {
public:
/// Supported archive types