annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "foobar2000-sdk-pch.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "cfg_var.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "configStore.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 pfc::string8 formatCfgVarName(const GUID& guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 return pfc::format("cfg_var.", pfc::print_guid(guid));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 pfc::string8 advconfig_autoName(const GUID& id) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 return pfc::format("advconfig.unnamed.", pfc::print_guid(id));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 pfc::string8 advconfig_autoName(const GUID& id, const char* specified) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 if (specified) return specified;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 return advconfig_autoName(id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 namespace cfg_var_modern {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 #ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 void cfg_string::set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 (void)p_sizehint;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 pfc::string8_fastalloc temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 p_stream->read_string_raw(temp, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 this->set(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 void cfg_int::set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 switch (p_sizehint) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 case 4:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 { int32_t v; p_stream->read_lendian_t(v, p_abort); set(v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 case 8:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 { int64_t v; p_stream->read_lendian_t(v, p_abort); set(v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 void cfg_bool::set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 (void)p_sizehint;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 uint8_t b;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 if (p_stream->read(&b, 1, p_abort) == 1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 this->set(b != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 int64_t cfg_int::get() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 std::call_once(m_init, [this] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 m_val = fb2k::configStore::get()->getConfigInt(formatName(), m_initVal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 return m_val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 void cfg_int::set(int64_t v) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 if (v != get()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 m_val = v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 fb2k::configStore::get()->setConfigInt(formatName(), v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 bool cfg_bool::get() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 std::call_once(m_init, [this] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 m_val = fb2k::configStore::get()->getConfigBool(formatName(), m_initVal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 return m_val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 void cfg_bool::set(bool v) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 if (v != get()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 m_val = v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 fb2k::configStore::get()->setConfigBool(formatName(), v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 void cfg_string::set(const char* v) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 if (strcmp(v, get()) != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 pfc::string8 obj = v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 PFC_INSYNC_WRITE(m_valueGuard);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 m_value = std::move(obj);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 fb2k::configStore::get()->setConfigString(formatName(), v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 void cfg_string::get(pfc::string_base& out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 std::call_once(m_init, [this] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 pfc::string8 v = fb2k::configStore::get()->getConfigString(formatName(), m_initVal)->c_str();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 PFC_INSYNC_WRITE(m_valueGuard);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 m_value = std::move(v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 PFC_INSYNC_READ(m_valueGuard);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 out = m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 pfc::string8 cfg_string::get() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 pfc::string8 ret; get(ret); return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 pfc::string8 cfg_var_common::formatVarName(const GUID& guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 return fb2k::formatCfgVarName( guid );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 pfc::string8 cfg_var_common::formatName() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 return formatVarName(this->m_guid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 fb2k::memBlockRef cfg_blob::get() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 std::call_once(m_init, [this] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 auto v = fb2k::configStore::get()->getConfigBlob(formatName(), m_initVal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 PFC_INSYNC_WRITE(m_dataGuard);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 m_data = std::move(v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 PFC_INSYNC_READ(m_dataGuard);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 return m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 void cfg_blob::set_(fb2k::memBlockRef arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 PFC_INSYNC_WRITE(m_dataGuard);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 m_data = arg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 auto api = fb2k::configStore::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 auto name = formatName();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 if (arg.is_valid()) api->setConfigBlob(name, arg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 else api->deleteConfigBlob(name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 void cfg_blob::set(fb2k::memBlockRef arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 auto old = get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 if (!fb2k::memBlock::equals(old, arg)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 set_(arg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 void cfg_blob::set(const void* ptr, size_t size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 set(fb2k::makeMemBlock(ptr, size));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 #ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 void cfg_blob::set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 pfc::mem_block block;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 block.resize(p_sizehint);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 p_stream->read_object(block.ptr(), p_sizehint, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 set(fb2k::memBlock::blockWithData(std::move(block)));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 double cfg_float::get() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 std::call_once(m_init, [this] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 m_val = fb2k::configStore::get()->getConfigFloat(formatName(), m_initVal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 return m_val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 void cfg_float::set(double v) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 if (v != get()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 m_val = v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 fb2k::configStore::get()->setConfigFloat(formatName(), v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 #ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 void cfg_float::set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 switch (p_sizehint) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 case 4:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 { float v; if (p_stream->read(&v, 4, p_abort) == 4) set(v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 case 8:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 { double v; if (p_stream->read(&v, 8, p_abort) == 8) set(v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 }