/*************************************************************************** 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 #include #include namespace KioSword { class OptionBase { public: virtual void readFromQueryString(TQMap 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 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 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::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* other2 = (Option*)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::fromString(const TQString& val) { if (val == "0") return false; else return true; } template<> inline const TQString Option::fromString(const TQString& val) { return val; } template<> inline const int Option::fromString(const TQString& val) { return val.toInt(); } // toString specialisations template<> inline TQString Option::toString(bool val) { return val ? TQString("1"): TQString("0"); } template<> inline TQString Option::toString(TQString val) { return val; } template<> inline TQString Option::toString(int val) { return TQString::number(val); } // readConfigSetting specialisations template<> inline bool Option::readConfigSetting(const TDEConfig* config) { return config->readBoolEntry(m_configName, m_default_value); } template<> inline TQString Option::readConfigSetting(const TDEConfig* config) { return config->readEntry(m_configName, m_default_value); } template<> inline int Option::readConfigSetting(const TDEConfig* config) { return config->readNumEntry(m_configName, m_default_value); } } #endif