summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp
diff options
context:
space:
mode:
authorFearlessTobi <thm.frey@gmail.com>2024-02-10 18:15:58 +0100
committerFearlessTobi <thm.frey@gmail.com>2024-02-19 19:20:40 +0100
commitd5e4617ab5c8b7e72e2155de886135766ce61c7a (patch)
tree5d76b2101df594324bedb323bb5340e24ed7fa7c /src/core/hle/service/filesystem/fsp/fs_i_directory.cpp
parentMerge pull request #13080 from FearlessTobi/scope-exit (diff)
downloadyuzu-d5e4617ab5c8b7e72e2155de886135766ce61c7a.tar
yuzu-d5e4617ab5c8b7e72e2155de886135766ce61c7a.tar.gz
yuzu-d5e4617ab5c8b7e72e2155de886135766ce61c7a.tar.bz2
yuzu-d5e4617ab5c8b7e72e2155de886135766ce61c7a.tar.lz
yuzu-d5e4617ab5c8b7e72e2155de886135766ce61c7a.tar.xz
yuzu-d5e4617ab5c8b7e72e2155de886135766ce61c7a.tar.zst
yuzu-d5e4617ab5c8b7e72e2155de886135766ce61c7a.zip
Diffstat (limited to 'src/core/hle/service/filesystem/fsp/fs_i_directory.cpp')
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_directory.cpp58
1 files changed, 12 insertions, 46 deletions
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp b/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp
index 39690018b..661da5326 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp
+++ b/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp
@@ -8,43 +8,15 @@
namespace Service::FileSystem {
-template <typename T>
-static void BuildEntryIndex(std::vector<FileSys::DirectoryEntry>& entries,
- const std::vector<T>& new_data, FileSys::DirectoryEntryType type) {
- entries.reserve(entries.size() + new_data.size());
-
- for (const auto& new_entry : new_data) {
- auto name = new_entry->GetName();
-
- if (type == FileSys::DirectoryEntryType::File &&
- name == FileSys::GetSaveDataSizeFileName()) {
- continue;
- }
-
- entries.emplace_back(name, static_cast<s8>(type),
- type == FileSys::DirectoryEntryType::Directory ? 0
- : new_entry->GetSize());
- }
-}
-
-IDirectory::IDirectory(Core::System& system_, FileSys::VirtualDir backend_,
+IDirectory::IDirectory(Core::System& system_, FileSys::VirtualDir directory_,
FileSys::OpenDirectoryMode mode)
- : ServiceFramework{system_, "IDirectory"}, backend(std::move(backend_)) {
+ : ServiceFramework{system_, "IDirectory"},
+ backend(std::make_unique<FileSys::Fsa::IDirectory>(directory_, mode)) {
static const FunctionInfo functions[] = {
{0, &IDirectory::Read, "Read"},
{1, &IDirectory::GetEntryCount, "GetEntryCount"},
};
RegisterHandlers(functions);
-
- // TODO(DarkLordZach): Verify that this is the correct behavior.
- // Build entry index now to save time later.
- if (True(mode & FileSys::OpenDirectoryMode::Directory)) {
- BuildEntryIndex(entries, backend->GetSubdirectories(),
- FileSys::DirectoryEntryType::Directory);
- }
- if (True(mode & FileSys::OpenDirectoryMode::File)) {
- BuildEntryIndex(entries, backend->GetFiles(), FileSys::DirectoryEntryType::File);
- }
}
void IDirectory::Read(HLERequestContext& ctx) {
@@ -53,32 +25,26 @@ void IDirectory::Read(HLERequestContext& ctx) {
// Calculate how many entries we can fit in the output buffer
const u64 count_entries = ctx.GetWriteBufferNumElements<FileSys::DirectoryEntry>();
- // Cap at total number of entries.
- const u64 actual_entries = std::min(count_entries, entries.size() - next_entry_index);
-
- // Determine data start and end
- const auto* begin = reinterpret_cast<u8*>(entries.data() + next_entry_index);
- const auto* end = reinterpret_cast<u8*>(entries.data() + next_entry_index + actual_entries);
- const auto range_size = static_cast<std::size_t>(std::distance(begin, end));
-
- next_entry_index += actual_entries;
+ s64 out_count{};
+ FileSys::DirectoryEntry* out_entries = nullptr;
+ const auto result = backend->Read(&out_count, out_entries, count_entries);
// Write the data to memory
- ctx.WriteBuffer(begin, range_size);
+ ctx.WriteBuffer(out_entries, out_count);
IPC::ResponseBuilder rb{ctx, 4};
- rb.Push(ResultSuccess);
- rb.Push(actual_entries);
+ rb.Push(result);
+ rb.Push(out_count);
}
void IDirectory::GetEntryCount(HLERequestContext& ctx) {
LOG_DEBUG(Service_FS, "called");
- u64 count = entries.size() - next_entry_index;
+ s64 out_count{};
IPC::ResponseBuilder rb{ctx, 4};
- rb.Push(ResultSuccess);
- rb.Push(count);
+ rb.Push(backend->GetEntryCount(&out_count));
+ rb.Push(out_count);
}
} // namespace Service::FileSystem