diff --git a/Userland/Libraries/LibConfig/Client.cpp b/Userland/Libraries/LibConfig/Client.cpp index 7046300bc0..9d026630b2 100644 --- a/Userland/Libraries/LibConfig/Client.cpp +++ b/Userland/Libraries/LibConfig/Client.cpp @@ -75,6 +75,16 @@ void Client::remove_key(StringView domain, StringView group, StringView key) remove_key_entry(domain, group, key); } +void Client::remove_group(StringView domain, StringView group) +{ + remove_group_entry(domain, group); +} + +void Client::add_group(StringView domain, StringView group) +{ + add_group_entry(domain, group); +} + void Client::notify_changed_string_value(String const& domain, String const& group, String const& key, String const& value) { Listener::for_each([&](auto& listener) { @@ -103,4 +113,18 @@ void Client::notify_removed_key(String const& domain, String const& group, Strin }); } +void Client::notify_removed_group(String const& domain, String const& group) +{ + Listener::for_each([&](auto& listener) { + listener.config_group_was_removed(domain, group); + }); +} + +void Client::notify_added_group(String const& domain, String const& group) +{ + Listener::for_each([&](auto& listener) { + listener.config_group_was_added(domain, group); + }); +} + } diff --git a/Userland/Libraries/LibConfig/Client.h b/Userland/Libraries/LibConfig/Client.h index 406dd3a93b..ff1c2d5207 100644 --- a/Userland/Libraries/LibConfig/Client.h +++ b/Userland/Libraries/LibConfig/Client.h @@ -35,6 +35,8 @@ public: void write_i32(StringView domain, StringView group, StringView key, i32 value); void write_bool(StringView domain, StringView group, StringView key, bool value); void remove_key(StringView domain, StringView group, StringView key); + void remove_group(StringView domain, StringView group); + void add_group(StringView domain, StringView group); static Client& the(); @@ -48,6 +50,8 @@ private: void notify_changed_i32_value(String const& domain, String const& group, String const& key, i32 value) override; void notify_changed_bool_value(String const& domain, String const& group, String const& key, bool value) override; void notify_removed_key(String const& domain, String const& group, String const& key) override; + void notify_removed_group(String const& domain, String const& group) override; + void notify_added_group(String const& domain, String const& group) override; }; inline Vector list_groups(StringView domain) @@ -95,6 +99,16 @@ inline void remove_key(StringView domain, StringView group, StringView key) Client::the().remove_key(domain, group, key); } +inline void remove_group(StringView domain, StringView group) +{ + Client::the().remove_group(domain, group); +} + +inline void add_group(StringView domain, StringView group) +{ + Client::the().add_group(domain, group); +} + inline void pledge_domains(Vector const& domains) { Client::the().pledge_domains(domains); diff --git a/Userland/Libraries/LibConfig/Listener.cpp b/Userland/Libraries/LibConfig/Listener.cpp index 31e5afc93d..08fafeadc1 100644 --- a/Userland/Libraries/LibConfig/Listener.cpp +++ b/Userland/Libraries/LibConfig/Listener.cpp @@ -45,4 +45,12 @@ void Listener::config_key_was_removed(String const&, String const&, String const { } +void Listener::config_group_was_removed(String const&, String const&) +{ +} + +void Listener::config_group_was_added(String const&, String const&) +{ +} + } diff --git a/Userland/Libraries/LibConfig/Listener.h b/Userland/Libraries/LibConfig/Listener.h index b59c907e41..67820d1be2 100644 --- a/Userland/Libraries/LibConfig/Listener.h +++ b/Userland/Libraries/LibConfig/Listener.h @@ -20,6 +20,8 @@ public: virtual void config_i32_did_change(String const& domain, String const& group, String const& key, i32 value); virtual void config_bool_did_change(String const& domain, String const& group, String const& key, bool value); virtual void config_key_was_removed(String const& domain, String const& group, String const& key); + virtual void config_group_was_removed(String const& domain, String const& group); + virtual void config_group_was_added(String const& domain, String const& group); protected: Listener(); diff --git a/Userland/Libraries/LibCore/ConfigFile.cpp b/Userland/Libraries/LibCore/ConfigFile.cpp index 22264d46b7..5df2fce419 100644 --- a/Userland/Libraries/LibCore/ConfigFile.cpp +++ b/Userland/Libraries/LibCore/ConfigFile.cpp @@ -234,6 +234,12 @@ bool ConfigFile::has_group(String const& group) const return m_groups.contains(group); } +void ConfigFile::add_group(String const& group) +{ + m_groups.ensure(group); + m_dirty = true; +} + void ConfigFile::remove_group(String const& group) { m_groups.remove(group); diff --git a/Userland/Libraries/LibCore/ConfigFile.h b/Userland/Libraries/LibCore/ConfigFile.h index 9655a6eb42..044acd050b 100644 --- a/Userland/Libraries/LibCore/ConfigFile.h +++ b/Userland/Libraries/LibCore/ConfigFile.h @@ -54,6 +54,7 @@ public: ErrorOr sync(); + void add_group(String const& group); void remove_group(String const& group); void remove_entry(String const& group, String const& key); diff --git a/Userland/Services/ConfigServer/ConfigClient.ipc b/Userland/Services/ConfigServer/ConfigClient.ipc index bd16899025..0700c1ec5a 100644 --- a/Userland/Services/ConfigServer/ConfigClient.ipc +++ b/Userland/Services/ConfigServer/ConfigClient.ipc @@ -4,4 +4,6 @@ endpoint ConfigClient notify_changed_i32_value(String domain, String group, String key, i32 value) =| notify_changed_bool_value(String domain, String group, String key, bool value) =| notify_removed_key(String domain, String group, String key) =| + notify_removed_group(String domain, String group) =| + notify_added_group(String domain, String group) =| } diff --git a/Userland/Services/ConfigServer/ConfigServer.ipc b/Userland/Services/ConfigServer/ConfigServer.ipc index 491e24101d..e68dd2b2eb 100644 --- a/Userland/Services/ConfigServer/ConfigServer.ipc +++ b/Userland/Services/ConfigServer/ConfigServer.ipc @@ -15,4 +15,6 @@ endpoint ConfigServer write_i32_value(String domain, String group, String key, i32 value) => () write_bool_value(String domain, String group, String key, bool value) => () remove_key_entry(String domain, String group, String key) => () + remove_group_entry(String domain, String group) => () + add_group_entry(String domain, String group) => () } diff --git a/Userland/Services/ConfigServer/ConnectionFromClient.cpp b/Userland/Services/ConfigServer/ConnectionFromClient.cpp index 22bf2370cf..264cd7ead1 100644 --- a/Userland/Services/ConfigServer/ConnectionFromClient.cpp +++ b/Userland/Services/ConfigServer/ConnectionFromClient.cpp @@ -267,4 +267,40 @@ void ConnectionFromClient::remove_key_entry(String const& domain, String const& }); } +void ConnectionFromClient::remove_group_entry(String const& domain, String const& group) +{ + if (!validate_access(domain, group, {})) + return; + + auto& config = ensure_domain_config(domain); + if (!config.has_group(group)) + return; + + config.remove_group(group); + m_dirty_domains.set(domain); + start_or_restart_sync_timer(); + + for_each_monitoring_connection(domain, this, [&domain, &group](ConnectionFromClient& connection) { + connection.async_notify_removed_group(domain, group); + }); +} + +void ConnectionFromClient::add_group_entry(String const& domain, String const& group) +{ + if (!validate_access(domain, group, {})) + return; + + auto& config = ensure_domain_config(domain); + if (config.has_group(group)) + return; + + config.add_group(group); + m_dirty_domains.set(domain); + start_or_restart_sync_timer(); + + for_each_monitoring_connection(domain, this, [&domain, &group](ConnectionFromClient& connection) { + connection.async_notify_added_group(domain, group); + }); +} + } diff --git a/Userland/Services/ConfigServer/ConnectionFromClient.h b/Userland/Services/ConfigServer/ConnectionFromClient.h index a5ce7e1f4a..a5ca6a5762 100644 --- a/Userland/Services/ConfigServer/ConnectionFromClient.h +++ b/Userland/Services/ConfigServer/ConnectionFromClient.h @@ -36,6 +36,8 @@ private: virtual void write_i32_value([[maybe_unused]] String const& domain, [[maybe_unused]] String const& group, [[maybe_unused]] String const& key, [[maybe_unused]] i32 value) override; virtual void write_bool_value([[maybe_unused]] String const& domain, [[maybe_unused]] String const& group, [[maybe_unused]] String const& key, [[maybe_unused]] bool value) override; virtual void remove_key_entry([[maybe_unused]] String const& domain, [[maybe_unused]] String const& group, [[maybe_unused]] String const& key) override; + virtual void remove_group_entry([[maybe_unused]] String const& domain, [[maybe_unused]] String const& group) override; + virtual void add_group_entry([[maybe_unused]] String const& domain, [[maybe_unused]] String const& group) override; bool validate_access(String const& domain, String const& group, String const& key); void sync_dirty_domains_to_disk();