diff --git a/src/common/rclconfig.cpp b/src/common/rclconfig.cpp index 0da2be44..939c4274 100644 --- a/src/common/rclconfig.cpp +++ b/src/common/rclconfig.cpp @@ -1,5 +1,5 @@ #ifndef lint -static char rcsid[] = "@(#$Id: rclconfig.cpp,v 1.52 2007-10-04 12:21:52 dockes Exp $ (C) 2004 J.F.Dockes"; +static char rcsid[] = "@(#$Id: rclconfig.cpp,v 1.53 2007-10-09 09:43:10 dockes Exp $ (C) 2004 J.F.Dockes"; #endif /* * This program is free software; you can redistribute it and/or modify @@ -103,34 +103,46 @@ RclConfig::RclConfig(const string *argcnf) return; } - list cdirs; - cdirs.push_back(m_confdir); - cdirs.push_back(path_cat(m_datadir, "examples")); + m_cdirs.push_back(m_confdir); + m_cdirs.push_back(path_cat(m_datadir, "examples")); string cnferrloc = m_confdir + " or " + path_cat(m_datadir, "examples"); - m_conf = new ConfStack("recoll.conf", cdirs, false); - if (m_conf == 0 || !m_conf->ok()) { - m_reason = string("No/bad main configuration file in: ") + cnferrloc; + if (!updateMainConfig()) return; - } - mimemap = new ConfStack("mimemap", cdirs, true); + mimemap = new ConfStack("mimemap", m_cdirs, true); if (mimemap == 0 || !mimemap->ok()) { m_reason = string("No or bad mimemap file in: ") + cnferrloc; return; } - mimeconf = new ConfStack("mimeconf", cdirs, true); + mimeconf = new ConfStack("mimeconf", m_cdirs, true); if (mimeconf == 0 || !mimeconf->ok()) { m_reason = string("No/bad mimeconf in: ") + cnferrloc; return; } - mimeview = new ConfStack("mimeview", cdirs, true); + mimeview = new ConfStack("mimeview", m_cdirs, true); if (mimeconf == 0 || !mimeconf->ok()) { m_reason = string("No/bad mimeview in: ") + cnferrloc; return; } + m_ok = true; + setKeyDir(""); + return; +} + +bool RclConfig::updateMainConfig() +{ + LOGDEB(("RclConfig::updateMainConfig()\n")); + m_conf = new ConfStack("recoll.conf", m_cdirs, true); + if (m_conf == 0 || !m_conf->ok()) { + string where; + stringsToString(m_cdirs, where); + m_reason = string("No/bad main configuration file in: ") + where; + m_ok = false; + return false; + } setKeyDir(""); bool nocjk = false; if (getConfParam("nocjk", &nocjk) && nocjk == true) { @@ -143,8 +155,17 @@ RclConfig::RclConfig(const string *argcnf) TextSplit::cjkProcessing(true); } } - m_ok = true; - return; + return true; +} + +ConfNull *RclConfig::cloneMainConfig() +{ + ConfNull *conf = new ConfStack("recoll.conf", m_cdirs, false); + if (conf == 0 || !conf->ok()) { + m_reason = string("Can't read config"); + return 0; + } + return conf; } bool RclConfig::getConfParam(const std::string &name, int *ivp) diff --git a/src/common/rclconfig.h b/src/common/rclconfig.h index 6c2770db..07d39645 100644 --- a/src/common/rclconfig.h +++ b/src/common/rclconfig.h @@ -16,7 +16,7 @@ */ #ifndef _RCLCONFIG_H_INCLUDED_ #define _RCLCONFIG_H_INCLUDED_ -/* @(#$Id: rclconfig.h,v 1.37 2007-10-01 06:19:21 dockes Exp $ (C) 2004 J.F.Dockes */ +/* @(#$Id: rclconfig.h,v 1.38 2007-10-09 09:43:10 dockes Exp $ (C) 2004 J.F.Dockes */ #include #include @@ -46,6 +46,13 @@ class RclConfig { // themselves. static RclConfig* getMainConfig(); + // Return a writable clone of the main config. This belongs to the + // caller (must delete it when done) + ConfNull *cloneMainConfig(); + + /** (re)Read recoll.conf */ + bool updateMainConfig(); + bool ok() {return m_ok;} const string &getReason() {return m_reason;} @@ -56,6 +63,8 @@ class RclConfig { void setKeyDir(const string &dir) { m_keydir = dir; + if (m_conf == 0) + return; if (!m_conf->get("defaultcharset", defcharset, m_keydir)) defcharset.erase(); string str; @@ -63,8 +72,6 @@ class RclConfig { guesscharset = stringToBool(str); } string getKeyDir() const {return m_keydir;} - /** Get all defined key directories in configuration */ - list getKeyDirs() {return m_conf->getSubKeys();} /** Get generic configuration parameter according to current keydir */ bool getConfParam(const string &name, string &value) @@ -73,28 +80,6 @@ class RclConfig { return false; return m_conf->get(name, value, m_keydir); } - /** Set generic configuration parameter according to current keydir */ - bool setConfParam(const string &name, const string &value) - { - if (m_conf == 0) - return false; - return m_conf->set(name, value, m_keydir); - } - /** Remove parameter from configuration */ - bool eraseConfParam(const string &name) - { - if (m_conf == 0) - return false; - return m_conf->erase(name, m_keydir); - } - /** Remove parameter from configuration */ - bool eraseKeyDir() - { - if (m_conf == 0) - return false; - return m_conf->eraseKey(m_keydir); - } - /** Variant with autoconversion to int */ bool getConfParam(const std::string &name, int *value); /** Variant with autoconversion to bool */ @@ -197,9 +182,10 @@ class RclConfig { private: int m_ok; string m_reason; // Explanation for bad state - string m_confdir; // Directory where the files are stored - string m_datadir; // Example: /usr/local/share/recoll + string m_confdir; // User directory where the customized files are stored + string m_datadir; // Example: /usr/local/share/recoll string m_keydir; // Current directory used for parameter fetches. + list m_cdirs; // directory stack for the confstacks ConfStack *m_conf; // Parsed configuration files ConfStack *mimemap; // The files don't change with keydir, @@ -215,7 +201,6 @@ class RclConfig { /** Create initial user configuration */ bool initUserConfig(); - /** Copy from other */ void initFrom(const RclConfig& r); /** Init pointers to 0 */