diff foosdk/sdk/foobar2000/SDK/cfg_var.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/foobar2000/SDK/cfg_var.cpp	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,180 @@
+#include "foobar2000-sdk-pch.h"
+#include "cfg_var.h"
+#include "configStore.h"
+
+namespace fb2k {
+	pfc::string8 formatCfgVarName(const GUID& guid) {
+		return pfc::format("cfg_var.", pfc::print_guid(guid));
+	}
+	pfc::string8 advconfig_autoName(const GUID& id) {
+		return pfc::format("advconfig.unnamed.", pfc::print_guid(id));
+	}
+	pfc::string8 advconfig_autoName(const GUID& id, const char* specified) {
+		if (specified) return specified;
+		return advconfig_autoName(id);
+	}
+}
+namespace cfg_var_modern {
+
+#ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY
+	void cfg_string::set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
+		(void)p_sizehint;
+		pfc::string8_fastalloc temp;
+		p_stream->read_string_raw(temp, p_abort);
+		this->set(temp);
+	}
+
+	void cfg_int::set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
+		switch (p_sizehint) {
+		case 4:
+		{ int32_t v; p_stream->read_lendian_t(v, p_abort); set(v); }
+		break;
+		case 8:
+		{ int64_t v; p_stream->read_lendian_t(v, p_abort); set(v); }
+		break;
+		}
+	}
+
+	void cfg_bool::set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
+		(void)p_sizehint;
+		uint8_t b;
+		if (p_stream->read(&b, 1, p_abort) == 1) {
+			this->set(b != 0);
+		}
+	}
+#endif
+
+	int64_t cfg_int::get() {
+		std::call_once(m_init, [this] {
+			m_val = fb2k::configStore::get()->getConfigInt(formatName(), m_initVal);
+			});
+		return m_val;
+	}
+
+	void cfg_int::set(int64_t v) {
+		if (v != get()) {
+			m_val = v;
+			fb2k::configStore::get()->setConfigInt(formatName(), v);
+		}
+	}
+
+	bool cfg_bool::get() {
+		std::call_once(m_init, [this] {
+			m_val = fb2k::configStore::get()->getConfigBool(formatName(), m_initVal);
+			});
+		return m_val;
+	}
+
+	void cfg_bool::set(bool v) {
+		if (v != get()) {
+			m_val = v;
+			fb2k::configStore::get()->setConfigBool(formatName(), v);
+		}
+	}
+
+	void cfg_string::set(const char* v) {
+		if (strcmp(v, get()) != 0) {
+			pfc::string8 obj = v;
+
+			{
+				PFC_INSYNC_WRITE(m_valueGuard);
+				m_value = std::move(obj);
+			}
+
+			fb2k::configStore::get()->setConfigString(formatName(), v);
+		}
+	}
+
+	void cfg_string::get(pfc::string_base& out) {
+		std::call_once(m_init, [this] {
+			pfc::string8 v = fb2k::configStore::get()->getConfigString(formatName(), m_initVal)->c_str();
+			PFC_INSYNC_WRITE(m_valueGuard);
+			m_value = std::move(v);
+			});
+
+		PFC_INSYNC_READ(m_valueGuard);
+		out = m_value;
+	}
+
+	pfc::string8 cfg_string::get() {
+		pfc::string8 ret; get(ret); return ret;
+	}
+
+
+	pfc::string8 cfg_var_common::formatVarName(const GUID& guid) {
+		return fb2k::formatCfgVarName( guid );
+	}
+
+	pfc::string8 cfg_var_common::formatName() const {
+		return formatVarName(this->m_guid);
+	}
+
+	fb2k::memBlockRef cfg_blob::get() {
+		std::call_once(m_init, [this] {
+			auto v = fb2k::configStore::get()->getConfigBlob(formatName(), m_initVal);
+			PFC_INSYNC_WRITE(m_dataGuard);
+			m_data = std::move(v);
+			});
+		PFC_INSYNC_READ(m_dataGuard);
+		return m_data;
+	}
+
+	void cfg_blob::set_(fb2k::memBlockRef arg) {
+		{
+			PFC_INSYNC_WRITE(m_dataGuard);
+			m_data = arg;
+		}
+
+		auto api = fb2k::configStore::get();
+		auto name = formatName();
+		if (arg.is_valid()) api->setConfigBlob(name, arg);
+		else api->deleteConfigBlob(name);
+	}
+
+	void cfg_blob::set(fb2k::memBlockRef arg) {
+		auto old = get();
+		if (!fb2k::memBlock::equals(old, arg)) {
+			set_(arg);
+		}
+	}
+
+	void cfg_blob::set(const void* ptr, size_t size) {
+		set(fb2k::makeMemBlock(ptr, size));
+	}
+
+#ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY
+	void cfg_blob::set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
+		pfc::mem_block block;
+		block.resize(p_sizehint);
+		p_stream->read_object(block.ptr(), p_sizehint, p_abort);
+		set(fb2k::memBlock::blockWithData(std::move(block)));
+	}
+#endif
+
+	double cfg_float::get() {
+		std::call_once(m_init, [this] {
+			m_val = fb2k::configStore::get()->getConfigFloat(formatName(), m_initVal);
+			});
+		return m_val;
+	}
+
+	void cfg_float::set(double v) {
+		if (v != get()) {
+			m_val = v;
+			fb2k::configStore::get()->setConfigFloat(formatName(), v);
+		}
+	}
+
+#ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY
+	void cfg_float::set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
+		switch (p_sizehint) {
+		case 4:
+		{ float v; if (p_stream->read(&v, 4, p_abort) == 4) set(v); }
+		break;
+		case 8:
+		{ double v; if (p_stream->read(&v, 8, p_abort) == 8) set(v); }
+		break;
+		}
+	}
+#endif
+}