]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/settings.h
Don't print an error for valid listring[] formspec
[dragonfireclient.git] / src / settings.h
index 6c063e43e5fca2801ac27bc300547663cdc87b6f..d43ad6a205e28c75a23f7e11449b679db32385d5 100644 (file)
@@ -31,8 +31,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 class Settings;
 struct NoiseParams;
 
+// Global objects
+extern Settings *g_settings;
+extern std::string g_settings_path;
+
 /** function type to register a changed callback */
-typedef void (*setting_changed_callback)(const std::string);
+typedef void (*setting_changed_callback)(const std::string, void*);
 
 enum ValueType {
        VALUETYPE_STRING,
@@ -55,40 +59,36 @@ struct ValueSpec {
                type = a_type;
                help = a_help;
        }
+
        ValueType type;
        const char *help;
 };
 
-/** function type to register a changed callback */
-
 struct SettingsEntry {
        SettingsEntry()
        {
-               group = NULL;
+               group    = NULL;
+               is_group = false;
        }
 
        SettingsEntry(const std::string &value_)
        {
-               value = value_;
-               group = NULL;
+               value    = value_;
+               group    = NULL;
+               is_group = false;
        }
 
        SettingsEntry(Settings *group_)
        {
-               group = group_;
-       }
-
-       SettingsEntry(const std::string &value_, Settings *group_)
-       {
-               value = value_;
-               group = group_;
+               group    = group_;
+               is_group = true;
        }
 
        std::string value;
        Settings *group;
+       bool is_group;
 };
 
-
 class Settings {
 public:
        Settings() {}
@@ -97,7 +97,6 @@ class Settings {
        Settings & operator += (const Settings &other);
        Settings & operator = (const Settings &other);
 
-
        /***********************
         * Reading and writing *
         ***********************/
@@ -114,20 +113,16 @@ class Settings {
 
        SettingsParseEvent parseConfigObject(const std::string &line,
                const std::string &end, std::string &name, std::string &value);
-       void getNamesPresent(std::istream &is, const std::string &end,
-               std::set<std::string> &present_values,
-               std::set<std::string> &present_groups);
        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 sanitizeName(const std::string &name);
+       static std::string sanitizeValue(const std::string &value);
        static std::string getMultiline(std::istream &is, size_t *num_lines=NULL);
-       static std::string sanitizeString(const std::string &value);
-       static bool printEntry(std::ostream &os, const std::string &name,
+       static void printEntry(std::ostream &os, const std::string &name,
                const SettingsEntry &entry, u32 tab_depth=0);
-       static void printValue(std::ostream &os, const std::string &name,
-               const std::string &value, u32 tab_depth=0);
-       static void printGroup(std::ostream &os, const std::string &name,
-               const Settings *group, u32 tab_depth=0);
 
        /***********
         * Getters *
@@ -186,21 +181,24 @@ class Settings {
 
        // N.B. Groups not allocated with new must be set to NULL in the settings
        // tree before object destruction.
-       void set(const std::string &name, const std::string &value);
-       void setGroup(const std::string &name, Settings *group);
-       void setDefault(const std::string &name, const std::string &value);
-       void setGroupDefault(const std::string &name, Settings *group);
-       void setBool(const std::string &name, bool value);
-       void setS16(const std::string &name, s16 value);
-       void setU16(const std::string &name, u16 value);
-       void setS32(const std::string &name, s32 value);
-       void setU64(const std::string &name, u64 value);
-       void setFloat(const std::string &name, float value);
-       void setV2F(const std::string &name, v2f value);
-       void setV3F(const std::string &name, v3f value);
-       void setFlagStr(const std::string &name, u32 flags,
+       bool setEntry(const std::string &name, const void *entry,
+               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 setBool(const std::string &name, bool value);
+       bool setS16(const std::string &name, s16 value);
+       bool setU16(const std::string &name, u16 value);
+       bool setS32(const std::string &name, s32 value);
+       bool setU64(const std::string &name, u64 value);
+       bool setFloat(const std::string &name, float value);
+       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);
-       void setNoiseParams(const std::string &name, const NoiseParams &np);
+       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);
@@ -208,22 +206,28 @@ class Settings {
        // 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);
-       void registerChangedCallback(std::string name, setting_changed_callback cbf);
+       void registerChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL);
+       void deregisterChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL);
 
 private:
 
        void updateNoLock(const Settings &other);
        void clearNoLock();
+       void clearDefaultsNoLock();
 
        void doCallbacks(std::string name);
 
        std::map<std::string, SettingsEntry> m_settings;
        std::map<std::string, SettingsEntry> m_defaults;
-       std::map<std::string, std::vector<setting_changed_callback> > m_callbacks;
-       // All methods that access m_settings/m_defaults directly should lock this.
-       mutable JMutex m_mutex;
+
+       std::map<std::string, std::vector<std::pair<setting_changed_callback,void*> > > m_callbacks;
+
+       mutable JMutex m_callbackMutex;
+       mutable JMutex m_mutex; // All methods that access m_settings/m_defaults directly should lock this.
+
 };
 
 #endif