1
0
mirror of https://github.com/moparisthebest/minetest synced 2024-11-10 19:35:12 -05:00
minetest/src/settings.h

218 lines
6.7 KiB
C
Raw Normal View History

2011-10-12 06:53:38 -04:00
/*
2013-02-24 12:40:43 -05:00
Minetest
2013-02-24 13:38:45 -05:00
Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
2011-10-12 06:53:38 -04:00
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
2011-10-12 06:53:38 -04:00
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
2011-10-12 06:53:38 -04:00
You should have received a copy of the GNU Lesser General Public License along
2011-10-12 06:53:38 -04:00
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
2012-06-16 21:00:31 -04:00
#include "irrlichttypes_bloated.h"
#include "util/string.h"
#include "jthread/jmutex.h"
#include <string>
2012-12-20 12:19:49 -05:00
#include <map>
#include <list>
2012-12-20 12:19:49 -05:00
#include <set>
2011-10-12 06:53:38 -04:00
class Settings;
/** function type to register a changed callback */
typedef void (*setting_changed_callback)(const std::string);
enum ValueType {
2011-10-12 06:53:38 -04:00
VALUETYPE_STRING,
VALUETYPE_FLAG // Doesn't take any arguments
};
enum SettingsParseEvent {
SPE_NONE,
SPE_INVALID,
SPE_COMMENT,
SPE_KVPAIR,
SPE_END,
SPE_GROUP,
SPE_MULTILINE,
};
struct ValueSpec {
2011-10-12 06:53:38 -04:00
ValueSpec(ValueType a_type, const char *a_help=NULL)
{
type = a_type;
help = a_help;
}
ValueType type;
const char *help;
};
2014-11-23 07:40:43 -05:00
/** function type to register a changed callback */
struct SettingsEntry {
SettingsEntry()
{
group = NULL;
}
SettingsEntry(const std::string &value_)
{
value = value_;
group = NULL;
}
SettingsEntry(Settings *group_)
{
group = group_;
}
SettingsEntry(const std::string &value_, Settings *group_)
{
value = value_;
group = group_;
}
std::string value;
Settings *group;
};
class Settings {
2011-10-12 06:53:38 -04:00
public:
Settings() {}
~Settings();
2011-10-12 06:53:38 -04:00
Settings & operator += (const Settings &other);
Settings & operator = (const Settings &other);
2011-10-12 06:53:38 -04:00
/***********************
* Reading and writing *
***********************/
2011-10-12 06:53:38 -04:00
// Read configuration file. Returns success.
bool readConfigFile(const char *filename);
//Updates configuration file. Returns success.
bool updateConfigFile(const char *filename);
// NOTE: Types of allowed_options are ignored. Returns success.
2011-10-12 06:53:38 -04:00
bool parseCommandLine(int argc, char *argv[],
std::map<std::string, ValueSpec> &allowed_options);
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 std::string getMultiline(std::istream &is);
static std::string sanitizeString(const std::string &value);
static void printValue(std::ostream &os, const std::string &name,
const SettingsEntry &entry, bool is_value_multiline, u32 tab_depth=0);
/***********
* Getters *
***********/
const SettingsEntry &getEntry(const std::string &name) const;
Settings *getGroup(const std::string &name) const;
std::string get(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;
s32 getS32(const std::string &name) const;
u64 getU64(const std::string &name) const;
float getFloat(const std::string &name) const;
v2f getV2F(const std::string &name) const;
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;
// return all keys used
std::vector<std::string> getNames() const;
bool exists(const std::string &name) const;
/***************************************
* 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 getFlag(const std::string &name) const;
bool getU16NoEx(const std::string &name, u16 &val) const;
bool getS16NoEx(const std::string &name, s16 &val) const;
bool getS32NoEx(const std::string &name, s32 &val) const;
bool getU64NoEx(const std::string &name, u64 &val) const;
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;
/***********
* Setters *
***********/
// 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 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,
const FlagDesc *flagdesc, u32 flagmask);
// 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 updateValue(const Settings &other, const std::string &name);
void update(const Settings &other);
2014-11-23 07:40:43 -05:00
void registerChangedCallback(std::string name, setting_changed_callback cbf);
2011-10-12 06:53:38 -04:00
private:
2014-09-11 14:23:04 -04:00
void updateNoLock(const Settings &other);
void clearNoLock();
2014-09-11 14:23:04 -04:00
2014-11-23 07:40:43 -05:00
void doCallbacks(std::string name);
2014-09-11 14:23:04 -04:00
std::map<std::string, SettingsEntry> m_settings;
std::map<std::string, SettingsEntry> m_defaults;
2014-11-23 07:40:43 -05:00
std::map<std::string, std::vector<setting_changed_callback> > m_callbacks;
2011-10-12 06:53:38 -04:00
// All methods that access m_settings/m_defaults directly should lock this.
mutable JMutex m_mutex;
2011-10-12 06:53:38 -04:00
};
#endif