2011-10-12 12:53:38 +02:00
|
|
|
/*
|
2013-02-24 18:40:43 +01:00
|
|
|
Minetest
|
2013-02-24 19:38:45 +01:00
|
|
|
Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
2011-10-12 12:53:38 +02:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
2012-06-05 16:56:56 +02:00
|
|
|
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 12:53:38 +02: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
|
2012-06-05 16:56:56 +02:00
|
|
|
GNU Lesser General Public License for more details.
|
2011-10-12 12:53:38 +02:00
|
|
|
|
2012-06-05 16:56:56 +02:00
|
|
|
You should have received a copy of the GNU Lesser General Public License along
|
2011-10-12 12:53:38 +02: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-17 03:00:31 +02:00
|
|
|
#include "irrlichttypes_bloated.h"
|
2012-06-17 01:40:36 +02:00
|
|
|
#include "util/string.h"
|
2014-09-12 00:22:05 +02:00
|
|
|
#include "jthread/jmutex.h"
|
|
|
|
#include <string>
|
2012-12-20 18:19:49 +01:00
|
|
|
#include <map>
|
2014-09-12 00:22:05 +02:00
|
|
|
#include <list>
|
2012-12-20 18:19:49 +01:00
|
|
|
#include <set>
|
2011-10-12 12:53:38 +02:00
|
|
|
|
|
|
|
enum ValueType
|
|
|
|
{
|
|
|
|
VALUETYPE_STRING,
|
|
|
|
VALUETYPE_FLAG // Doesn't take any arguments
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ValueSpec
|
|
|
|
{
|
|
|
|
ValueSpec(ValueType a_type, const char *a_help=NULL)
|
|
|
|
{
|
|
|
|
type = a_type;
|
|
|
|
help = a_help;
|
|
|
|
}
|
|
|
|
ValueType type;
|
|
|
|
const char *help;
|
|
|
|
};
|
|
|
|
|
2014-11-23 13:40:43 +01:00
|
|
|
/** function type to register a changed callback */
|
|
|
|
typedef void (*setting_changed_callback)(const std::string);
|
|
|
|
|
2014-09-12 00:22:05 +02:00
|
|
|
|
2011-10-12 12:53:38 +02:00
|
|
|
class Settings
|
|
|
|
{
|
|
|
|
public:
|
2014-09-12 00:22:05 +02:00
|
|
|
Settings() {}
|
2011-10-12 12:53:38 +02:00
|
|
|
|
2014-09-12 00:22:05 +02:00
|
|
|
Settings & operator += (const Settings &other);
|
|
|
|
Settings & operator = (const Settings &other);
|
2011-10-12 12:53:38 +02:00
|
|
|
|
|
|
|
|
2014-09-12 00:22:05 +02:00
|
|
|
/***********************
|
|
|
|
* Reading and writing *
|
|
|
|
***********************/
|
2011-10-12 12:53:38 +02:00
|
|
|
|
2014-09-12 00:22:05 +02: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 12:53:38 +02:00
|
|
|
bool parseCommandLine(int argc, char *argv[],
|
2014-09-12 00:22:05 +02:00
|
|
|
std::map<std::string, ValueSpec> &allowed_options);
|
|
|
|
bool parseConfigLines(std::istream &is, const std::string &end = "");
|
|
|
|
void writeLines(std::ostream &os) const;
|
|
|
|
|
|
|
|
|
|
|
|
/***********
|
|
|
|
* Getters *
|
|
|
|
***********/
|
|
|
|
|
|
|
|
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;
|
2014-09-11 19:42:21 +02:00
|
|
|
u32 getFlagStr(const std::string &name, const FlagDesc *flagdesc,
|
2014-09-12 00:22:05 +02:00
|
|
|
u32 *flagmask) const;
|
2014-02-08 23:50:26 +01:00
|
|
|
// N.B. if getStruct() is used to read a non-POD aggregate type,
|
|
|
|
// the behavior is undefined.
|
2014-09-11 19:42:21 +02:00
|
|
|
bool getStruct(const std::string &name, const std::string &format,
|
2014-09-12 00:22:05 +02:00
|
|
|
void *out, size_t olen) const;
|
2014-02-04 04:40:57 +01:00
|
|
|
|
2014-09-12 00:22:05 +02:00
|
|
|
// return all keys used
|
|
|
|
std::vector<std::string> getNames() const;
|
|
|
|
bool exists(const std::string &name) const;
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************
|
|
|
|
* Getters that don't throw exceptions *
|
|
|
|
***************************************/
|
|
|
|
|
|
|
|
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;
|
2014-02-08 23:50:26 +01:00
|
|
|
// 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.
|
2014-09-12 00:22:05 +02:00
|
|
|
bool getFlagStrNoEx(const std::string &name, u32 &val, FlagDesc *flagdesc) const;
|
|
|
|
|
|
|
|
|
|
|
|
/***********
|
|
|
|
* Setters *
|
|
|
|
***********/
|
|
|
|
|
|
|
|
void set(const std::string &name, std::string value);
|
|
|
|
void set(const std::string &name, const char *value);
|
|
|
|
void setDefault(const std::string &name, std::string value);
|
|
|
|
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);
|
2014-02-08 23:50:26 +01:00
|
|
|
// N.B. if setStruct() is used to write a non-POD aggregate type,
|
|
|
|
// the behavior is undefined.
|
2014-09-12 00:22:05 +02:00
|
|
|
bool setStruct(const std::string &name, const std::string &format, void *value);
|
2014-02-08 23:50:26 +01:00
|
|
|
|
2014-09-12 00:22:05 +02:00
|
|
|
// 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 13:40:43 +01:00
|
|
|
void registerChangedCallback(std::string name, setting_changed_callback cbf);
|
2011-10-12 12:53:38 +02:00
|
|
|
|
|
|
|
private:
|
2014-09-12 00:22:05 +02:00
|
|
|
/***********************
|
|
|
|
* Reading and writing *
|
|
|
|
***********************/
|
|
|
|
|
|
|
|
bool parseConfigObject(std::istream &is,
|
|
|
|
std::string &name, std::string &value);
|
|
|
|
bool parseConfigObject(std::istream &is,
|
|
|
|
std::string &name, std::string &value,
|
|
|
|
const std::string &end, bool &end_found);
|
|
|
|
/*
|
|
|
|
* Reads a configuration object from stream (usually a single line)
|
|
|
|
* and adds it to dst.
|
|
|
|
* Preserves comments and empty lines.
|
|
|
|
* Setting names that were added to dst are also added to updated.
|
|
|
|
*/
|
|
|
|
void getUpdatedConfigObject(std::istream &is,
|
|
|
|
std::list<std::string> &dst,
|
|
|
|
std::set<std::string> &updated,
|
|
|
|
bool &changed);
|
2014-09-11 20:23:04 +02:00
|
|
|
|
|
|
|
|
2014-09-12 00:22:05 +02:00
|
|
|
void updateNoLock(const Settings &other);
|
|
|
|
void clearNoLock();
|
2014-09-11 20:23:04 +02:00
|
|
|
|
2014-11-23 13:40:43 +01:00
|
|
|
void doCallbacks(std::string name);
|
2014-09-11 20:23:04 +02:00
|
|
|
|
2012-12-20 18:19:49 +01:00
|
|
|
std::map<std::string, std::string> m_settings;
|
|
|
|
std::map<std::string, std::string> m_defaults;
|
2014-11-23 13:40:43 +01:00
|
|
|
std::map<std::string, std::vector<setting_changed_callback> > m_callbacks;
|
2011-10-12 12:53:38 +02:00
|
|
|
// All methods that access m_settings/m_defaults directly should lock this.
|
2014-09-11 14:49:25 +02:00
|
|
|
mutable JMutex m_mutex;
|
2011-10-12 12:53:38 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|