summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Zach Hilman2019-04-16 09:13:34 -0400
committerGravatar Zach Hilman2019-09-21 16:43:10 -0400
commit8abbc619a1b452e2324f9482226d544fa9bcd3f2 (patch)
treed3d9341bd3c68075bf9ba482852856b0182a29bd /src
parentsubmisson_package: Fix edge case with improperly sized filenames (diff)
downloadyuzu-8abbc619a1b452e2324f9482226d544fa9bcd3f2.tar.gz
yuzu-8abbc619a1b452e2324f9482226d544fa9bcd3f2.tar.xz
yuzu-8abbc619a1b452e2324f9482226d544fa9bcd3f2.zip
filesystem: Add FileSystemController to deglobalize FS services
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/filesystem/filesystem.cpp309
-rw-r--r--src/core/hle/service/filesystem/filesystem.h108
2 files changed, 359 insertions, 58 deletions
diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp
index 8ce110dd1..adc1917aa 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"
@@ -251,44 +252,35 @@ ResultVal<FileSys::EntryType> VfsDirectoryServiceWrapper::GetEntryType(
251 return FileSys::ERROR_PATH_NOT_FOUND; 252 return FileSys::ERROR_PATH_NOT_FOUND;
252} 253}
253 254
254/** 255ResultCode FileSystemController::RegisterRomFS(std::unique_ptr<FileSys::RomFSFactory>&& factory) {
255 * Map of registered file systems, identified by type. Once an file system is registered here, it
256 * is never removed until UnregisterFileSystems is called.
257 */
258static std::unique_ptr<FileSys::RomFSFactory> romfs_factory;
259static std::unique_ptr<FileSys::SaveDataFactory> save_data_factory;
260static std::unique_ptr<FileSys::SDMCFactory> sdmc_factory;
261static std::unique_ptr<FileSys::BISFactory> bis_factory;
262
263ResultCode 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); 256 romfs_factory = std::move(factory);
266 LOG_DEBUG(Service_FS, "Registered RomFS"); 257 LOG_DEBUG(Service_FS, "Registered RomFS");
267 return RESULT_SUCCESS; 258 return RESULT_SUCCESS;
268} 259}
269 260
270ResultCode RegisterSaveData(std::unique_ptr<FileSys::SaveDataFactory>&& factory) { 261ResultCode FileSystemController::RegisterSaveData(
271 ASSERT_MSG(romfs_factory == nullptr, "Tried to register a second save data"); 262 std::unique_ptr<FileSys::SaveDataFactory>&& factory) {
263 ASSERT_MSG(save_data_factory == nullptr, "Tried to register a second save data");
272 save_data_factory = std::move(factory); 264 save_data_factory = std::move(factory);
273 LOG_DEBUG(Service_FS, "Registered save data"); 265 LOG_DEBUG(Service_FS, "Registered save data");
274 return RESULT_SUCCESS; 266 return RESULT_SUCCESS;
275} 267}
276 268
277ResultCode RegisterSDMC(std::unique_ptr<FileSys::SDMCFactory>&& factory) { 269ResultCode FileSystemController::RegisterSDMC(std::unique_ptr<FileSys::SDMCFactory>&& factory) {
278 ASSERT_MSG(sdmc_factory == nullptr, "Tried to register a second SDMC"); 270 ASSERT_MSG(sdmc_factory == nullptr, "Tried to register a second SDMC");
279 sdmc_factory = std::move(factory); 271 sdmc_factory = std::move(factory);
280 LOG_DEBUG(Service_FS, "Registered SDMC"); 272 LOG_DEBUG(Service_FS, "Registered SDMC");
281 return RESULT_SUCCESS; 273 return RESULT_SUCCESS;
282} 274}
283 275
284ResultCode RegisterBIS(std::unique_ptr<FileSys::BISFactory>&& factory) { 276ResultCode FileSystemController::RegisterBIS(std::unique_ptr<FileSys::BISFactory>&& factory) {
285 ASSERT_MSG(bis_factory == nullptr, "Tried to register a second BIS"); 277 ASSERT_MSG(bis_factory == nullptr, "Tried to register a second BIS");
286 bis_factory = std::move(factory); 278 bis_factory = std::move(factory);
287 LOG_DEBUG(Service_FS, "Registered BIS"); 279 LOG_DEBUG(Service_FS, "Registered BIS");
288 return RESULT_SUCCESS; 280 return RESULT_SUCCESS;
289} 281}
290 282
291void SetPackedUpdate(FileSys::VirtualFile update_raw) { 283void FileSystemController::SetPackedUpdate(FileSys::VirtualFile update_raw) {
292 LOG_TRACE(Service_FS, "Setting packed update for romfs"); 284 LOG_TRACE(Service_FS, "Setting packed update for romfs");
293 285
294 if (romfs_factory == nullptr) 286 if (romfs_factory == nullptr)
@@ -297,7 +289,7 @@ void SetPackedUpdate(FileSys::VirtualFile update_raw) {
297 romfs_factory->SetPackedUpdate(std::move(update_raw)); 289 romfs_factory->SetPackedUpdate(std::move(update_raw));
298} 290}
299 291
300ResultVal<FileSys::VirtualFile> OpenRomFSCurrentProcess() { 292ResultVal<FileSys::VirtualFile> FileSystemController::OpenRomFSCurrentProcess() {
301 LOG_TRACE(Service_FS, "Opening RomFS for current process"); 293 LOG_TRACE(Service_FS, "Opening RomFS for current process");
302 294
303 if (romfs_factory == nullptr) { 295 if (romfs_factory == nullptr) {
@@ -308,8 +300,9 @@ ResultVal<FileSys::VirtualFile> OpenRomFSCurrentProcess() {
308 return romfs_factory->OpenCurrentProcess(); 300 return romfs_factory->OpenCurrentProcess();
309} 301}
310 302
311ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId storage_id, 303ResultVal<FileSys::VirtualFile> FileSystemController::OpenRomFS(u64 title_id,
312 FileSys::ContentRecordType type) { 304 FileSys::StorageId storage_id,
305 FileSys::ContentRecordType type) {
313 LOG_TRACE(Service_FS, "Opening RomFS for title_id={:016X}, storage_id={:02X}, type={:02X}", 306 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)); 307 title_id, static_cast<u8>(storage_id), static_cast<u8>(type));
315 308
@@ -321,8 +314,20 @@ ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId stora
321 return romfs_factory->Open(title_id, storage_id, type); 314 return romfs_factory->Open(title_id, storage_id, type);
322} 315}
323 316
324ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space, 317ResultVal<FileSys::VirtualDir> FileSystemController::CreateSaveData(
325 const FileSys::SaveDataDescriptor& descriptor) { 318 FileSys::SaveDataSpaceId space, const FileSys::SaveDataDescriptor& save_struct) {
319 LOG_TRACE(Service_FS, "Creating Save Data for space_id={:01X}, save_struct={}",
320 static_cast<u8>(space), save_struct.DebugInfo());
321
322 if (save_data_factory == nullptr) {
323 return FileSys::ERROR_ENTITY_NOT_FOUND;
324 }
325
326 return save_data_factory->Create(space, save_struct);
327}
328
329ResultVal<FileSys::VirtualDir> FileSystemController::OpenSaveData(
330 FileSys::SaveDataSpaceId space, const FileSys::SaveDataDescriptor& descriptor) {
326 LOG_TRACE(Service_FS, "Opening Save Data for space_id={:01X}, save_struct={}", 331 LOG_TRACE(Service_FS, "Opening Save Data for space_id={:01X}, save_struct={}",
327 static_cast<u8>(space), descriptor.DebugInfo()); 332 static_cast<u8>(space), descriptor.DebugInfo());
328 333
@@ -333,7 +338,8 @@ ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space,
333 return save_data_factory->Open(space, descriptor); 338 return save_data_factory->Open(space, descriptor);
334} 339}
335 340
336ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space) { 341ResultVal<FileSys::VirtualDir> FileSystemController::OpenSaveDataSpace(
342 FileSys::SaveDataSpaceId space) {
337 LOG_TRACE(Service_FS, "Opening Save Data Space for space_id={:01X}", static_cast<u8>(space)); 343 LOG_TRACE(Service_FS, "Opening Save Data Space for space_id={:01X}", static_cast<u8>(space));
338 344
339 if (save_data_factory == nullptr) { 345 if (save_data_factory == nullptr) {
@@ -343,7 +349,7 @@ ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space)
343 return MakeResult(save_data_factory->GetSaveDataSpaceDirectory(space)); 349 return MakeResult(save_data_factory->GetSaveDataSpaceDirectory(space));
344} 350}
345 351
346ResultVal<FileSys::VirtualDir> OpenSDMC() { 352ResultVal<FileSys::VirtualDir> FileSystemController::OpenSDMC() {
347 LOG_TRACE(Service_FS, "Opening SDMC"); 353 LOG_TRACE(Service_FS, "Opening SDMC");
348 354
349 if (sdmc_factory == nullptr) { 355 if (sdmc_factory == nullptr) {
@@ -353,7 +359,91 @@ ResultVal<FileSys::VirtualDir> OpenSDMC() {
353 return sdmc_factory->Open(); 359 return sdmc_factory->Open();
354} 360}
355 361
356FileSys::SaveDataSize ReadSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id) { 362ResultVal<FileSys::VirtualDir> FileSystemController::OpenBISPartition(FileSys::BisPartitionId id) {
363 LOG_TRACE(Service_FS, "Opening BIS Partition with id={:08X}", static_cast<u32>(id));
364
365 if (bis_factory == nullptr) {
366 return FileSys::ERROR_ENTITY_NOT_FOUND;
367 }
368
369 auto part = bis_factory->OpenPartition(id);
370 if (part == nullptr) {
371 return FileSys::ERROR_INVALID_ARGUMENT;
372 }
373
374 return MakeResult<FileSys::VirtualDir>(std::move(part));
375}
376
377ResultVal<FileSys::VirtualFile> FileSystemController::OpenBISPartitionStorage(
378 FileSys::BisPartitionId id) {
379 LOG_TRACE(Service_FS, "Opening BIS Partition Storage with id={:08X}", static_cast<u32>(id));
380
381 if (bis_factory == nullptr) {
382 return FileSys::ERROR_ENTITY_NOT_FOUND;
383 }
384
385 auto part = bis_factory->OpenPartitionStorage(id);
386 if (part == nullptr) {
387 return FileSys::ERROR_INVALID_ARGUMENT;
388 }
389
390 return MakeResult<FileSys::VirtualFile>(std::move(part));
391}
392
393u64 FileSystemController::GetFreeSpaceSize(FileSys::StorageId id) const {
394 switch (id) {
395 case FileSys::StorageId::None:
396 case FileSys::StorageId::GameCard:
397 return 0;
398 case FileSys::StorageId::SdCard:
399 if (sdmc_factory == nullptr)
400 return 0;
401 return sdmc_factory->GetSDMCFreeSpace();
402 case FileSys::StorageId::Host:
403 if (bis_factory == nullptr)
404 return 0;
405 return bis_factory->GetSystemNANDFreeSpace() + bis_factory->GetUserNANDFreeSpace();
406 case FileSys::StorageId::NandSystem:
407 if (bis_factory == nullptr)
408 return 0;
409 return bis_factory->GetSystemNANDFreeSpace();
410 case FileSys::StorageId::NandUser:
411 if (bis_factory == nullptr)
412 return 0;
413 return bis_factory->GetUserNANDFreeSpace();
414 }
415
416 return 0;
417}
418
419u64 FileSystemController::GetTotalSpaceSize(FileSys::StorageId id) const {
420 switch (id) {
421 case FileSys::StorageId::None:
422 case FileSys::StorageId::GameCard:
423 return 0;
424 case FileSys::StorageId::SdCard:
425 if (sdmc_factory == nullptr)
426 return 0;
427 return sdmc_factory->GetSDMCTotalSpace();
428 case FileSys::StorageId::Host:
429 if (bis_factory == nullptr)
430 return 0;
431 return bis_factory->GetFullNANDTotalSpace();
432 case FileSys::StorageId::NandSystem:
433 if (bis_factory == nullptr)
434 return 0;
435 return bis_factory->GetSystemNANDTotalSpace();
436 case FileSys::StorageId::NandUser:
437 if (bis_factory == nullptr)
438 return 0;
439 return bis_factory->GetUserNANDTotalSpace();
440 }
441
442 return 0;
443}
444
445FileSys::SaveDataSize FileSystemController::ReadSaveDataSize(FileSys::SaveDataType type,
446 u64 title_id, u128 user_id) {
357 if (save_data_factory == nullptr) { 447 if (save_data_factory == nullptr) {
358 return {0, 0}; 448 return {0, 0};
359 } 449 }
@@ -385,13 +475,32 @@ FileSys::SaveDataSize ReadSaveDataSize(FileSys::SaveDataType type, u64 title_id,
385 return value; 475 return value;
386} 476}
387 477
388void WriteSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id, 478void FileSystemController::WriteSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id,
389 FileSys::SaveDataSize new_value) { 479 FileSys::SaveDataSize new_value) {
390 if (save_data_factory != nullptr) 480 if (save_data_factory != nullptr)
391 save_data_factory->WriteSaveDataSize(type, title_id, user_id, new_value); 481 save_data_factory->WriteSaveDataSize(type, title_id, user_id, new_value);
392} 482}
393 483
394FileSys::RegisteredCache* GetSystemNANDContents() { 484void FileSystemController::SetGameCard(FileSys::VirtualFile file) {
485 gamecard = std::make_unique<FileSys::XCI>(file);
486 const auto dir = gamecard->ConcatenatedPseudoDirectory();
487 gamecard_registered = std::make_unique<FileSys::RegisteredCache>(dir);
488 gamecard_placeholder = std::make_unique<FileSys::PlaceholderCache>(dir);
489}
490
491FileSys::XCI* FileSystemController::GetGameCard() {
492 return gamecard.get();
493}
494
495FileSys::RegisteredCache* FileSystemController::GetGameCardContents() {
496 return gamecard_registered.get();
497}
498
499FileSys::PlaceholderCache* FileSystemController::GetGameCardPlaceholder() {
500 return gamecard_placeholder.get();
501}
502
503FileSys::RegisteredCache* FileSystemController::GetSystemNANDContents() {
395 LOG_TRACE(Service_FS, "Opening System NAND Contents"); 504 LOG_TRACE(Service_FS, "Opening System NAND Contents");
396 505
397 if (bis_factory == nullptr) 506 if (bis_factory == nullptr)
@@ -400,7 +509,7 @@ FileSys::RegisteredCache* GetSystemNANDContents() {
400 return bis_factory->GetSystemNANDContents(); 509 return bis_factory->GetSystemNANDContents();
401} 510}
402 511
403FileSys::RegisteredCache* GetUserNANDContents() { 512FileSys::RegisteredCache* FileSystemController::GetUserNANDContents() {
404 LOG_TRACE(Service_FS, "Opening User NAND Contents"); 513 LOG_TRACE(Service_FS, "Opening User NAND Contents");
405 514
406 if (bis_factory == nullptr) 515 if (bis_factory == nullptr)
@@ -409,7 +518,7 @@ FileSys::RegisteredCache* GetUserNANDContents() {
409 return bis_factory->GetUserNANDContents(); 518 return bis_factory->GetUserNANDContents();
410} 519}
411 520
412FileSys::RegisteredCache* GetSDMCContents() { 521FileSys::RegisteredCache* FileSystemController::GetSDMCContents() {
413 LOG_TRACE(Service_FS, "Opening SDMC Contents"); 522 LOG_TRACE(Service_FS, "Opening SDMC Contents");
414 523
415 if (sdmc_factory == nullptr) 524 if (sdmc_factory == nullptr)
@@ -418,7 +527,143 @@ FileSys::RegisteredCache* GetSDMCContents() {
418 return sdmc_factory->GetSDMCContents(); 527 return sdmc_factory->GetSDMCContents();
419} 528}
420 529
421FileSys::VirtualDir GetModificationLoadRoot(u64 title_id) { 530FileSys::PlaceholderCache* FileSystemController::GetSystemNANDPlaceholder() {
531 LOG_TRACE(Service_FS, "Opening System NAND Placeholder");
532
533 if (bis_factory == nullptr)
534 return nullptr;
535
536 return bis_factory->GetSystemNANDPlaceholder();
537}
538
539FileSys::PlaceholderCache* FileSystemController::GetUserNANDPlaceholder() {
540 LOG_TRACE(Service_FS, "Opening User NAND Placeholder");
541
542 if (bis_factory == nullptr)
543 return nullptr;
544
545 return bis_factory->GetUserNANDPlaceholder();
546}
547
548FileSys::PlaceholderCache* FileSystemController::GetSDMCPlaceholder() {
549 LOG_TRACE(Service_FS, "Opening SDMC Placeholder");
550
551 if (sdmc_factory == nullptr)
552 return nullptr;
553
554 return sdmc_factory->GetSDMCPlaceholder();
555}
556
557FileSys::RegisteredCache* FileSystemController::GetRegisteredCacheForStorage(
558 FileSys::StorageId id) {
559 switch (id) {
560 case FileSys::StorageId::None:
561 case FileSys::StorageId::Host:
562 UNIMPLEMENTED();
563 return nullptr;
564 case FileSys::StorageId::GameCard:
565 return GetGameCardContents();
566 case FileSys::StorageId::NandSystem:
567 return GetSystemNANDContents();
568 case FileSys::StorageId::NandUser:
569 return GetUserNANDContents();
570 case FileSys::StorageId::SdCard:
571 return GetSDMCContents();
572 }
573
574 return nullptr;
575}
576
577FileSys::PlaceholderCache* FileSystemController::GetPlaceholderCacheForStorage(
578 FileSys::StorageId id) {
579 switch (id) {
580 case FileSys::StorageId::None:
581 case FileSys::StorageId::Host:
582 UNIMPLEMENTED();
583 return nullptr;
584 case FileSys::StorageId::GameCard:
585 return GetGameCardPlaceholder();
586 case FileSys::StorageId::NandSystem:
587 return GetSystemNANDPlaceholder();
588 case FileSys::StorageId::NandUser:
589 return GetUserNANDPlaceholder();
590 case FileSys::StorageId::SdCard:
591 return GetSDMCPlaceholder();
592 }
593
594 return nullptr;
595}
596
597FileSys::VirtualDir FileSystemController::GetSystemNANDContentDirectory() {
598 LOG_TRACE(Service_FS, "Opening system NAND content directory");
599
600 if (bis_factory == nullptr)
601 return nullptr;
602
603 return bis_factory->GetSystemNANDContentDirectory();
604}
605
606FileSys::VirtualDir FileSystemController::GetUserNANDContentDirectory() {
607 LOG_TRACE(Service_FS, "Opening user NAND content directory");
608
609 if (bis_factory == nullptr)
610 return nullptr;
611
612 return bis_factory->GetUserNANDContentDirectory();
613}
614
615FileSys::VirtualDir FileSystemController::GetSDMCContentDirectory() {
616 LOG_TRACE(Service_FS, "Opening SDMC content directory");
617
618 if (sdmc_factory == nullptr)
619 return nullptr;
620
621 return sdmc_factory->GetSDMCContentDirectory();
622}
623
624FileSys::VirtualDir FileSystemController::GetNANDImageDirectory() {
625 LOG_TRACE(Service_FS, "Opening NAND image directory");
626
627 if (bis_factory == nullptr)
628 return nullptr;
629
630 return bis_factory->GetImageDirectory();
631}
632
633FileSys::VirtualDir FileSystemController::GetSDMCImageDirectory() {
634 LOG_TRACE(Service_FS, "Opening SDMC image directory");
635
636 if (sdmc_factory == nullptr)
637 return nullptr;
638
639 return sdmc_factory->GetImageDirectory();
640}
641
642FileSys::VirtualDir FileSystemController::GetContentDirectory(ContentStorageId id) {
643 switch (id) {
644 case ContentStorageId::System:
645 return GetSystemNANDContentDirectory();
646 case ContentStorageId::User:
647 return GetUserNANDContentDirectory();
648 case ContentStorageId::SdCard:
649 return GetSDMCContentDirectory();
650 }
651
652 return nullptr;
653}
654
655FileSys::VirtualDir FileSystemController::GetImageDirectory(ImageDirectoryId id) {
656 switch (id) {
657 case ImageDirectoryId::NAND:
658 return GetNANDImageDirectory();
659 case ImageDirectoryId::SdCard:
660 return GetSDMCImageDirectory();
661 }
662
663 return nullptr;
664}
665
666FileSys::VirtualDir FileSystemController::GetModificationLoadRoot(u64 title_id) {
422 LOG_TRACE(Service_FS, "Opening mod load root for tid={:016X}", title_id); 667 LOG_TRACE(Service_FS, "Opening mod load root for tid={:016X}", title_id);
423 668
424 if (bis_factory == nullptr) 669 if (bis_factory == nullptr)
@@ -427,7 +672,7 @@ FileSys::VirtualDir GetModificationLoadRoot(u64 title_id) {
427 return bis_factory->GetModificationLoadRoot(title_id); 672 return bis_factory->GetModificationLoadRoot(title_id);
428} 673}
429 674
430FileSys::VirtualDir GetModificationDumpRoot(u64 title_id) { 675FileSys::VirtualDir FileSystemController::GetModificationDumpRoot(u64 title_id) {
431 LOG_TRACE(Service_FS, "Opening mod dump root for tid={:016X}", title_id); 676 LOG_TRACE(Service_FS, "Opening mod dump root for tid={:016X}", title_id);
432 677
433 if (bis_factory == nullptr) 678 if (bis_factory == nullptr)
@@ -436,7 +681,7 @@ FileSys::VirtualDir GetModificationDumpRoot(u64 title_id) {
436 return bis_factory->GetModificationDumpRoot(title_id); 681 return bis_factory->GetModificationDumpRoot(title_id);
437} 682}
438 683
439void CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite) { 684void FileSystemController::CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite) {
440 if (overwrite) { 685 if (overwrite) {
441 bis_factory = nullptr; 686 bis_factory = nullptr;
442 save_data_factory = nullptr; 687 save_data_factory = nullptr;
diff --git a/src/core/hle/service/filesystem/filesystem.h b/src/core/hle/service/filesystem/filesystem.h
index 3849dd89e..aa4e437ac 100644
--- a/src/core/hle/service/filesystem/filesystem.h
+++ b/src/core/hle/service/filesystem/filesystem.h
@@ -14,10 +14,13 @@ namespace FileSys {
14class BISFactory; 14class BISFactory;
15class RegisteredCache; 15class RegisteredCache;
16class RegisteredCacheUnion; 16class RegisteredCacheUnion;
17class PlaceholderCache;
17class RomFSFactory; 18class RomFSFactory;
18class SaveDataFactory; 19class SaveDataFactory;
19class SDMCFactory; 20class SDMCFactory;
21class XCI;
20 22
23enum class BisPartitionId : u32;
21enum class ContentRecordType : u8; 24enum class ContentRecordType : u8;
22enum class Mode : u32; 25enum class Mode : u32;
23enum class SaveDataSpaceId : u8; 26enum class SaveDataSpaceId : u8;
@@ -36,36 +39,89 @@ class ServiceManager;
36 39
37namespace FileSystem { 40namespace FileSystem {
38 41
39ResultCode RegisterRomFS(std::unique_ptr<FileSys::RomFSFactory>&& factory); 42enum class ContentStorageId : u32 {
40ResultCode RegisterSaveData(std::unique_ptr<FileSys::SaveDataFactory>&& factory); 43 System,
41ResultCode RegisterSDMC(std::unique_ptr<FileSys::SDMCFactory>&& factory); 44 User,
42ResultCode RegisterBIS(std::unique_ptr<FileSys::BISFactory>&& factory); 45 SdCard,
43 46};
44void SetPackedUpdate(FileSys::VirtualFile update_raw);
45ResultVal<FileSys::VirtualFile> OpenRomFSCurrentProcess();
46ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId storage_id,
47 FileSys::ContentRecordType type);
48ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space,
49 const FileSys::SaveDataDescriptor& descriptor);
50ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space);
51ResultVal<FileSys::VirtualDir> OpenSDMC();
52
53FileSys::SaveDataSize ReadSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id);
54void WriteSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id,
55 FileSys::SaveDataSize new_value);
56 47
57FileSys::RegisteredCache* GetSystemNANDContents(); 48enum class ImageDirectoryId : u32 {
58FileSys::RegisteredCache* GetUserNANDContents(); 49 NAND,
59FileSys::RegisteredCache* GetSDMCContents(); 50 SdCard,
51};
60 52
61FileSys::VirtualDir GetModificationLoadRoot(u64 title_id); 53class FileSystemController {
62FileSys::VirtualDir GetModificationDumpRoot(u64 title_id); 54public:
55 ResultCode RegisterRomFS(std::unique_ptr<FileSys::RomFSFactory>&& factory);
56 ResultCode RegisterSaveData(std::unique_ptr<FileSys::SaveDataFactory>&& factory);
57 ResultCode RegisterSDMC(std::unique_ptr<FileSys::SDMCFactory>&& factory);
58 ResultCode RegisterBIS(std::unique_ptr<FileSys::BISFactory>&& factory);
59
60 void SetPackedUpdate(FileSys::VirtualFile update_raw);
61 ResultVal<FileSys::VirtualFile> OpenRomFSCurrentProcess();
62 ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId storage_id,
63 FileSys::ContentRecordType type);
64 ResultVal<FileSys::VirtualDir> CreateSaveData(FileSys::SaveDataSpaceId space,
65 const FileSys::SaveDataDescriptor& save_struct);
66 ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space,
67 const FileSys::SaveDataDescriptor& save_struct);
68 ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space);
69 ResultVal<FileSys::VirtualDir> OpenSDMC();
70 ResultVal<FileSys::VirtualDir> OpenBISPartition(FileSys::BisPartitionId id);
71 ResultVal<FileSys::VirtualFile> OpenBISPartitionStorage(FileSys::BisPartitionId id);
72
73 u64 GetFreeSpaceSize(FileSys::StorageId id) const;
74 u64 GetTotalSpaceSize(FileSys::StorageId id) const;
75
76 FileSys::SaveDataSize ReadSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id);
77 void WriteSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id,
78 FileSys::SaveDataSize new_value);
79
80 void SetGameCard(FileSys::VirtualFile file);
81 FileSys::XCI* GetGameCard();
82
83 FileSys::RegisteredCache* GetSystemNANDContents();
84 FileSys::RegisteredCache* GetUserNANDContents();
85 FileSys::RegisteredCache* GetSDMCContents();
86 FileSys::RegisteredCache* GetGameCardContents();
87
88 FileSys::PlaceholderCache* GetSystemNANDPlaceholder();
89 FileSys::PlaceholderCache* GetUserNANDPlaceholder();
90 FileSys::PlaceholderCache* GetSDMCPlaceholder();
91 FileSys::PlaceholderCache* GetGameCardPlaceholder();
92
93 FileSys::RegisteredCache* GetRegisteredCacheForStorage(FileSys::StorageId id);
94 FileSys::PlaceholderCache* GetPlaceholderCacheForStorage(FileSys::StorageId id);
95
96 FileSys::VirtualDir GetSystemNANDContentDirectory();
97 FileSys::VirtualDir GetUserNANDContentDirectory();
98 FileSys::VirtualDir GetSDMCContentDirectory();
99
100 FileSys::VirtualDir GetNANDImageDirectory();
101 FileSys::VirtualDir GetSDMCImageDirectory();
102
103 FileSys::VirtualDir GetContentDirectory(ContentStorageId id);
104 FileSys::VirtualDir GetImageDirectory(ImageDirectoryId id);
105
106 FileSys::VirtualDir GetModificationLoadRoot(u64 title_id);
107 FileSys::VirtualDir GetModificationDumpRoot(u64 title_id);
108
109 // Creates the SaveData, SDMC, and BIS Factories. Should be called once and before any function
110 // above is called.
111 void CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite = true);
63 112
64// Creates the SaveData, SDMC, and BIS Factories. Should be called once and before any function 113private:
65// above is called. 114 std::unique_ptr<FileSys::RomFSFactory> romfs_factory;
66void CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite = true); 115 std::unique_ptr<FileSys::SaveDataFactory> save_data_factory;
116 std::unique_ptr<FileSys::SDMCFactory> sdmc_factory;
117 std::unique_ptr<FileSys::BISFactory> bis_factory;
118
119 std::unique_ptr<FileSys::XCI> gamecard;
120 std::unique_ptr<FileSys::RegisteredCache> gamecard_registered;
121 std::unique_ptr<FileSys::PlaceholderCache> gamecard_placeholder;
122};
67 123
68void InstallInterfaces(Core::System& system); 124void InstallInterfaces(SM::ServiceManager& service_manager, FileSystemController& controller);
69 125
70// A class that wraps a VfsDirectory with methods that return ResultVal and ResultCode instead of 126// A class that wraps a VfsDirectory with methods that return ResultVal and ResultCode instead of
71// pointers and booleans. This makes using a VfsDirectory with switch services much easier and 127// pointers and booleans. This makes using a VfsDirectory with switch services much easier and