mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	FileSys: De-inline Path members
This commit is contained in:
		
							parent
							
								
									6f89d25f90
								
							
						
					
					
						commit
						b89f644cfe
					
				
					 4 changed files with 139 additions and 125 deletions
				
			
		|  | @ -12,6 +12,7 @@ set(SRCS | ||||||
|             arm/skyeye_common/vfp/vfpdouble.cpp |             arm/skyeye_common/vfp/vfpdouble.cpp | ||||||
|             arm/skyeye_common/vfp/vfpinstr.cpp |             arm/skyeye_common/vfp/vfpinstr.cpp | ||||||
|             arm/skyeye_common/vfp/vfpsingle.cpp |             arm/skyeye_common/vfp/vfpsingle.cpp | ||||||
|  |             file_sys/archive_backend.cpp | ||||||
|             file_sys/archive_extsavedata.cpp |             file_sys/archive_extsavedata.cpp | ||||||
|             file_sys/archive_romfs.cpp |             file_sys/archive_romfs.cpp | ||||||
|             file_sys/archive_savedata.cpp |             file_sys/archive_savedata.cpp | ||||||
|  |  | ||||||
							
								
								
									
										127
									
								
								src/core/file_sys/archive_backend.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								src/core/file_sys/archive_backend.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -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{}; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -5,18 +5,14 @@ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <memory> | #include <memory> | ||||||
| #include <sstream> |  | ||||||
| #include <string> | #include <string> | ||||||
| #include <utility> | #include <utility> | ||||||
| #include <vector> | #include <vector> | ||||||
| 
 | 
 | ||||||
| #include "common/bit_field.h" | #include "common/bit_field.h" | ||||||
| #include "common/common_types.h" | #include "common/common_types.h" | ||||||
| #include "common/logging/log.h" |  | ||||||
| #include "common/string_util.h" |  | ||||||
| 
 | 
 | ||||||
| #include "core/hle/result.h" | #include "core/hle/result.h" | ||||||
| #include "core/mem_map.h" |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| namespace FileSys { | namespace FileSys { | ||||||
|  | @ -42,134 +38,22 @@ union Mode { | ||||||
| 
 | 
 | ||||||
| class Path { | class Path { | ||||||
| public: | public: | ||||||
|  |     Path() : type(Invalid) {} | ||||||
|  |     Path(const char* path) : type(Char), string(path) {} | ||||||
|  |     Path(std::vector<u8> binary_data) : type(Binary), binary(std::move(binary_data)) {} | ||||||
|  |     Path(LowPathType type, u32 size, u32 pointer); | ||||||
| 
 | 
 | ||||||
|     Path() : type(Invalid) { |     LowPathType GetType() const { return type; } | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     Path(const char* path) : type(Char), string(path) { |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     Path(std::vector<u8> binary_data) : type(Binary), binary(std::move(binary_data)) { |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     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; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     LowPathType GetType() const { |  | ||||||
|         return type; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     /**
 |     /**
 | ||||||
|      * Gets the string representation of the path for debugging |      * Gets the string representation of the path for debugging | ||||||
|      * @return String representation of the path for debugging |      * @return String representation of the path for debugging | ||||||
|      */ |      */ | ||||||
|     const std::string DebugStr() const { |     const std::string 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 AsString() const { |     const std::string AsString() const; | ||||||
|         switch (GetType()) { |     const std::u16string AsU16Str() const; | ||||||
|         case Char: |     const std::vector<u8> AsBinary() const; | ||||||
|             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 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> 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 {}; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     LowPathType type; |     LowPathType type; | ||||||
|  |  | ||||||
|  | @ -4,6 +4,8 @@ | ||||||
| 
 | 
 | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| 
 | 
 | ||||||
|  | #include "common/string_util.h" | ||||||
|  | 
 | ||||||
| #include "core/file_sys/file_backend.h" | #include "core/file_sys/file_backend.h" | ||||||
| #include "core/hle/service/cfg/cfg.h" | #include "core/hle/service/cfg/cfg.h" | ||||||
| #include "core/hle/service/cfg/cfg_i.h" | #include "core/hle/service/cfg/cfg_i.h" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue