diff options
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/service/am/am.cpp | 24 | ||||
| -rw-r--r-- | src/core/hle/service/am/applet_ae.h | 4 | ||||
| -rw-r--r-- | src/core/hle/service/am/applet_oe.h | 4 | ||||
| -rw-r--r-- | src/core/hle/service/filesystem/filesystem.cpp | 329 | ||||
| -rw-r--r-- | src/core/hle/service/filesystem/filesystem.h | 116 | ||||
| -rw-r--r-- | src/core/hle/service/filesystem/fsp_srv.cpp | 80 | ||||
| -rw-r--r-- | src/core/hle/service/filesystem/fsp_srv.h | 4 | ||||
| -rw-r--r-- | src/core/hle/service/ns/ns.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/service/ns/ns.h | 14 | ||||
| -rw-r--r-- | src/core/hle/service/ns/pl_u.cpp | 5 | ||||
| -rw-r--r-- | src/core/hle/service/ns/pl_u.h | 14 | ||||
| -rw-r--r-- | src/core/hle/service/service.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/service/service.h | 8 |
13 files changed, 493 insertions, 116 deletions
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index aa2c83937..6c594dcaf 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp | |||
| @@ -1143,13 +1143,21 @@ void IApplicationFunctions::CreateApplicationAndRequestToStartForQuest( | |||
| 1143 | 1143 | ||
| 1144 | void IApplicationFunctions::EnsureSaveData(Kernel::HLERequestContext& ctx) { | 1144 | void IApplicationFunctions::EnsureSaveData(Kernel::HLERequestContext& ctx) { |
| 1145 | IPC::RequestParser rp{ctx}; | 1145 | IPC::RequestParser rp{ctx}; |
| 1146 | u128 uid = rp.PopRaw<u128>(); // What does this do? | 1146 | u128 user_id = rp.PopRaw<u128>(); |
| 1147 | LOG_WARNING(Service, "(STUBBED) called uid = {:016X}{:016X}", uid[1], uid[0]); | 1147 | |
| 1148 | LOG_DEBUG(Service_AM, "called, uid={:016X}{:016X}", user_id[1], user_id[0]); | ||
| 1149 | |||
| 1150 | FileSys::SaveDataDescriptor descriptor{}; | ||
| 1151 | descriptor.title_id = Core::CurrentProcess()->GetTitleID(); | ||
| 1152 | descriptor.user_id = user_id; | ||
| 1153 | descriptor.type = FileSys::SaveDataType::SaveData; | ||
| 1154 | const auto res = system.GetFileSystemController().CreateSaveData( | ||
| 1155 | FileSys::SaveDataSpaceId::NandUser, descriptor); | ||
| 1148 | 1156 | ||
| 1149 | IPC::ResponseBuilder rb{ctx, 4}; | 1157 | IPC::ResponseBuilder rb{ctx, 4}; |
| 1150 | rb.Push(RESULT_SUCCESS); | 1158 | rb.Push(res.Code()); |
| 1151 | rb.Push<u64>(0); | 1159 | rb.Push<u64>(0); |
| 1152 | } // namespace Service::AM | 1160 | } |
| 1153 | 1161 | ||
| 1154 | void IApplicationFunctions::SetTerminateResult(Kernel::HLERequestContext& ctx) { | 1162 | void IApplicationFunctions::SetTerminateResult(Kernel::HLERequestContext& ctx) { |
| 1155 | // Takes an input u32 Result, no output. | 1163 | // Takes an input u32 Result, no output. |
| @@ -1261,8 +1269,8 @@ void IApplicationFunctions::ExtendSaveData(Kernel::HLERequestContext& ctx) { | |||
| 1261 | "new_journal={:016X}", | 1269 | "new_journal={:016X}", |
| 1262 | static_cast<u8>(type), user_id[1], user_id[0], new_normal_size, new_journal_size); | 1270 | static_cast<u8>(type), user_id[1], user_id[0], new_normal_size, new_journal_size); |
| 1263 | 1271 | ||
| 1264 | const auto title_id = system.CurrentProcess()->GetTitleID(); | 1272 | system.GetFileSystemController().WriteSaveDataSize( |
| 1265 | FileSystem::WriteSaveDataSize(type, title_id, user_id, {new_normal_size, new_journal_size}); | 1273 | type, system.CurrentProcess()->GetTitleID(), user_id, {new_normal_size, new_journal_size}); |
| 1266 | 1274 | ||
| 1267 | IPC::ResponseBuilder rb{ctx, 4}; | 1275 | IPC::ResponseBuilder rb{ctx, 4}; |
| 1268 | rb.Push(RESULT_SUCCESS); | 1276 | rb.Push(RESULT_SUCCESS); |
| @@ -1281,8 +1289,8 @@ void IApplicationFunctions::GetSaveDataSize(Kernel::HLERequestContext& ctx) { | |||
| 1281 | LOG_DEBUG(Service_AM, "called with type={:02X}, user_id={:016X}{:016X}", static_cast<u8>(type), | 1289 | LOG_DEBUG(Service_AM, "called with type={:02X}, user_id={:016X}{:016X}", static_cast<u8>(type), |
| 1282 | user_id[1], user_id[0]); | 1290 | user_id[1], user_id[0]); |
| 1283 | 1291 | ||
| 1284 | const auto title_id = system.CurrentProcess()->GetTitleID(); | 1292 | const auto size = system.GetFileSystemController().ReadSaveDataSize( |
| 1285 | const auto size = FileSystem::ReadSaveDataSize(type, title_id, user_id); | 1293 | type, system.CurrentProcess()->GetTitleID(), user_id); |
| 1286 | 1294 | ||
| 1287 | IPC::ResponseBuilder rb{ctx, 6}; | 1295 | IPC::ResponseBuilder rb{ctx, 6}; |
| 1288 | rb.Push(RESULT_SUCCESS); | 1296 | rb.Push(RESULT_SUCCESS); |
diff --git a/src/core/hle/service/am/applet_ae.h b/src/core/hle/service/am/applet_ae.h index 9e006cd9d..0e0d10858 100644 --- a/src/core/hle/service/am/applet_ae.h +++ b/src/core/hle/service/am/applet_ae.h | |||
| @@ -9,6 +9,10 @@ | |||
| 9 | #include "core/hle/service/service.h" | 9 | #include "core/hle/service/service.h" |
| 10 | 10 | ||
| 11 | namespace Service { | 11 | namespace Service { |
| 12 | namespace FileSystem { | ||
| 13 | class FileSystemController; | ||
| 14 | } | ||
| 15 | |||
| 12 | namespace NVFlinger { | 16 | namespace NVFlinger { |
| 13 | class NVFlinger; | 17 | class NVFlinger; |
| 14 | } | 18 | } |
diff --git a/src/core/hle/service/am/applet_oe.h b/src/core/hle/service/am/applet_oe.h index 22c05419d..99a65e7b5 100644 --- a/src/core/hle/service/am/applet_oe.h +++ b/src/core/hle/service/am/applet_oe.h | |||
| @@ -9,6 +9,10 @@ | |||
| 9 | #include "core/hle/service/service.h" | 9 | #include "core/hle/service/service.h" |
| 10 | 10 | ||
| 11 | namespace Service { | 11 | namespace Service { |
| 12 | namespace FileSystem { | ||
| 13 | class FileSystemController; | ||
| 14 | } | ||
| 15 | |||
| 12 | namespace NVFlinger { | 16 | namespace NVFlinger { |
| 13 | class NVFlinger; | 17 | class NVFlinger; |
| 14 | } | 18 | } |
diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index 8ce110dd1..14cd0e322 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include "common/file_util.h" | 8 | #include "common/file_util.h" |
| 9 | #include "core/core.h" | 9 | #include "core/core.h" |
| 10 | #include "core/file_sys/bis_factory.h" | 10 | #include "core/file_sys/bis_factory.h" |
| 11 | #include "core/file_sys/card_image.h" | ||
| 11 | #include "core/file_sys/control_metadata.h" | 12 | #include "core/file_sys/control_metadata.h" |
| 12 | #include "core/file_sys/errors.h" | 13 | #include "core/file_sys/errors.h" |
| 13 | #include "core/file_sys/mode.h" | 14 | #include "core/file_sys/mode.h" |
| @@ -25,14 +26,10 @@ | |||
| 25 | #include "core/hle/service/filesystem/fsp_pr.h" | 26 | #include "core/hle/service/filesystem/fsp_pr.h" |
| 26 | #include "core/hle/service/filesystem/fsp_srv.h" | 27 | #include "core/hle/service/filesystem/fsp_srv.h" |
| 27 | #include "core/loader/loader.h" | 28 | #include "core/loader/loader.h" |
| 29 | #include "core/settings.h" | ||
| 28 | 30 | ||
| 29 | namespace Service::FileSystem { | 31 | namespace Service::FileSystem { |
| 30 | 32 | ||
| 31 | // Size of emulated sd card free space, reported in bytes. | ||
| 32 | // Just using 32GB because thats reasonable | ||
| 33 | // TODO(DarkLordZach): Eventually make this configurable in settings. | ||
| 34 | constexpr u64 EMULATED_SD_REPORTED_SIZE = 32000000000; | ||
| 35 | |||
| 36 | // A default size for normal/journal save data size if application control metadata cannot be found. | 33 | // A default size for normal/journal save data size if application control metadata cannot be found. |
| 37 | // This should be large enough to satisfy even the most extreme requirements (~4.2GB) | 34 | // This should be large enough to satisfy even the most extreme requirements (~4.2GB) |
| 38 | constexpr u64 SUFFICIENT_SAVE_DATA_SIZE = 0xF0000000; | 35 | constexpr u64 SUFFICIENT_SAVE_DATA_SIZE = 0xF0000000; |
| @@ -226,13 +223,6 @@ ResultVal<FileSys::VirtualDir> VfsDirectoryServiceWrapper::OpenDirectory(const s | |||
| 226 | return MakeResult(dir); | 223 | return MakeResult(dir); |
| 227 | } | 224 | } |
| 228 | 225 | ||
| 229 | u64 VfsDirectoryServiceWrapper::GetFreeSpaceSize() const { | ||
| 230 | if (backing->IsWritable()) | ||
| 231 | return EMULATED_SD_REPORTED_SIZE; | ||
| 232 | |||
| 233 | return 0; | ||
| 234 | } | ||
| 235 | |||
| 236 | ResultVal<FileSys::EntryType> VfsDirectoryServiceWrapper::GetEntryType( | 226 | ResultVal<FileSys::EntryType> VfsDirectoryServiceWrapper::GetEntryType( |
| 237 | const std::string& path_) const { | 227 | const std::string& path_) const { |
| 238 | std::string path(FileUtil::SanitizePath(path_)); | 228 | std::string path(FileUtil::SanitizePath(path_)); |
| @@ -251,44 +241,39 @@ ResultVal<FileSys::EntryType> VfsDirectoryServiceWrapper::GetEntryType( | |||
| 251 | return FileSys::ERROR_PATH_NOT_FOUND; | 241 | return FileSys::ERROR_PATH_NOT_FOUND; |
| 252 | } | 242 | } |
| 253 | 243 | ||
| 254 | /** | 244 | FileSystemController::FileSystemController() = default; |
| 255 | * Map of registered file systems, identified by type. Once an file system is registered here, it | 245 | |
| 256 | * is never removed until UnregisterFileSystems is called. | 246 | FileSystemController::~FileSystemController() = default; |
| 257 | */ | ||
| 258 | static std::unique_ptr<FileSys::RomFSFactory> romfs_factory; | ||
| 259 | static std::unique_ptr<FileSys::SaveDataFactory> save_data_factory; | ||
| 260 | static std::unique_ptr<FileSys::SDMCFactory> sdmc_factory; | ||
| 261 | static std::unique_ptr<FileSys::BISFactory> bis_factory; | ||
| 262 | 247 | ||
| 263 | ResultCode RegisterRomFS(std::unique_ptr<FileSys::RomFSFactory>&& factory) { | 248 | ResultCode FileSystemController::RegisterRomFS(std::unique_ptr<FileSys::RomFSFactory>&& factory) { |
| 264 | ASSERT_MSG(romfs_factory == nullptr, "Tried to register a second RomFS"); | ||
| 265 | romfs_factory = std::move(factory); | 249 | romfs_factory = std::move(factory); |
| 266 | LOG_DEBUG(Service_FS, "Registered RomFS"); | 250 | LOG_DEBUG(Service_FS, "Registered RomFS"); |
| 267 | return RESULT_SUCCESS; | 251 | return RESULT_SUCCESS; |
| 268 | } | 252 | } |
| 269 | 253 | ||
| 270 | ResultCode RegisterSaveData(std::unique_ptr<FileSys::SaveDataFactory>&& factory) { | 254 | ResultCode FileSystemController::RegisterSaveData( |
| 271 | ASSERT_MSG(romfs_factory == nullptr, "Tried to register a second save data"); | 255 | std::unique_ptr<FileSys::SaveDataFactory>&& factory) { |
| 256 | ASSERT_MSG(save_data_factory == nullptr, "Tried to register a second save data"); | ||
| 272 | save_data_factory = std::move(factory); | 257 | save_data_factory = std::move(factory); |
| 273 | LOG_DEBUG(Service_FS, "Registered save data"); | 258 | LOG_DEBUG(Service_FS, "Registered save data"); |
| 274 | return RESULT_SUCCESS; | 259 | return RESULT_SUCCESS; |
| 275 | } | 260 | } |
| 276 | 261 | ||
| 277 | ResultCode RegisterSDMC(std::unique_ptr<FileSys::SDMCFactory>&& factory) { | 262 | ResultCode FileSystemController::RegisterSDMC(std::unique_ptr<FileSys::SDMCFactory>&& factory) { |
| 278 | ASSERT_MSG(sdmc_factory == nullptr, "Tried to register a second SDMC"); | 263 | ASSERT_MSG(sdmc_factory == nullptr, "Tried to register a second SDMC"); |
| 279 | sdmc_factory = std::move(factory); | 264 | sdmc_factory = std::move(factory); |
| 280 | LOG_DEBUG(Service_FS, "Registered SDMC"); | 265 | LOG_DEBUG(Service_FS, "Registered SDMC"); |
| 281 | return RESULT_SUCCESS; | 266 | return RESULT_SUCCESS; |
| 282 | } | 267 | } |
| 283 | 268 | ||
| 284 | ResultCode RegisterBIS(std::unique_ptr<FileSys::BISFactory>&& factory) { | 269 | ResultCode FileSystemController::RegisterBIS(std::unique_ptr<FileSys::BISFactory>&& factory) { |
| 285 | ASSERT_MSG(bis_factory == nullptr, "Tried to register a second BIS"); | 270 | ASSERT_MSG(bis_factory == nullptr, "Tried to register a second BIS"); |
| 286 | bis_factory = std::move(factory); | 271 | bis_factory = std::move(factory); |
| 287 | LOG_DEBUG(Service_FS, "Registered BIS"); | 272 | LOG_DEBUG(Service_FS, "Registered BIS"); |
| 288 | return RESULT_SUCCESS; | 273 | return RESULT_SUCCESS; |
| 289 | } | 274 | } |
| 290 | 275 | ||
| 291 | void SetPackedUpdate(FileSys::VirtualFile update_raw) { | 276 | void FileSystemController::SetPackedUpdate(FileSys::VirtualFile update_raw) { |
| 292 | LOG_TRACE(Service_FS, "Setting packed update for romfs"); | 277 | LOG_TRACE(Service_FS, "Setting packed update for romfs"); |
| 293 | 278 | ||
| 294 | if (romfs_factory == nullptr) | 279 | if (romfs_factory == nullptr) |
| @@ -297,7 +282,7 @@ void SetPackedUpdate(FileSys::VirtualFile update_raw) { | |||
| 297 | romfs_factory->SetPackedUpdate(std::move(update_raw)); | 282 | romfs_factory->SetPackedUpdate(std::move(update_raw)); |
| 298 | } | 283 | } |
| 299 | 284 | ||
| 300 | ResultVal<FileSys::VirtualFile> OpenRomFSCurrentProcess() { | 285 | ResultVal<FileSys::VirtualFile> FileSystemController::OpenRomFSCurrentProcess() const { |
| 301 | LOG_TRACE(Service_FS, "Opening RomFS for current process"); | 286 | LOG_TRACE(Service_FS, "Opening RomFS for current process"); |
| 302 | 287 | ||
| 303 | if (romfs_factory == nullptr) { | 288 | if (romfs_factory == nullptr) { |
| @@ -308,8 +293,8 @@ ResultVal<FileSys::VirtualFile> OpenRomFSCurrentProcess() { | |||
| 308 | return romfs_factory->OpenCurrentProcess(); | 293 | return romfs_factory->OpenCurrentProcess(); |
| 309 | } | 294 | } |
| 310 | 295 | ||
| 311 | ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId storage_id, | 296 | ResultVal<FileSys::VirtualFile> FileSystemController::OpenRomFS( |
| 312 | FileSys::ContentRecordType type) { | 297 | u64 title_id, FileSys::StorageId storage_id, FileSys::ContentRecordType type) const { |
| 313 | LOG_TRACE(Service_FS, "Opening RomFS for title_id={:016X}, storage_id={:02X}, type={:02X}", | 298 | LOG_TRACE(Service_FS, "Opening RomFS for title_id={:016X}, storage_id={:02X}, type={:02X}", |
| 314 | title_id, static_cast<u8>(storage_id), static_cast<u8>(type)); | 299 | title_id, static_cast<u8>(storage_id), static_cast<u8>(type)); |
| 315 | 300 | ||
| @@ -321,8 +306,20 @@ ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId stora | |||
| 321 | return romfs_factory->Open(title_id, storage_id, type); | 306 | return romfs_factory->Open(title_id, storage_id, type); |
| 322 | } | 307 | } |
| 323 | 308 | ||
| 324 | ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space, | 309 | ResultVal<FileSys::VirtualDir> FileSystemController::CreateSaveData( |
| 325 | const FileSys::SaveDataDescriptor& descriptor) { | 310 | FileSys::SaveDataSpaceId space, const FileSys::SaveDataDescriptor& save_struct) const { |
| 311 | LOG_TRACE(Service_FS, "Creating Save Data for space_id={:01X}, save_struct={}", | ||
| 312 | static_cast<u8>(space), save_struct.DebugInfo()); | ||
| 313 | |||
| 314 | if (save_data_factory == nullptr) { | ||
| 315 | return FileSys::ERROR_ENTITY_NOT_FOUND; | ||
| 316 | } | ||
| 317 | |||
| 318 | return save_data_factory->Create(space, save_struct); | ||
| 319 | } | ||
| 320 | |||
| 321 | ResultVal<FileSys::VirtualDir> FileSystemController::OpenSaveData( | ||
| 322 | FileSys::SaveDataSpaceId space, const FileSys::SaveDataDescriptor& descriptor) const { | ||
| 326 | LOG_TRACE(Service_FS, "Opening Save Data for space_id={:01X}, save_struct={}", | 323 | LOG_TRACE(Service_FS, "Opening Save Data for space_id={:01X}, save_struct={}", |
| 327 | static_cast<u8>(space), descriptor.DebugInfo()); | 324 | static_cast<u8>(space), descriptor.DebugInfo()); |
| 328 | 325 | ||
| @@ -333,7 +330,8 @@ ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space, | |||
| 333 | return save_data_factory->Open(space, descriptor); | 330 | return save_data_factory->Open(space, descriptor); |
| 334 | } | 331 | } |
| 335 | 332 | ||
| 336 | ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space) { | 333 | ResultVal<FileSys::VirtualDir> FileSystemController::OpenSaveDataSpace( |
| 334 | FileSys::SaveDataSpaceId space) const { | ||
| 337 | LOG_TRACE(Service_FS, "Opening Save Data Space for space_id={:01X}", static_cast<u8>(space)); | 335 | LOG_TRACE(Service_FS, "Opening Save Data Space for space_id={:01X}", static_cast<u8>(space)); |
| 338 | 336 | ||
| 339 | if (save_data_factory == nullptr) { | 337 | if (save_data_factory == nullptr) { |
| @@ -343,7 +341,7 @@ ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space) | |||
| 343 | return MakeResult(save_data_factory->GetSaveDataSpaceDirectory(space)); | 341 | return MakeResult(save_data_factory->GetSaveDataSpaceDirectory(space)); |
| 344 | } | 342 | } |
| 345 | 343 | ||
| 346 | ResultVal<FileSys::VirtualDir> OpenSDMC() { | 344 | ResultVal<FileSys::VirtualDir> FileSystemController::OpenSDMC() const { |
| 347 | LOG_TRACE(Service_FS, "Opening SDMC"); | 345 | LOG_TRACE(Service_FS, "Opening SDMC"); |
| 348 | 346 | ||
| 349 | if (sdmc_factory == nullptr) { | 347 | if (sdmc_factory == nullptr) { |
| @@ -353,7 +351,92 @@ ResultVal<FileSys::VirtualDir> OpenSDMC() { | |||
| 353 | return sdmc_factory->Open(); | 351 | return sdmc_factory->Open(); |
| 354 | } | 352 | } |
| 355 | 353 | ||
| 356 | FileSys::SaveDataSize ReadSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id) { | 354 | ResultVal<FileSys::VirtualDir> FileSystemController::OpenBISPartition( |
| 355 | FileSys::BisPartitionId id) const { | ||
| 356 | LOG_TRACE(Service_FS, "Opening BIS Partition with id={:08X}", static_cast<u32>(id)); | ||
| 357 | |||
| 358 | if (bis_factory == nullptr) { | ||
| 359 | return FileSys::ERROR_ENTITY_NOT_FOUND; | ||
| 360 | } | ||
| 361 | |||
| 362 | auto part = bis_factory->OpenPartition(id); | ||
| 363 | if (part == nullptr) { | ||
| 364 | return FileSys::ERROR_INVALID_ARGUMENT; | ||
| 365 | } | ||
| 366 | |||
| 367 | return MakeResult<FileSys::VirtualDir>(std::move(part)); | ||
| 368 | } | ||
| 369 | |||
| 370 | ResultVal<FileSys::VirtualFile> FileSystemController::OpenBISPartitionStorage( | ||
| 371 | FileSys::BisPartitionId id) const { | ||
| 372 | LOG_TRACE(Service_FS, "Opening BIS Partition Storage with id={:08X}", static_cast<u32>(id)); | ||
| 373 | |||
| 374 | if (bis_factory == nullptr) { | ||
| 375 | return FileSys::ERROR_ENTITY_NOT_FOUND; | ||
| 376 | } | ||
| 377 | |||
| 378 | auto part = bis_factory->OpenPartitionStorage(id); | ||
| 379 | if (part == nullptr) { | ||
| 380 | return FileSys::ERROR_INVALID_ARGUMENT; | ||
| 381 | } | ||
| 382 | |||
| 383 | return MakeResult<FileSys::VirtualFile>(std::move(part)); | ||
| 384 | } | ||
| 385 | |||
| 386 | u64 FileSystemController::GetFreeSpaceSize(FileSys::StorageId id) const { | ||
| 387 | switch (id) { | ||
| 388 | case FileSys::StorageId::None: | ||
| 389 | case FileSys::StorageId::GameCard: | ||
| 390 | return 0; | ||
| 391 | case FileSys::StorageId::SdCard: | ||
| 392 | if (sdmc_factory == nullptr) | ||
| 393 | return 0; | ||
| 394 | return sdmc_factory->GetSDMCFreeSpace(); | ||
| 395 | case FileSys::StorageId::Host: | ||
| 396 | if (bis_factory == nullptr) | ||
| 397 | return 0; | ||
| 398 | return bis_factory->GetSystemNANDFreeSpace() + bis_factory->GetUserNANDFreeSpace(); | ||
| 399 | case FileSys::StorageId::NandSystem: | ||
| 400 | if (bis_factory == nullptr) | ||
| 401 | return 0; | ||
| 402 | return bis_factory->GetSystemNANDFreeSpace(); | ||
| 403 | case FileSys::StorageId::NandUser: | ||
| 404 | if (bis_factory == nullptr) | ||
| 405 | return 0; | ||
| 406 | return bis_factory->GetUserNANDFreeSpace(); | ||
| 407 | } | ||
| 408 | |||
| 409 | return 0; | ||
| 410 | } | ||
| 411 | |||
| 412 | u64 FileSystemController::GetTotalSpaceSize(FileSys::StorageId id) const { | ||
| 413 | switch (id) { | ||
| 414 | case FileSys::StorageId::None: | ||
| 415 | case FileSys::StorageId::GameCard: | ||
| 416 | return 0; | ||
| 417 | case FileSys::StorageId::SdCard: | ||
| 418 | if (sdmc_factory == nullptr) | ||
| 419 | return 0; | ||
| 420 | return sdmc_factory->GetSDMCTotalSpace(); | ||
| 421 | case FileSys::StorageId::Host: | ||
| 422 | if (bis_factory == nullptr) | ||
| 423 | return 0; | ||
| 424 | return bis_factory->GetFullNANDTotalSpace(); | ||
| 425 | case FileSys::StorageId::NandSystem: | ||
| 426 | if (bis_factory == nullptr) | ||
| 427 | return 0; | ||
| 428 | return bis_factory->GetSystemNANDTotalSpace(); | ||
| 429 | case FileSys::StorageId::NandUser: | ||
| 430 | if (bis_factory == nullptr) | ||
| 431 | return 0; | ||
| 432 | return bis_factory->GetUserNANDTotalSpace(); | ||
| 433 | } | ||
| 434 | |||
| 435 | return 0; | ||
| 436 | } | ||
| 437 | |||
| 438 | FileSys::SaveDataSize FileSystemController::ReadSaveDataSize(FileSys::SaveDataType type, | ||
| 439 | u64 title_id, u128 user_id) const { | ||
| 357 | if (save_data_factory == nullptr) { | 440 | if (save_data_factory == nullptr) { |
| 358 | return {0, 0}; | 441 | return {0, 0}; |
| 359 | } | 442 | } |
| @@ -385,13 +468,32 @@ FileSys::SaveDataSize ReadSaveDataSize(FileSys::SaveDataType type, u64 title_id, | |||
| 385 | return value; | 468 | return value; |
| 386 | } | 469 | } |
| 387 | 470 | ||
| 388 | void WriteSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id, | 471 | void FileSystemController::WriteSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id, |
| 389 | FileSys::SaveDataSize new_value) { | 472 | FileSys::SaveDataSize new_value) const { |
| 390 | if (save_data_factory != nullptr) | 473 | if (save_data_factory != nullptr) |
| 391 | save_data_factory->WriteSaveDataSize(type, title_id, user_id, new_value); | 474 | save_data_factory->WriteSaveDataSize(type, title_id, user_id, new_value); |
| 392 | } | 475 | } |
| 393 | 476 | ||
| 394 | FileSys::RegisteredCache* GetSystemNANDContents() { | 477 | void FileSystemController::SetGameCard(FileSys::VirtualFile file) { |
| 478 | gamecard = std::make_unique<FileSys::XCI>(file); | ||
| 479 | const auto dir = gamecard->ConcatenatedPseudoDirectory(); | ||
| 480 | gamecard_registered = std::make_unique<FileSys::RegisteredCache>(dir); | ||
| 481 | gamecard_placeholder = std::make_unique<FileSys::PlaceholderCache>(dir); | ||
| 482 | } | ||
| 483 | |||
| 484 | FileSys::XCI* FileSystemController::GetGameCard() const { | ||
| 485 | return gamecard.get(); | ||
| 486 | } | ||
| 487 | |||
| 488 | FileSys::RegisteredCache* FileSystemController::GetGameCardContents() const { | ||
| 489 | return gamecard_registered.get(); | ||
| 490 | } | ||
| 491 | |||
| 492 | FileSys::PlaceholderCache* FileSystemController::GetGameCardPlaceholder() const { | ||
| 493 | return gamecard_placeholder.get(); | ||
| 494 | } | ||
| 495 | |||
| 496 | FileSys::RegisteredCache* FileSystemController::GetSystemNANDContents() const { | ||
| 395 | LOG_TRACE(Service_FS, "Opening System NAND Contents"); | 497 | LOG_TRACE(Service_FS, "Opening System NAND Contents"); |
| 396 | 498 | ||
| 397 | if (bis_factory == nullptr) | 499 | if (bis_factory == nullptr) |
| @@ -400,7 +502,7 @@ FileSys::RegisteredCache* GetSystemNANDContents() { | |||
| 400 | return bis_factory->GetSystemNANDContents(); | 502 | return bis_factory->GetSystemNANDContents(); |
| 401 | } | 503 | } |
| 402 | 504 | ||
| 403 | FileSys::RegisteredCache* GetUserNANDContents() { | 505 | FileSys::RegisteredCache* FileSystemController::GetUserNANDContents() const { |
| 404 | LOG_TRACE(Service_FS, "Opening User NAND Contents"); | 506 | LOG_TRACE(Service_FS, "Opening User NAND Contents"); |
| 405 | 507 | ||
| 406 | if (bis_factory == nullptr) | 508 | if (bis_factory == nullptr) |
| @@ -409,7 +511,7 @@ FileSys::RegisteredCache* GetUserNANDContents() { | |||
| 409 | return bis_factory->GetUserNANDContents(); | 511 | return bis_factory->GetUserNANDContents(); |
| 410 | } | 512 | } |
| 411 | 513 | ||
| 412 | FileSys::RegisteredCache* GetSDMCContents() { | 514 | FileSys::RegisteredCache* FileSystemController::GetSDMCContents() const { |
| 413 | LOG_TRACE(Service_FS, "Opening SDMC Contents"); | 515 | LOG_TRACE(Service_FS, "Opening SDMC Contents"); |
| 414 | 516 | ||
| 415 | if (sdmc_factory == nullptr) | 517 | if (sdmc_factory == nullptr) |
| @@ -418,7 +520,143 @@ FileSys::RegisteredCache* GetSDMCContents() { | |||
| 418 | return sdmc_factory->GetSDMCContents(); | 520 | return sdmc_factory->GetSDMCContents(); |
| 419 | } | 521 | } |
| 420 | 522 | ||
| 421 | FileSys::VirtualDir GetModificationLoadRoot(u64 title_id) { | 523 | FileSys::PlaceholderCache* FileSystemController::GetSystemNANDPlaceholder() const { |
| 524 | LOG_TRACE(Service_FS, "Opening System NAND Placeholder"); | ||
| 525 | |||
| 526 | if (bis_factory == nullptr) | ||
| 527 | return nullptr; | ||
| 528 | |||
| 529 | return bis_factory->GetSystemNANDPlaceholder(); | ||
| 530 | } | ||
| 531 | |||
| 532 | FileSys::PlaceholderCache* FileSystemController::GetUserNANDPlaceholder() const { | ||
| 533 | LOG_TRACE(Service_FS, "Opening User NAND Placeholder"); | ||
| 534 | |||
| 535 | if (bis_factory == nullptr) | ||
| 536 | return nullptr; | ||
| 537 | |||
| 538 | return bis_factory->GetUserNANDPlaceholder(); | ||
| 539 | } | ||
| 540 | |||
| 541 | FileSys::PlaceholderCache* FileSystemController::GetSDMCPlaceholder() const { | ||
| 542 | LOG_TRACE(Service_FS, "Opening SDMC Placeholder"); | ||
| 543 | |||
| 544 | if (sdmc_factory == nullptr) | ||
| 545 | return nullptr; | ||
| 546 | |||
| 547 | return sdmc_factory->GetSDMCPlaceholder(); | ||
| 548 | } | ||
| 549 | |||
| 550 | FileSys::RegisteredCache* FileSystemController::GetRegisteredCacheForStorage( | ||
| 551 | FileSys::StorageId id) const { | ||
| 552 | switch (id) { | ||
| 553 | case FileSys::StorageId::None: | ||
| 554 | case FileSys::StorageId::Host: | ||
| 555 | UNIMPLEMENTED(); | ||
| 556 | return nullptr; | ||
| 557 | case FileSys::StorageId::GameCard: | ||
| 558 | return GetGameCardContents(); | ||
| 559 | case FileSys::StorageId::NandSystem: | ||
| 560 | return GetSystemNANDContents(); | ||
| 561 | case FileSys::StorageId::NandUser: | ||
| 562 | return GetUserNANDContents(); | ||
| 563 | case FileSys::StorageId::SdCard: | ||
| 564 | return GetSDMCContents(); | ||
| 565 | } | ||
| 566 | |||
| 567 | return nullptr; | ||
| 568 | } | ||
| 569 | |||
| 570 | FileSys::PlaceholderCache* FileSystemController::GetPlaceholderCacheForStorage( | ||
| 571 | FileSys::StorageId id) const { | ||
| 572 | switch (id) { | ||
| 573 | case FileSys::StorageId::None: | ||
| 574 | case FileSys::StorageId::Host: | ||
| 575 | UNIMPLEMENTED(); | ||
| 576 | return nullptr; | ||
| 577 | case FileSys::StorageId::GameCard: | ||
| 578 | return GetGameCardPlaceholder(); | ||
| 579 | case FileSys::StorageId::NandSystem: | ||
| 580 | return GetSystemNANDPlaceholder(); | ||
| 581 | case FileSys::StorageId::NandUser: | ||
| 582 | return GetUserNANDPlaceholder(); | ||
| 583 | case FileSys::StorageId::SdCard: | ||
| 584 | return GetSDMCPlaceholder(); | ||
| 585 | } | ||
| 586 | |||
| 587 | return nullptr; | ||
| 588 | } | ||
| 589 | |||
| 590 | FileSys::VirtualDir FileSystemController::GetSystemNANDContentDirectory() const { | ||
| 591 | LOG_TRACE(Service_FS, "Opening system NAND content directory"); | ||
| 592 | |||
| 593 | if (bis_factory == nullptr) | ||
| 594 | return nullptr; | ||
| 595 | |||
| 596 | return bis_factory->GetSystemNANDContentDirectory(); | ||
| 597 | } | ||
| 598 | |||
| 599 | FileSys::VirtualDir FileSystemController::GetUserNANDContentDirectory() const { | ||
| 600 | LOG_TRACE(Service_FS, "Opening user NAND content directory"); | ||
| 601 | |||
| 602 | if (bis_factory == nullptr) | ||
| 603 | return nullptr; | ||
| 604 | |||
| 605 | return bis_factory->GetUserNANDContentDirectory(); | ||
| 606 | } | ||
| 607 | |||
| 608 | FileSys::VirtualDir FileSystemController::GetSDMCContentDirectory() const { | ||
| 609 | LOG_TRACE(Service_FS, "Opening SDMC content directory"); | ||
| 610 | |||
| 611 | if (sdmc_factory == nullptr) | ||
| 612 | return nullptr; | ||
| 613 | |||
| 614 | return sdmc_factory->GetSDMCContentDirectory(); | ||
| 615 | } | ||
| 616 | |||
| 617 | FileSys::VirtualDir FileSystemController::GetNANDImageDirectory() const { | ||
| 618 | LOG_TRACE(Service_FS, "Opening NAND image directory"); | ||
| 619 | |||
| 620 | if (bis_factory == nullptr) | ||
| 621 | return nullptr; | ||
| 622 | |||
| 623 | return bis_factory->GetImageDirectory(); | ||
| 624 | } | ||
| 625 | |||
| 626 | FileSys::VirtualDir FileSystemController::GetSDMCImageDirectory() const { | ||
| 627 | LOG_TRACE(Service_FS, "Opening SDMC image directory"); | ||
| 628 | |||
| 629 | if (sdmc_factory == nullptr) | ||
| 630 | return nullptr; | ||
| 631 | |||
| 632 | return sdmc_factory->GetImageDirectory(); | ||
| 633 | } | ||
| 634 | |||
| 635 | FileSys::VirtualDir FileSystemController::GetContentDirectory(ContentStorageId id) const { | ||
| 636 | switch (id) { | ||
| 637 | case ContentStorageId::System: | ||
| 638 | return GetSystemNANDContentDirectory(); | ||
| 639 | case ContentStorageId::User: | ||
| 640 | return GetUserNANDContentDirectory(); | ||
| 641 | case ContentStorageId::SdCard: | ||
| 642 | return GetSDMCContentDirectory(); | ||
| 643 | } | ||
| 644 | |||
| 645 | return nullptr; | ||
| 646 | } | ||
| 647 | |||
| 648 | FileSys::VirtualDir FileSystemController::GetImageDirectory(ImageDirectoryId id) const { | ||
| 649 | switch (id) { | ||
| 650 | case ImageDirectoryId::NAND: | ||
| 651 | return GetNANDImageDirectory(); | ||
| 652 | case ImageDirectoryId::SdCard: | ||
| 653 | return GetSDMCImageDirectory(); | ||
| 654 | } | ||
| 655 | |||
| 656 | return nullptr; | ||
| 657 | } | ||
| 658 | |||
| 659 | FileSys::VirtualDir FileSystemController::GetModificationLoadRoot(u64 title_id) const { | ||
| 422 | LOG_TRACE(Service_FS, "Opening mod load root for tid={:016X}", title_id); | 660 | LOG_TRACE(Service_FS, "Opening mod load root for tid={:016X}", title_id); |
| 423 | 661 | ||
| 424 | if (bis_factory == nullptr) | 662 | if (bis_factory == nullptr) |
| @@ -427,7 +665,7 @@ FileSys::VirtualDir GetModificationLoadRoot(u64 title_id) { | |||
| 427 | return bis_factory->GetModificationLoadRoot(title_id); | 665 | return bis_factory->GetModificationLoadRoot(title_id); |
| 428 | } | 666 | } |
| 429 | 667 | ||
| 430 | FileSys::VirtualDir GetModificationDumpRoot(u64 title_id) { | 668 | FileSys::VirtualDir FileSystemController::GetModificationDumpRoot(u64 title_id) const { |
| 431 | LOG_TRACE(Service_FS, "Opening mod dump root for tid={:016X}", title_id); | 669 | LOG_TRACE(Service_FS, "Opening mod dump root for tid={:016X}", title_id); |
| 432 | 670 | ||
| 433 | if (bis_factory == nullptr) | 671 | if (bis_factory == nullptr) |
| @@ -436,7 +674,7 @@ FileSys::VirtualDir GetModificationDumpRoot(u64 title_id) { | |||
| 436 | return bis_factory->GetModificationDumpRoot(title_id); | 674 | return bis_factory->GetModificationDumpRoot(title_id); |
| 437 | } | 675 | } |
| 438 | 676 | ||
| 439 | void CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite) { | 677 | void FileSystemController::CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite) { |
| 440 | if (overwrite) { | 678 | if (overwrite) { |
| 441 | bis_factory = nullptr; | 679 | bis_factory = nullptr; |
| 442 | save_data_factory = nullptr; | 680 | save_data_factory = nullptr; |
| @@ -473,11 +711,10 @@ void CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite) { | |||
| 473 | } | 711 | } |
| 474 | 712 | ||
| 475 | void InstallInterfaces(Core::System& system) { | 713 | void InstallInterfaces(Core::System& system) { |
| 476 | romfs_factory = nullptr; | ||
| 477 | CreateFactories(*system.GetFilesystem(), false); | ||
| 478 | std::make_shared<FSP_LDR>()->InstallAsService(system.ServiceManager()); | 714 | std::make_shared<FSP_LDR>()->InstallAsService(system.ServiceManager()); |
| 479 | std::make_shared<FSP_PR>()->InstallAsService(system.ServiceManager()); | 715 | std::make_shared<FSP_PR>()->InstallAsService(system.ServiceManager()); |
| 480 | std::make_shared<FSP_SRV>(system.GetReporter())->InstallAsService(system.ServiceManager()); | 716 | std::make_shared<FSP_SRV>(system.GetFileSystemController(), system.GetReporter()) |
| 717 | ->InstallAsService(system.ServiceManager()); | ||
| 481 | } | 718 | } |
| 482 | 719 | ||
| 483 | } // namespace Service::FileSystem | 720 | } // namespace Service::FileSystem |
diff --git a/src/core/hle/service/filesystem/filesystem.h b/src/core/hle/service/filesystem/filesystem.h index 3849dd89e..3e0c03ec0 100644 --- a/src/core/hle/service/filesystem/filesystem.h +++ b/src/core/hle/service/filesystem/filesystem.h | |||
| @@ -14,10 +14,13 @@ namespace FileSys { | |||
| 14 | class BISFactory; | 14 | class BISFactory; |
| 15 | class RegisteredCache; | 15 | class RegisteredCache; |
| 16 | class RegisteredCacheUnion; | 16 | class RegisteredCacheUnion; |
| 17 | class PlaceholderCache; | ||
| 17 | class RomFSFactory; | 18 | class RomFSFactory; |
| 18 | class SaveDataFactory; | 19 | class SaveDataFactory; |
| 19 | class SDMCFactory; | 20 | class SDMCFactory; |
| 21 | class XCI; | ||
| 20 | 22 | ||
| 23 | enum class BisPartitionId : u32; | ||
| 21 | enum class ContentRecordType : u8; | 24 | enum class ContentRecordType : u8; |
| 22 | enum class Mode : u32; | 25 | enum class Mode : u32; |
| 23 | enum class SaveDataSpaceId : u8; | 26 | enum class SaveDataSpaceId : u8; |
| @@ -36,34 +39,91 @@ class ServiceManager; | |||
| 36 | 39 | ||
| 37 | namespace FileSystem { | 40 | namespace FileSystem { |
| 38 | 41 | ||
| 39 | ResultCode RegisterRomFS(std::unique_ptr<FileSys::RomFSFactory>&& factory); | 42 | enum class ContentStorageId : u32 { |
| 40 | ResultCode RegisterSaveData(std::unique_ptr<FileSys::SaveDataFactory>&& factory); | 43 | System, |
| 41 | ResultCode RegisterSDMC(std::unique_ptr<FileSys::SDMCFactory>&& factory); | 44 | User, |
| 42 | ResultCode RegisterBIS(std::unique_ptr<FileSys::BISFactory>&& factory); | 45 | SdCard, |
| 43 | 46 | }; | |
| 44 | void SetPackedUpdate(FileSys::VirtualFile update_raw); | ||
| 45 | ResultVal<FileSys::VirtualFile> OpenRomFSCurrentProcess(); | ||
| 46 | ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId storage_id, | ||
| 47 | FileSys::ContentRecordType type); | ||
| 48 | ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space, | ||
| 49 | const FileSys::SaveDataDescriptor& descriptor); | ||
| 50 | ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space); | ||
| 51 | ResultVal<FileSys::VirtualDir> OpenSDMC(); | ||
| 52 | |||
| 53 | FileSys::SaveDataSize ReadSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id); | ||
| 54 | void WriteSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id, | ||
| 55 | FileSys::SaveDataSize new_value); | ||
| 56 | 47 | ||
| 57 | FileSys::RegisteredCache* GetSystemNANDContents(); | 48 | enum class ImageDirectoryId : u32 { |
| 58 | FileSys::RegisteredCache* GetUserNANDContents(); | 49 | NAND, |
| 59 | FileSys::RegisteredCache* GetSDMCContents(); | 50 | SdCard, |
| 51 | }; | ||
| 60 | 52 | ||
| 61 | FileSys::VirtualDir GetModificationLoadRoot(u64 title_id); | 53 | class FileSystemController { |
| 62 | FileSys::VirtualDir GetModificationDumpRoot(u64 title_id); | 54 | public: |
| 55 | FileSystemController(); | ||
| 56 | ~FileSystemController(); | ||
| 57 | |||
| 58 | ResultCode RegisterRomFS(std::unique_ptr<FileSys::RomFSFactory>&& factory); | ||
| 59 | ResultCode RegisterSaveData(std::unique_ptr<FileSys::SaveDataFactory>&& factory); | ||
| 60 | ResultCode RegisterSDMC(std::unique_ptr<FileSys::SDMCFactory>&& factory); | ||
| 61 | ResultCode RegisterBIS(std::unique_ptr<FileSys::BISFactory>&& factory); | ||
| 62 | |||
| 63 | void SetPackedUpdate(FileSys::VirtualFile update_raw); | ||
| 64 | ResultVal<FileSys::VirtualFile> OpenRomFSCurrentProcess() const; | ||
| 65 | ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId storage_id, | ||
| 66 | FileSys::ContentRecordType type) const; | ||
| 67 | ResultVal<FileSys::VirtualDir> CreateSaveData( | ||
| 68 | FileSys::SaveDataSpaceId space, const FileSys::SaveDataDescriptor& save_struct) const; | ||
| 69 | ResultVal<FileSys::VirtualDir> OpenSaveData( | ||
| 70 | FileSys::SaveDataSpaceId space, const FileSys::SaveDataDescriptor& save_struct) const; | ||
| 71 | ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space) const; | ||
| 72 | ResultVal<FileSys::VirtualDir> OpenSDMC() const; | ||
| 73 | ResultVal<FileSys::VirtualDir> OpenBISPartition(FileSys::BisPartitionId id) const; | ||
| 74 | ResultVal<FileSys::VirtualFile> OpenBISPartitionStorage(FileSys::BisPartitionId id) const; | ||
| 75 | |||
| 76 | u64 GetFreeSpaceSize(FileSys::StorageId id) const; | ||
| 77 | u64 GetTotalSpaceSize(FileSys::StorageId id) const; | ||
| 78 | |||
| 79 | FileSys::SaveDataSize ReadSaveDataSize(FileSys::SaveDataType type, u64 title_id, | ||
| 80 | u128 user_id) const; | ||
| 81 | void WriteSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id, | ||
| 82 | FileSys::SaveDataSize new_value) const; | ||
| 83 | |||
| 84 | void SetGameCard(FileSys::VirtualFile file); | ||
| 85 | FileSys::XCI* GetGameCard() const; | ||
| 86 | |||
| 87 | FileSys::RegisteredCache* GetSystemNANDContents() const; | ||
| 88 | FileSys::RegisteredCache* GetUserNANDContents() const; | ||
| 89 | FileSys::RegisteredCache* GetSDMCContents() const; | ||
| 90 | FileSys::RegisteredCache* GetGameCardContents() const; | ||
| 91 | |||
| 92 | FileSys::PlaceholderCache* GetSystemNANDPlaceholder() const; | ||
| 93 | FileSys::PlaceholderCache* GetUserNANDPlaceholder() const; | ||
| 94 | FileSys::PlaceholderCache* GetSDMCPlaceholder() const; | ||
| 95 | FileSys::PlaceholderCache* GetGameCardPlaceholder() const; | ||
| 96 | |||
| 97 | FileSys::RegisteredCache* GetRegisteredCacheForStorage(FileSys::StorageId id) const; | ||
| 98 | FileSys::PlaceholderCache* GetPlaceholderCacheForStorage(FileSys::StorageId id) const; | ||
| 99 | |||
| 100 | FileSys::VirtualDir GetSystemNANDContentDirectory() const; | ||
| 101 | FileSys::VirtualDir GetUserNANDContentDirectory() const; | ||
| 102 | FileSys::VirtualDir GetSDMCContentDirectory() const; | ||
| 103 | |||
| 104 | FileSys::VirtualDir GetNANDImageDirectory() const; | ||
| 105 | FileSys::VirtualDir GetSDMCImageDirectory() const; | ||
| 106 | |||
| 107 | FileSys::VirtualDir GetContentDirectory(ContentStorageId id) const; | ||
| 108 | FileSys::VirtualDir GetImageDirectory(ImageDirectoryId id) const; | ||
| 109 | |||
| 110 | FileSys::VirtualDir GetModificationLoadRoot(u64 title_id) const; | ||
| 111 | FileSys::VirtualDir GetModificationDumpRoot(u64 title_id) const; | ||
| 112 | |||
| 113 | // Creates the SaveData, SDMC, and BIS Factories. Should be called once and before any function | ||
| 114 | // above is called. | ||
| 115 | void CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite = true); | ||
| 63 | 116 | ||
| 64 | // Creates the SaveData, SDMC, and BIS Factories. Should be called once and before any function | 117 | private: |
| 65 | // above is called. | 118 | std::unique_ptr<FileSys::RomFSFactory> romfs_factory; |
| 66 | void CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite = true); | 119 | std::unique_ptr<FileSys::SaveDataFactory> save_data_factory; |
| 120 | std::unique_ptr<FileSys::SDMCFactory> sdmc_factory; | ||
| 121 | std::unique_ptr<FileSys::BISFactory> bis_factory; | ||
| 122 | |||
| 123 | std::unique_ptr<FileSys::XCI> gamecard; | ||
| 124 | std::unique_ptr<FileSys::RegisteredCache> gamecard_registered; | ||
| 125 | std::unique_ptr<FileSys::PlaceholderCache> gamecard_placeholder; | ||
| 126 | }; | ||
| 67 | 127 | ||
| 68 | void InstallInterfaces(Core::System& system); | 128 | void InstallInterfaces(Core::System& system); |
| 69 | 129 | ||
| @@ -160,12 +220,6 @@ public: | |||
| 160 | ResultVal<FileSys::VirtualDir> OpenDirectory(const std::string& path); | 220 | ResultVal<FileSys::VirtualDir> OpenDirectory(const std::string& path); |
| 161 | 221 | ||
| 162 | /** | 222 | /** |
| 163 | * Get the free space | ||
| 164 | * @return The number of free bytes in the archive | ||
| 165 | */ | ||
| 166 | u64 GetFreeSpaceSize() const; | ||
| 167 | |||
| 168 | /** | ||
| 169 | * Get the type of the specified path | 223 | * Get the type of the specified path |
| 170 | * @return The type of the specified path or error code | 224 | * @return The type of the specified path or error code |
| 171 | */ | 225 | */ |
diff --git a/src/core/hle/service/filesystem/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp_srv.cpp index d3cd46a9b..eb982ad49 100644 --- a/src/core/hle/service/filesystem/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp_srv.cpp | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include "core/file_sys/mode.h" | 19 | #include "core/file_sys/mode.h" |
| 20 | #include "core/file_sys/nca_metadata.h" | 20 | #include "core/file_sys/nca_metadata.h" |
| 21 | #include "core/file_sys/patch_manager.h" | 21 | #include "core/file_sys/patch_manager.h" |
| 22 | #include "core/file_sys/romfs_factory.h" | ||
| 22 | #include "core/file_sys/savedata_factory.h" | 23 | #include "core/file_sys/savedata_factory.h" |
| 23 | #include "core/file_sys/system_archive/system_archive.h" | 24 | #include "core/file_sys/system_archive/system_archive.h" |
| 24 | #include "core/file_sys/vfs.h" | 25 | #include "core/file_sys/vfs.h" |
| @@ -30,6 +31,18 @@ | |||
| 30 | 31 | ||
| 31 | namespace Service::FileSystem { | 32 | namespace Service::FileSystem { |
| 32 | 33 | ||
| 34 | struct SizeGetter { | ||
| 35 | std::function<u64()> get_free_size; | ||
| 36 | std::function<u64()> get_total_size; | ||
| 37 | |||
| 38 | static SizeGetter FromStorageId(const FileSystemController& fsc, FileSys::StorageId id) { | ||
| 39 | return { | ||
| 40 | [&fsc, id] { return fsc.GetFreeSpaceSize(id); }, | ||
| 41 | [&fsc, id] { return fsc.GetTotalSpaceSize(id); }, | ||
| 42 | }; | ||
| 43 | } | ||
| 44 | }; | ||
| 45 | |||
| 33 | enum class FileSystemType : u8 { | 46 | enum class FileSystemType : u8 { |
| 34 | Invalid0 = 0, | 47 | Invalid0 = 0, |
| 35 | Invalid1 = 1, | 48 | Invalid1 = 1, |
| @@ -289,8 +302,8 @@ private: | |||
| 289 | 302 | ||
| 290 | class IFileSystem final : public ServiceFramework<IFileSystem> { | 303 | class IFileSystem final : public ServiceFramework<IFileSystem> { |
| 291 | public: | 304 | public: |
| 292 | explicit IFileSystem(FileSys::VirtualDir backend) | 305 | explicit IFileSystem(FileSys::VirtualDir backend, SizeGetter size) |
| 293 | : ServiceFramework("IFileSystem"), backend(std::move(backend)) { | 306 | : ServiceFramework("IFileSystem"), backend(std::move(backend)), size(std::move(size)) { |
| 294 | static const FunctionInfo functions[] = { | 307 | static const FunctionInfo functions[] = { |
| 295 | {0, &IFileSystem::CreateFile, "CreateFile"}, | 308 | {0, &IFileSystem::CreateFile, "CreateFile"}, |
| 296 | {1, &IFileSystem::DeleteFile, "DeleteFile"}, | 309 | {1, &IFileSystem::DeleteFile, "DeleteFile"}, |
| @@ -467,14 +480,31 @@ public: | |||
| 467 | rb.Push(RESULT_SUCCESS); | 480 | rb.Push(RESULT_SUCCESS); |
| 468 | } | 481 | } |
| 469 | 482 | ||
| 483 | void GetFreeSpaceSize(Kernel::HLERequestContext& ctx) { | ||
| 484 | LOG_DEBUG(Service_FS, "called"); | ||
| 485 | |||
| 486 | IPC::ResponseBuilder rb{ctx, 4}; | ||
| 487 | rb.Push(RESULT_SUCCESS); | ||
| 488 | rb.Push(size.get_free_size()); | ||
| 489 | } | ||
| 490 | |||
| 491 | void GetTotalSpaceSize(Kernel::HLERequestContext& ctx) { | ||
| 492 | LOG_DEBUG(Service_FS, "called"); | ||
| 493 | |||
| 494 | IPC::ResponseBuilder rb{ctx, 4}; | ||
| 495 | rb.Push(RESULT_SUCCESS); | ||
| 496 | rb.Push(size.get_total_size()); | ||
| 497 | } | ||
| 498 | |||
| 470 | private: | 499 | private: |
| 471 | VfsDirectoryServiceWrapper backend; | 500 | VfsDirectoryServiceWrapper backend; |
| 501 | SizeGetter size; | ||
| 472 | }; | 502 | }; |
| 473 | 503 | ||
| 474 | class ISaveDataInfoReader final : public ServiceFramework<ISaveDataInfoReader> { | 504 | class ISaveDataInfoReader final : public ServiceFramework<ISaveDataInfoReader> { |
| 475 | public: | 505 | public: |
| 476 | explicit ISaveDataInfoReader(FileSys::SaveDataSpaceId space) | 506 | explicit ISaveDataInfoReader(FileSys::SaveDataSpaceId space, FileSystemController& fsc) |
| 477 | : ServiceFramework("ISaveDataInfoReader") { | 507 | : ServiceFramework("ISaveDataInfoReader"), fsc(fsc) { |
| 478 | static const FunctionInfo functions[] = { | 508 | static const FunctionInfo functions[] = { |
| 479 | {0, &ISaveDataInfoReader::ReadSaveDataInfo, "ReadSaveDataInfo"}, | 509 | {0, &ISaveDataInfoReader::ReadSaveDataInfo, "ReadSaveDataInfo"}, |
| 480 | }; | 510 | }; |
| @@ -520,8 +550,13 @@ private: | |||
| 520 | } | 550 | } |
| 521 | 551 | ||
| 522 | void FindAllSaves(FileSys::SaveDataSpaceId space) { | 552 | void FindAllSaves(FileSys::SaveDataSpaceId space) { |
| 523 | const auto save_root = OpenSaveDataSpace(space); | 553 | const auto save_root = fsc.OpenSaveDataSpace(space); |
| 524 | ASSERT(save_root.Succeeded()); | 554 | |
| 555 | if (save_root.Failed() || *save_root == nullptr) { | ||
| 556 | LOG_ERROR(Service_FS, "The save root for the space_id={:02X} was invalid!", | ||
| 557 | static_cast<u8>(space)); | ||
| 558 | return; | ||
| 559 | } | ||
| 525 | 560 | ||
| 526 | for (const auto& type : (*save_root)->GetSubdirectories()) { | 561 | for (const auto& type : (*save_root)->GetSubdirectories()) { |
| 527 | if (type->GetName() == "save") { | 562 | if (type->GetName() == "save") { |
| @@ -610,11 +645,13 @@ private: | |||
| 610 | }; | 645 | }; |
| 611 | static_assert(sizeof(SaveDataInfo) == 0x60, "SaveDataInfo has incorrect size."); | 646 | static_assert(sizeof(SaveDataInfo) == 0x60, "SaveDataInfo has incorrect size."); |
| 612 | 647 | ||
| 648 | FileSystemController& fsc; | ||
| 613 | std::vector<SaveDataInfo> info; | 649 | std::vector<SaveDataInfo> info; |
| 614 | u64 next_entry_index = 0; | 650 | u64 next_entry_index = 0; |
| 615 | }; | 651 | }; |
| 616 | 652 | ||
| 617 | FSP_SRV::FSP_SRV(const Core::Reporter& reporter) : ServiceFramework("fsp-srv"), reporter(reporter) { | 653 | FSP_SRV::FSP_SRV(FileSystemController& fsc, const Core::Reporter& reporter) |
| 654 | : ServiceFramework("fsp-srv"), fsc(fsc), reporter(reporter) { | ||
| 618 | // clang-format off | 655 | // clang-format off |
| 619 | static const FunctionInfo functions[] = { | 656 | static const FunctionInfo functions[] = { |
| 620 | {0, nullptr, "OpenFileSystem"}, | 657 | {0, nullptr, "OpenFileSystem"}, |
| @@ -754,7 +791,8 @@ void FSP_SRV::OpenFileSystemWithPatch(Kernel::HLERequestContext& ctx) { | |||
| 754 | void FSP_SRV::OpenSdCardFileSystem(Kernel::HLERequestContext& ctx) { | 791 | void FSP_SRV::OpenSdCardFileSystem(Kernel::HLERequestContext& ctx) { |
| 755 | LOG_DEBUG(Service_FS, "called"); | 792 | LOG_DEBUG(Service_FS, "called"); |
| 756 | 793 | ||
| 757 | IFileSystem filesystem(OpenSDMC().Unwrap()); | 794 | IFileSystem filesystem(fsc.OpenSDMC().Unwrap(), |
| 795 | SizeGetter::FromStorageId(fsc, FileSys::StorageId::SdCard)); | ||
| 758 | 796 | ||
| 759 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | 797 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
| 760 | rb.Push(RESULT_SUCCESS); | 798 | rb.Push(RESULT_SUCCESS); |
| @@ -768,8 +806,10 @@ void FSP_SRV::CreateSaveDataFileSystem(Kernel::HLERequestContext& ctx) { | |||
| 768 | auto save_create_struct = rp.PopRaw<std::array<u8, 0x40>>(); | 806 | auto save_create_struct = rp.PopRaw<std::array<u8, 0x40>>(); |
| 769 | u128 uid = rp.PopRaw<u128>(); | 807 | u128 uid = rp.PopRaw<u128>(); |
| 770 | 808 | ||
| 771 | LOG_WARNING(Service_FS, "(STUBBED) called save_struct = {}, uid = {:016X}{:016X}", | 809 | LOG_DEBUG(Service_FS, "called save_struct = {}, uid = {:016X}{:016X}", save_struct.DebugInfo(), |
| 772 | save_struct.DebugInfo(), uid[1], uid[0]); | 810 | uid[1], uid[0]); |
| 811 | |||
| 812 | fsc.CreateSaveData(FileSys::SaveDataSpaceId::NandUser, save_struct); | ||
| 773 | 813 | ||
| 774 | IPC::ResponseBuilder rb{ctx, 2}; | 814 | IPC::ResponseBuilder rb{ctx, 2}; |
| 775 | rb.Push(RESULT_SUCCESS); | 815 | rb.Push(RESULT_SUCCESS); |
| @@ -786,14 +826,24 @@ void FSP_SRV::OpenSaveDataFileSystem(Kernel::HLERequestContext& ctx) { | |||
| 786 | IPC::RequestParser rp{ctx}; | 826 | IPC::RequestParser rp{ctx}; |
| 787 | const auto parameters = rp.PopRaw<Parameters>(); | 827 | const auto parameters = rp.PopRaw<Parameters>(); |
| 788 | 828 | ||
| 789 | auto dir = OpenSaveData(parameters.save_data_space_id, parameters.descriptor); | 829 | auto dir = fsc.OpenSaveData(parameters.save_data_space_id, parameters.descriptor); |
| 790 | if (dir.Failed()) { | 830 | if (dir.Failed()) { |
| 791 | IPC::ResponseBuilder rb{ctx, 2, 0, 0}; | 831 | IPC::ResponseBuilder rb{ctx, 2, 0, 0}; |
| 792 | rb.Push(FileSys::ERROR_ENTITY_NOT_FOUND); | 832 | rb.Push(FileSys::ERROR_ENTITY_NOT_FOUND); |
| 793 | return; | 833 | return; |
| 794 | } | 834 | } |
| 795 | 835 | ||
| 796 | IFileSystem filesystem(std::move(dir.Unwrap())); | 836 | FileSys::StorageId id; |
| 837 | if (parameters.save_data_space_id == FileSys::SaveDataSpaceId::NandUser) { | ||
| 838 | id = FileSys::StorageId::NandUser; | ||
| 839 | } else if (parameters.save_data_space_id == FileSys::SaveDataSpaceId::SdCardSystem || | ||
| 840 | parameters.save_data_space_id == FileSys::SaveDataSpaceId::SdCardUser) { | ||
| 841 | id = FileSys::StorageId::SdCard; | ||
| 842 | } else { | ||
| 843 | id = FileSys::StorageId::NandSystem; | ||
| 844 | } | ||
| 845 | |||
| 846 | IFileSystem filesystem(std::move(dir.Unwrap()), SizeGetter::FromStorageId(fsc, id)); | ||
| 797 | 847 | ||
| 798 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | 848 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
| 799 | rb.Push(RESULT_SUCCESS); | 849 | rb.Push(RESULT_SUCCESS); |
| @@ -812,7 +862,7 @@ void FSP_SRV::OpenSaveDataInfoReaderBySaveDataSpaceId(Kernel::HLERequestContext& | |||
| 812 | 862 | ||
| 813 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | 863 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
| 814 | rb.Push(RESULT_SUCCESS); | 864 | rb.Push(RESULT_SUCCESS); |
| 815 | rb.PushIpcInterface<ISaveDataInfoReader>(std::make_shared<ISaveDataInfoReader>(space)); | 865 | rb.PushIpcInterface<ISaveDataInfoReader>(std::make_shared<ISaveDataInfoReader>(space, fsc)); |
| 816 | } | 866 | } |
| 817 | 867 | ||
| 818 | void FSP_SRV::SetGlobalAccessLogMode(Kernel::HLERequestContext& ctx) { | 868 | void FSP_SRV::SetGlobalAccessLogMode(Kernel::HLERequestContext& ctx) { |
| @@ -836,7 +886,7 @@ void FSP_SRV::GetGlobalAccessLogMode(Kernel::HLERequestContext& ctx) { | |||
| 836 | void FSP_SRV::OpenDataStorageByCurrentProcess(Kernel::HLERequestContext& ctx) { | 886 | void FSP_SRV::OpenDataStorageByCurrentProcess(Kernel::HLERequestContext& ctx) { |
| 837 | LOG_DEBUG(Service_FS, "called"); | 887 | LOG_DEBUG(Service_FS, "called"); |
| 838 | 888 | ||
| 839 | auto romfs = OpenRomFSCurrentProcess(); | 889 | auto romfs = fsc.OpenRomFSCurrentProcess(); |
| 840 | if (romfs.Failed()) { | 890 | if (romfs.Failed()) { |
| 841 | // TODO (bunnei): Find the right error code to use here | 891 | // TODO (bunnei): Find the right error code to use here |
| 842 | LOG_CRITICAL(Service_FS, "no file system interface available!"); | 892 | LOG_CRITICAL(Service_FS, "no file system interface available!"); |
| @@ -861,7 +911,7 @@ void FSP_SRV::OpenDataStorageByDataId(Kernel::HLERequestContext& ctx) { | |||
| 861 | LOG_DEBUG(Service_FS, "called with storage_id={:02X}, unknown={:08X}, title_id={:016X}", | 911 | LOG_DEBUG(Service_FS, "called with storage_id={:02X}, unknown={:08X}, title_id={:016X}", |
| 862 | static_cast<u8>(storage_id), unknown, title_id); | 912 | static_cast<u8>(storage_id), unknown, title_id); |
| 863 | 913 | ||
| 864 | auto data = OpenRomFS(title_id, storage_id, FileSys::ContentRecordType::Data); | 914 | auto data = fsc.OpenRomFS(title_id, storage_id, FileSys::ContentRecordType::Data); |
| 865 | 915 | ||
| 866 | if (data.Failed()) { | 916 | if (data.Failed()) { |
| 867 | const auto archive = FileSys::SystemArchive::SynthesizeSystemArchive(title_id); | 917 | const auto archive = FileSys::SystemArchive::SynthesizeSystemArchive(title_id); |
diff --git a/src/core/hle/service/filesystem/fsp_srv.h b/src/core/hle/service/filesystem/fsp_srv.h index b5486a193..d52b55999 100644 --- a/src/core/hle/service/filesystem/fsp_srv.h +++ b/src/core/hle/service/filesystem/fsp_srv.h | |||
| @@ -32,7 +32,7 @@ enum class LogMode : u32 { | |||
| 32 | 32 | ||
| 33 | class FSP_SRV final : public ServiceFramework<FSP_SRV> { | 33 | class FSP_SRV final : public ServiceFramework<FSP_SRV> { |
| 34 | public: | 34 | public: |
| 35 | explicit FSP_SRV(const Core::Reporter& reporter); | 35 | explicit FSP_SRV(FileSystemController& fsc, const Core::Reporter& reporter); |
| 36 | ~FSP_SRV() override; | 36 | ~FSP_SRV() override; |
| 37 | 37 | ||
| 38 | private: | 38 | private: |
| @@ -51,6 +51,8 @@ private: | |||
| 51 | void OutputAccessLogToSdCard(Kernel::HLERequestContext& ctx); | 51 | void OutputAccessLogToSdCard(Kernel::HLERequestContext& ctx); |
| 52 | void GetAccessLogVersionInfo(Kernel::HLERequestContext& ctx); | 52 | void GetAccessLogVersionInfo(Kernel::HLERequestContext& ctx); |
| 53 | 53 | ||
| 54 | FileSystemController& fsc; | ||
| 55 | |||
| 54 | FileSys::VirtualFile romfs; | 56 | FileSys::VirtualFile romfs; |
| 55 | u64 current_process_id = 0; | 57 | u64 current_process_id = 0; |
| 56 | u32 access_log_program_index = 0; | 58 | u32 access_log_program_index = 0; |
diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp index ce88a2941..13121c4f1 100644 --- a/src/core/hle/service/ns/ns.cpp +++ b/src/core/hle/service/ns/ns.cpp | |||
| @@ -617,7 +617,7 @@ public: | |||
| 617 | } | 617 | } |
| 618 | }; | 618 | }; |
| 619 | 619 | ||
| 620 | void InstallInterfaces(SM::ServiceManager& service_manager) { | 620 | void InstallInterfaces(SM::ServiceManager& service_manager, FileSystem::FileSystemController& fsc) { |
| 621 | std::make_shared<NS>("ns:am2")->InstallAsService(service_manager); | 621 | std::make_shared<NS>("ns:am2")->InstallAsService(service_manager); |
| 622 | std::make_shared<NS>("ns:ec")->InstallAsService(service_manager); | 622 | std::make_shared<NS>("ns:ec")->InstallAsService(service_manager); |
| 623 | std::make_shared<NS>("ns:rid")->InstallAsService(service_manager); | 623 | std::make_shared<NS>("ns:rid")->InstallAsService(service_manager); |
| @@ -628,7 +628,7 @@ void InstallInterfaces(SM::ServiceManager& service_manager) { | |||
| 628 | std::make_shared<NS_SU>()->InstallAsService(service_manager); | 628 | std::make_shared<NS_SU>()->InstallAsService(service_manager); |
| 629 | std::make_shared<NS_VM>()->InstallAsService(service_manager); | 629 | std::make_shared<NS_VM>()->InstallAsService(service_manager); |
| 630 | 630 | ||
| 631 | std::make_shared<PL_U>()->InstallAsService(service_manager); | 631 | std::make_shared<PL_U>(fsc)->InstallAsService(service_manager); |
| 632 | } | 632 | } |
| 633 | 633 | ||
| 634 | } // namespace Service::NS | 634 | } // namespace Service::NS |
diff --git a/src/core/hle/service/ns/ns.h b/src/core/hle/service/ns/ns.h index 0e8256cb4..d067e7a9a 100644 --- a/src/core/hle/service/ns/ns.h +++ b/src/core/hle/service/ns/ns.h | |||
| @@ -6,7 +6,13 @@ | |||
| 6 | 6 | ||
| 7 | #include "core/hle/service/service.h" | 7 | #include "core/hle/service/service.h" |
| 8 | 8 | ||
| 9 | namespace Service::NS { | 9 | namespace Service { |
| 10 | |||
| 11 | namespace FileSystem { | ||
| 12 | class FileSystemController; | ||
| 13 | } // namespace FileSystem | ||
| 14 | |||
| 15 | namespace NS { | ||
| 10 | 16 | ||
| 11 | class IAccountProxyInterface final : public ServiceFramework<IAccountProxyInterface> { | 17 | class IAccountProxyInterface final : public ServiceFramework<IAccountProxyInterface> { |
| 12 | public: | 18 | public: |
| @@ -91,6 +97,8 @@ private: | |||
| 91 | }; | 97 | }; |
| 92 | 98 | ||
| 93 | /// Registers all NS services with the specified service manager. | 99 | /// Registers all NS services with the specified service manager. |
| 94 | void InstallInterfaces(SM::ServiceManager& service_manager); | 100 | void InstallInterfaces(SM::ServiceManager& service_manager, FileSystem::FileSystemController& fsc); |
| 101 | |||
| 102 | } // namespace NS | ||
| 95 | 103 | ||
| 96 | } // namespace Service::NS | 104 | } // namespace Service |
diff --git a/src/core/hle/service/ns/pl_u.cpp b/src/core/hle/service/ns/pl_u.cpp index 2a522136d..9d49f36e8 100644 --- a/src/core/hle/service/ns/pl_u.cpp +++ b/src/core/hle/service/ns/pl_u.cpp | |||
| @@ -150,7 +150,8 @@ struct PL_U::Impl { | |||
| 150 | std::vector<FontRegion> shared_font_regions; | 150 | std::vector<FontRegion> shared_font_regions; |
| 151 | }; | 151 | }; |
| 152 | 152 | ||
| 153 | PL_U::PL_U() : ServiceFramework("pl:u"), impl{std::make_unique<Impl>()} { | 153 | PL_U::PL_U(FileSystem::FileSystemController& fsc) |
| 154 | : ServiceFramework("pl:u"), impl{std::make_unique<Impl>()} { | ||
| 154 | static const FunctionInfo functions[] = { | 155 | static const FunctionInfo functions[] = { |
| 155 | {0, &PL_U::RequestLoad, "RequestLoad"}, | 156 | {0, &PL_U::RequestLoad, "RequestLoad"}, |
| 156 | {1, &PL_U::GetLoadState, "GetLoadState"}, | 157 | {1, &PL_U::GetLoadState, "GetLoadState"}, |
| @@ -161,7 +162,7 @@ PL_U::PL_U() : ServiceFramework("pl:u"), impl{std::make_unique<Impl>()} { | |||
| 161 | }; | 162 | }; |
| 162 | RegisterHandlers(functions); | 163 | RegisterHandlers(functions); |
| 163 | // Attempt to load shared font data from disk | 164 | // Attempt to load shared font data from disk |
| 164 | const auto* nand = FileSystem::GetSystemNANDContents(); | 165 | const auto* nand = fsc.GetSystemNANDContents(); |
| 165 | std::size_t offset = 0; | 166 | std::size_t offset = 0; |
| 166 | // Rebuild shared fonts from data ncas | 167 | // Rebuild shared fonts from data ncas |
| 167 | if (nand->HasEntry(static_cast<u64>(FontArchives::Standard), | 168 | if (nand->HasEntry(static_cast<u64>(FontArchives::Standard), |
diff --git a/src/core/hle/service/ns/pl_u.h b/src/core/hle/service/ns/pl_u.h index 253f26a2a..35ca424d2 100644 --- a/src/core/hle/service/ns/pl_u.h +++ b/src/core/hle/service/ns/pl_u.h | |||
| @@ -7,11 +7,17 @@ | |||
| 7 | #include <memory> | 7 | #include <memory> |
| 8 | #include "core/hle/service/service.h" | 8 | #include "core/hle/service/service.h" |
| 9 | 9 | ||
| 10 | namespace Service::NS { | 10 | namespace Service { |
| 11 | |||
| 12 | namespace FileSystem { | ||
| 13 | class FileSystemController; | ||
| 14 | } // namespace FileSystem | ||
| 15 | |||
| 16 | namespace NS { | ||
| 11 | 17 | ||
| 12 | class PL_U final : public ServiceFramework<PL_U> { | 18 | class PL_U final : public ServiceFramework<PL_U> { |
| 13 | public: | 19 | public: |
| 14 | PL_U(); | 20 | PL_U(FileSystem::FileSystemController& fsc); |
| 15 | ~PL_U() override; | 21 | ~PL_U() override; |
| 16 | 22 | ||
| 17 | private: | 23 | private: |
| @@ -26,4 +32,6 @@ private: | |||
| 26 | std::unique_ptr<Impl> impl; | 32 | std::unique_ptr<Impl> impl; |
| 27 | }; | 33 | }; |
| 28 | 34 | ||
| 29 | } // namespace Service::NS | 35 | } // namespace NS |
| 36 | |||
| 37 | } // namespace Service | ||
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 3a0f8c3f6..454387467 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp | |||
| @@ -199,6 +199,7 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm, Core::System& system) { | |||
| 199 | // NVFlinger needs to be accessed by several services like Vi and AppletOE so we instantiate it | 199 | // NVFlinger needs to be accessed by several services like Vi and AppletOE so we instantiate it |
| 200 | // here and pass it into the respective InstallInterfaces functions. | 200 | // here and pass it into the respective InstallInterfaces functions. |
| 201 | auto nv_flinger = std::make_shared<NVFlinger::NVFlinger>(system.CoreTiming()); | 201 | auto nv_flinger = std::make_shared<NVFlinger::NVFlinger>(system.CoreTiming()); |
| 202 | system.GetFileSystemController().CreateFactories(*system.GetFilesystem(), false); | ||
| 202 | 203 | ||
| 203 | SM::ServiceManager::InstallInterfaces(sm); | 204 | SM::ServiceManager::InstallInterfaces(sm); |
| 204 | 205 | ||
| @@ -235,7 +236,7 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm, Core::System& system) { | |||
| 235 | NIFM::InstallInterfaces(*sm); | 236 | NIFM::InstallInterfaces(*sm); |
| 236 | NIM::InstallInterfaces(*sm); | 237 | NIM::InstallInterfaces(*sm); |
| 237 | NPNS::InstallInterfaces(*sm); | 238 | NPNS::InstallInterfaces(*sm); |
| 238 | NS::InstallInterfaces(*sm); | 239 | NS::InstallInterfaces(*sm, system.GetFileSystemController()); |
| 239 | Nvidia::InstallInterfaces(*sm, *nv_flinger, system); | 240 | Nvidia::InstallInterfaces(*sm, *nv_flinger, system); |
| 240 | PCIe::InstallInterfaces(*sm); | 241 | PCIe::InstallInterfaces(*sm); |
| 241 | PCTL::InstallInterfaces(*sm); | 242 | PCTL::InstallInterfaces(*sm); |
diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h index c6c4bdae5..aef964861 100644 --- a/src/core/hle/service/service.h +++ b/src/core/hle/service/service.h | |||
| @@ -18,10 +18,6 @@ namespace Core { | |||
| 18 | class System; | 18 | class System; |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | namespace FileSys { | ||
| 22 | class VfsFilesystem; | ||
| 23 | } | ||
| 24 | |||
| 25 | namespace Kernel { | 21 | namespace Kernel { |
| 26 | class ClientPort; | 22 | class ClientPort; |
| 27 | class ServerPort; | 23 | class ServerPort; |
| @@ -31,6 +27,10 @@ class HLERequestContext; | |||
| 31 | 27 | ||
| 32 | namespace Service { | 28 | namespace Service { |
| 33 | 29 | ||
| 30 | namespace FileSystem { | ||
| 31 | class FileSystemController; | ||
| 32 | } // namespace FileSystem | ||
| 33 | |||
| 34 | namespace SM { | 34 | namespace SM { |
| 35 | class ServiceManager; | 35 | class ServiceManager; |
| 36 | } | 36 | } |