diff options
Diffstat (limited to 'src/core/file_sys')
-rw-r--r-- | src/core/file_sys/archive.h | 106 | ||||
-rw-r--r-- | src/core/file_sys/archive_romfs.cpp | 12 | ||||
-rw-r--r-- | src/core/file_sys/archive_romfs.h | 7 | ||||
-rw-r--r-- | src/core/file_sys/archive_sdmc.cpp | 9 | ||||
-rw-r--r-- | src/core/file_sys/archive_sdmc.h | 7 | ||||
-rw-r--r-- | src/core/file_sys/directory_sdmc.cpp | 2 |
6 files changed, 141 insertions, 2 deletions
diff --git a/src/core/file_sys/archive.h b/src/core/file_sys/archive.h index 560db6dea..38145eed8 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 @@ -57,6 +156,13 @@ public: virtual std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const = 0; /** + * Create a directory specified by its path + * @param path Path relative to the archive + * @return Whether the directory could be created + */ + virtual bool CreateDirectory(const std::string& path) const = 0; + + /** * Open a directory specified by its path * @param path Path relative to the archive * @return Opened directory, or nullptr diff --git a/src/core/file_sys/archive_romfs.cpp b/src/core/file_sys/archive_romfs.cpp index 9bab3471f..cc759faa8 100644 --- a/src/core/file_sys/archive_romfs.cpp +++ b/src/core/file_sys/archive_romfs.cpp @@ -34,6 +34,16 @@ std::unique_ptr<File> Archive_RomFS::OpenFile(const std::string& path, const Mod } /** + * Create a directory specified by its path + * @param path Path relative to the archive + * @return Whether the directory could be created + */ +bool Archive_RomFS::CreateDirectory(const std::string& path) const { + ERROR_LOG(FILESYS, "Attempted to create a directory in ROMFS."); + return false; +}; + +/** * Open a directory specified by its path * @param path Path relative to the archive * @return Opened directory, or nullptr @@ -50,7 +60,7 @@ std::unique_ptr<Directory> Archive_RomFS::OpenDirectory(const std::string& path) * @return Number of bytes read */ size_t Archive_RomFS::Read(const u64 offset, const u32 length, u8* buffer) const { - DEBUG_LOG(FILESYS, "called offset=%d, length=%d", offset, length); + DEBUG_LOG(FILESYS, "called offset=%llu, length=%d", offset, length); memcpy(buffer, &raw_data[(u32)offset], length); return length; } diff --git a/src/core/file_sys/archive_romfs.h b/src/core/file_sys/archive_romfs.h index fcdefa95f..ae2344e82 100644 --- a/src/core/file_sys/archive_romfs.h +++ b/src/core/file_sys/archive_romfs.h @@ -37,6 +37,13 @@ public: std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const override; /** + * Create a directory specified by its path + * @param path Path relative to the archive + * @return Whether the directory could be created + */ + bool CreateDirectory(const std::string& path) const override; + + /** * Open a directory specified by its path * @param path Path relative to the archive * @return Opened directory, or nullptr diff --git a/src/core/file_sys/archive_sdmc.cpp b/src/core/file_sys/archive_sdmc.cpp index 0b647f7d0..66931e93e 100644 --- a/src/core/file_sys/archive_sdmc.cpp +++ b/src/core/file_sys/archive_sdmc.cpp @@ -58,6 +58,15 @@ std::unique_ptr<File> Archive_SDMC::OpenFile(const std::string& path, const Mode } /** + * Create a directory specified by its path + * @param path Path relative to the archive + * @return Whether the directory could be created + */ +bool Archive_SDMC::CreateDirectory(const std::string& path) const { + return FileUtil::CreateDir(GetMountPoint() + path); +} + +/** * Open a directory specified by its path * @param path Path relative to the archive * @return Opened directory, or nullptr diff --git a/src/core/file_sys/archive_sdmc.h b/src/core/file_sys/archive_sdmc.h index f68648e6f..0e059b635 100644 --- a/src/core/file_sys/archive_sdmc.h +++ b/src/core/file_sys/archive_sdmc.h @@ -41,6 +41,13 @@ public: std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const override; /** + * Create a directory specified by its path + * @param path Path relative to the archive + * @return Whether the directory could be created + */ + bool CreateDirectory(const std::string& path) const override; + + /** * Open a directory specified by its path * @param path Path relative to the archive * @return Opened directory, or nullptr diff --git a/src/core/file_sys/directory_sdmc.cpp b/src/core/file_sys/directory_sdmc.cpp index 36951564d..fd558def9 100644 --- a/src/core/file_sys/directory_sdmc.cpp +++ b/src/core/file_sys/directory_sdmc.cpp @@ -42,7 +42,7 @@ u32 Directory_SDMC::Read(const u32 count, Entry* entries) { const std::string& filename = file.virtualName; Entry& entry = entries[entries_read]; - WARN_LOG(FILESYS, "File %s: size=%d dir=%d", filename.c_str(), file.size, file.isDirectory); + WARN_LOG(FILESYS, "File %s: size=%llu dir=%d", filename.c_str(), file.size, file.isDirectory); // TODO(Link Mauve): use a proper conversion to UTF-16. for (int j = 0; j < FILENAME_LENGTH; ++j) { |