mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-11-04 04:34:07 +01:00 
			
		
		
		
	Merge pull request #12392 from liamwhite/mode
fs: implement OpenDirectoryMode
This commit is contained in:
		
						commit
						b14547b8b6
					
				@ -54,6 +54,13 @@ enum class ImageDirectoryId : u32 {
 | 
			
		||||
    SdCard,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum class OpenDirectoryMode : u64 {
 | 
			
		||||
    Directory = (1 << 0),
 | 
			
		||||
    File = (1 << 1),
 | 
			
		||||
    All = Directory | File
 | 
			
		||||
};
 | 
			
		||||
DECLARE_ENUM_FLAG_OPERATORS(OpenDirectoryMode);
 | 
			
		||||
 | 
			
		||||
class FileSystemController {
 | 
			
		||||
public:
 | 
			
		||||
    explicit FileSystemController(Core::System& system_);
 | 
			
		||||
 | 
			
		||||
@ -259,7 +259,7 @@ static void BuildEntryIndex(std::vector<FileSys::Entry>& entries, const std::vec
 | 
			
		||||
 | 
			
		||||
class IDirectory final : public ServiceFramework<IDirectory> {
 | 
			
		||||
public:
 | 
			
		||||
    explicit IDirectory(Core::System& system_, FileSys::VirtualDir backend_)
 | 
			
		||||
    explicit IDirectory(Core::System& system_, FileSys::VirtualDir backend_, OpenDirectoryMode mode)
 | 
			
		||||
        : ServiceFramework{system_, "IDirectory"}, backend(std::move(backend_)) {
 | 
			
		||||
        static const FunctionInfo functions[] = {
 | 
			
		||||
            {0, &IDirectory::Read, "Read"},
 | 
			
		||||
@ -269,8 +269,12 @@ public:
 | 
			
		||||
 | 
			
		||||
        // TODO(DarkLordZach): Verify that this is the correct behavior.
 | 
			
		||||
        // Build entry index now to save time later.
 | 
			
		||||
        BuildEntryIndex(entries, backend->GetFiles(), FileSys::EntryType::File);
 | 
			
		||||
        BuildEntryIndex(entries, backend->GetSubdirectories(), FileSys::EntryType::Directory);
 | 
			
		||||
        if (True(mode & OpenDirectoryMode::Directory)) {
 | 
			
		||||
            BuildEntryIndex(entries, backend->GetSubdirectories(), FileSys::EntryType::Directory);
 | 
			
		||||
        }
 | 
			
		||||
        if (True(mode & OpenDirectoryMode::File)) {
 | 
			
		||||
            BuildEntryIndex(entries, backend->GetFiles(), FileSys::EntryType::File);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
@ -446,11 +450,9 @@ public:
 | 
			
		||||
 | 
			
		||||
        const auto file_buffer = ctx.ReadBuffer();
 | 
			
		||||
        const std::string name = Common::StringFromBuffer(file_buffer);
 | 
			
		||||
        const auto mode = rp.PopRaw<OpenDirectoryMode>();
 | 
			
		||||
 | 
			
		||||
        // TODO(Subv): Implement this filter.
 | 
			
		||||
        const u32 filter_flags = rp.Pop<u32>();
 | 
			
		||||
 | 
			
		||||
        LOG_DEBUG(Service_FS, "called. directory={}, filter={}", name, filter_flags);
 | 
			
		||||
        LOG_DEBUG(Service_FS, "called. directory={}, mode={}", name, mode);
 | 
			
		||||
 | 
			
		||||
        FileSys::VirtualDir vfs_dir{};
 | 
			
		||||
        auto result = backend.OpenDirectory(&vfs_dir, name);
 | 
			
		||||
@ -460,7 +462,7 @@ public:
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        auto directory = std::make_shared<IDirectory>(system, vfs_dir);
 | 
			
		||||
        auto directory = std::make_shared<IDirectory>(system, vfs_dir, mode);
 | 
			
		||||
 | 
			
		||||
        IPC::ResponseBuilder rb{ctx, 2, 0, 1};
 | 
			
		||||
        rb.Push(ResultSuccess);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user