4 changed files with 139 additions and 125 deletions
-
1src/core/CMakeLists.txt
-
127src/core/file_sys/archive_backend.cpp
-
134src/core/file_sys/archive_backend.h
-
2src/core/hle/service/cfg/cfg.cpp
@ -0,0 +1,127 @@ |
|||||
|
// Copyright 2015 Citra Emulator Project
|
||||
|
// Licensed under GPLv2 or any later version
|
||||
|
// Refer to the license.txt file included.
|
||||
|
|
||||
|
#include <sstream>
|
||||
|
|
||||
|
#include "common/logging/log.h"
|
||||
|
#include "common/string_util.h"
|
||||
|
|
||||
|
#include "core/file_sys/archive_backend.h"
|
||||
|
#include "core/mem_map.h"
|
||||
|
|
||||
|
|
||||
|
namespace FileSys { |
||||
|
|
||||
|
Path::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; |
||||
|
} |
||||
|
|
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
const std::string Path::DebugStr() const { |
||||
|
switch (GetType()) { |
||||
|
case Invalid: |
||||
|
default: |
||||
|
return "[Invalid]"; |
||||
|
case Empty: |
||||
|
return "[Empty]"; |
||||
|
case Binary: |
||||
|
{ |
||||
|
std::stringstream res; |
||||
|
res << "[Binary: "; |
||||
|
for (unsigned byte : binary) |
||||
|
res << std::hex << std::setw(2) << std::setfill('0') << byte; |
||||
|
res << ']'; |
||||
|
return res.str(); |
||||
|
} |
||||
|
case Char: |
||||
|
return "[Char: " + AsString() + ']'; |
||||
|
case Wchar: |
||||
|
return "[Wchar: " + AsString() + ']'; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
const std::string Path::AsString() const { |
||||
|
switch (GetType()) { |
||||
|
case Char: |
||||
|
return string; |
||||
|
case Wchar: |
||||
|
return Common::UTF16ToUTF8(u16str); |
||||
|
case Empty: |
||||
|
return{}; |
||||
|
case Invalid: |
||||
|
case Binary: |
||||
|
default: |
||||
|
// TODO(yuriks): Add assert
|
||||
|
LOG_ERROR(Service_FS, "LowPathType cannot be converted to string!"); |
||||
|
return{}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
const std::u16string Path::AsU16Str() const { |
||||
|
switch (GetType()) { |
||||
|
case Char: |
||||
|
return Common::UTF8ToUTF16(string); |
||||
|
case Wchar: |
||||
|
return u16str; |
||||
|
case Empty: |
||||
|
return{}; |
||||
|
case Invalid: |
||||
|
case Binary: |
||||
|
// TODO(yuriks): Add assert
|
||||
|
LOG_ERROR(Service_FS, "LowPathType cannot be converted to u16string!"); |
||||
|
return{}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
const std::vector<u8> Path::AsBinary() const { |
||||
|
switch (GetType()) { |
||||
|
case Binary: |
||||
|
return binary; |
||||
|
case Char: |
||||
|
return std::vector<u8>(string.begin(), string.end()); |
||||
|
case Wchar: |
||||
|
{ |
||||
|
// use two u8 for each character of u16str
|
||||
|
std::vector<u8> to_return(u16str.size() * 2); |
||||
|
for (size_t i = 0; i < u16str.size(); ++i) { |
||||
|
u16 tmp_char = u16str.at(i); |
||||
|
to_return[i*2] = (tmp_char & 0xFF00) >> 8; |
||||
|
to_return[i*2 + 1] = (tmp_char & 0x00FF); |
||||
|
} |
||||
|
return to_return; |
||||
|
} |
||||
|
case Empty: |
||||
|
return{}; |
||||
|
case Invalid: |
||||
|
default: |
||||
|
// TODO(yuriks): Add assert
|
||||
|
LOG_ERROR(Service_FS, "LowPathType cannot be converted to binary!"); |
||||
|
return{}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue