Minetest  5.4.0
settings.h
Go to the documentation of this file.
1 /*
2 Minetest
3 Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4 
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
14 
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19 
20 #pragma once
21 
22 #include "irrlichttypes_bloated.h"
23 #include "util/string.h"
24 #include <string>
25 #include <list>
26 #include <set>
27 #include <mutex>
28 
29 class Settings;
30 struct NoiseParams;
31 
32 // Global objects
33 extern Settings *g_settings; // Same as Settings::getLayer(SL_GLOBAL);
34 extern std::string g_settings_path;
35 
36 // Type for a settings changed callback function
37 typedef void (*SettingsChangedCallback)(const std::string &name, void *data);
38 
39 typedef std::vector<
40  std::pair<
42  void *
43  >
45 
46 typedef std::unordered_map<std::string, SettingsCallbackList> SettingsCallbackMap;
47 
48 enum ValueType {
50  VALUETYPE_FLAG // Doesn't take any arguments
51 };
52 
61 };
62 
69 };
70 
71 struct ValueSpec {
72  ValueSpec(ValueType a_type, const char *a_help=NULL)
73  {
74  type = a_type;
75  help = a_help;
76  }
77 
79  const char *help;
80 };
81 
82 struct SettingsEntry {
83  SettingsEntry() = default;
84 
85  SettingsEntry(const std::string &value_) :
86  value(value_)
87  {}
88 
90  group(group_),
91  is_group(true)
92  {}
93 
94  std::string value = "";
95  Settings *group = nullptr;
96  bool is_group = false;
97 };
98 
99 typedef std::unordered_map<std::string, SettingsEntry> SettingEntries;
100 
101 class Settings {
102 public:
103  static Settings *createLayer(SettingsLayer sl, const std::string &end_tag = "");
104  static Settings *getLayer(SettingsLayer sl);
106 
107  Settings(const std::string &end_tag = "") :
108  m_end_tag(end_tag)
109  {}
110  ~Settings();
111 
112  Settings & operator += (const Settings &other);
113  Settings & operator = (const Settings &other);
114 
115  /***********************
116  * Reading and writing *
117  ***********************/
118 
119  // Read configuration file. Returns success.
120  bool readConfigFile(const char *filename);
121  //Updates configuration file. Returns success.
122  bool updateConfigFile(const char *filename);
123  // NOTE: Types of allowed_options are ignored. Returns success.
124  bool parseCommandLine(int argc, char *argv[],
125  std::map<std::string, ValueSpec> &allowed_options);
126  bool parseConfigLines(std::istream &is);
127  void writeLines(std::ostream &os, u32 tab_depth=0) const;
128 
129  /***********
130  * Getters *
131  ***********/
132 
133  Settings *getGroup(const std::string &name) const;
134  const std::string &get(const std::string &name) const;
135  bool getBool(const std::string &name) const;
136  u16 getU16(const std::string &name) const;
137  s16 getS16(const std::string &name) const;
138  u32 getU32(const std::string &name) const;
139  s32 getS32(const std::string &name) const;
140  u64 getU64(const std::string &name) const;
141  float getFloat(const std::string &name) const;
142  v2f getV2F(const std::string &name) const;
143  v3f getV3F(const std::string &name) const;
144  u32 getFlagStr(const std::string &name, const FlagDesc *flagdesc,
145  u32 *flagmask) const;
146  bool getNoiseParams(const std::string &name, NoiseParams &np) const;
147  bool getNoiseParamsFromValue(const std::string &name, NoiseParams &np) const;
148  bool getNoiseParamsFromGroup(const std::string &name, NoiseParams &np) const;
149 
150  // return all keys used
151  std::vector<std::string> getNames() const;
152  bool exists(const std::string &name) const;
153 
154 
155  /***************************************
156  * Getters that don't throw exceptions *
157  ***************************************/
158 
159  bool getGroupNoEx(const std::string &name, Settings *&val) const;
160  bool getNoEx(const std::string &name, std::string &val) const;
161  bool getFlag(const std::string &name) const;
162  bool getU16NoEx(const std::string &name, u16 &val) const;
163  bool getS16NoEx(const std::string &name, s16 &val) const;
164  bool getS32NoEx(const std::string &name, s32 &val) const;
165  bool getU64NoEx(const std::string &name, u64 &val) const;
166  bool getFloatNoEx(const std::string &name, float &val) const;
167  bool getV2FNoEx(const std::string &name, v2f &val) const;
168  bool getV3FNoEx(const std::string &name, v3f &val) const;
169 
170  // Like other getters, but handling each flag individualy:
171  // 1) Read default flags (or 0)
172  // 2) Override using user-defined flags
173  bool getFlagStrNoEx(const std::string &name, u32 &val,
174  const FlagDesc *flagdesc) const;
175 
176 
177  /***********
178  * Setters *
179  ***********/
180 
181  // N.B. Groups not allocated with new must be set to NULL in the settings
182  // tree before object destruction.
183  bool setEntry(const std::string &name, const void *entry,
184  bool set_group);
185  bool set(const std::string &name, const std::string &value);
186  bool setDefault(const std::string &name, const std::string &value);
187  bool setGroup(const std::string &name, const Settings &group);
188  bool setBool(const std::string &name, bool value);
189  bool setS16(const std::string &name, s16 value);
190  bool setU16(const std::string &name, u16 value);
191  bool setS32(const std::string &name, s32 value);
192  bool setU64(const std::string &name, u64 value);
193  bool setFloat(const std::string &name, float value);
194  bool setV2F(const std::string &name, v2f value);
195  bool setV3F(const std::string &name, v3f value);
196  bool setFlagStr(const std::string &name, u32 flags,
197  const FlagDesc *flagdesc = nullptr, u32 flagmask = U32_MAX);
198  bool setNoiseParams(const std::string &name, const NoiseParams &np);
199 
200  // remove a setting
201  bool remove(const std::string &name);
202 
203  /**************
204  * Miscellany *
205  **************/
206 
207  void setDefault(const std::string &name, const FlagDesc *flagdesc, u32 flags);
208  const FlagDesc *getFlagDescFallback(const std::string &name) const;
209 
210  void registerChangedCallback(const std::string &name,
211  SettingsChangedCallback cbf, void *userdata = NULL);
212  void deregisterChangedCallback(const std::string &name,
213  SettingsChangedCallback cbf, void *userdata = NULL);
214 
215  void removeSecureSettings();
216 
217 private:
218  /***********************
219  * Reading and writing *
220  ***********************/
221 
222  SettingsParseEvent parseConfigObject(const std::string &line,
223  std::string &name, std::string &value);
224  bool updateConfigObject(std::istream &is, std::ostream &os,
225  u32 tab_depth=0);
226 
227  static bool checkNameValid(const std::string &name);
228  static bool checkValueValid(const std::string &value);
229  static std::string getMultiline(std::istream &is, size_t *num_lines=NULL);
230  static void printEntry(std::ostream &os, const std::string &name,
231  const SettingsEntry &entry, u32 tab_depth=0);
232 
233  /***********
234  * Getters *
235  ***********/
236  Settings *getParent() const;
237 
238  const SettingsEntry &getEntry(const std::string &name) const;
239 
240  // Allow TestSettings to run sanity checks using private functions.
241  friend class TestSettings;
242 
243  void updateNoLock(const Settings &other);
244  void clearNoLock();
246 
247  void doCallbacks(const std::string &name) const;
248 
251  std::string m_end_tag;
252 
253  mutable std::mutex m_callback_mutex;
254 
255  // All methods that access m_settings/m_defaults directly should lock this.
256  mutable std::mutex m_mutex;
257 
260  static std::unordered_map<std::string, const FlagDesc *> s_flags;
261 };
Definition: settings.h:101
v2f getV2F(const std::string &name) const
Definition: settings.cpp:508
SettingsLayer getLayerType() const
Definition: settings.h:105
bool setGroup(const std::string &name, const Settings &group)
Definition: settings.cpp:829
v3f getV3F(const std::string &name) const
Definition: settings.cpp:519
SettingsCallbackMap m_callbacks
Definition: settings.h:250
Settings(const std::string &end_tag="")
Definition: settings.h:107
std::mutex m_callback_mutex
Definition: settings.h:253
bool getFloatNoEx(const std::string &name, float &val) const
Definition: settings.cpp:685
bool getFlag(const std::string &name) const
Definition: settings.cpp:675
void deregisterChangedCallback(const std::string &name, SettingsChangedCallback cbf, void *userdata=NULL)
Definition: settings.cpp:999
static Settings * createLayer(SettingsLayer sl, const std::string &end_tag="")
Definition: settings.cpp:43
SettingsLayer m_settingslayer
Definition: settings.h:259
bool getV3FNoEx(const std::string &name, v3f &val) const
Definition: settings.cpp:751
void doCallbacks(const std::string &name) const
Definition: settings.cpp:1029
bool setS32(const std::string &name, s32 value)
Definition: settings.cpp:857
u64 getU64(const std::string &name) const
Definition: settings.cpp:498
static std::unordered_map< std::string, const FlagDesc * > s_flags
Definition: settings.h:260
bool getU64NoEx(const std::string &name, u64 &val) const
Definition: settings.cpp:729
~Settings()
Definition: settings.cpp:68
bool readConfigFile(const char *filename)
Definition: settings.cpp:155
bool getS32NoEx(const std::string &name, s32 &val) const
Definition: settings.cpp:718
bool setU16(const std::string &name, u16 value)
Definition: settings.cpp:851
Settings & operator+=(const Settings &other)
bool remove(const std::string &name)
Definition: settings.cpp:922
Settings * getGroup(const std::string &name) const
Definition: settings.cpp:445
bool getS16NoEx(const std::string &name, s16 &val) const
Definition: settings.cpp:707
bool getNoiseParamsFromValue(const std::string &name, NoiseParams &np) const
Definition: settings.cpp:570
bool getGroupNoEx(const std::string &name, Settings *&val) const
Definition: settings.cpp:653
u32 getU32(const std::string &name) const
Definition: settings.cpp:481
s32 getS32(const std::string &name) const
Definition: settings.cpp:486
bool getNoEx(const std::string &name, std::string &val) const
Definition: settings.cpp:664
void writeLines(std::ostream &os, u32 tab_depth=0) const
Definition: settings.cpp:205
bool parseCommandLine(int argc, char *argv[], std::map< std::string, ValueSpec > &allowed_options)
Definition: settings.cpp:354
void registerChangedCallback(const std::string &name, SettingsChangedCallback cbf, void *userdata=NULL)
Definition: settings.cpp:992
static bool checkValueValid(const std::string &value)
Definition: settings.cpp:118
bool setDefault(const std::string &name, const std::string &value)
Definition: settings.cpp:823
void updateNoLock(const Settings &other)
std::vector< std::string > getNames() const
Definition: settings.cpp:636
const SettingsEntry & getEntry(const std::string &name) const
Definition: settings.cpp:428
bool getV2FNoEx(const std::string &name, v2f &val) const
Definition: settings.cpp:740
void clearDefaultsNoLock()
bool updateConfigFile(const char *filename)
Definition: settings.cpp:331
const std::string & get(const std::string &name) const
Definition: settings.cpp:454
SettingsParseEvent parseConfigObject(const std::string &line, std::string &name, std::string &value)
Definition: settings.cpp:942
bool getFlagStrNoEx(const std::string &name, u32 &val, const FlagDesc *flagdesc) const
Definition: settings.cpp:762
bool setBool(const std::string &name, bool value)
Definition: settings.cpp:839
float getFloat(const std::string &name) const
Definition: settings.cpp:492
Settings * getParent() const
Definition: settings.cpp:411
bool set(const std::string &name, const std::string &value)
Definition: settings.cpp:812
static Settings * s_layers[SL_TOTAL_COUNT]
Definition: settings.h:258
static std::string getMultiline(std::istream &is, size_t *num_lines=NULL)
Definition: settings.cpp:129
bool getBool(const std::string &name) const
Definition: settings.cpp:463
static bool checkNameValid(const std::string &name)
Definition: settings.cpp:103
bool setS16(const std::string &name, s16 value)
Definition: settings.cpp:845
bool parseConfigLines(std::istream &is)
Definition: settings.cpp:165
std::string m_end_tag
Definition: settings.h:251
void clearNoLock()
Definition: settings.cpp:970
bool setFloat(const std::string &name, float value)
Definition: settings.cpp:871
bool setEntry(const std::string &name, const void *entry, bool set_group)
Definition: settings.cpp:784
static Settings * getLayer(SettingsLayer sl)
Definition: settings.cpp:61
std::mutex m_mutex
Definition: settings.h:256
bool setNoiseParams(const std::string &name, const NoiseParams &np)
Definition: settings.cpp:905
static void printEntry(std::ostream &os, const std::string &name, const SettingsEntry &entry, u32 tab_depth=0)
Definition: settings.cpp:222
bool exists(const std::string &name) const
Definition: settings.cpp:624
Settings & operator=(const Settings &other)
Definition: settings.cpp:83
void removeSecureSettings()
Definition: settings.cpp:1016
bool getNoiseParams(const std::string &name, NoiseParams &np) const
Definition: settings.cpp:559
bool setV3F(const std::string &name, v3f value)
Definition: settings.cpp:885
u16 getU16(const std::string &name) const
Definition: settings.cpp:469
bool setFlagStr(const std::string &name, u32 flags, const FlagDesc *flagdesc=nullptr, u32 flagmask=U32_MAX)
Definition: settings.cpp:893
bool setV2F(const std::string &name, v2f value)
Definition: settings.cpp:877
bool getU16NoEx(const std::string &name, u16 &val) const
Definition: settings.cpp:696
SettingEntries m_settings
Definition: settings.h:249
u32 getFlagStr(const std::string &name, const FlagDesc *flagdesc, u32 *flagmask) const
Definition: settings.cpp:531
s16 getS16(const std::string &name) const
Definition: settings.cpp:475
bool updateConfigObject(std::istream &is, std::ostream &os, u32 tab_depth=0)
Definition: settings.cpp:245
bool getNoiseParamsFromGroup(const std::string &name, NoiseParams &np) const
Definition: settings.cpp:600
bool setU64(const std::string &name, u64 value)
Definition: settings.cpp:863
const FlagDesc * getFlagDescFallback(const std::string &name) const
Definition: settings.cpp:986
Definition: test_settings.cpp:27
core::vector2d< f32 > v2f
Definition: irr_v2d.h:26
core::vector3df v3f
Definition: irr_v3d.h:26
#define U32_MAX
Definition: irrlichttypes.h:79
static OptionList allowed_options
Definition: main.cpp:119
Settings * g_settings
Definition: settings.cpp:36
std::vector< std::pair< SettingsChangedCallback, void * >> SettingsCallbackList
Definition: settings.h:44
std::unordered_map< std::string, SettingsEntry > SettingEntries
Definition: settings.h:99
SettingsLayer
Definition: settings.h:63
@ SL_GLOBAL
Definition: settings.h:66
@ SL_GAME
Definition: settings.h:65
@ SL_MAP
Definition: settings.h:67
@ SL_DEFAULTS
Definition: settings.h:64
@ SL_TOTAL_COUNT
Definition: settings.h:68
void(* SettingsChangedCallback)(const std::string &name, void *data)
Definition: settings.h:37
std::string g_settings_path
Definition: settings.cpp:37
SettingsParseEvent
Definition: settings.h:53
@ SPE_KVPAIR
Definition: settings.h:57
@ SPE_MULTILINE
Definition: settings.h:60
@ SPE_GROUP
Definition: settings.h:59
@ SPE_INVALID
Definition: settings.h:55
@ SPE_COMMENT
Definition: settings.h:56
@ SPE_END
Definition: settings.h:58
@ SPE_NONE
Definition: settings.h:54
std::unordered_map< std::string, SettingsCallbackList > SettingsCallbackMap
Definition: settings.h:46
ValueType
Definition: settings.h:48
@ VALUETYPE_FLAG
Definition: settings.h:50
@ VALUETYPE_STRING
Definition: settings.h:49
Definition: string.h:62
Definition: noise.h:110
Definition: settings.h:82
std::string value
Definition: settings.h:94
SettingsEntry(const std::string &value_)
Definition: settings.h:85
bool is_group
Definition: settings.h:96
Settings * group
Definition: settings.h:95
SettingsEntry(Settings *group_)
Definition: settings.h:89
SettingsEntry()=default
Definition: settings.h:71
const char * help
Definition: settings.h:79
ValueSpec(ValueType a_type, const char *a_help=NULL)
Definition: settings.h:72
ValueType type
Definition: settings.h:78