You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeio-sword/src/option.h

301 lines
8.5 KiB

/***************************************************************************
File: option.h
Project: Kio-Sword -- An ioslave for SWORD and KDE
Copyright: Copyright (C) 2005 Luke Plant
***************************************************************************/
/***************************************************************************
* 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., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef option_h
#define option_h
#include <tdeconfig.h>
#include <ntqstring.h>
#include <ntqmap.h>
namespace KioSword
{
class OptionBase
{
public:
virtual void readFromQueryString(TQMap<TQString, TQString> params, bool allowPropagating) = 0;
virtual void getQueryStringPair(TQString& name, TQString& val) = 0;
virtual void readFromConfig(const TDEConfig* config) = 0;
virtual void saveToConfig(TDEConfig* config) = 0;
virtual void copy(const OptionBase* other) = 0;
virtual ~OptionBase() {};
};
/**
* Template class for options that can be read/saved to a query string
* or config file and are used at run time to determine various things
*
*/
template <class T>
class Option : public OptionBase
{
protected:
T m_value; // current value
T m_propagate_value; // value we are going to propagate when creating URLs
T m_default_value; // KioSWord internal default
T m_config_value; // User's default
/** Convert a value from a string to the option's type */
static const T fromString(const TQString& val)
{
// We will specialise this function later
// to work correctly
T result;
return result;
}
/** Convert the option to a string for use in query strings */
TQString toString(T val)
{
// Will specialise this later
TQString result;
return result;
}
/** return the config setting */
T readConfigSetting(const TDEConfig* config)
{
// We will specialise this later
T result;
return result;
}
public:
TQString m_qsShortName; // short name in querystring
TQString m_qsLongName; // long name in querystring
bool m_propagate; // true if this option can be propagated
TQString m_configName; // name of config setting in config file
Option()
{
};
virtual ~Option()
{
};
/**
* Sets up the names and default value of the option
*
* Setting configName to "" means the option is never put into the config file
* Setting both qsShortName and qsLongName to "" means the option is never put
* in the query string.
*
* @param default_value the value the option if not set from anywhere else
* @param configName the name the option has in the config file, or "" to never save or read from config
* @param qsShortName the short name for the option when used in a query string
* @param qsLongName the long name for the option when use in a query string
* @param propagate true if this parameter can be propagated in generated query strings
*/
void setup(const T& default_value, const TQString& configName, const TQString& qsShortName, const TQString& qsLongName, bool propagate)
{
m_value = default_value;
m_default_value = default_value;
m_config_value = default_value; // assume this for now
m_propagate_value = m_value;
m_configName = configName;
m_qsShortName = qsShortName;
m_qsLongName = qsLongName;
m_propagate = propagate;
}
/** Get the value of the option */
const T& operator() () const
{
return m_value;
}
/** Set the value of the option (including the value to propagate) */
void set(const T& value)
{
m_value = value;
m_propagate_value = value;
}
/** read and set the option from the querystring */
virtual void readFromQueryString(TQMap<TQString, TQString> params, bool allowPropagating)
{
T newval;
bool found = false;
/* // Start with defaults. We have to do this
// because these objects are re-used from one request to the next
m_value = m_config_value;
m_propagate_value = m_config_value;*/
// Search for short name
TQMap<TQString, TQString>::const_iterator it = params.find(m_qsShortName);
if (it != params.end())
{
newval = fromString(it.data());
found = true;
}
if (!found) {
// Search for long name
it = params.find(m_qsLongName);
if (it != params.end())
{
newval = fromString(it.data());
found = true;
}
}
if (found) {
m_value = newval;
if (m_propagate && allowPropagating) {
m_propagate_value = newval;
}
}
}
/** set the name and value of a query string pair */
virtual void getQueryStringPair(TQString& name, TQString& val)
{
// To keep things tidy, we don't propagate in the
// query string values that wouldn't make a difference
// i.e. if current value is the same as config,
// don't propagate
if (m_propagate_value != m_config_value) {
if (m_qsShortName.isEmpty())
name.append(m_qsLongName);
else
name.append(m_qsShortName.copy());
val.append(toString(m_propagate_value));
}
}
/** read and set the value from the config file, or set to default if no config setting */
virtual void readFromConfig(const TDEConfig* config)
{
if (!m_configName.isEmpty())
{
set(readConfigSetting(config));
}
else
{
set(m_default_value);
}
m_config_value = m_value;
}
/** save the value to the config file */
virtual void saveToConfig(TDEConfig* config)
{
if (!m_configName.isEmpty())
{
// overloads for TDEConfig::writeEntry cater
// for everything we need so far
if (m_value != m_default_value) // keep settings file tidy
{
config->writeEntry(m_configName, m_value);
m_config_value = m_value;
}
else
{
config->deleteEntry(m_configName);
}
}
}
/** copy value from another */
virtual void copy(const OptionBase* other)
{
// we must ensure that we only copy from an object
// of the same type.
const Option<T>* other2 = (Option<T>*)other;
// m_configName, m_default_value, m_qsShortName and m_qsLongName, and m_propagate
// have already been set up correctly (those don't change fromString
// the values given in the setup() method)
m_value = other2->m_value;
m_config_value = other2->m_config_value;
m_propagate_value = other2->m_propagate_value;
}
};
// Specialisations
// fromString specialisations
template<>
inline const bool Option<bool>::fromString(const TQString& val)
{
if (val == "0")
return false;
else
return true;
}
template<>
inline const TQString Option<TQString>::fromString(const TQString& val)
{
return val;
}
template<>
inline const int Option<int>::fromString(const TQString& val)
{
return val.toInt();
}
// toString specialisations
template<>
inline TQString Option<bool>::toString(bool val)
{
return val ? TQString("1"): TQString("0");
}
template<>
inline TQString Option<TQString>::toString(TQString val)
{
return val;
}
template<>
inline TQString Option<int>::toString(int val)
{
return TQString::number(val);
}
// readConfigSetting specialisations
template<>
inline bool Option<bool>::readConfigSetting(const TDEConfig* config)
{
return config->readBoolEntry(m_configName, m_default_value);
}
template<>
inline TQString Option<TQString>::readConfigSetting(const TDEConfig* config)
{
return config->readEntry(m_configName, m_default_value);
}
template<>
inline int Option<int>::readConfigSetting(const TDEConfig* config)
{
return config->readNumEntry(m_configName, m_default_value);
}
}
#endif