diff options
| author | Marius Nita <marius@cs.pdx.edu> | 2002-11-06 13:51:23 +0000 |
|---|---|---|
| committer | Marius Nita <marius@cs.pdx.edu> | 2002-11-06 13:51:23 +0000 |
| commit | 35fcb62ddd4861f857d93941407e3d87d444b2cc (patch) | |
| tree | 8538b81a0e74689d12ec95fb71f9c4ae6fdf5eab /otk/configuration.cc | |
| parent | 0cf6e32e1cd1659adc6f0a95649302758256207a (diff) | |
added style class, moved util and config to otk
Diffstat (limited to 'otk/configuration.cc')
| -rw-r--r-- | otk/configuration.cc | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/otk/configuration.cc b/otk/configuration.cc new file mode 100644 index 00000000..8c92651c --- /dev/null +++ b/otk/configuration.cc @@ -0,0 +1,236 @@ +// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- + +#ifdef HAVE_CONFIG_H +#include "../config.h" +#endif // HAVE_CONFIG_H + +extern "C" { +#ifdef HAVE_STDLIB_H +# include <stdlib.h> +#endif // HAVE_STDLIB_H +} + +#include "configuration.hh" +#include "util.hh" + +#include <algorithm> + +namespace otk { + +bool Configuration::_initialized = False; + +Configuration::Configuration(const std::string &file, bool autosave) { + setFile(file); + _modified = False; + _database = NULL; + _autosave = autosave; + if (! _initialized) { + XrmInitialize(); + _initialized = True; + } +} + +Configuration::Configuration(bool autosave) { + _modified = False; + _database = NULL; + _autosave = autosave; + if (! _initialized) { + XrmInitialize(); + _initialized = True; + } +} + +Configuration::~Configuration() { + if (_database != NULL) + XrmDestroyDatabase(_database); +} + +void Configuration::setFile(const std::string &file) { + _file = file; +} + +void Configuration::setAutoSave(bool autosave) { + _autosave = autosave; +} + +void Configuration::save() { + assert(_database != NULL); + XrmPutFileDatabase(_database, _file.c_str()); + _modified = False; +} + +bool Configuration::load() { + if (_database != NULL) + XrmDestroyDatabase(_database); + _modified = False; + if (NULL == (_database = XrmGetFileDatabase(_file.c_str()))) + return False; + return True; +} + +bool Configuration::merge(const std::string &file, bool overwrite) { + if (XrmCombineFileDatabase(file.c_str(), &_database, overwrite) == 0) + return False; + _modified = True; + if (_autosave) + save(); + return True; +} + +void Configuration::create() { + if (_database != NULL) + XrmDestroyDatabase(_database); + _modified = False; + assert(NULL != (_database = XrmGetStringDatabase(""))); +} + +void Configuration::setValue(const std::string &rname, bool value) { + assert(_database != NULL); + + const char *val = (value ? "True" : "False"); + std::string rc_string = rname + ": " + val; + XrmPutLineResource(&_database, rc_string.c_str()); + + _modified = True; + if (_autosave) + save(); +} + +void Configuration::setValue(const std::string &rname, unsigned long value) { + assert(_database != NULL); + + std::string rc_string = rname + ": " + itostring(value); + XrmPutLineResource(&_database, rc_string.c_str()); + + _modified = True; + if (_autosave) + save(); +} + +void Configuration::setValue(const std::string &rname, long value) { + assert(_database != NULL); + + std::string rc_string = rname + ": " + itostring(value); + XrmPutLineResource(&_database, rc_string.c_str()); + + _modified = True; + if (_autosave) + save(); +} + +void Configuration::setValue(const std::string &rname, const char *value) { + assert(_database != NULL); + assert(value != NULL); + + std::string rc_string = rname + ": " + value; + XrmPutLineResource(&_database, rc_string.c_str()); + + _modified = True; + if (_autosave) + save(); +} + +void Configuration::setValue(const std::string &rname, + const std::string &value) { + assert(_database != NULL); + + std::string rc_string = rname + ": " + value; + XrmPutLineResource(&_database, rc_string.c_str()); + + _modified = True; + if (_autosave) + save(); +} + +bool Configuration::getValue(const std::string &rname, bool &value) const { + assert(_database != NULL); + + std::string rclass = createClassName(rname); + + char *rettype; + XrmValue retvalue; + if (0 == XrmGetResource(_database, rname.c_str(), rclass.c_str(), + &rettype, &retvalue) || retvalue.addr == NULL) + return False; + std::string val = retvalue.addr; + if (val == "True" || val == "True") + value = True; + else + value = False; + return True; +} + +bool Configuration::getValue(const std::string &rname, long &value) const { + assert(_database != NULL); + + std::string rclass = createClassName(rname); + + char *rettype; + XrmValue retvalue; + if (0 == XrmGetResource(_database, rname.c_str(), rclass.c_str(), + &rettype, &retvalue) || retvalue.addr == NULL) + return False; + char *end; + value = strtol(retvalue.addr, &end, 10); + if (end == retvalue.addr) + return False; + return True; +} + +bool Configuration::getValue(const std::string &rname, unsigned long &value) const { + assert(_database != NULL); + + std::string rclass = createClassName(rname); + + char *rettype; + XrmValue retvalue; + if (0 == XrmGetResource(_database, rname.c_str(), rclass.c_str(), + &rettype, &retvalue) || retvalue.addr == NULL) + return False; + char *end; + value = strtoul(retvalue.addr, &end, 10); + if (end == retvalue.addr) + return False; + return True; +} + +bool Configuration::getValue(const std::string &rname, + std::string &value) const { + assert(_database != NULL); + + std::string rclass = createClassName(rname); + + char *rettype; + XrmValue retvalue; + if (0 == XrmGetResource(_database, rname.c_str(), rclass.c_str(), + &rettype, &retvalue) || retvalue.addr == NULL) + return False; + value = retvalue.addr; + return True; +} + + +std::string Configuration::createClassName(const std::string &rname) const { + std::string rclass(rname); + + std::string::iterator it = rclass.begin(), end = rclass.end(); + while (True) { + *it = toUpper(*it); + ++it; + if (it == end) break; + it = std::find(it, rclass.end(), '.'); + if (it == end) break; + ++it; + if (it == end) break; + } + return rclass; +} + + +char Configuration::toUpper(char c) const { + if (c >= 'a' && c <= 'z') + return c - 'a' + 'A'; + return c; +} + +} |
