diff options
author | Andreas Kling <kling@serenityos.org> | 2021-08-25 19:35:19 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-08-26 00:54:27 +0200 |
commit | bdcd0abf9dd96fadfc456c165f9aba365d5a30f7 (patch) | |
tree | 64c2d7fa852ba8909faaf2b8810697c7ccfba6ca /Userland/Libraries/LibConfig/Client.h | |
parent | c97f7ea23b9f0d3702e4c700a6671ae44da96906 (diff) | |
download | serenity-bdcd0abf9dd96fadfc456c165f9aba365d5a30f7.zip |
Userland: Introduce ConfigServer and LibConfig
ConfigServer is an IPC service that provides access to application
configuration and settings. The idea is to replace all uses of
Core::ConfigFile with IPC requests to ConfigServer.
This first cut of the API is pretty similar to Core::ConfigFile.
The old:
auto config = Core::ConfigFile::open_for_app("App");
auto value = config->read_entry("Group", "Key");
The new:
auto value = Config::read_string("App", "Group", "Key");
ConfigServer uses the ~/.config directory as its backing store
and all the files remain human-editable. :^)
Diffstat (limited to 'Userland/Libraries/LibConfig/Client.h')
-rw-r--r-- | Userland/Libraries/LibConfig/Client.h | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/Userland/Libraries/LibConfig/Client.h b/Userland/Libraries/LibConfig/Client.h new file mode 100644 index 0000000000..6018145b03 --- /dev/null +++ b/Userland/Libraries/LibConfig/Client.h @@ -0,0 +1,71 @@ +/* + * 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: + 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") + { + } +}; + +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); +} + +} |