ladybird/Userland/Libraries/LibConfig/Client.h
Andreas Kling edf7843409 ConfigServer+LibConfig: Add way for clients to listen for config changes
This patch adds a Config::Listener abstract class that anyone can
inherit from and receive notifications when configuration values change.

We don't yet monitor file system changes, so these only work for changes
made by ConfigServer itself.

In order to receive these notifications, clients must monitor the domain
by calling monitor_domain(). Only pledged domains can be monitored.

Note that the client initiating the change does not get notified.
2021-08-26 23:41:38 +02:00

93 lines
2.9 KiB
C++

/*
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <ConfigServer/ConfigClientEndpoint.h>
#include <ConfigServer/ConfigServerEndpoint.h>
#include <LibCore/File.h>
#include <LibCore/Promise.h>
#include <LibCore/StandardPaths.h>
#include <LibIPC/ServerConnection.h>
namespace Config {
class Client final
: public IPC::ServerConnection<ConfigClientEndpoint, ConfigServerEndpoint>
, public ConfigClientEndpoint {
C_OBJECT(Client);
public:
void pledge_domains(Vector<String> const&);
void monitor_domain(String const&);
String read_string(StringView domain, StringView group, StringView key, StringView fallback);
i32 read_i32(StringView domain, StringView group, StringView key, i32 fallback);
bool read_bool(StringView domain, StringView group, StringView key, bool fallback);
void write_string(StringView domain, StringView group, StringView key, StringView value);
void write_i32(StringView domain, StringView group, StringView key, i32 value);
void write_bool(StringView domain, StringView group, StringView key, bool value);
static Client& the();
private:
explicit Client()
: IPC::ServerConnection<ConfigClientEndpoint, ConfigServerEndpoint>(*this, "/tmp/portal/config")
{
}
void notify_changed_string_value(String const& domain, String const& group, String const& key, String const& value) override;
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;
};
inline String read_string(StringView domain, StringView group, StringView key, StringView fallback = {})
{
return Client::the().read_string(domain, group, key, fallback);
}
inline i32 read_i32(StringView domain, StringView group, StringView key, i32 fallback = 0)
{
return Client::the().read_i32(domain, group, key, fallback);
}
inline bool read_bool(StringView domain, StringView group, StringView key, bool fallback = false)
{
return Client::the().read_bool(domain, group, key, fallback);
}
inline void write_string(StringView domain, StringView group, StringView key, StringView value)
{
Client::the().write_string(domain, group, key, value);
}
inline void write_i32(StringView domain, StringView group, StringView key, i32 value)
{
Client::the().write_i32(domain, group, key, value);
}
inline void write_bool(StringView domain, StringView group, StringView key, bool value)
{
Client::the().write_bool(domain, group, key, value);
}
inline void pledge_domains(Vector<String> const& domains)
{
Client::the().pledge_domains(domains);
}
inline void pledge_domains(String const& domains)
{
Client::the().pledge_domains({ domains });
}
inline void monitor_domain(String const& domain)
{
Client::the().monitor_domain(domain);
}
}