Switch to side-by-side view

--- a/src/qtgui/guiutils.cpp
+++ b/src/qtgui/guiutils.cpp
@@ -1,5 +1,5 @@
 #ifndef lint
-static char rcsid[] = "@(#$Id: guiutils.cpp,v 1.7 2006-04-05 13:39:07 dockes Exp $ (C) 2005 Jean-Francois Dockes";
+static char rcsid[] = "@(#$Id: guiutils.cpp,v 1.8 2006-04-07 13:08:08 dockes Exp $ (C) 2005 Jean-Francois Dockes";
 #endif
 /*
  *   This program is free software; you can redistribute it and/or modify
@@ -25,6 +25,7 @@
 #include "guiutils.h"
 #include "pathut.h"
 #include "base64.h"
+#include "rcldb.h"
 
 #include <qsettings.h>
 #include <qstringlist.h>
@@ -32,8 +33,10 @@
 const static char *htmlbrowserlist = 
     "opera konqueror firefox mozilla netscape";
 
-// Search for and launch an html browser for the documentation. If the
-// user has set a preference, we use it directly instead of guessing.
+/** 
+ * Search for and launch an html browser for the documentation. If the
+ * user has set a preference, we use it directly instead of guessing.
+ */
 bool startHelpBrowser(const string &iurl)
 {
     string url;
@@ -43,7 +46,6 @@
 	url = string("file://") + url;
     } else
 	url = iurl;
-
 
     // If the user set a preference with an absolute path then things are
     // simple
@@ -97,11 +99,11 @@
 }
 
 
-///////////////////////// 
-// Global variables for user preferences. These are set in the user preference
-// dialog and saved restored to the appropriate place in the qt settings
+// The global preferences structure
 PrefsPack prefs;
 
+// Using the same macro to read/write a setting. insurance against typing 
+// mistakes
 #define SETTING_RW(var, nm, tp, def)			\
     if (writing) {					\
 	settings.writeEntry(nm , var);			\
@@ -109,6 +111,11 @@
 	var = settings.read##tp##Entry(nm, def);	\
     }						
 
+/** 
+ * Saving and restoring user preferences. These are stored in a global
+ * structure during program execution and saved to disk using the QT
+ * settings mechanism
+ */
 void rwSettings(bool writing)
 {
     QSettings settings;
@@ -132,6 +139,12 @@
     SETTING_RW(prefs.queryReplaceAbstract, 
 	       "/Recoll/prefs/query/replaceAbstract", Bool, false);
 
+    // The extra databases settings. These are stored as a list of
+    // xapian directory names, encoded in base64 to avoid any
+    // binary/charset conversion issues. There are 2 lists for all
+    // known dbs and active (searched) ones.
+    // When starting up, we also add from the RECOLL_EXTRA_DBS environment
+    // variable.
     QStringList qsl;
     if (writing) {
 	for (list<string>::const_iterator it = prefs.allExtraDbs.begin();
@@ -158,7 +171,24 @@
 	    base64_decode((*it).ascii(), dec);
 	    prefs.allExtraDbs.push_back(dec);
 	}
-
+	const char *cp;
+	if ((cp = getenv("RECOLL_EXTRA_DBS")) != 0) {
+	    list<string> dbl;
+	    stringToTokens(cp, dbl, ":");
+	    for (list<string>::iterator dit = dbl.begin(); dit != dbl.end();
+		 dit++) {
+		string dbdir = path_canon(*dit);
+		path_catslash(dbdir);
+		if (find(prefs.allExtraDbs.begin(), prefs.allExtraDbs.end(),
+			 dbdir) != prefs.allExtraDbs.end())
+		    continue;
+		if (!Rcl::Db::testDbDir(dbdir)) {
+		    LOGERR(("Not a xapian database: [%s]\n", dbdir.c_str()));
+		    continue;
+		}
+		prefs.allExtraDbs.push_back(dbdir);
+	    }
+	}
 	qsl = settings.readListEntry("/Recoll/prefs/query/activeExtraDbs");
 	prefs.activeExtraDbs.clear();
 	for (QStringList::iterator it = qsl.begin(); it != qsl.end(); it++) {