#include <Debug.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "TrackerSettings.h"
Settings* settings = NULL;
StringValueSetting::StringValueSetting(const char* name,
const char* defaultValue, const char* valueExpectedErrorString,
const char* wrongValueErrorString)
:
SettingsArgvDispatcher(name),
fDefaultValue(defaultValue),
fValueExpectedErrorString(valueExpectedErrorString),
fWrongValueErrorString(wrongValueErrorString),
fValue(defaultValue)
{
}
StringValueSetting::~StringValueSetting()
{
}
void
StringValueSetting::ValueChanged(const char* newValue)
{
fValue = newValue;
}
const char*
StringValueSetting::Value() const
{
return fValue.String();
}
void
StringValueSetting::SaveSettingValue(Settings* settings)
{
settings->Write("\"%s\"", fValue.String());
}
bool
StringValueSetting::NeedsSaving() const
{
return fValue != fDefaultValue;
}
const char*
StringValueSetting::Handle(const char* const* argv)
{
if (!*++argv)
return fValueExpectedErrorString;
ValueChanged(*argv);
return 0;
}
EnumeratedStringValueSetting::EnumeratedStringValueSetting(const char* name,
const char* defaultValue, const char* const* values,
const char* valueExpectedErrorString, const char* wrongValueErrorString)
:
StringValueSetting(name, defaultValue, valueExpectedErrorString,
wrongValueErrorString),
fValues(values)
{
}
void
EnumeratedStringValueSetting::ValueChanged(const char* newValue)
{
#if DEBUG
bool found = false;
for (int32 index = 0; ; index++) {
if (fValues[index] == NULL)
break;
if (strcmp(fValues[index], newValue) != 0)
continue;
found = true;
break;
}
ASSERT(found);
#endif
StringValueSetting::ValueChanged(newValue);
}
const char*
EnumeratedStringValueSetting::Handle(const char* const* argv)
{
if (!*++argv)
return fValueExpectedErrorString;
bool found = false;
for (int32 index = 0; ; index++) {
if (fValues[index] == NULL)
break;
if (strcmp(fValues[index], *argv) != 0)
continue;
found = true;
break;
}
if (!found)
return fWrongValueErrorString;
ValueChanged(*argv);
return 0;
}
ScalarValueSetting::ScalarValueSetting(const char* name, int32 defaultValue,
const char* valueExpectedErrorString, const char* wrongValueErrorString,
int32 min, int32 max)
:
SettingsArgvDispatcher(name),
fDefaultValue(defaultValue),
fValue(defaultValue),
fMax(max),
fMin(min),
fValueExpectedErrorString(valueExpectedErrorString),
fWrongValueErrorString(wrongValueErrorString)
{
}
void
ScalarValueSetting::ValueChanged(int32 newValue)
{
ASSERT(newValue > fMin);
ASSERT(newValue < fMax);
fValue = newValue;
}
int32
ScalarValueSetting::Value() const
{
return fValue;
}
void
ScalarValueSetting::GetValueAsString(char* buffer) const
{
sprintf(buffer, "%" B_PRId32, fValue);
}
const char*
ScalarValueSetting::Handle(const char* const* argv)
{
if (!*++argv)
return fValueExpectedErrorString;
int32 newValue;
if ((*argv)[0] == '0' && (*argv)[1] == 'x')
sscanf(*argv, "%" B_PRIx32, &newValue);
else
newValue = atoi(*argv);
if (newValue < fMin || newValue > fMax)
return fWrongValueErrorString;
fValue = newValue;
return NULL;
}
void
ScalarValueSetting::SaveSettingValue(Settings* settings)
{
settings->Write("%" B_PRId32, fValue);
}
bool
ScalarValueSetting::NeedsSaving() const
{
return fValue != fDefaultValue;
}
HexScalarValueSetting::HexScalarValueSetting(const char* name,
int32 defaultValue, const char* valueExpectedErrorString,
const char* wrongValueErrorString, int32 min, int32 max)
:
ScalarValueSetting(name, defaultValue, valueExpectedErrorString,
wrongValueErrorString, min, max)
{
}
void
HexScalarValueSetting::GetValueAsString(char* buffer) const
{
sprintf(buffer, "0x%08" B_PRIx32, fValue);
}
void
HexScalarValueSetting::SaveSettingValue(Settings* settings)
{
settings->Write("0x%08" B_PRIx32, fValue);
}
BooleanValueSetting::BooleanValueSetting(const char* name, bool defaultValue)
: ScalarValueSetting(name, defaultValue, 0, 0)
{
}
bool
BooleanValueSetting::Value() const
{
return fValue != 0;
}
void
BooleanValueSetting::SetValue(bool value)
{
fValue = value;
}
const char*
BooleanValueSetting::Handle(const char* const* argv)
{
if (!*++argv)
return "on or off expected";
if (strcmp(*argv, "on") == 0)
fValue = true;
else if (strcmp(*argv, "off") == 0)
fValue = false;
else
return "on or off expected";
return 0;
}
void
BooleanValueSetting::SaveSettingValue(Settings* settings)
{
settings->Write(fValue ? "on" : "off");
}