annotate foosdk/sdk/foobar2000/SDK/advconfig_impl_legacy.h @ 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 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 // advconfig_impl_legacy.h : legacy (foobar2000 v1.x compatible) implementation of advconfig objects
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 #include "cfg_var_legacy.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 using namespace cfg_var_legacy;
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 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 pfc::string8 advconfig_autoName(const GUID&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 }
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 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 #define ADVCONFIG_DOWNGRADE { this->get_static_instance().downgrade_set_name(configStoreName); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 #define ADVCONFIG_DOWNGRADE_AUTO { this->get_static_instance().downgrade_set_name( fb2k::advconfig_autoName(p_guid) ); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 #define ADVCONFIG_DOWNGRADE {(void)configStoreName;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 #define ADVCONFIG_DOWNGRADE_AUTO
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 //! Standard implementation of advconfig_entry_checkbox. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 class advconfig_entry_checkbox_impl : public advconfig_entry_checkbox_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 advconfig_entry_checkbox_impl(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority, bool p_initialstate, bool isRadio = false, uint32_t flags = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 : m_name(p_name), m_initialstate(p_initialstate), m_state(p_guid, p_initialstate), m_parent(p_parent), m_priority(p_priority), m_isRadio(isRadio), m_flags(flags) {}
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 void get_name(pfc::string_base& p_out) override { p_out = m_name; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 GUID get_guid() override { return m_state.get_guid(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 GUID get_parent() override { return m_parent; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 void reset() override { m_state = m_initialstate; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 bool get_state() override { return m_state; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 void set_state(bool p_state) override { m_state = p_state; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 bool is_radio() override { return m_isRadio; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 double get_sort_priority() override { return m_priority; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 bool get_default_state() override { return m_initialstate; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 t_uint32 get_preferences_flags() override { return m_flags; }
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 bool get_state_() const { return m_state; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 bool get_default_state_() const { return m_initialstate; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 void downgrade_set_name(const char * arg) { m_state.downgrade_set_name(arg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 const pfc::string8 m_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 const bool m_initialstate;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 const bool m_isRadio;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 const uint32_t m_flags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 cfg_bool m_state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 const GUID m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 const double m_priority;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 //! Service factory helper around standard advconfig_branch implementation. Use this class to register your own Advanced Preferences branches. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 //! Usage: static advconfig_branch_factory mybranch(name, branchID, parentBranchID, priority);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 class advconfig_branch_factory : public service_factory_single_t<advconfig_branch_impl> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 advconfig_branch_factory(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 : service_factory_single_t<advconfig_branch_impl>(p_name, p_guid, p_parent, p_priority) {}
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 class advconfig_checkbox_factory_common : public service_factory_single_t<advconfig_entry_checkbox_impl> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 template<typename ... args_t> advconfig_checkbox_factory_common(args_t && ... args) : service_factory_single_t<advconfig_entry_checkbox_impl>(std::forward<args_t>(args) ...) {}
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 bool get() const { return this->get_static_instance().get_state_(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 void set(bool val) { this->get_static_instance().set_state(val); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 operator bool() const { return get(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 bool operator=(bool val) { set(val); return val; }
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 class advconfig_checkbox_factory : public advconfig_checkbox_factory_common {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 advconfig_checkbox_factory(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority, bool p_initialstate, uint32_t flags = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 : advconfig_checkbox_factory_common(p_name, p_guid, p_parent, p_priority, p_initialstate, false /* not radio */, flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 ADVCONFIG_DOWNGRADE_AUTO;
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 advconfig_checkbox_factory(const char* p_name, const char * configStoreName, const GUID& p_guid, const GUID& p_parent, double p_priority, bool p_initialstate, uint32_t flags = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 : advconfig_checkbox_factory_common(p_name, p_guid, p_parent, p_priority, p_initialstate, false /* not radio */, flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 ADVCONFIG_DOWNGRADE;
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 };
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 class advconfig_radio_factory : public advconfig_checkbox_factory_common {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 advconfig_radio_factory(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority, bool p_initialstate, uint32_t flags = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 : advconfig_checkbox_factory_common(p_name, p_guid, p_parent, p_priority, p_initialstate, true /* radio */, flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 ADVCONFIG_DOWNGRADE_AUTO;
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 advconfig_radio_factory(const char* p_name, const char * configStoreName, const GUID& p_guid, const GUID& p_parent, double p_priority, bool p_initialstate, uint32_t flags = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 : advconfig_checkbox_factory_common(p_name, p_guid, p_parent, p_priority, p_initialstate, true /* radio */, flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 ADVCONFIG_DOWNGRADE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 }
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 // OBSOLETE, use advconfig_checkbox_factory / advconfig_radio_factory
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 template<bool p_is_radio, uint32_t prefFlags = 0>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 class advconfig_checkbox_factory_t : public advconfig_checkbox_factory_common {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 advconfig_checkbox_factory_t(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority, bool p_initialstate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 : advconfig_checkbox_factory_common(p_name, p_guid, p_parent, p_priority, p_initialstate, p_is_radio, prefFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 ADVCONFIG_DOWNGRADE_AUTO;
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 advconfig_checkbox_factory_t(const char* p_name, const char * configStoreName, const GUID& p_guid, const GUID& p_parent, double p_priority, bool p_initialstate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 : advconfig_checkbox_factory_common(p_name, p_guid, p_parent, p_priority, p_initialstate, p_is_radio, prefFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 ADVCONFIG_DOWNGRADE;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 //! Special advconfig_entry_string implementation - implements integer entries. Use advconfig_integer_factory to register your own integer entries in Advanced Preferences instead of using this class directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 template<typename int_t_>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 class advconfig_entry_integer_impl_ : public advconfig_entry_string_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 typedef int_t_ int_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 advconfig_entry_integer_impl_(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority, int_t p_initialstate, int_t p_min, int_t p_max, t_uint32 p_prefFlags)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 : m_name(p_name), m_parent(p_parent), m_priority(p_priority), m_initval(p_initialstate), m_min(p_min), m_max(p_max), m_state(p_guid, p_initialstate), m_prefFlags(p_prefFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 PFC_ASSERT(p_min < p_max);
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 void get_name(pfc::string_base& p_out) { p_out = m_name; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 GUID get_guid() { return m_state.get_guid(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 GUID get_parent() { return m_parent; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 void reset() { m_state = m_initval; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 double get_sort_priority() { return m_priority; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 void get_state(pfc::string_base& p_out) { format(p_out, m_state.get_value()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 void set_state(const char* p_string, t_size p_length) { set_state_int(myATOI(p_string, p_length)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 t_uint32 get_flags() { return advconfig_entry_string::flag_is_integer | (is_signed() ? flag_is_signed : 0); }
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 int_t get_state_int() const { return m_state; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 void set_state_int(int_t val) { m_state = pfc::clip_t<int_t>(val, m_min, m_max); }
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 void get_default_state(pfc::string_base& out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 format(out, m_initval);
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 void validate(pfc::string_base& val) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 format(val, pfc::clip_t<int_t>(myATOI(val, SIZE_MAX), m_min, m_max));
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 t_uint32 get_preferences_flags() { return m_prefFlags; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 void downgrade_set_name(const char * arg) { m_state.downgrade_set_name(arg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 static void format(pfc::string_base& out, int_t v) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 if (is_signed()) out = pfc::format_int(v).get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 else out = pfc::format_uint(v).get_ptr();
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 static int_t myATOI(const char* s, size_t l) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 if (is_signed()) return pfc::atoi64_ex(s, l);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 else return pfc::atoui64_ex(s, l);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 static bool is_signed() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 return ((int_t)-1) < ((int_t)0);
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 cfg_int_t<int_t> m_state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 const double m_priority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 const int_t m_initval, m_min, m_max;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 const GUID m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 const pfc::string8 m_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 const t_uint32 m_prefFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 };
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 typedef advconfig_entry_integer_impl_<uint64_t> advconfig_entry_integer_impl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 //! Service factory helper around integer-specialized advconfig_entry_string implementation. Use this class to register your own integer entries in Advanced Preferences. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 //! Usage: static advconfig_integer_factory myint(name, itemID, parentID, priority, initialValue, minValue, maxValue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 template<typename int_t_>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 class advconfig_integer_factory_ : public service_factory_single_t<advconfig_entry_integer_impl_<int_t_> > {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 typedef int_t_ int_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 advconfig_integer_factory_(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority, t_uint64 p_initialstate, t_uint64 p_min, t_uint64 p_max, t_uint32 p_prefFlags = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 : service_factory_single_t<advconfig_entry_integer_impl_<int_t_> >(p_name, p_guid, p_parent, p_priority, p_initialstate, p_min, p_max, p_prefFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 ADVCONFIG_DOWNGRADE_AUTO;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 advconfig_integer_factory_(const char* p_name, const char * configStoreName, const GUID& p_guid, const GUID& p_parent, double p_priority, t_uint64 p_initialstate, t_uint64 p_min, t_uint64 p_max, t_uint32 p_prefFlags = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 : service_factory_single_t<advconfig_entry_integer_impl_<int_t_> >(p_name, p_guid, p_parent, p_priority, p_initialstate, p_min, p_max, p_prefFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 ADVCONFIG_DOWNGRADE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 }
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 int_t get() const { return this->get_static_instance().get_state_int(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 void set(int_t val) { this->get_static_instance().set_state_int(val); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 operator int_t() const { return get(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 int_t operator=(int_t val) { set(val); return val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 typedef advconfig_integer_factory_<uint64_t> advconfig_integer_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 typedef advconfig_integer_factory_<int64_t> advconfig_signed_integer_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 //! Standard advconfig_entry_string implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 class advconfig_entry_string_impl : public advconfig_entry_string_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 advconfig_entry_string_impl(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority, const char* p_initialstate, t_uint32 p_prefFlags)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 : m_name(p_name), m_parent(p_parent), m_priority(p_priority), m_initialstate(p_initialstate), m_state(p_guid, p_initialstate), m_prefFlags(p_prefFlags) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 void get_name(pfc::string_base& p_out) { p_out = m_name; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 GUID get_guid() { return m_state.get_guid(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 GUID get_parent() { return m_parent; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 void reset() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 inWriteSync(m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 m_state = m_initialstate;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 double get_sort_priority() { return m_priority; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 void get_state(pfc::string_base& p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 inReadSync(m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 p_out = m_state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 void set_state(const char* p_string, t_size p_length = SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 inWriteSync(m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 m_state.set_string(p_string, p_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 t_uint32 get_flags() { return 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 void get_default_state(pfc::string_base& out) { out = m_initialstate; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 t_uint32 get_preferences_flags() { return m_prefFlags; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 void downgrade_set_name(const char * arg) { m_state.downgrade_set_name(arg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 const pfc::string8 m_initialstate, m_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 cfg_string m_state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 pfc::readWriteLock m_sync;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 const double m_priority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 const GUID m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 const t_uint32 m_prefFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 //! Service factory helper around standard advconfig_entry_string implementation. Use this class to register your own string entries in Advanced Preferences. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 //! Usage: static advconfig_string_factory mystring(name, itemID, branchID, priority, initialValue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 class advconfig_string_factory : public service_factory_single_t<advconfig_entry_string_impl> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 advconfig_string_factory(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority, const char* p_initialstate, t_uint32 p_prefFlags = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 : service_factory_single_t<advconfig_entry_string_impl>(p_name, p_guid, p_parent, p_priority, p_initialstate, p_prefFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 ADVCONFIG_DOWNGRADE_AUTO;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 advconfig_string_factory(const char* p_name, const char * configStoreName, const GUID& p_guid, const GUID& p_parent, double p_priority, const char* p_initialstate, t_uint32 p_prefFlags = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 : service_factory_single_t<advconfig_entry_string_impl>(p_name, p_guid, p_parent, p_priority, p_initialstate, p_prefFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 ADVCONFIG_DOWNGRADE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 void get(pfc::string_base& out) { get_static_instance().get_state(out); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 void set(const char* in) { get_static_instance().set_state(in); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 // No more separate _MT versions, readWriteLock overhead is irrelevant
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 typedef advconfig_entry_string_impl advconfig_entry_string_impl_MT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 typedef advconfig_string_factory advconfig_string_factory_MT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 Advanced Preferences variable declaration examples
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 static advconfig_string_factory mystring("name goes here",myguid,parentguid,0,"asdf");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 to retrieve state: pfc::string8 val; mystring.get(val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 static advconfig_checkbox_factory mycheckbox("name goes here",myguid,parentguid,0,false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 to retrieve state: mycheckbox.get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 static advconfig_integer_factory myint("name goes here",myguid,parentguid,0,initialValue,minimumValue,maximumValue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 to retrieve state: myint.get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 #undef ADVCONFIG_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 #undef ADVCONFIG_DOWNGRADE_AUTO