]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/settings.h
serverpackethandler: Minor log message fixes
[dragonfireclient.git] / src / settings.h
index f0baf41bfddd5aaa1184b9683e67b2aca929aaa7..6db2f9481672873b87843c26b443449d4812ca4e 100644 (file)
@@ -17,8 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef SETTINGS_HEADER
-#define SETTINGS_HEADER
+#pragma once
 
 #include "irrlichttypes_bloated.h"
 #include "util/string.h"
@@ -73,7 +72,7 @@ struct ValueSpec {
 };
 
 struct SettingsEntry {
-       SettingsEntry() {}
+       SettingsEntry() = default;
 
        SettingsEntry(const std::string &value_) :
                value(value_)
@@ -93,7 +92,8 @@ typedef std::unordered_map<std::string, SettingsEntry> SettingEntries;
 
 class Settings {
 public:
-       Settings() {}
+       Settings() = default;
+
        ~Settings();
 
        Settings & operator += (const Settings &other);
@@ -113,24 +113,13 @@ class Settings {
        bool parseConfigLines(std::istream &is, const std::string &end = "");
        void writeLines(std::ostream &os, u32 tab_depth=0) const;
 
-       SettingsParseEvent parseConfigObject(const std::string &line,
-               const std::string &end, std::string &name, std::string &value);
-       bool updateConfigObject(std::istream &is, std::ostream &os,
-               const std::string &end, u32 tab_depth=0);
-
-       static bool checkNameValid(const std::string &name);
-       static bool checkValueValid(const std::string &value);
-       static std::string getMultiline(std::istream &is, size_t *num_lines=NULL);
-       static void printEntry(std::ostream &os, const std::string &name,
-               const SettingsEntry &entry, u32 tab_depth=0);
-
        /***********
         * Getters *
         ***********/
 
-       const SettingsEntry &getEntry(const std::string &name) const;
        Settings *getGroup(const std::string &name) const;
        const std::string &get(const std::string &name) const;
+       const std::string &getDefault(const std::string &name) const;
        bool getBool(const std::string &name) const;
        u16 getU16(const std::string &name) const;
        s16 getS16(const std::string &name) const;
@@ -142,10 +131,6 @@ class Settings {
        v3f getV3F(const std::string &name) const;
        u32 getFlagStr(const std::string &name, const FlagDesc *flagdesc,
                        u32 *flagmask) const;
-       // N.B. if getStruct() is used to read a non-POD aggregate type,
-       // the behavior is undefined.
-       bool getStruct(const std::string &name, const std::string &format,
-                       void *out, size_t olen) const;
        bool getNoiseParams(const std::string &name, NoiseParams &np) const;
        bool getNoiseParamsFromValue(const std::string &name, NoiseParams &np) const;
        bool getNoiseParamsFromGroup(const std::string &name, NoiseParams &np) const;
@@ -159,9 +144,9 @@ class Settings {
         * Getters that don't throw exceptions *
         ***************************************/
 
-       bool getEntryNoEx(const std::string &name, SettingsEntry &val) const;
        bool getGroupNoEx(const std::string &name, Settings *&val) const;
        bool getNoEx(const std::string &name, std::string &val) const;
+       bool getDefaultNoEx(const std::string &name, std::string &val) const;
        bool getFlag(const std::string &name) const;
        bool getU16NoEx(const std::string &name, u16 &val) const;
        bool getS16NoEx(const std::string &name, s16 &val) const;
@@ -170,10 +155,12 @@ class Settings {
        bool getFloatNoEx(const std::string &name, float &val) const;
        bool getV2FNoEx(const std::string &name, v2f &val) const;
        bool getV3FNoEx(const std::string &name, v3f &val) const;
-       // N.B. getFlagStrNoEx() does not set val, but merely modifies it.  Thus,
-       // val must be initialized before using getFlagStrNoEx().  The intention of
-       // this is to simplify modifying a flags field from a default value.
-       bool getFlagStrNoEx(const std::string &name, u32 &val, FlagDesc *flagdesc) const;
+
+       // Like other getters, but handling each flag individualy:
+       // 1) Read default flags (or 0)
+       // 2) Override using user-defined flags
+       bool getFlagStrNoEx(const std::string &name, u32 &val,
+               const FlagDesc *flagdesc) const;
 
 
        /***********
@@ -186,8 +173,8 @@ class Settings {
                bool set_group, bool set_default);
        bool set(const std::string &name, const std::string &value);
        bool setDefault(const std::string &name, const std::string &value);
-       bool setGroup(const std::string &name, Settings *group);
-       bool setGroupDefault(const std::string &name, Settings *group);
+       bool setGroup(const std::string &name, const Settings &group);
+       bool setGroupDefault(const std::string &name, const Settings &group);
        bool setBool(const std::string &name, bool value);
        bool setS16(const std::string &name, s16 value);
        bool setU16(const std::string &name, u16 value);
@@ -197,26 +184,57 @@ class Settings {
        bool setV2F(const std::string &name, v2f value);
        bool setV3F(const std::string &name, v3f value);
        bool setFlagStr(const std::string &name, u32 flags,
-               const FlagDesc *flagdesc, u32 flagmask);
+               const FlagDesc *flagdesc = nullptr, u32 flagmask = U32_MAX);
        bool setNoiseParams(const std::string &name, const NoiseParams &np,
                bool set_default=false);
-       // N.B. if setStruct() is used to write a non-POD aggregate type,
-       // the behavior is undefined.
-       bool setStruct(const std::string &name, const std::string &format, void *value);
 
        // remove a setting
        bool remove(const std::string &name);
        void clear();
        void clearDefaults();
-       void updateValue(const Settings &other, const std::string &name);
-       void update(const Settings &other);
+
+       /**************
+        * Miscellany *
+        **************/
+
+       void setDefault(const std::string &name, const FlagDesc *flagdesc, u32 flags);
+       // Takes the provided setting values and uses them as new defaults
+       void overrideDefaults(Settings *other);
+       const FlagDesc *getFlagDescFallback(const std::string &name) const;
 
        void registerChangedCallback(const std::string &name,
                SettingsChangedCallback cbf, void *userdata = NULL);
        void deregisterChangedCallback(const std::string &name,
                SettingsChangedCallback cbf, void *userdata = NULL);
 
+       void removeSecureSettings();
+
 private:
+       /***********************
+        * Reading and writing *
+        ***********************/
+
+       SettingsParseEvent parseConfigObject(const std::string &line,
+               const std::string &end, std::string &name, std::string &value);
+       bool updateConfigObject(std::istream &is, std::ostream &os,
+               const std::string &end, u32 tab_depth=0);
+
+       static bool checkNameValid(const std::string &name);
+       static bool checkValueValid(const std::string &value);
+       static std::string getMultiline(std::istream &is, size_t *num_lines=NULL);
+       static void printEntry(std::ostream &os, const std::string &name,
+               const SettingsEntry &entry, u32 tab_depth=0);
+
+       /***********
+        * Getters *
+        ***********/
+
+       const SettingsEntry &getEntry(const std::string &name) const;
+       const SettingsEntry &getEntryDefault(const std::string &name) const;
+
+       // Allow TestSettings to run sanity checks using private functions.
+       friend class TestSettings;
+
        void updateNoLock(const Settings &other);
        void clearNoLock();
        void clearDefaultsNoLock();
@@ -225,6 +243,7 @@ class Settings {
 
        SettingEntries m_settings;
        SettingEntries m_defaults;
+       std::unordered_map<std::string, const FlagDesc *> m_flags;
 
        SettingsCallbackMap m_callbacks;
 
@@ -234,6 +253,3 @@ class Settings {
        mutable std::mutex m_mutex;
 
 };
-
-#endif
-