aboutsummaryrefslogtreecommitdiffstats
path: root/src/ConfigData.hxx
blob: d6b024b9b27a258b61d7a6ded2ea29b68f7b044e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
 * Copyright (C) 2003-2013 The Music Player Daemon Project
 * http://www.musicpd.org
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef MPD_CONFIG_DATA_HXX
#define MPD_CONFIG_DATA_HXX

#include "ConfigOption.hxx"
#include "gerror.h"
#include "gcc.h"

#include <string>
#include <array>
#include <vector>

struct block_param {
	std::string name;
	std::string value;
	int line;

	/**
	 * This flag is false when nobody has queried the value of
	 * this option yet.
	 */
	mutable bool used;

	gcc_nonnull_all
	block_param(const char *_name, const char *_value, int _line=-1)
		:name(_name), value(_value), line(_line), used(false) {}

	gcc_pure
	unsigned GetUnsignedValue() const;

	gcc_pure
	bool GetBoolValue() const;
};

struct config_param {
	/**
	 * The next config_param with the same name.  The destructor
	 * deletes the whole chain.
	 */
	struct config_param *next;

	char *value;
	unsigned int line;

	std::vector<block_param> block_params;

	/**
	 * This flag is false when nobody has queried the value of
	 * this option yet.
	 */
	bool used;

	config_param(int _line=-1)
		:next(nullptr), value(nullptr), line(_line), used(false) {}

	gcc_nonnull_all
	config_param(const char *_value, int _line=-1);

	config_param(const config_param &) = delete;

	~config_param();

	config_param &operator=(const config_param &) = delete;

	/**
	 * Determine if this is a "null" instance, i.e. an empty
	 * object that was synthesized and not loaded from a
	 * configuration file.
	 */
	bool IsNull() const {
		return line == unsigned(-1);
	}

	gcc_nonnull_all
	void AddBlockParam(const char *_name, const char *_value,
			   int _line=-1) {
		block_params.emplace_back(_name, _value, _line);
	}

	gcc_nonnull_all gcc_pure
	const block_param *GetBlockParam(const char *_name) const;

	gcc_pure
	const char *GetBlockValue(const char *name,
				  const char *default_value=nullptr) const;

	gcc_malloc
	char *DupBlockString(const char *name,
			     const char *default_value=nullptr) const;

	/**
	 * Same as config_dup_path(), but looks up the setting in the
	 * specified block.
	 */
	gcc_malloc
	char *DupBlockPath(const char *name, GError **error_r) const;

	gcc_pure
	unsigned GetBlockValue(const char *name, unsigned default_value) const;

	gcc_pure
	bool GetBlockValue(const char *name, bool default_value) const;
};

struct ConfigData {
	std::array<config_param *, std::size_t(CONF_MAX)> params;
};

gcc_pure
const char *
config_get_block_string(const struct config_param *param, const char *name,
			const char *default_value);

gcc_malloc
char *
config_dup_block_string(const struct config_param *param, const char *name,
			const char *default_value);

/**
 * Same as config_dup_path(), but looks up the setting in the
 * specified block.
 */
gcc_malloc
char *
config_dup_block_path(const struct config_param *param, const char *name,
		      GError **error_r);

gcc_pure
unsigned
config_get_block_unsigned(const struct config_param *param, const char *name,
			  unsigned default_value);

gcc_pure
bool
config_get_block_bool(const struct config_param *param, const char *name,
		      bool default_value);

#endif