Blame src/configimpl.h

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * 
Packit 1c1d7e
 *
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#ifndef CONFIGIMPL_H
Packit 1c1d7e
#define CONFIGIMPL_H
Packit 1c1d7e
Packit 1c1d7e
#include <qstrlist.h>
Packit 1c1d7e
#include <qdict.h>
Packit 1c1d7e
#include <qlist.h>
Packit 1c1d7e
#include <qregexp.h>
Packit 1c1d7e
#include "ftextstream.h"
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/** Abstract base class for any configuration option.
Packit 1c1d7e
 */
Packit 1c1d7e
class ConfigOption
Packit 1c1d7e
{
Packit 1c1d7e
    friend class ConfigImpl;
Packit 1c1d7e
Packit 1c1d7e
  public:
Packit 1c1d7e
Packit 1c1d7e
    /*! The type of option */
Packit 1c1d7e
    enum OptionType 
Packit 1c1d7e
    { 
Packit 1c1d7e
      O_Info,      //
Packit 1c1d7e
      O_List,      //
Packit 1c1d7e
      O_Enum,      //
Packit 1c1d7e
      O_String,    //
Packit 1c1d7e
      O_Int,       //
Packit 1c1d7e
      O_Bool,      //
Packit 1c1d7e
      O_Obsolete,  //
Packit 1c1d7e
      O_Disabled   //
Packit 1c1d7e
    };
Packit 1c1d7e
    enum 
Packit 1c1d7e
    { 
Packit 1c1d7e
     /*! Maximum length of an option in the config file. Used for 
Packit 1c1d7e
      *  alignment purposes.
Packit 1c1d7e
      */
Packit 1c1d7e
      MAX_OPTION_LENGTH = 23  
Packit 1c1d7e
    };
Packit 1c1d7e
    ConfigOption(OptionType t) : m_kind(t) 
Packit 1c1d7e
    {
Packit 1c1d7e
      m_spaces.fill(' ',40);
Packit 1c1d7e
    }
Packit 1c1d7e
    virtual ~ConfigOption()
Packit 1c1d7e
    {
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    /*! returns the kind of option this is. */
Packit 1c1d7e
    OptionType kind() const { return m_kind; }
Packit 1c1d7e
    QCString name() const { return m_name; }
Packit 1c1d7e
    QCString docs() const { return m_doc; }
Packit 1c1d7e
Packit 1c1d7e
    QCString dependsOn() const { return m_dependency; }
Packit 1c1d7e
    void addDependency(const char *dep) { m_dependency = dep; }
Packit 1c1d7e
    void setEncoding(const QCString &e) { m_encoding = e; }
Packit 1c1d7e
    void setUserComment(const QCString &u) { m_userComment += u; }
Packit 1c1d7e
Packit 1c1d7e
  protected:
Packit 1c1d7e
    virtual void writeTemplate(FTextStream &t,bool sl,bool upd) = 0;
Packit 1c1d7e
    virtual void convertStrToVal() {}
Packit 1c1d7e
    virtual void substEnvVars() = 0;
Packit 1c1d7e
    virtual void init() {}
Packit 1c1d7e
Packit 1c1d7e
    void writeBoolValue(FTextStream &t,bool v);
Packit 1c1d7e
    void writeIntValue(FTextStream &t,int i);
Packit 1c1d7e
    void writeStringValue(FTextStream &t,QCString &s);
Packit 1c1d7e
    void writeStringList(FTextStream &t,QStrList &l);
Packit 1c1d7e
Packit 1c1d7e
    QCString m_spaces;
Packit 1c1d7e
    QCString m_name;
Packit 1c1d7e
    QCString m_doc;
Packit 1c1d7e
    QCString m_dependency;
Packit 1c1d7e
    QCString m_encoding;
Packit 1c1d7e
    QCString m_userComment;
Packit 1c1d7e
    OptionType m_kind;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
/** Section marker for grouping the configuration options.
Packit 1c1d7e
 */
Packit 1c1d7e
class ConfigInfo : public ConfigOption
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    ConfigInfo(const char *name,const char *doc) 
Packit 1c1d7e
      : ConfigOption(O_Info)
Packit 1c1d7e
    {
Packit 1c1d7e
      m_name = name;
Packit 1c1d7e
      m_doc = doc;
Packit 1c1d7e
    }
Packit 1c1d7e
    void writeTemplate(FTextStream &t, bool sl,bool);
Packit 1c1d7e
    void substEnvVars() {}
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
/** Class respresenting a list type option.
Packit 1c1d7e
 */
Packit 1c1d7e
class ConfigList : public ConfigOption
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    enum WidgetType { String, File, Dir, FileAndDir };
Packit 1c1d7e
    ConfigList(const char *name,const char *doc) 
Packit 1c1d7e
      : ConfigOption(O_List)
Packit 1c1d7e
    {
Packit 1c1d7e
      m_name = name;
Packit 1c1d7e
      m_doc = doc;
Packit 1c1d7e
      m_widgetType = String;
Packit 1c1d7e
    }
Packit 1c1d7e
    void addValue(const char *v) { m_defaultValue.append(v); }
Packit 1c1d7e
    void setWidgetType(WidgetType w) { m_widgetType = w; }
Packit 1c1d7e
    WidgetType widgetType() const { return m_widgetType; }
Packit 1c1d7e
    QStrList *valueRef() { return &m_value; }
Packit 1c1d7e
    void writeTemplate(FTextStream &t,bool sl,bool);
Packit 1c1d7e
    void substEnvVars();
Packit 1c1d7e
    void init() { m_value = m_defaultValue; }
Packit 1c1d7e
  private:
Packit 1c1d7e
    QStrList m_value;
Packit 1c1d7e
    QStrList m_defaultValue;
Packit 1c1d7e
    WidgetType m_widgetType;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
/** Class representing an enum type option.
Packit 1c1d7e
 */
Packit 1c1d7e
class ConfigEnum : public ConfigOption
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    ConfigEnum(const char *name,const char *doc,const char *defVal) 
Packit 1c1d7e
      : ConfigOption(O_Enum)
Packit 1c1d7e
    {
Packit 1c1d7e
      m_name = name;
Packit 1c1d7e
      m_doc = doc;
Packit 1c1d7e
      m_value = defVal;
Packit 1c1d7e
      m_defValue = defVal;
Packit 1c1d7e
    }
Packit 1c1d7e
    void addValue(const char *v) { m_valueRange.append(v); }
Packit 1c1d7e
    QStrListIterator iterator() 
Packit 1c1d7e
    {
Packit 1c1d7e
      return QStrListIterator(m_valueRange);
Packit 1c1d7e
    }
Packit 1c1d7e
    QCString *valueRef() { return &m_value; }
Packit 1c1d7e
    void substEnvVars();
Packit 1c1d7e
    void writeTemplate(FTextStream &t,bool sl,bool);
Packit 1c1d7e
    void init() { m_value = m_defValue.copy(); }
Packit 1c1d7e
Packit 1c1d7e
  private:
Packit 1c1d7e
    QStrList m_valueRange;
Packit 1c1d7e
    QCString m_value;
Packit 1c1d7e
    QCString m_defValue;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
/** Class representing a string type option.
Packit 1c1d7e
 */
Packit 1c1d7e
class ConfigString : public ConfigOption
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    enum WidgetType { String, File, Dir, Image };
Packit 1c1d7e
    ConfigString(const char *name,const char *doc) 
Packit 1c1d7e
      : ConfigOption(O_String)
Packit 1c1d7e
    {
Packit 1c1d7e
      m_name = name;
Packit 1c1d7e
      m_doc = doc;
Packit 1c1d7e
      m_widgetType = String;
Packit 1c1d7e
    }
Packit 1c1d7e
   ~ConfigString()
Packit 1c1d7e
    {
Packit 1c1d7e
    }
Packit 1c1d7e
    void setWidgetType(WidgetType w) { m_widgetType = w; }
Packit 1c1d7e
    WidgetType widgetType() const { return m_widgetType; }
Packit 1c1d7e
    void setDefaultValue(const char *v) { m_defValue = v; }
Packit 1c1d7e
    QCString *valueRef() { return &m_value; }
Packit 1c1d7e
    void writeTemplate(FTextStream &t,bool sl,bool);
Packit 1c1d7e
    void substEnvVars();
Packit 1c1d7e
    void init() { m_value = m_defValue.copy(); }
Packit 1c1d7e
  
Packit 1c1d7e
  private:
Packit 1c1d7e
    QCString m_value;
Packit 1c1d7e
    QCString m_defValue;
Packit 1c1d7e
    WidgetType m_widgetType;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
/** Class representing an integer type option.
Packit 1c1d7e
 */
Packit 1c1d7e
class ConfigInt : public ConfigOption
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    ConfigInt(const char *name,const char *doc,int minVal,int maxVal,int defVal) 
Packit 1c1d7e
      : ConfigOption(O_Int)
Packit 1c1d7e
    {
Packit 1c1d7e
      m_name = name;
Packit 1c1d7e
      m_doc = doc;
Packit 1c1d7e
      m_value = defVal;
Packit 1c1d7e
      m_defValue = defVal;
Packit 1c1d7e
      m_minVal = minVal;
Packit 1c1d7e
      m_maxVal = maxVal;
Packit 1c1d7e
    }
Packit 1c1d7e
    QCString *valueStringRef() { return &m_valueString; }
Packit 1c1d7e
    int *valueRef() { return &m_value; }
Packit 1c1d7e
    int minVal() const { return m_minVal; }
Packit 1c1d7e
    int maxVal() const { return m_maxVal; }
Packit 1c1d7e
    void convertStrToVal();
Packit 1c1d7e
    void substEnvVars();
Packit 1c1d7e
    void writeTemplate(FTextStream &t,bool sl,bool upd);
Packit 1c1d7e
    void init() { m_value = m_defValue; }
Packit 1c1d7e
  private:
Packit 1c1d7e
    int m_value;
Packit 1c1d7e
    int m_defValue;
Packit 1c1d7e
    int m_minVal;
Packit 1c1d7e
    int m_maxVal;
Packit 1c1d7e
    QCString m_valueString;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
/** Class representing a Boolean type option.
Packit 1c1d7e
 */
Packit 1c1d7e
class ConfigBool : public ConfigOption
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    ConfigBool(const char *name,const char *doc,bool defVal) 
Packit 1c1d7e
      : ConfigOption(O_Bool)
Packit 1c1d7e
    {
Packit 1c1d7e
      m_name = name;
Packit 1c1d7e
      m_doc = doc;
Packit 1c1d7e
      m_value = defVal;
Packit 1c1d7e
      m_defValue = defVal;
Packit 1c1d7e
    }
Packit 1c1d7e
    QCString *valueStringRef() { return &m_valueString; }
Packit 1c1d7e
    bool *valueRef() { return &m_value; }
Packit 1c1d7e
    void convertStrToVal();
Packit 1c1d7e
    void substEnvVars();
Packit 1c1d7e
    void setValueString(const QCString &v) { m_valueString = v; }
Packit 1c1d7e
    void writeTemplate(FTextStream &t,bool sl,bool upd);
Packit 1c1d7e
    void init() { m_value = m_defValue; }
Packit 1c1d7e
  private:
Packit 1c1d7e
    bool m_value;
Packit 1c1d7e
    bool m_defValue;
Packit 1c1d7e
    QCString m_valueString;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
/** Section marker for obsolete options
Packit 1c1d7e
 */
Packit 1c1d7e
class ConfigObsolete : public ConfigOption
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    ConfigObsolete(const char *name) : ConfigOption(O_Obsolete)  
Packit 1c1d7e
    { m_name = name; }
Packit 1c1d7e
    void writeTemplate(FTextStream &,bool,bool);
Packit 1c1d7e
    void substEnvVars() {}
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
/** Section marker for compile time optional options
Packit 1c1d7e
 */
Packit 1c1d7e
class ConfigDisabled : public ConfigOption
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    ConfigDisabled(const char *name) : ConfigOption(O_Disabled)  
Packit 1c1d7e
    { m_name = name; }
Packit 1c1d7e
    void writeTemplate(FTextStream &,bool,bool);
Packit 1c1d7e
    void substEnvVars() {}
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
// some convenience macros for access the config options
Packit 1c1d7e
#define ConfigImpl_getString(val)  ConfigImpl::instance()->getString(__FILE__,__LINE__,val)
Packit 1c1d7e
#define ConfigImpl_getInt(val)     ConfigImpl::instance()->getInt(__FILE__,__LINE__,val)
Packit 1c1d7e
#define ConfigImpl_getList(val)    ConfigImpl::instance()->getList(__FILE__,__LINE__,val)
Packit 1c1d7e
#define ConfigImpl_getEnum(val)    ConfigImpl::instance()->getEnum(__FILE__,__LINE__,val)
Packit 1c1d7e
#define ConfigImpl_getBool(val)    ConfigImpl::instance()->getBool(__FILE__,__LINE__,val)
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/** Singleton for configuration variables.
Packit 1c1d7e
 *
Packit 1c1d7e
 *  This object holds the global static variables
Packit 1c1d7e
 *  read from a user-supplied configuration file.
Packit 1c1d7e
 *  The static member instance() can be used to get
Packit 1c1d7e
 *  a pointer to the one and only instance.
Packit 1c1d7e
 *  
Packit 1c1d7e
 *  Set all variables to their default values by
Packit 1c1d7e
 *  calling Config::instance()->init()
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
class ConfigImpl
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    /////////////////////////////
Packit 1c1d7e
    // public API
Packit 1c1d7e
    /////////////////////////////
Packit 1c1d7e
Packit 1c1d7e
    /*! Returns the one and only instance of this class */
Packit 1c1d7e
    static ConfigImpl *instance()
Packit 1c1d7e
    {
Packit 1c1d7e
      if (m_instance==0) m_instance = new ConfigImpl;
Packit 1c1d7e
      return m_instance;
Packit 1c1d7e
    }
Packit 1c1d7e
    /*! Delete the instance */
Packit 1c1d7e
    static void deleteInstance()
Packit 1c1d7e
    {
Packit 1c1d7e
      delete m_instance;
Packit 1c1d7e
      m_instance=0;
Packit 1c1d7e
    }
Packit 1c1d7e
    
Packit 1c1d7e
    /*! Returns an iterator that can by used to iterate over the 
Packit 1c1d7e
     *  configuration options.
Packit 1c1d7e
     */
Packit 1c1d7e
    QListIterator<ConfigOption> iterator()
Packit 1c1d7e
    {
Packit 1c1d7e
      return QListIterator<ConfigOption>(*m_options);
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    /*! 
Packit 1c1d7e
     *  @name Getting configuration values.
Packit 1c1d7e
     *  @{
Packit 1c1d7e
     */
Packit 1c1d7e
Packit 1c1d7e
    /*! Returns the value of the string option with name \a fileName. 
Packit 1c1d7e
     *  The arguments \a num and \a name are for debugging purposes only.
Packit 1c1d7e
     *  There is a convenience function Config_getString() for this.
Packit 1c1d7e
     */
Packit 1c1d7e
    QCString &getString(const char *fileName,int num,const char *name) const;
Packit 1c1d7e
Packit 1c1d7e
    /*! Returns the value of the list option with name \a fileName. 
Packit 1c1d7e
     *  The arguments \a num and \a name are for debugging purposes only.
Packit 1c1d7e
     *  There is a convenience function Config_getList() for this.
Packit 1c1d7e
     */
Packit 1c1d7e
    QStrList &getList(const char *fileName,int num,const char *name) const;
Packit 1c1d7e
Packit 1c1d7e
    /*! Returns the value of the enum option with name \a fileName. 
Packit 1c1d7e
     *  The arguments \a num and \a name are for debugging purposes only.
Packit 1c1d7e
     *  There is a convenience function Config_getEnum() for this.
Packit 1c1d7e
     */
Packit 1c1d7e
    QCString &getEnum(const char *fileName,int num,const char *name) const;
Packit 1c1d7e
Packit 1c1d7e
    /*! Returns the value of the integer option with name \a fileName. 
Packit 1c1d7e
     *  The arguments \a num and \a name are for debugging purposes only.
Packit 1c1d7e
     *  There is a convenience function Config_getInt() for this.
Packit 1c1d7e
     */
Packit 1c1d7e
    int      &getInt(const char *fileName,int num,const char *name) const;
Packit 1c1d7e
Packit 1c1d7e
    /*! Returns the value of the boolean option with name \a fileName. 
Packit 1c1d7e
     *  The arguments \a num and \a name are for debugging purposes only.
Packit 1c1d7e
     *  There is a convenience function Config_getBool() for this.
Packit 1c1d7e
     */
Packit 1c1d7e
    bool     &getBool(const char *fileName,int num,const char *name) const;
Packit 1c1d7e
Packit 1c1d7e
    /*! Returns the ConfigOption corresponding with \a name or 0 if
Packit 1c1d7e
     *  the option is not supported.
Packit 1c1d7e
     */
Packit 1c1d7e
    ConfigOption *get(const char *name) const
Packit 1c1d7e
    {
Packit 1c1d7e
      return m_dict->find(name); 
Packit 1c1d7e
    }
Packit 1c1d7e
    /* @} */
Packit 1c1d7e
Packit 1c1d7e
    /*! 
Packit 1c1d7e
     *  @name Adding configuration options. 
Packit 1c1d7e
     *  @{
Packit 1c1d7e
     */
Packit 1c1d7e
Packit 1c1d7e
    /*! Starts a new configuration section with \a name and description \a doc.
Packit 1c1d7e
     *  \returns An object representing the option.
Packit 1c1d7e
     */
Packit 1c1d7e
    ConfigInfo   *addInfo(const char *name,const char *doc)
Packit 1c1d7e
    {
Packit 1c1d7e
      ConfigInfo *result = new ConfigInfo(name,doc);
Packit 1c1d7e
      m_options->append(result);
Packit 1c1d7e
      return result;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    /*! Adds a new string option with \a name and documentation \a doc.
Packit 1c1d7e
     *  \returns An object representing the option.
Packit 1c1d7e
     */
Packit 1c1d7e
    ConfigString *addString(const char *name,
Packit 1c1d7e
                            const char *doc)
Packit 1c1d7e
    {
Packit 1c1d7e
      ConfigString *result = new ConfigString(name,doc);
Packit 1c1d7e
      m_options->append(result);
Packit 1c1d7e
      m_dict->insert(name,result);
Packit 1c1d7e
      return result;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    /*! Adds a new enumeration option with \a name and documentation \a doc
Packit 1c1d7e
     *  and initial value \a defVal. 
Packit 1c1d7e
     *  \returns An object representing the option.
Packit 1c1d7e
     */
Packit 1c1d7e
    ConfigEnum   *addEnum(const char *name,
Packit 1c1d7e
                          const char *doc,
Packit 1c1d7e
                          const char *defVal)
Packit 1c1d7e
    {
Packit 1c1d7e
      ConfigEnum *result = new ConfigEnum(name,doc,defVal);
Packit 1c1d7e
      m_options->append(result);
Packit 1c1d7e
      m_dict->insert(name,result);
Packit 1c1d7e
      return result;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    /*! Adds a new string option with \a name and documentation \a doc.
Packit 1c1d7e
     *  \returns An object representing the option.
Packit 1c1d7e
     */
Packit 1c1d7e
    ConfigList   *addList(const char *name,
Packit 1c1d7e
                          const char *doc)
Packit 1c1d7e
    {
Packit 1c1d7e
      ConfigList *result = new ConfigList(name,doc);
Packit 1c1d7e
      m_options->append(result);
Packit 1c1d7e
      m_dict->insert(name,result);
Packit 1c1d7e
      return result;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    /*! Adds a new integer option with \a name and documentation \a doc.
Packit 1c1d7e
     *  The integer has a range between \a minVal and \a maxVal and a
Packit 1c1d7e
     *  default value of \a defVal.
Packit 1c1d7e
     *  \returns An object representing the option.
Packit 1c1d7e
     */
Packit 1c1d7e
    ConfigInt    *addInt(const char *name,
Packit 1c1d7e
                         const char *doc,
Packit 1c1d7e
                         int minVal,int maxVal,int defVal)
Packit 1c1d7e
    {
Packit 1c1d7e
      ConfigInt *result = new ConfigInt(name,doc,minVal,maxVal,defVal);
Packit 1c1d7e
      m_options->append(result);
Packit 1c1d7e
      m_dict->insert(name,result);
Packit 1c1d7e
      return result;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    /*! Adds a new boolean option with \a name and documentation \a doc.
Packit 1c1d7e
     *  The boolean has a default value of \a defVal.
Packit 1c1d7e
     *  \returns An object representing the option.
Packit 1c1d7e
     */
Packit 1c1d7e
    ConfigBool   *addBool(const char *name,
Packit 1c1d7e
                          const char *doc,
Packit 1c1d7e
                          bool defVal)
Packit 1c1d7e
    {
Packit 1c1d7e
      ConfigBool *result = new ConfigBool(name,doc,defVal);
Packit 1c1d7e
      m_options->append(result);
Packit 1c1d7e
      m_dict->insert(name,result);
Packit 1c1d7e
      return result;
Packit 1c1d7e
    }
Packit 1c1d7e
    /*! Adds an option that has become obsolete. */
Packit 1c1d7e
    ConfigOption *addObsolete(const char *name)
Packit 1c1d7e
    {
Packit 1c1d7e
      ConfigObsolete *option = new ConfigObsolete(name);
Packit 1c1d7e
      m_dict->insert(name,option);
Packit 1c1d7e
      m_obsolete->append(option);
Packit 1c1d7e
      return option;
Packit 1c1d7e
    }
Packit 1c1d7e
    /*! Adds an option that has been disabled at compile time. */
Packit 1c1d7e
    ConfigOption *addDisabled(const char *name)
Packit 1c1d7e
    {
Packit 1c1d7e
      ConfigDisabled *option = new ConfigDisabled(name);
Packit 1c1d7e
      m_dict->insert(name,option);
Packit 1c1d7e
      m_disabled->append(option);
Packit 1c1d7e
      return option;
Packit 1c1d7e
    }
Packit 1c1d7e
    /*! @} */
Packit 1c1d7e
Packit 1c1d7e
    /*! Writes a template configuration to stream \a t. If \a shortIndex
Packit 1c1d7e
     *  is \c TRUE the description of each configuration option will
Packit 1c1d7e
     *  be omitted.
Packit 1c1d7e
     */
Packit 1c1d7e
    void writeTemplate(FTextStream &t,bool shortIndex,bool updateOnly);
Packit 1c1d7e
Packit 1c1d7e
    void setHeader(const char *header) { m_header = header; }
Packit 1c1d7e
Packit 1c1d7e
    /////////////////////////////
Packit 1c1d7e
    // internal API
Packit 1c1d7e
    /////////////////////////////
Packit 1c1d7e
Packit 1c1d7e
    /*! Converts the string values read from the configuration file
Packit 1c1d7e
     *  to real values for non-string type options (like int, and bools)
Packit 1c1d7e
     */
Packit 1c1d7e
    void convertStrToVal();
Packit 1c1d7e
Packit 1c1d7e
    /*! Replaces references to environment variable by the actual value
Packit 1c1d7e
     *  of the environment variable.
Packit 1c1d7e
     */
Packit 1c1d7e
    void substituteEnvironmentVars();
Packit 1c1d7e
Packit 1c1d7e
    /*! Initialize config variables to their default value */
Packit 1c1d7e
    void init();
Packit 1c1d7e
Packit 1c1d7e
    /*! Parse a configuration data in string \a str.
Packit 1c1d7e
     *  \returns TRUE if successful, or FALSE if the string could not be
Packit 1c1d7e
     *  parsed.
Packit 1c1d7e
     */ 
Packit 1c1d7e
    //bool parseString(const char *fn,const char *str);
Packit 1c1d7e
    bool parseString(const char *fn,const char *str,bool upd = FALSE);
Packit 1c1d7e
Packit 1c1d7e
    /*! Parse a configuration file with name \a fn.
Packit 1c1d7e
     *  \returns TRUE if successful, FALSE if the file could not be 
Packit 1c1d7e
     *  opened or read.
Packit 1c1d7e
     */ 
Packit 1c1d7e
    bool parse(const char *fn,bool upd = FALSE);
Packit 1c1d7e
Packit 1c1d7e
    /*! Called from the constructor, will add doxygen's default options
Packit 1c1d7e
     *  to the configuration object 
Packit 1c1d7e
     */
Packit 1c1d7e
    void create();
Packit 1c1d7e
Packit 1c1d7e
    /*! Append user start comment
Packit 1c1d7e
     */
Packit 1c1d7e
    void appendStartComment(const QCString &u)
Packit 1c1d7e
    {
Packit 1c1d7e
      m_startComment += u;
Packit 1c1d7e
    }
Packit 1c1d7e
    /*! Append user comment
Packit 1c1d7e
     */
Packit 1c1d7e
    void appendUserComment(const QCString &u)
Packit 1c1d7e
    {
Packit 1c1d7e
      m_userComment += u;
Packit 1c1d7e
    }
Packit 1c1d7e
    /*! Take the user start comment and reset it internally
Packit 1c1d7e
     *  \returns user start comment
Packit 1c1d7e
     */
Packit 1c1d7e
    QCString takeStartComment()
Packit 1c1d7e
    {
Packit 1c1d7e
      QCString result=m_startComment;
Packit 1c1d7e
      m_startComment.resize(0);
Packit 1c1d7e
      return result.replace(QRegExp("\r"),"");
Packit 1c1d7e
    }
Packit 1c1d7e
    /*! Take the user comment and reset it internally
Packit 1c1d7e
     *  \returns user comment
Packit 1c1d7e
     */
Packit 1c1d7e
    QCString takeUserComment()
Packit 1c1d7e
    {
Packit 1c1d7e
      QCString result=m_userComment;
Packit 1c1d7e
      m_userComment.resize(0);
Packit 1c1d7e
      return result.replace(QRegExp("\r"),"");
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
  protected:
Packit 1c1d7e
Packit 1c1d7e
    ConfigImpl()
Packit 1c1d7e
    {
Packit 1c1d7e
      m_options  = new QList<ConfigOption>;
Packit 1c1d7e
      m_obsolete = new QList<ConfigOption>;
Packit 1c1d7e
      m_disabled = new QList<ConfigOption>;
Packit 1c1d7e
      m_dict     = new QDict<ConfigOption>(257);
Packit 1c1d7e
      m_options->setAutoDelete(TRUE);
Packit 1c1d7e
      m_obsolete->setAutoDelete(TRUE);
Packit 1c1d7e
      m_disabled->setAutoDelete(TRUE);
Packit 1c1d7e
      m_initialized = FALSE;
Packit 1c1d7e
      create();
Packit 1c1d7e
    }
Packit 1c1d7e
   ~ConfigImpl()
Packit 1c1d7e
    {
Packit 1c1d7e
      delete m_options;
Packit 1c1d7e
      delete m_obsolete;
Packit 1c1d7e
      delete m_disabled;
Packit 1c1d7e
      delete m_dict;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
  private:
Packit 1c1d7e
    QList<ConfigOption> *m_options;
Packit 1c1d7e
    QList<ConfigOption> *m_obsolete;
Packit 1c1d7e
    QList<ConfigOption> *m_disabled;
Packit 1c1d7e
    QDict<ConfigOption> *m_dict;
Packit 1c1d7e
    static ConfigImpl *m_instance;
Packit 1c1d7e
    QCString m_startComment;
Packit 1c1d7e
    QCString m_userComment;
Packit 1c1d7e
    bool m_initialized;
Packit 1c1d7e
    QCString m_header;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
#endif