annotate foosdk/sdk/foobar2000/SDK/configStore.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 "configStore.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #ifdef FOOBAR2000_MOBILE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "appearance.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 using namespace fb2k;
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 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 class configStoreNotifyImpl : public configStoreNotify {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 void onVarChange() { f(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 std::function< void() > f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 };
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 objRef configStore::addNotify( const char * name, std::function<void () > f ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 auto nameRef = makeString(name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 ptr self = this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 auto obj = new configStoreNotifyImpl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 obj->f = f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 this->addNotify(name, obj );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 return callOnRelease([self, nameRef, obj] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 self->removeNotify( nameRef->c_str(), obj );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 delete obj;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 void configStore::addPermanentNotify( const char * name, std::function<void () > f ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 auto obj = new configStoreNotifyImpl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 obj->f = f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 this->addNotify(name, obj );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 }
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 bool configStore::getConfigBool( const char * name, bool defVal ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 return this->getConfigInt( name, defVal ? 1 : 0) != 0;
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 bool configStore::toggleConfigBool (const char * name, bool defVal ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 bool newVal = ! getConfigBool(name, defVal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 setConfigBool( name, newVal );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 return newVal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 }
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 void configStore::setConfigBool( const char * name, bool val ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 this->setConfigInt( name, val ? 1 : 0 );
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 void configStore::deleteConfigBool( const char * name ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 this->deleteConfigInt( name );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
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 GUID configStore::getConfigGUID(const char* name, const GUID& defVal) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 auto str = this->getConfigString(name, nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 if (str.is_empty()) return defVal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 return pfc::GUID_from_text(str->c_str());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 } catch (...) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 return defVal;
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 void configStore::setConfigGUID(const char* name, const GUID& val) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 this->setConfigString(name, pfc::print_guid(val));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
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 void configStore::deleteConfigGUID(const char* name) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 this->deleteConfigString(name);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 configEventHandle_t configEvent::operator+=(std::function< void() > f) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 auto obj = new configStoreNotifyImpl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 obj->f = f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 static_api_ptr_t<configStore>()->addNotify(m_name, obj);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 } catch (...) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 delete obj; throw;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 return reinterpret_cast<configEventHandle_t>(obj);
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 configEvent::operator-=(configEventHandle_t h) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 auto obj = reinterpret_cast<configStoreNotifyImpl*>(h);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 if ( core_api::are_services_available() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 static_api_ptr_t<configStore>()->removeNotify(m_name, obj);
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 delete obj;
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 configEventRef & configEventRef::operator<< ( const char * name ) { m_name = name; return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 configEventRef & configEventRef::operator<< ( std::function<void () > f ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 setFunction(f);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 return *this;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 configEventRef::~configEventRef() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 } catch(...) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 // corner case: called from worker while app is shutting down, don't crash
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 void configEventRef::clear() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 if (m_handle != nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 configEvent( m_name ) -= m_handle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 m_handle = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 void configEventRef::set( const char * name, std::function<void () > f ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 m_name = name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 m_handle = configEvent( m_name ) += f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 void configEventRef::setName( const char * name ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 m_name = name;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 void configEventRef::setFunction(std::function<void ()> f) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 PFC_ASSERT( m_name.length() > 0 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 m_handle = configEvent( m_name ) += f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 }
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 #ifdef FOOBAR2000_MOBILE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 class appearanceChangeNoitfyImpl : public appearanceChangeNoitfy {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 void onAppearanceChange() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 f();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 std::function<void () > f;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 appearance::notifyHandle_t appearance::addNotify2( std::function<void () > f) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 auto ret = new appearanceChangeNoitfyImpl();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 ret->f = f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 addNotify(ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 return reinterpret_cast<notifyHandle_t>(ret);
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 void appearance::removeNotify2( appearance::notifyHandle_t h ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 auto obj = reinterpret_cast<appearanceChangeNoitfyImpl*>(h);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 removeNotify(obj);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 delete obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 }
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 void appearanceChangeNotifyRef::set( std::function<void()> f ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 handle = static_api_ptr_t<appearance>()->addNotify2(f);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 void appearanceChangeNotifyRef::clear() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 if (isSet()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 if ( core_api::are_services_available() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 static_api_ptr_t<appearance>()->removeNotify2(handle);
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 handle = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 #endif