summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibConfig/Client.h
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-08-25 19:35:19 +0200
committerAndreas Kling <kling@serenityos.org>2021-08-26 00:54:27 +0200
commitbdcd0abf9dd96fadfc456c165f9aba365d5a30f7 (patch)
tree64c2d7fa852ba8909faaf2b8810697c7ccfba6ca /Userland/Libraries/LibConfig/Client.h
parentc97f7ea23b9f0d3702e4c700a6671ae44da96906 (diff)
downloadserenity-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.h71
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);
+}
+
+}