Switch to side-by-side view

--- a/src/common/rclconfig.cpp
+++ b/src/common/rclconfig.cpp
@@ -1,5 +1,5 @@
 #ifndef lint
-static char rcsid[] = "@(#$Id: rclconfig.cpp,v 1.18 2006-01-10 12:58:39 dockes Exp $ (C) 2004 J.F.Dockes";
+static char rcsid[] = "@(#$Id: rclconfig.cpp,v 1.19 2006-01-19 17:11:46 dockes Exp $ (C) 2004 J.F.Dockes";
 #endif
 #include <unistd.h>
 #include <stdio.h>
@@ -23,13 +23,11 @@
 static const char *configfiles[] = {"recoll.conf", "mimemap", "mimeconf"};
 static int ncffiles = sizeof(configfiles) / sizeof(char *);
 
-static bool createConfig(string &reason)
-{
-    const char *cprefix = getenv("RECOLL_PREFIX");
-    if (cprefix == 0)
-	cprefix = RECOLL_PREFIX;
-    string prefix = path_cat(cprefix, "share/recoll/examples");
-
+static bool createConfig(const string &datadir, string &reason)
+{
+    // Samples directory
+    string exdir = path_cat(datadir, "examples");
+    // User's 
     string recolldir = path_tildexpand("~/.recoll");
     if (mkdir(recolldir.c_str(), 0755) < 0) {
 	reason += string("mkdir(") + recolldir + ") failed: " + 
@@ -37,7 +35,7 @@
 	return false;
     }
     for (int i = 0; i < ncffiles; i++) {
-	string src = path_cat((const string&)prefix, string(configfiles[i]));
+	string src = path_cat((const string&)exdir, string(configfiles[i]));
 	string dst = path_cat((const string&)recolldir, string(configfiles[i])); 
 	if (!copyfile(src.c_str(), dst.c_str(), reason)) {
 	    LOGERR(("Copyfile failed: %s\n", reason.c_str()));
@@ -49,8 +47,8 @@
 
 
 RclConfig::RclConfig()
-    : m_ok(false), conf(0), mimemap(0), mimeconf(0), stopsuffixes(0)
-
+    : m_ok(false), m_conf(0), mimemap(0), mimeconf(0), mimemap_local(0),
+      stopsuffixes(0)
 {
     static int loginit = 0;
     if (!loginit) {
@@ -59,35 +57,45 @@
 	loginit = 1;
     }
 
+    // Compute our data dir name, typically /usr/local/share/recoll
+    const char *cdatadir = getenv("RECOLL_DATADIR");
+    if (cdatadir == 0) {
+	// If not in environment, use the compiled-in constant. 
+	m_datadir = RECOLL_DATADIR;
+    } else {
+	m_datadir = cdatadir;
+    }
+
     const char *cp = getenv("RECOLL_CONFDIR");
     if (cp) {
-	confdir = cp;
+	m_confdir = cp;
     } else {
-	confdir = path_home();
-	confdir += ".recoll/";
-    }
-    string cfilename = path_cat(confdir, "recoll.conf");
-
-    if (access(confdir.c_str(), 0) != 0 || access(cfilename.c_str(), 0) != 0) {
-	if (!createConfig(reason))
+	m_confdir = path_home();
+	m_confdir += ".recoll/";
+    }
+    string cfilename = path_cat(m_confdir, "recoll.conf");
+
+    if (access(m_confdir.c_str(), 0) != 0 || 
+	access(cfilename.c_str(), 0) != 0) {
+	if (!createConfig(m_datadir, reason))
 	    return;
     }
 
     // Open readonly here so as not to casually create a config file
-    conf = new ConfTree(cfilename.c_str(), true);
-    if (conf == 0 || 
-	(conf->getStatus() != ConfSimple::STATUS_RO && 
-	 conf->getStatus() != ConfSimple::STATUS_RW)) {
+    m_conf = new ConfTree(cfilename.c_str(), true);
+    if (m_conf == 0 || 
+	(m_conf->getStatus() != ConfSimple::STATUS_RO && 
+	 m_conf->getStatus() != ConfSimple::STATUS_RW)) {
 	reason = string("No main configuration file: ") + cfilename + 
 	    " does not exist or cannot be parsed";
 	return;
     }
 
     string mimemapfile;
-    if (!conf->get("mimemapfile", mimemapfile, "")) {
+    if (!m_conf->get("mimemapfile", mimemapfile, "")) {
 	mimemapfile = "mimemap";
     }
-    string mpath  = path_cat(confdir, mimemapfile);
+    string mpath  = path_cat(m_confdir, mimemapfile);
     mimemap = new ConfTree(mpath.c_str(), true);
     if (mimemap == 0 ||
 	(mimemap->getStatus() != ConfSimple::STATUS_RO && 
@@ -99,10 +107,10 @@
     // mimemap->list();
 
     string mimeconffile;
-    if (!conf->get("mimeconffile", mimeconffile, "")) {
+    if (!m_conf->get("mimeconffile", mimeconffile, "")) {
 	mimeconffile = "mimeconf";
     }
-    mpath = path_cat(confdir, mimeconffile);
+    mpath = path_cat(m_confdir, mimeconffile);
     mimeconf = new ConfTree(mpath.c_str(), true);
     if (mimeconf == 0 ||
 	(mimeconf->getStatus() != ConfSimple::STATUS_RO && 
@@ -210,10 +218,9 @@
     return hs;
 }
 
-// Look up an executable filter.  
-// We look in RECOLL_FILTERSDIR, filtersdir param, then
-// let the system use the PATH
-string find_filter(RclConfig *conf, const string &icmd)
+// Look up an executable filter.  We look in $RECOLL_FILTERSDIR,
+// filtersdir in config file, then let the system use the PATH
+string RclConfig::findFilter(const string &icmd)
 {
     // If the path is absolute, this is it
     if (icmd[0] == '/')
@@ -222,19 +229,33 @@
     string cmd;
     const char *cp;
 
+    // Filters dir from environment ?
     if ((cp = getenv("RECOLL_FILTERSDIR"))) {
 	cmd = path_cat(cp, icmd);
 	if (access(cmd.c_str(), X_OK) == 0)
 	    return cmd;
-    } else if (conf->getConfParam(string("filtersdir"), cmd)) {
+    } 
+    // Filters dir as configuration parameter?
+    if (getConfParam(string("filtersdir"), cmd)) {
 	cmd = path_cat(cmd, icmd);
 	if (access(cmd.c_str(), X_OK) == 0)
 	    return cmd;
-    } else {
-	cmd = path_cat(conf->getConfDir(), icmd);
-	if (access(cmd.c_str(), X_OK) == 0)
-	    return cmd;
-    }
+    } 
+
+    // Filters dir as datadir subdir. Actually the standard case, but
+    // this is normally the same value found in config file (previous step)
+    cmd = path_cat(m_datadir, "filters");
+    cmd = path_cat(cmd, icmd);
+    if (access(cmd.c_str(), X_OK) == 0)
+	return cmd;
+
+    // Last resort for historical reasons: check in personal config
+    // directory
+    cmd = path_cat(getConfDir(), icmd);
+    if (access(cmd.c_str(), X_OK) == 0)
+	return cmd;
+
+    // Let the shell try to find it...
     return icmd;
 }