filesystem.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <boost/container/flat_map.hpp>
  5. #include "common/file_util.h"
  6. #include "core/file_sys/filesystem.h"
  7. #include "core/file_sys/savedata_factory.h"
  8. #include "core/hle/service/filesystem/filesystem.h"
  9. #include "core/hle/service/filesystem/fsp_srv.h"
  10. namespace Service {
  11. namespace FileSystem {
  12. /**
  13. * Map of registered file systems, identified by type. Once an file system is registered here, it
  14. * is never removed until UnregisterFileSystems is called.
  15. */
  16. static boost::container::flat_map<Type, std::unique_ptr<FileSys::FileSystemFactory>> filesystem_map;
  17. ResultCode RegisterFileSystem(std::unique_ptr<FileSys::FileSystemFactory>&& factory, Type type) {
  18. auto result = filesystem_map.emplace(type, std::move(factory));
  19. bool inserted = result.second;
  20. ASSERT_MSG(inserted, "Tried to register more than one system with same id code");
  21. auto& filesystem = result.first->second;
  22. LOG_DEBUG(Service_FS, "Registered file system %s with id code 0x%08X",
  23. filesystem->GetName().c_str(), static_cast<u32>(type));
  24. return RESULT_SUCCESS;
  25. }
  26. ResultVal<std::unique_ptr<FileSys::FileSystemBackend>> OpenFileSystem(Type type,
  27. FileSys::Path& path) {
  28. LOG_TRACE(Service_FS, "Opening FileSystem with type=%d", type);
  29. auto itr = filesystem_map.find(type);
  30. if (itr == filesystem_map.end()) {
  31. // TODO(bunnei): Find a better error code for this
  32. return ResultCode(-1);
  33. }
  34. return itr->second->Open(path);
  35. }
  36. void RegisterFileSystems() {
  37. filesystem_map.clear();
  38. std::string nand_directory = FileUtil::GetUserPath(D_NAND_IDX);
  39. auto savedata = std::make_unique<FileSys::SaveData_Factory>(std::move(nand_directory));
  40. RegisterFileSystem(std::move(savedata), Type::SaveData);
  41. }
  42. void InstallInterfaces(SM::ServiceManager& service_manager) {
  43. RegisterFileSystems();
  44. std::make_shared<FSP_SRV>()->InstallAsService(service_manager);
  45. }
  46. } // namespace FileSystem
  47. } // namespace Service