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