1#include "Settings.h"
2
3#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
6
7#include <Catalog.h>
8#include <Debug.h>
9#include <Locale.h>
10
11
12#undef B_TRANSLATION_CONTEXT
13#define B_TRANSLATION_CONTEXT "Settings"
14
15
16Settings* settings = NULL;
17
18
19StringValueSetting::StringValueSetting(const char* name,
20	const char* defaultValue, const char* valueExpectedErrorString,
21	const char* wrongValueErrorString)
22	:
23	SettingsArgvDispatcher(name),
24	fDefaultValue(defaultValue),
25	fValueExpectedErrorString(valueExpectedErrorString),
26	fWrongValueErrorString(wrongValueErrorString),
27	fValue(strdup(defaultValue))
28{
29}
30
31
32StringValueSetting::~StringValueSetting()
33{
34	free(fValue);
35}
36
37
38void
39StringValueSetting::ValueChanged(const char* newValue)
40{
41	if (newValue == fValue)
42		// guard against self assingment
43		return;
44
45	free(fValue);
46	fValue = strdup(newValue);
47}
48
49
50const char*
51StringValueSetting::Value() const
52{
53	return fValue;
54}
55
56
57void
58StringValueSetting::SaveSettingValue(Settings* settings)
59{
60	printf("-----StringValueSetting::SaveSettingValue %s %s\n", Name(), fValue);
61	settings->Write("\"%s\"", fValue);
62}
63
64
65bool
66StringValueSetting::NeedsSaving() const
67{
68	// needs saving if different than default
69	return strcmp(fValue, fDefaultValue) != 0;
70}
71
72
73const char*
74StringValueSetting::Handle(const char *const *argv)
75{
76	if (!*++argv)
77		return fValueExpectedErrorString;
78
79	ValueChanged(*argv);
80	return 0;
81}
82
83
84//	#pragma mark -
85
86
87EnumeratedStringValueSetting::EnumeratedStringValueSetting(const char* name,
88	const char* defaultValue, StringEnumerator enumerator,
89	const char* valueExpectedErrorString,
90	const char* wrongValueErrorString)
91	:
92	StringValueSetting(name, defaultValue, valueExpectedErrorString,
93		wrongValueErrorString),
94	fEnumerator(enumerator)
95{
96}
97
98
99void
100EnumeratedStringValueSetting::ValueChanged(const char* newValue)
101{
102#if DEBUG
103	// must be one of the enumerated values
104	ASSERT(_ValidateString(newValue));
105#endif
106	StringValueSetting::ValueChanged(newValue);
107}
108
109
110const char*
111EnumeratedStringValueSetting::Handle(const char *const *argv)
112{
113	if (!*++argv)
114		return fValueExpectedErrorString;
115
116	printf("---EnumeratedStringValueSetting::Handle %s %s\n", *(argv-1), *argv);
117	if (!_ValidateString(*argv))
118		return fWrongValueErrorString;
119
120	ValueChanged(*argv);
121	return 0;
122}
123
124
125bool
126EnumeratedStringValueSetting::_ValidateString(const char* string)
127{
128	for (int32 i = 0;; i++) {
129		const char* enumString = fEnumerator(i);
130		if (!enumString)
131			return false;
132		if (strcmp(enumString, string) == 0)
133			return true;
134	}
135	return false;
136}
137
138
139//	#pragma mark -
140
141
142ScalarValueSetting::ScalarValueSetting(const char* name, int32 defaultValue,
143	const char* valueExpectedErrorString, const char* wrongValueErrorString,
144	int32 min, int32 max)
145	: SettingsArgvDispatcher(name),
146	fDefaultValue(defaultValue),
147	fValue(defaultValue),
148	fMax(max),
149	fMin(min),
150	fValueExpectedErrorString(valueExpectedErrorString),
151	fWrongValueErrorString(wrongValueErrorString)
152{
153}
154
155
156ScalarValueSetting::~ScalarValueSetting()
157{
158}
159
160
161void
162ScalarValueSetting::ValueChanged(int32 newValue)
163{
164	ASSERT(newValue > fMin);
165	ASSERT(newValue < fMax);
166	fValue = newValue;
167}
168
169
170int32
171ScalarValueSetting::Value() const
172{
173	return fValue;
174}
175
176
177void
178ScalarValueSetting::GetValueAsString(char* buffer) const
179{
180	sprintf(buffer, "%ld", fValue);
181}
182
183
184const char*
185ScalarValueSetting::Handle(const char *const *argv)
186{
187	if (!*++argv)
188		return fValueExpectedErrorString;
189
190	int32 newValue = atoi(*argv);
191	if (newValue < fMin || newValue > fMax)
192		return fWrongValueErrorString;
193
194	fValue = newValue;
195	return 0;
196}
197
198
199void
200ScalarValueSetting::SaveSettingValue(Settings* settings)
201{
202	settings->Write("%d", fValue);
203}
204
205
206bool
207ScalarValueSetting::NeedsSaving() const
208{
209	return fValue != fDefaultValue;
210}
211
212
213//	#pragma mark -
214
215
216BooleanValueSetting::BooleanValueSetting(const char* name, bool defaultValue)
217	: ScalarValueSetting(name, defaultValue, 0, 0)
218{
219}
220
221
222BooleanValueSetting::~BooleanValueSetting()
223{
224}
225
226
227bool
228BooleanValueSetting::Value() const
229{
230	return fValue;
231}
232
233
234const char*
235BooleanValueSetting::Handle(const char *const *argv)
236{
237	if (!*++argv) {
238		return B_TRANSLATE_COMMENT("on or off expected","Do not translate "
239			"'on' and 'off'");
240	}
241
242	if (strcmp(*argv, "on") == 0)
243		fValue = true;
244	else if (strcmp(*argv, "off") == 0)
245		fValue = false;
246	else {
247		return B_TRANSLATE_COMMENT("on or off expected", "Do not translate "
248		"'on' and 'off'");
249	}
250
251	return 0;
252}
253
254
255void
256BooleanValueSetting::SaveSettingValue(Settings* settings)
257{
258	settings->Write(fValue ? "on" : "off");
259}
260