#ifndef SETTINGS_H
#define SETTINGS_H
#include <driver_settings.h>
#include "List.h"
#include "String.h"
class Settings {
public:
Settings();
~Settings();
status_t SetTo(const char *volumeName = NULL);
status_t SetTo(off_t volumeOffset, off_t volumeSize);
void Unset();
const char *GetDefaultVolumeName() const;
const char *GetVolumeName() const;
bool GetHideEsoteric() const;
const char *HiddenEntryAt(int32 index) const;
void Dump();
private:
status_t _Init(const driver_settings *settings,
const driver_parameter *volume);
static const driver_parameter *_FindVolumeParameter(
const driver_settings *settings, const char *name);
static const driver_parameter *_FindVolumeParameter(
const driver_settings *settings, off_t offset, off_t size);
template<typename container_t>
static const driver_parameter *_FindNextParameter(
const container_t *container, const char *name, int32 &cookie);
template<typename container_t>
static const char *_GetParameterValue(const container_t *container,
const char *name, const char *unknownValue, const char *noArgValue);
template<typename container_t>
static bool _GetParameterValue(const container_t *container,
const char *name, bool unknownValue, bool noArgValue);
template<typename container_t>
static int64 _GetParameterValue(const container_t *container,
const char *name, int64 unknownValue, int64 noArgValue);
static void _CheckVolumeName(String &name);
static bool _CheckEntryName(const char *name);
private:
String fDefaultVolumeName;
String fVolumeName;
bool fHideEsoteric;
List<String> fHiddenEntries;
};
template<typename container_t>
const driver_parameter *
Settings::_FindNextParameter(const container_t *container,
const char *name, int32 &cookie)
{
const driver_parameter *parameter = NULL;
if (container) {
for (; !parameter && cookie < container->parameter_count; cookie++) {
const driver_parameter ¶m = container->parameters[cookie];
if (!strcmp(param.name, name))
parameter = ¶m;
}
}
return parameter;
}
template<typename container_t>
const char *
Settings::_GetParameterValue(const container_t *container, const char *name,
const char *unknownValue, const char *noArgValue)
{
if (container) {
for (int32 i = container->parameter_count - 1; i >= 0; i--) {
const driver_parameter ¶m = container->parameters[i];
if (!strcmp(param.name, name)) {
if (param.value_count > 0)
return param.values[0];
return noArgValue;
}
}
}
return unknownValue;
}
static inline
bool
contains(const char **array, size_t size, const char *value)
{
for (int32 i = 0; i < (int32)size; i++) {
if (!strcmp(array[i], value))
return true;
}
return false;
}
template<typename container_t>
bool
Settings::_GetParameterValue(const container_t *container, const char *name,
bool unknownValue, bool noArgValue)
{
const char unknown = 0;
const char noArg = 0;
const char *value = _GetParameterValue(container, name, &unknown, &noArg);
if (value == &unknown)
return unknownValue;
if (value == &noArg)
return noArgValue;
const char *trueStrings[]
= { "1", "true", "yes", "on", "enable", "enabled" };
const char *falseStrings[]
= { "0", "false", "no", "off", "disable", "disabled" };
if (contains(trueStrings, sizeof(trueStrings) / sizeof(const char*),
value)) {
return true;
}
if (contains(falseStrings, sizeof(falseStrings) / sizeof(const char*),
value)) {
return false;
}
return unknownValue;
}
template<typename container_t>
int64
Settings::_GetParameterValue(const container_t *container, const char *name,
int64 unknownValue, int64 noArgValue)
{
const char unknown = 0;
const char noArg = 0;
const char *value = _GetParameterValue(container, name, &unknown, &noArg);
if (value == &unknown)
return unknownValue;
if (value == &noArg)
return noArgValue;
return atoll(value);
}
#endif