diff --git a/src/common/rclconfig.cpp b/src/common/rclconfig.cpp index 5bdecd3d..5667c429 100644 --- a/src/common/rclconfig.cpp +++ b/src/common/rclconfig.cpp @@ -65,55 +65,93 @@ bool o_uptodate_test_use_mtime = false; string RclConfig::o_localecharset; string RclConfig::o_origcwd; -bool ParamStale::needrecompute() +// Compute the difference of 1st to 2nd set and return as +// plus/minus strings +static void setPlusMinus(const set& base, const set& upd, + string& plus, string& minus) { - LOGDEB2("ParamStale:: needrecompute. parent gen " << (parent->m_keydirgen) << " mine " << (savedkeydirgen) << "\n" ); - if (active && parent->m_keydirgen != savedkeydirgen) { - LOGDEB2("ParamState:: needrecompute. conffile " << (conffile) << "\n" ); + vector diff; + auto it = + set_difference(base.begin(), base.end(), upd.begin(), upd.end(), + std::inserter(diff, diff.begin())); + minus = stringsToString(diff); - savedkeydirgen = parent->m_keydirgen; - string newvalue; - if (!conffile) - return false; - conffile->get(paramname, newvalue, parent->m_keydir); - if (newvalue.compare(savedvalue)) { - savedvalue = newvalue; - LOGDEB2("ParamState:: needrecompute. return true newvalue [" << (newvalue) << "]\n" ); - return true; + diff.clear(); + it = set_difference(upd.begin(), upd.end(), base.begin(), base.end(), + std::inserter(diff, diff.begin())); + plus = stringsToString(diff); +} + +static void computeBasePlusMinus(set& res, const string& strbase, + const string& strplus, const string& strminus) +{ + set plus, minus; + stringToStrings(strbase, res); + stringToStrings(strplus, plus); + stringToStrings(strminus, minus); + for (auto& it : minus) { + auto it1 = res.find(it); + if (it1 != res.end()) { + res.erase(it1); } } - return false; + for (auto& it : plus) { + res.insert(it); + } +} + +bool ParamStale::needrecompute() +{ + LOGDEB1("ParamStale:: needrecompute. parent gen " << parent->m_keydirgen << + " mine " << savedkeydirgen << "\n"); + + if (!conffile) { + LOGDEB("ParamStale::needrecompute: conffile not set\n"); + return false; + } + + bool needrecomp = false; + if (active && parent->m_keydirgen != savedkeydirgen) { + savedkeydirgen = parent->m_keydirgen; + for (unsigned int i = 0; i < paramnames.size(); i++) { + string newvalue; + conffile->get(paramnames[i], newvalue, parent->m_keydir); + LOGDEB1("ParamStale::needrecompute: " << paramnames[i] << " -> " << + newvalue << " keydir " << parent->m_keydir << endl); + if (newvalue.compare(savedvalues[i])) { + savedvalues[i] = newvalue; + needrecomp = true; + } + } + } + return needrecomp; +} + +const string& ParamStale::getvalue(unsigned int i) const +{ + if (i < savedvalues.size()) { + return savedvalues[i]; + } else { + static string nll; + return nll; + } } void ParamStale::init(ConfNull *cnf) { conffile = cnf; active = false; - if (conffile) - active = conffile->hasNameAnywhere(paramname); + if (conffile) { + for (auto& nm : paramnames) { + if (conffile->hasNameAnywhere(nm)) { + active = true; + break; + } + } + } savedkeydirgen = -1; } -ParamStale::ParamStale(RclConfig *rconf, const string& nm) - : parent(rconf), conffile(0), paramname(nm), - active(false), savedkeydirgen(-1) -{ -} - -void RclConfig::zeroMe() { - m_ok = false; - m_keydirgen = 0; - m_conf = 0; - mimemap = 0; - mimeconf = 0; - mimeview = 0; - m_fields = 0; - m_ptrans = 0; - m_stopsuffixes = 0; - m_maxsufflen = 0; - initParamStale(0, 0); -} - bool RclConfig::isDefaultConfig() const { string defaultconf = path_cat(path_homedata(), @@ -124,10 +162,24 @@ bool RclConfig::isDefaultConfig() const return !defaultconf.compare(specifiedconf); } + +RclConfig::RclConfig(const RclConfig &r) + : m_oldstpsuffstate(this, "recoll_noindex"), + m_stpsuffstate(this, {"noContentSuffixes", "noContentSuffixes+", + "noContentSuffixes-"}), + m_skpnstate(this, {"skippedNames", "skippedNames+", "skippedNames-"}), + m_rmtstate(this, "indexedmimetypes"), + m_xmtstate(this, "excludedmimetypes"), + m_mdrstate(this, "metadatacmds") +{ + initFrom(r); +} + RclConfig::RclConfig(const string *argcnf) : m_oldstpsuffstate(this, "recoll_noindex"), - m_stpsuffstate(this, "noContentSuffixes"), - m_skpnstate(this, "skippedNames"), + m_stpsuffstate(this, {"noContentSuffixes", "noContentSuffixes+", + "noContentSuffixes-"}), + m_skpnstate(this, {"skippedNames", "skippedNames+", "skippedNames-"}), m_rmtstate(this, "indexedmimetypes"), m_xmtstate(this, "excludedmimetypes"), m_mdrstate(this, "metadatacmds") @@ -139,7 +191,8 @@ RclConfig::RclConfig(const string *argcnf) if (getcwd(buf, MAXPATHLEN)) { o_origcwd = string(buf); } else { - fprintf(stderr, "recollxx: can't retrieve current working directory: relative path translations will fail\n"); + fprintf(stderr, "recollxx: can't retrieve current working " + "directory: relative path translations will fail\n"); } } @@ -163,7 +216,7 @@ RclConfig::RclConfig(const string *argcnf) m_confdir = path_canon(cp); } else { autoconfdir = true; - m_confdir = path_cat(path_homedata(), path_defaultrecollconfsubdir()); + m_confdir=path_cat(path_homedata(), path_defaultrecollconfsubdir()); } } @@ -448,7 +501,7 @@ void RclConfig::initThrConf() vector vq; vector vt; if (!getConfParam("thrQSizes", &vq)) { - LOGINFO("RclConfig::initThrConf: no thread info (queues)\n" ); + LOGINFO("RclConfig::initThrConf: no thread info (queues)\n"); goto out; } @@ -456,7 +509,7 @@ void RclConfig::initThrConf() if (vq.size() > 0 && vq[0] == 0) { CpuConf cpus; if (!getCpuConf(cpus) || cpus.ncpus < 1) { - LOGERR("RclConfig::initThrConf: could not retrieve cpu conf\n" ); + LOGERR("RclConfig::initThrConf: could not retrieve cpu conf\n"); cpus.ncpus = 1; } if (cpus.ncpus != 1) { @@ -484,12 +537,12 @@ void RclConfig::initThrConf() } if (!getConfParam("thrTCounts", &vt) ) { - LOGINFO("RclConfig::initThrConf: no thread info (threads)\n" ); + LOGINFO("RclConfig::initThrConf: no thread info (threads)\n"); goto out; } if (vq.size() != 3 || vt.size() != 3) { - LOGINFO("RclConfig::initThrConf: bad thread info vector sizes\n" ); + LOGINFO("RclConfig::initThrConf: bad thread info vector sizes\n"); goto out; } @@ -506,13 +559,14 @@ out: ") "; } - LOGDEB("RclConfig::initThrConf: chosen config (ql,nt): " << (sconf.str()) << "\n" ); + LOGDEB("RclConfig::initThrConf: chosen config (ql,nt): " << sconf.str() << + "\n"); } pair RclConfig::getThrConf(ThrStage who) const { if (m_thrConf.size() != 3) { - LOGERR("RclConfig::getThrConf: bad data in rclconfig\n" ); + LOGERR("RclConfig::getThrConf: bad data in rclconfig\n"); return pair(-1,-1); } return m_thrConf[who]; @@ -522,7 +576,8 @@ vector RclConfig::getTopdirs() const { vector tdl; if (!getConfParam("topdirs", &tdl)) { - LOGERR("RclConfig::getTopdirs: no top directories in config or bad list format\n" ); + LOGERR("RclConfig::getTopdirs: no top directories in config or " + "bad list format\n"); return tdl; } @@ -611,7 +666,7 @@ typedef multiset SuffixStore; bool RclConfig::inStopSuffixes(const string& fni) { - LOGDEB2("RclConfig::inStopSuffixes(" << (fni) << ")\n" ); + LOGDEB2("RclConfig::inStopSuffixes(" << fni << ")\n"); // Beware: both needrecompute() need to be called always hence the // bizarre way we do things bool needrecompute = m_stpsuffstate.needrecompute(); @@ -620,23 +675,24 @@ bool RclConfig::inStopSuffixes(const string& fni) // Need to initialize the suffixes delete STOPSUFFIXES; if ((m_stopsuffixes = new SuffixStore) == 0) { - LOGERR("RclConfig::inStopSuffixes: out of memory\n" ); + LOGERR("RclConfig::inStopSuffixes: out of memory\n"); return false; } // Let the old customisation have priority: if recoll_noindex // from mimemap is set, it the user's (the default value is // gone). Else use the new variable - vector stoplist; - if (!m_oldstpsuffstate.savedvalue.empty()) { - stringToStrings(m_oldstpsuffstate.savedvalue, stoplist); + set stoplist; + if (!m_oldstpsuffstate.getvalue(0).empty()) { + stringToStrings(m_oldstpsuffstate.getvalue(0), stoplist); } else { - stringToStrings(m_stpsuffstate.savedvalue, stoplist); + computeBasePlusMinus(stoplist, m_stpsuffstate.getvalue(0), + m_stpsuffstate.getvalue(1), + m_stpsuffstate.getvalue(2)); } - for (vector::const_iterator it = stoplist.begin(); - it != stoplist.end(); it++) { - STOPSUFFIXES->insert(SfString(stringtolower(*it))); - if (m_maxsufflen < it->length()) - m_maxsufflen = int(it->length()); + for (auto& it : stoplist) { + STOPSUFFIXES->insert(SfString(stringtolower(it))); + if (m_maxsufflen < it.length()) + m_maxsufflen = int(it.length()); } } @@ -647,10 +703,11 @@ bool RclConfig::inStopSuffixes(const string& fni) stringtolower(fn); SuffixStore::const_iterator it = STOPSUFFIXES->find(fn); if (it != STOPSUFFIXES->end()) { - LOGDEB2("RclConfig::inStopSuffixes: Found (" << (fni) << ") [" << ((*it).m_str) << "]\n" ); + LOGDEB2("RclConfig::inStopSuffixes: Found (" << fni << ") [" << + ((*it).m_str) << "]\n"); return true; } else { - LOGDEB2("RclConfig::inStopSuffixes: not found [" << (fni) << "]\n" ); + LOGDEB2("RclConfig::inStopSuffixes: not found [" << fni << "]\n"); return false; } } @@ -717,28 +774,28 @@ string RclConfig::getMimeHandlerDef(const string &mtype, bool filtertypes) if (filtertypes) { if(m_rmtstate.needrecompute()) { m_restrictMTypes.clear(); - stringToStrings(stringtolower((const string&)m_rmtstate.savedvalue), + stringToStrings(stringtolower((const string&)m_rmtstate.getvalue()), m_restrictMTypes); } if (m_xmtstate.needrecompute()) { m_excludeMTypes.clear(); - stringToStrings(stringtolower((const string&)m_xmtstate.savedvalue), + stringToStrings(stringtolower((const string&)m_xmtstate.getvalue()), m_excludeMTypes); } if (!m_restrictMTypes.empty() && !m_restrictMTypes.count(stringtolower(mtype))) { - LOGDEB2("RclConfig::getMimeHandlerDef: not in mime type list\n" ); + LOGDEB2("RclConfig::getMimeHandlerDef: not in mime type list\n"); return hs; } if (!m_excludeMTypes.empty() && m_excludeMTypes.count(stringtolower(mtype))) { - LOGDEB2("RclConfig::getMimeHandlerDef: in excluded mime list\n" ); + LOGDEB2("RclConfig::getMimeHandlerDef: in excluded mime list\n"); return hs; } } if (!mimeconf->get(mtype, hs, "index")) { - LOGDEB1("getMimeHandler: no handler for '" << (mtype) << "'\n" ); + LOGDEB1("getMimeHandlerDef: no handler for '" << mtype << "'\n"); } return hs; } @@ -748,8 +805,8 @@ const vector& RclConfig::getMDReapers() string hs; if (m_mdrstate.needrecompute()) { m_mdreapers.clear(); - // New value now stored in m_mdrstate.savedvalue - string& sreapers = m_mdrstate.savedvalue; + // New value now stored in m_mdrstate.getvalue(0) + const string& sreapers = m_mdrstate.getvalue(0); if (sreapers.empty()) return m_mdreapers; string value; @@ -829,7 +886,7 @@ void RclConfig::storeMissingHelperDesc(const string &s) FILE *fp = fopen(fmiss.c_str(), "w"); if (fp) { if (s.size() > 0 && fwrite(s.c_str(), s.size(), 1, fp) != 1) { - LOGERR("storeMissingHelperDesc: fwrite failed\n" ); + LOGERR("storeMissingHelperDesc: fwrite failed\n"); } fclose(fp); } @@ -839,7 +896,7 @@ void RclConfig::storeMissingHelperDesc(const string &s) // things for speed (theses are used a lot during indexing) bool RclConfig::readFieldsConfig(const string& cnferrloc) { - LOGDEB2("RclConfig::readFieldsConfig\n" ); + LOGDEB2("RclConfig::readFieldsConfig\n"); m_fields = new ConfStack("fields", m_cdirs, true); if (m_fields == 0 || !m_fields->ok()) { m_reason = string("No/bad fields file in: ") + cnferrloc; @@ -919,7 +976,7 @@ bool RclConfig::readFieldsConfig(const string& cnferrloc) for (map::const_iterator it = m_fldtotraits.begin(); it != m_fldtotraits.end(); it++) { LOGDEB("readFieldsConfig: [" << *it << "] -> [" << it->second.pfx << - "] " << it->second.wdfinc << " " << it->second.boost << "\n"); + "] " << it->second.wdfinc << " " << it->second.boost << "\n"); } #endif @@ -952,10 +1009,12 @@ bool RclConfig::getFieldTraits(const string& _fld, const FieldTraits **ftpp, map::const_iterator pit = m_fldtotraits.find(fld); if (pit != m_fldtotraits.end()) { *ftpp = &pit->second; - LOGDEB1("RclConfig::getFieldTraits: [" << (_fld) << "]->[" << (pit->second.pfx) << "]\n" ); + LOGDEB1("RclConfig::getFieldTraits: [" << _fld << "]->[" << + pit->second.pfx << "]\n"); return true; } else { - LOGDEB1("RclConfig::getFieldTraits: no prefix for field [" << (fld) << "]\n" ); + LOGDEB1("RclConfig::getFieldTraits: no prefix for field [" << fld << + "]\n"); *ftpp = 0; return false; } @@ -977,10 +1036,11 @@ string RclConfig::fieldCanon(const string& f) const string fld = stringtolower(f); map::const_iterator it = m_aliastocanon.find(fld); if (it != m_aliastocanon.end()) { - LOGDEB1("RclConfig::fieldCanon: [" << (f) << "] -> [" << (it->second) << "]\n" ); + LOGDEB1("RclConfig::fieldCanon: [" << f << "] -> [" << it->second << + "]\n"); return it->second; } - LOGDEB1("RclConfig::fieldCanon: [" << (f) << "] -> [" << (fld) << "]\n" ); + LOGDEB1("RclConfig::fieldCanon: [" << (f) << "] -> [" << (fld) << "]\n"); return fld; } @@ -989,7 +1049,8 @@ string RclConfig::fieldQCanon(const string& f) const string fld = stringtolower(f); map::const_iterator it = m_aliastoqcanon.find(fld); if (it != m_aliastoqcanon.end()) { - LOGDEB1("RclConfig::fieldQCanon: [" << (f) << "] -> [" << (it->second) << "]\n" ); + LOGDEB1("RclConfig::fieldQCanon: [" << f << "] -> [" << it->second << + "]\n"); return it->second; } return fieldCanon(f); @@ -1011,20 +1072,44 @@ bool RclConfig::getFieldConfParam(const string &name, const string &sk, return m_fields->get(name, value, sk); } -string RclConfig::getMimeViewerAllEx() const +set RclConfig::getMimeViewerAllEx() const { - string hs; + set res; if (mimeview == 0) - return hs; - mimeview->get("xallexcepts", hs, ""); - return hs; + return res; + + string base, plus, minus; + mimeview->get("xallexcepts", base, ""); + LOGDEB1("RclConfig::getMimeViewerAllEx(): base: " << s << endl); + mimeview->get("xallexcepts+", plus, ""); + LOGDEB1("RclConfig::getMimeViewerAllEx(): plus: " << plus << endl); + mimeview->get("xallexcepts-", minus, ""); + LOGDEB1("RclConfig::getMimeViewerAllEx(): minus: " << minus << endl); + + computeBasePlusMinus(res, base, plus, minus); + LOGDEB1("RclConfig::getMimeViewerAllEx(): res: " << stringsToString(res) + << endl); + return res; } -bool RclConfig::setMimeViewerAllEx(const string& allex) +bool RclConfig::setMimeViewerAllEx(const set& allex) { if (mimeview == 0) return false; - if (!mimeview->set("xallexcepts", allex, "")) { + + string s; + mimeview->get("xallexcepts", s, ""); + set base; + stringToStrings(s, base); + + string splus, sminus; + setPlusMinus(base, allex, splus, sminus); + + if (!mimeview->set("xallexcepts-", sminus, "")) { + m_reason = string("RclConfig:: cant set value. Readonly?"); + return false; + } + if (!mimeview->set("xallexcepts+", splus, "")) { m_reason = string("RclConfig:: cant set value. Readonly?"); return false; } @@ -1035,21 +1120,19 @@ bool RclConfig::setMimeViewerAllEx(const string& allex) string RclConfig::getMimeViewerDef(const string &mtype, const string& apptag, bool useall) const { - LOGDEB2("RclConfig::getMimeViewerDef: mtype [" << (mtype) << "] apptag [" << (apptag) << "]\n" ); + LOGDEB2("RclConfig::getMimeViewerDef: mtype [" << mtype << "] apptag [" + << apptag << "]\n"); string hs; if (mimeview == 0) return hs; if (useall) { // Check for exception - string excepts = getMimeViewerAllEx(); - vector vex; - stringToTokens(excepts, vex); + set allex = getMimeViewerAllEx(); bool isexcept = false; - for (vector::iterator it = vex.begin(); - it != vex.end(); it++) { + for (auto& it : allex) { vector mita; - stringToTokens(*it, mita, "|"); + stringToTokens(it, mita, "|"); if ((mita.size() == 1 && apptag.empty() && mita[0] == mtype) || (mita.size() == 2 && mita[1] == apptag && mita[0] == mtype)) { // Exception to x-all @@ -1219,17 +1302,19 @@ string RclConfig::getPidfile() const void RclConfig::urlrewrite(const string& dbdir, string& url) const { - LOGDEB2("RclConfig::urlrewrite: dbdir [" << (dbdir) << "] url [" << (url) << "]\n" ); + LOGDEB2("RclConfig::urlrewrite: dbdir [" << dbdir << "] url [" << url << + "]\n"); // Do path translations exist for this index ? if (m_ptrans == 0 || !m_ptrans->hasSubKey(dbdir)) { - LOGDEB2("RclConfig::urlrewrite: no paths translations (m_ptrans " << (m_ptrans) << ")\n" ); + LOGDEB2("RclConfig::urlrewrite: no paths translations (m_ptrans " << + m_ptrans << ")\n"); return; } string path = fileurltolocalpath(url); if (path.empty()) { - LOGDEB2("RclConfig::urlrewrite: not file url\n" ); + LOGDEB2("RclConfig::urlrewrite: not file url\n"); return; } @@ -1279,7 +1364,10 @@ string RclConfig::getWebQueueDir() const vector& RclConfig::getSkippedNames() { if (m_skpnstate.needrecompute()) { - stringToStrings(m_skpnstate.savedvalue, m_skpnlist); + set ss; + computeBasePlusMinus(ss, m_skpnstate.getvalue(0), + m_skpnstate.getvalue(1), m_skpnstate.getvalue(2)); + m_skpnlist = vector(ss.begin(), ss.end()); } return m_skpnlist; } @@ -1388,7 +1476,7 @@ bool RclConfig::getUncompressor(const string &mtype, vector& cmd) const vector tokens; stringToStrings(hs, tokens); if (tokens.empty()) { - LOGERR("getUncompressor: empty spec for mtype " << (mtype) << "\n" ); + LOGERR("getUncompressor: empty spec for mtype " << mtype << "\n"); return false; } vector::iterator it = tokens.begin(); @@ -1406,7 +1494,8 @@ bool RclConfig::getUncompressor(const string &mtype, vector& cmd) const if (!stringlowercmp("python", *it) || !stringlowercmp("perl", *it)) { it++; if (tokens.size() < 3) { - LOGERR("getUncpressor: python/perl cmd: no script?. [" << (mtype) << "]\n" ); + LOGERR("getUncpressor: python/perl cmd: no script?. [" << + mtype << "]\n"); } else { *it = findFilter(*it); } @@ -1481,6 +1570,20 @@ bool RclConfig::initUserConfig() return true; } +void RclConfig::zeroMe() { + m_ok = false; + m_keydirgen = 0; + m_conf = 0; + mimemap = 0; + mimeconf = 0; + mimeview = 0; + m_fields = 0; + m_ptrans = 0; + m_stopsuffixes = 0; + m_maxsufflen = 0; + initParamStale(0, 0); +} + void RclConfig::freeAll() { delete m_conf; @@ -1499,12 +1602,30 @@ void RclConfig::initFrom(const RclConfig& r) zeroMe(); if (!(m_ok = r.m_ok)) return; + + // Copyable fields + m_ok = r.m_ok; m_reason = r.m_reason; m_confdir = r.m_confdir; m_cachedir = r.m_cachedir; m_datadir = r.m_datadir; m_keydir = r.m_keydir; + m_keydirgen = r.m_keydirgen; m_cdirs = r.m_cdirs; + m_fldtotraits = r.m_fldtotraits; + m_aliastocanon = r.m_aliastocanon; + m_aliastoqcanon = r.m_aliastoqcanon; + m_storedFields = r.m_storedFields; + m_xattrtofld = r.m_xattrtofld; + m_maxsufflen = r.m_maxsufflen; + m_skpnlist = r.m_skpnlist; + m_defcharset = r.m_defcharset; + m_restrictMTypes = r.m_restrictMTypes; + m_excludeMTypes = r.m_excludeMTypes; + m_thrConf = r.m_thrConf; + m_mdreapers = r.m_mdreapers; + + // Special treatment if (r.m_conf) m_conf = new ConfStack(*(r.m_conf)); if (r.mimemap) @@ -1517,19 +1638,9 @@ void RclConfig::initFrom(const RclConfig& r) m_fields = new ConfStack(*(r.m_fields)); if (r.m_ptrans) m_ptrans = new ConfSimple(*(r.m_ptrans)); - m_fldtotraits = r.m_fldtotraits; - m_aliastocanon = r.m_aliastocanon; - m_aliastoqcanon = r.m_aliastoqcanon; - m_storedFields = r.m_storedFields; - m_xattrtofld = r.m_xattrtofld; if (r.m_stopsuffixes) m_stopsuffixes = new SuffixStore(*((SuffixStore*)r.m_stopsuffixes)); - m_maxsufflen = r.m_maxsufflen; - m_defcharset = r.m_defcharset; - initParamStale(m_conf, mimemap); - - m_thrConf = r.m_thrConf; } void RclConfig::initParamStale(ConfNull *cnf, ConfNull *mimemap) diff --git a/src/common/rclconfig.h b/src/common/rclconfig.h index edc3dbaa..330c290a 100644 --- a/src/common/rclconfig.h +++ b/src/common/rclconfig.h @@ -36,22 +36,38 @@ using std::map; class RclConfig; -// A small class used for parameters that need to be computed from the -// config string, and which can change with the keydir. Minimize work -// by using the keydirgen and a saved string to avoid unneeded -// recomputations +// Cache parameter string values for params which need computation and +// which can change with the keydir. Minimize work by using the +// keydirgen and a saved string to avoid unneeded recomputations: +// keydirgen is incremented in RclConfig with each setKeyDir(). We +// compare our saved value with the current one. If it did not change +// no get() is needed. If it did change, but the resulting param get() +// string value is identical, no recomputation is needed. class ParamStale { public: - RclConfig *parent; - ConfNull *conffile; - string paramname; - bool active; // Check at init if config defines name at all - int savedkeydirgen; - string savedvalue; - - ParamStale(RclConfig *rconf, const string& nm); + ParamStale() {} + ParamStale(RclConfig *rconf, const string& nm) + : parent(rconf), paramnames(vector(1, nm)), savedvalues(1) { + } + ParamStale(RclConfig *rconf, const vector& nms) + : parent(rconf), paramnames(nms), savedvalues(nms.size()) { + } void init(ConfNull *cnf); bool needrecompute(); + const string& getvalue(unsigned int i = 0) const; + +private: + // The config we belong to. + RclConfig *parent{0}; + // The configuration file we search for values. This is a borrowed + // pointer belonging to the parent, we do not manage it. + ConfNull *conffile{0}; + vector paramnames; + vector savedvalues; + // Check at init if the configuration defines our vars at all. No + // further processing is needed if it does not. + bool active{false}; + int savedkeydirgen{-1}; }; // Hold the description for an external metadata-gathering command @@ -63,13 +79,10 @@ struct MDReaper { // Data associated to a indexed field name: struct FieldTraits { string pfx; // indexing prefix, - int wdfinc; // Index time term frequency increment (default 1) - double boost; // Query time boost (default 1.0) - bool pfxonly; // Suppress prefix-less indexing - bool noterms; // Don't add term to highlight data (e.g.: rclbes) - FieldTraits() - : wdfinc(1), boost(1.0), pfxonly(false), noterms(false) - {} + int wdfinc{1}; // Index time term frequency increment (default 1) + double boost{1.0}; // Query time boost (default 1.0) + bool pfxonly{false}; // Suppress prefix-less indexing + bool noterms{false}; // Don't add term to highlight data (e.g.: rclbes) }; class RclConfig { @@ -80,15 +93,7 @@ class RclConfig { // argcnf RclConfig(const string *argcnf = 0); - RclConfig(const RclConfig &r) - : m_oldstpsuffstate(this, "recoll_noindex"), - m_stpsuffstate(this, "noContentSuffixes"), - m_skpnstate(this, "skippedNames"), - m_rmtstate(this, "indexedmimetypes"), - m_xmtstate(this, "excludedmimetypes"), - m_mdrstate(this, "metadatacmds") { - initFrom(r); - } + RclConfig(const RclConfig &r); ~RclConfig() { freeAll(); @@ -289,8 +294,8 @@ class RclConfig { /** mimeview: get/set external viewer exec string(s) for mimetype(s) */ string getMimeViewerDef(const string &mimetype, const string& apptag, bool useall) const; - string getMimeViewerAllEx() const; - bool setMimeViewerAllEx(const string& allex); + set getMimeViewerAllEx() const; + bool setMimeViewerAllEx(const set& allex); bool getMimeViewerDefs(vector >&) const; bool setMimeViewerDef(const string& mimetype, const string& cmd); /** Check if mime type is designated as needing no uncompress before view @@ -355,19 +360,12 @@ class RclConfig { vector m_cdirs; // directory stack for the confstacks - ConfStack *m_conf; // Parsed configuration files - ConfStack *mimemap; // The files don't change with keydir, - ConfStack *mimeconf; // but their content may depend on it. - ConfStack *mimeview; // - ConfStack *m_fields; - ConfSimple *m_ptrans; // Paths translations map m_fldtotraits; // Field to field params map m_aliastocanon; map m_aliastoqcanon; set m_storedFields; map m_xattrtofld; - void *m_stopsuffixes; unsigned int m_maxsufflen; ParamStale m_oldstpsuffstate; // Values from user mimemap, now obsolete ParamStale m_stpsuffstate; @@ -396,7 +394,18 @@ class RclConfig { ParamStale m_mdrstate; vector m_mdreapers; - /** Create initial user configuration */ + ////////////////// + // Members needing explicit processing when copying + void *m_stopsuffixes; + ConfStack *m_conf; // Parsed configuration files + ConfStack *mimemap; // The files don't change with keydir, + ConfStack *mimeconf; // but their content may depend on it. + ConfStack *mimeview; // + ConfStack *m_fields; + ConfSimple *m_ptrans; // Paths translations + /////////////////// + +/** Create initial user configuration */ bool initUserConfig(); /** Init all ParamStale members */ void initParamStale(ConfNull *cnf, ConfNull *mimemap); diff --git a/src/qtgui/viewaction_w.cpp b/src/qtgui/viewaction_w.cpp index 97a52fe9..03032eba 100644 --- a/src/qtgui/viewaction_w.cpp +++ b/src/qtgui/viewaction_w.cpp @@ -83,8 +83,7 @@ void ViewAction::fillLists() set viewerXs; if (prefs.useDesktopOpen) { - string s = theconfig->getMimeViewerAllEx(); - stringToStrings(s, viewerXs); + viewerXs = theconfig->getMimeViewerAllEx(); } for (vector >::const_iterator it = defs.begin(); it != defs.end(); it++) { @@ -176,9 +175,7 @@ void ViewAction::editActions() QString action0; int except0 = -1; - set viewerXs; - string s = theconfig->getMimeViewerAllEx(); - stringToStrings(s, viewerXs); + set viewerXs = theconfig->getMimeViewerAllEx(); list mtypes; bool dowarnmultiple = true; @@ -233,8 +230,6 @@ void ViewAction::editActions() theconfig->setMimeViewerDef(*mit, sact); } - s = stringsToString(viewerXs); - theconfig->setMimeViewerAllEx(s); + theconfig->setMimeViewerAllEx(viewerXs); fillLists(); } -