disk_filesystem.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <cstddef>
  6. #include <memory>
  7. #include <string>
  8. #include "common/common_types.h"
  9. #include "common/file_util.h"
  10. #include "core/file_sys/directory.h"
  11. #include "core/file_sys/filesystem.h"
  12. #include "core/file_sys/storage.h"
  13. #include "core/hle/result.h"
  14. namespace FileSys {
  15. class Disk_FileSystem : public FileSystemBackend {
  16. public:
  17. explicit Disk_FileSystem(std::string base_directory)
  18. : base_directory(std::move(base_directory)) {}
  19. std::string GetName() const override;
  20. ResultVal<std::unique_ptr<StorageBackend>> OpenFile(const std::string& path,
  21. Mode mode) const override;
  22. ResultCode DeleteFile(const Path& path) const override;
  23. ResultCode RenameFile(const Path& src_path, const Path& dest_path) const override;
  24. ResultCode DeleteDirectory(const Path& path) const override;
  25. ResultCode DeleteDirectoryRecursively(const Path& path) const override;
  26. ResultCode CreateFile(const std::string& path, u64 size) const override;
  27. ResultCode CreateDirectory(const std::string& path) const override;
  28. ResultCode RenameDirectory(const Path& src_path, const Path& dest_path) const override;
  29. ResultVal<std::unique_ptr<DirectoryBackend>> OpenDirectory(
  30. const std::string& path) const override;
  31. u64 GetFreeSpaceSize() const override;
  32. ResultVal<EntryType> GetEntryType(const std::string& path) const override;
  33. protected:
  34. std::string base_directory;
  35. };
  36. class Disk_Storage : public StorageBackend {
  37. public:
  38. Disk_Storage(std::shared_ptr<FileUtil::IOFile> file) : file(std::move(file)) {}
  39. ResultVal<size_t> Read(u64 offset, size_t length, u8* buffer) const override;
  40. ResultVal<size_t> Write(u64 offset, size_t length, bool flush, const u8* buffer) const override;
  41. u64 GetSize() const override;
  42. bool SetSize(u64 size) const override;
  43. bool Close() const override {
  44. return false;
  45. }
  46. void Flush() const override {}
  47. private:
  48. std::shared_ptr<FileUtil::IOFile> file;
  49. };
  50. class Disk_Directory : public DirectoryBackend {
  51. public:
  52. Disk_Directory(const std::string& path);
  53. ~Disk_Directory() override {
  54. Close();
  55. }
  56. u64 Read(const u64 count, Entry* entries) override;
  57. u64 GetEntryCount() const override;
  58. bool Close() const override {
  59. return true;
  60. }
  61. protected:
  62. u32 total_entries_in_directory;
  63. FileUtil::FSTEntry directory;
  64. // We need to remember the last entry we returned, so a subsequent call to Read will continue
  65. // from the next one. This iterator will always point to the next unread entry.
  66. std::vector<FileUtil::FSTEntry>::iterator children_iterator;
  67. };
  68. } // namespace FileSys