annotate foosdk/sdk/foobar2000/SDK/cfg_var_legacy.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_legacy.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "configStore.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include <mutex>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
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 #ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 pfc::string8 formatCfgVarName(const GUID&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 #endif // FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 namespace cfg_var_legacy {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 cfg_var_reader* cfg_var_reader::g_list = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 cfg_var_writer* cfg_var_writer::g_list = NULL;
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 void cfg_var_reader::config_read_file(stream_reader* p_stream, abort_callback& p_abort)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 pfc::map_t<GUID, cfg_var_reader*> vars;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 for (cfg_var_reader* walk = g_list; walk != NULL; walk = walk->m_next) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 vars.set(walk->m_guid, walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 for (;;) {
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 GUID guid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 t_uint32 size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 if (p_stream->read(&guid, sizeof(guid), p_abort) != sizeof(guid)) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 guid = pfc::byteswap_if_be_t(guid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 p_stream->read_lendian_t(size, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 auto iter = vars.find(guid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 if ( iter.is_valid() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 stream_reader_limited_ref wrapper(p_stream, size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 iter->m_value->set_data_raw(&wrapper, size, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 } catch (exception_io_data const&) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 wrapper.flush_remaining(p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 p_stream->skip_object(size, p_abort);
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 static std::once_flag downgrade_once;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 void cfg_var_reader::downgrade_main() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 std::call_once(downgrade_once, [] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 auto api = fb2k::configStore::tryGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 if (api.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 for (cfg_var_reader* walk = g_list; walk != NULL; walk = walk->m_next) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 walk->downgrade_check(api);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 void cfg_var_writer::config_write_file(stream_writer* p_stream, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 cfg_var_writer* ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 pfc::array_t<t_uint8, pfc::alloc_fast_aggressive> temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 for (ptr = g_list; ptr; ptr = ptr->m_next) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 temp.set_size(0);
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 stream_writer_buffer_append_ref_t<pfc::array_t<t_uint8, pfc::alloc_fast_aggressive> > stream(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 ptr->get_data_raw(&stream, p_abort);
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 p_stream->write_lendian_t(ptr->m_guid, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 p_stream->write_lendian_t(pfc::downcast_guarded<t_uint32>(temp.get_size()), p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 if (temp.get_size() > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 p_stream->write_object(temp.get_ptr(), temp.get_size(), p_abort);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 void cfg_string::get_data_raw(stream_writer* p_stream, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 p_stream->write_object(get_ptr(), length(), p_abort);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 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
82 (void)p_sizehint;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 pfc::string8_fastalloc temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 p_stream->read_string_raw(temp, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 set_string(temp);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 int64_t downgrade_this(fb2k::configStore::ptr api, const char * name, int64_t current) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 int64_t v = api->getConfigInt(name, INT64_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 if (v == INT64_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 v = api->getConfigInt(name, INT64_MIN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 if ( v == INT64_MIN ) return current;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 api->deleteConfigInt(name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 return v;
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 uint64_t downgrade_this(fb2k::configStore::ptr api, const char * name, uint64_t current) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 return (uint64_t) downgrade_this(api, name, (int64_t) current);
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 int32_t downgrade_this(fb2k::configStore::ptr api, const char * name, int32_t current) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 return (int32_t) downgrade_this(api, name, (int64_t) current);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 uint32_t downgrade_this(fb2k::configStore::ptr api, const char * name, uint32_t current) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 return (uint32_t) downgrade_this(api, name, (int64_t) current);
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 bool downgrade_this(fb2k::configStore::ptr api, const char * name, bool current) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 return downgrade_this(api, name, (int64_t)(current?1:0)) != 0;
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 double downgrade_this(fb2k::configStore::ptr api, const char * name, double current) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 double v = api->getConfigFloat(name, -1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 if (v == -1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 v = api->getConfigFloat(name, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 if ( v == 0 ) return current;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 api->deleteConfigFloat(name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 return v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 GUID downgrade_this(fb2k::configStore::ptr api, const char * name, GUID current) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 auto blob = api->getConfigBlob( name );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 if (blob.is_valid() && blob->size() == sizeof(GUID)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 GUID ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 memcpy(&ret, blob->get_ptr(), sizeof(ret));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 api->deleteConfigBlob( name );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 return ret;
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 return current;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 void cfg_string::downgrade_check(fb2k::configStore::ptr api) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 const auto name = this->downgrade_name();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 auto v = api->getConfigString(name, nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 if (v.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 this->set(v->c_str());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 api->deleteConfigString(name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 }
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 void cfg_string_mt::downgrade_check(fb2k::configStore::ptr api) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 const auto name = this->downgrade_name();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 auto v = api->getConfigString(name, nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 if (v.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 this->set(v->c_str());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 api->deleteConfigString(name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 pfc::string8 cfg_var_reader::downgrade_name() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 if (m_downgrade_name.length() > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 return m_downgrade_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 return fb2k::formatCfgVarName(this->m_guid);
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156
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 #endif // FOOBAR2000_HAVE_CFG_VAR_LEGACY