|
|
@ -40,40 +40,37 @@ union Mode {
|
|
|
|
class Path {
|
|
|
|
class Path {
|
|
|
|
public:
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
|
|
Path():
|
|
|
|
Path() : type(Invalid) {
|
|
|
|
type(Invalid)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Path(const char* path):
|
|
|
|
Path(const char* path) : type(Char), string(path) {
|
|
|
|
type(Char), string(path)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Path(LowPathType type, u32 size, u32 pointer):
|
|
|
|
Path(LowPathType type, u32 size, u32 pointer) : type(type) {
|
|
|
|
type(type)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
switch (type) {
|
|
|
|
case Binary:
|
|
|
|
case Binary:
|
|
|
|
{
|
|
|
|
{
|
|
|
|
u8* data = Memory::GetPointer(pointer);
|
|
|
|
u8* data = Memory::GetPointer(pointer);
|
|
|
|
binary = std::vector<u8>(data, data + size);
|
|
|
|
binary = std::vector<u8>(data, data + size);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case Char:
|
|
|
|
|
|
|
|
{
|
|
|
|
case Char:
|
|
|
|
const char* data = reinterpret_cast<const char*>(Memory::GetPointer(pointer));
|
|
|
|
{
|
|
|
|
string = std::string(data, size - 1); // Data is always null-terminated.
|
|
|
|
const char* data = reinterpret_cast<const char*>(Memory::GetPointer(pointer));
|
|
|
|
break;
|
|
|
|
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));
|
|
|
|
case Wchar:
|
|
|
|
u16str = std::u16string(data, size/2 - 1); // Data is always null-terminated.
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
const char16_t* data = reinterpret_cast<const char16_t*>(Memory::GetPointer(pointer));
|
|
|
|
}
|
|
|
|
u16str = std::u16string(data, size/2 - 1); // Data is always null-terminated.
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -104,66 +101,64 @@ public:
|
|
|
|
return "[Char: " + AsString() + ']';
|
|
|
|
return "[Char: " + AsString() + ']';
|
|
|
|
case Wchar:
|
|
|
|
case Wchar:
|
|
|
|
return "[Wchar: " + AsString() + ']';
|
|
|
|
return "[Wchar: " + AsString() + ']';
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const std::string AsString() const {
|
|
|
|
|
|
|
|
switch (GetType()) {
|
|
|
|
|
|
|
|
case Char:
|
|
|
|
|
|
|
|
return string;
|
|
|
|
|
|
|
|
case Wchar:
|
|
|
|
|
|
|
|
return Common::UTF16ToUTF8(u16str);
|
|
|
|
|
|
|
|
case Empty:
|
|
|
|
|
|
|
|
return {};
|
|
|
|
|
|
|
|
case Invalid:
|
|
|
|
|
|
|
|
case Binary:
|
|
|
|
// TODO(yuriks): Add assert
|
|
|
|
// TODO(yuriks): Add assert
|
|
|
|
LOG_ERROR(Service_FS, "LowPathType cannot be converted to string!");
|
|
|
|
LOG_ERROR(Service_FS, "LowPathType cannot be converted to string!");
|
|
|
|
return {};
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const std::string AsString() const {
|
|
|
|
|
|
|
|
switch (GetType()) {
|
|
|
|
|
|
|
|
case Char:
|
|
|
|
|
|
|
|
return string;
|
|
|
|
|
|
|
|
case Wchar:
|
|
|
|
|
|
|
|
return Common::UTF16ToUTF8(u16str);
|
|
|
|
|
|
|
|
case Empty:
|
|
|
|
|
|
|
|
return {};
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
// TODO(yuriks): Add assert
|
|
|
|
|
|
|
|
LOG_ERROR(Service_FS, "LowPathType cannot be converted to string!");
|
|
|
|
|
|
|
|
return {};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const std::u16string AsU16Str() const {
|
|
|
|
const std::u16string AsU16Str() const {
|
|
|
|
switch (GetType()) {
|
|
|
|
switch (GetType()) {
|
|
|
|
case Char:
|
|
|
|
case Char:
|
|
|
|
return Common::UTF8ToUTF16(string);
|
|
|
|
return Common::UTF8ToUTF16(string);
|
|
|
|
case Wchar:
|
|
|
|
case Wchar:
|
|
|
|
return u16str;
|
|
|
|
return u16str;
|
|
|
|
case Empty:
|
|
|
|
case Empty:
|
|
|
|
return {};
|
|
|
|
return {};
|
|
|
|
default:
|
|
|
|
case Invalid:
|
|
|
|
// TODO(yuriks): Add assert
|
|
|
|
case Binary:
|
|
|
|
LOG_ERROR(Service_FS, "LowPathType cannot be converted to u16string!");
|
|
|
|
// TODO(yuriks): Add assert
|
|
|
|
return {};
|
|
|
|
LOG_ERROR(Service_FS, "LowPathType cannot be converted to u16string!");
|
|
|
|
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const std::vector<u8> AsBinary() const {
|
|
|
|
const std::vector<u8> AsBinary() const {
|
|
|
|
switch (GetType()) {
|
|
|
|
switch (GetType()) {
|
|
|
|
case Binary:
|
|
|
|
case Binary:
|
|
|
|
return binary;
|
|
|
|
return binary;
|
|
|
|
case Char:
|
|
|
|
case Char:
|
|
|
|
return std::vector<u8>(string.begin(), string.end());
|
|
|
|
return std::vector<u8>(string.begin(), string.end());
|
|
|
|
case Wchar:
|
|
|
|
case Wchar:
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// use two u8 for each character of u16str
|
|
|
|
// use two u8 for each character of u16str
|
|
|
|
std::vector<u8> to_return(u16str.size() * 2);
|
|
|
|
std::vector<u8> to_return(u16str.size() * 2);
|
|
|
|
for (size_t i = 0; i < u16str.size(); ++i) {
|
|
|
|
for (size_t i = 0; i < u16str.size(); ++i) {
|
|
|
|
u16 tmp_char = u16str.at(i);
|
|
|
|
u16 tmp_char = u16str.at(i);
|
|
|
|
to_return[i*2] = (tmp_char & 0xFF00) >> 8;
|
|
|
|
to_return[i*2] = (tmp_char & 0xFF00) >> 8;
|
|
|
|
to_return[i*2 + 1] = (tmp_char & 0x00FF);
|
|
|
|
to_return[i*2 + 1] = (tmp_char & 0x00FF);
|
|
|
|
}
|
|
|
|
|
|
|
|
return to_return;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case Empty:
|
|
|
|
return to_return;
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
case Empty:
|
|
|
|
// TODO(yuriks): Add assert
|
|
|
|
return {};
|
|
|
|
LOG_ERROR(Service_FS, "LowPathType cannot be converted to binary!");
|
|
|
|
case Invalid:
|
|
|
|
return {};
|
|
|
|
// TODO(yuriks): Add assert
|
|
|
|
|
|
|
|
LOG_ERROR(Service_FS, "LowPathType cannot be converted to binary!");
|
|
|
|
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -176,7 +171,8 @@ private:
|
|
|
|
|
|
|
|
|
|
|
|
class ArchiveBackend : NonCopyable {
|
|
|
|
class ArchiveBackend : NonCopyable {
|
|
|
|
public:
|
|
|
|
public:
|
|
|
|
virtual ~ArchiveBackend() { }
|
|
|
|
virtual ~ArchiveBackend() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Get a descriptive name for the archive (e.g. "RomFS", "SaveData", etc.)
|
|
|
|
* Get a descriptive name for the archive (e.g. "RomFS", "SaveData", etc.)
|
|
|
@ -196,7 +192,7 @@ public:
|
|
|
|
* @param path Path relative to the archive
|
|
|
|
* @param path Path relative to the archive
|
|
|
|
* @return Whether the file could be deleted
|
|
|
|
* @return Whether the file could be deleted
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
virtual bool DeleteFile(const FileSys::Path& path) const = 0;
|
|
|
|
virtual bool DeleteFile(const Path& path) const = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Rename a File specified by its path
|
|
|
|
* Rename a File specified by its path
|
|
|
@ -204,14 +200,14 @@ public:
|
|
|
|
* @param dest_path Destination path relative to the archive
|
|
|
|
* @param dest_path Destination path relative to the archive
|
|
|
|
* @return Whether rename succeeded
|
|
|
|
* @return Whether rename succeeded
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
virtual bool RenameFile(const FileSys::Path& src_path, const FileSys::Path& dest_path) const = 0;
|
|
|
|
virtual bool RenameFile(const Path& src_path, const Path& dest_path) const = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Delete a directory specified by its path
|
|
|
|
* Delete a directory specified by its path
|
|
|
|
* @param path Path relative to the archive
|
|
|
|
* @param path Path relative to the archive
|
|
|
|
* @return Whether the directory could be deleted
|
|
|
|
* @return Whether the directory could be deleted
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
virtual bool DeleteDirectory(const FileSys::Path& path) const = 0;
|
|
|
|
virtual bool DeleteDirectory(const Path& path) const = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Create a file specified by its path
|
|
|
|
* Create a file specified by its path
|
|
|
@ -234,7 +230,7 @@ public:
|
|
|
|
* @param dest_path Destination path relative to the archive
|
|
|
|
* @param dest_path Destination path relative to the archive
|
|
|
|
* @return Whether rename succeeded
|
|
|
|
* @return Whether rename succeeded
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
virtual bool RenameDirectory(const FileSys::Path& src_path, const FileSys::Path& dest_path) const = 0;
|
|
|
|
virtual bool RenameDirectory(const Path& src_path, const Path& dest_path) const = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Open a directory specified by its path
|
|
|
|
* Open a directory specified by its path
|
|
|
|