1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 20:17:44 +00:00

LibFileSystemAccessClient: Improve error propagation

Previously FSAC displayed some but not all errors and always
rejected directories and devices. This has led most apps to ignore
response errors in open/save actions or show redundant messages.

Now FSAC displays all errors including fd failures and has the ability
to silence messages for directories, devices and ENOENT, which some
apps handle differently. Silenced directory and device errors now
return files on success.

A request's access mode is now stored in RequestData to format more
accurate error messages from the user's perspective.

Resolved promises don't require callback propagation so they're voided
This commit is contained in:
thankyouverycool 2023-05-18 08:50:32 -04:00 committed by Andreas Kling
parent 7a183ee568
commit 37e621a3c7
2 changed files with 57 additions and 25 deletions

View file

@ -20,6 +20,14 @@
namespace FileSystemAccessClient {
enum ErrorFlag : u32 {
Devices = 1 << 0,
Directories = 1 << 1,
NoEntries = 1 << 2,
None = 0,
};
class Client;
class File {
public:
@ -51,6 +59,13 @@ public:
Result open_file(GUI::Window* parent_window, DeprecatedString const& window_title = {}, StringView path = Core::StandardPaths::home_directory(), Core::File::OpenMode requested_access = Core::File::OpenMode::Read, Optional<Vector<GUI::FileTypeFilter>> const& = {});
Result save_file(GUI::Window* parent_window, DeprecatedString const& name, DeprecatedString const ext, Core::File::OpenMode requested_access = Core::File::OpenMode::Write | Core::File::OpenMode::Truncate);
void set_silence_errors(u32 flags) { m_silenced_errors = flags; }
u32 silenced_errors() const { return m_silenced_errors; }
bool is_silencing_devices() { return m_silenced_errors & ErrorFlag::Devices; }
bool is_silencing_directories() { return m_silenced_errors & ErrorFlag::Directories; }
bool is_silencing_nonexistent_entries() { return m_silenced_errors & ErrorFlag::NoEntries; }
static Client& the();
protected:
@ -70,13 +85,15 @@ private:
template<typename T>
using PromiseType = RefPtr<Core::Promise<T>>;
struct PromiseAndWindow {
struct RequestData {
PromiseType<Result> promise;
GUI::Window* parent_window { nullptr };
Core::File::OpenMode mode { Core::File::OpenMode::NotOpen };
};
HashMap<int, PromiseAndWindow> m_promises {};
HashMap<int, RequestData> m_promises {};
int m_last_id { 0 };
u32 m_silenced_errors { ErrorFlag::None };
};
}