Switch to side-by-side view

--- a
+++ b/src/qtgui/rclm_saveload.cpp
@@ -0,0 +1,146 @@
+/* Copyright (C) 2005 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+#include "autoconfig.h"
+
+/** Saving and restoring named queries */
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <QSettings>
+#include <QMessageBox>
+#include <QFileDialog>
+
+#include "rclmain_w.h"
+#include "debuglog.h"
+#include "readfile.h"
+#include "xmltosd.h"
+#include "searchdata.h"
+
+using namespace std;
+using namespace Rcl;
+
+static QString prevDir()
+{
+    QSettings settings;
+    QString prevdir = 
+        settings.value("/Recoll/prefs/lastQuerySaveDir").toString();
+    string defpath = path_cat(theconfig->getConfDir(), "saved_queries");
+    if (prevdir.isEmpty()) {
+        if (access(defpath.c_str(), 0) != 0) {
+            mkdir(defpath.c_str(), 0700);
+        }
+        return QString::fromLocal8Bit(defpath.c_str());
+    } else {
+        return prevdir;
+    }
+}
+
+void RclMain::saveLastQuery()
+{
+    string xml;
+    if (lastSearchSimple()) {
+        xml = sSearch->asXML();
+    } else {
+        if (g_advshistory) {
+            RefCntr<Rcl::SearchData> sd;
+            sd = g_advshistory->getnewest();
+            if (sd) {
+                xml = sd->asXML();
+            }
+        }
+    }
+    if (xml.empty()) {
+        QMessageBox::information(this, tr("No search"), 
+                                 tr("No preserved previous search"));
+        return;
+    }
+    xml = string("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") +
+        "<recollquery version='1.0'>\n" + xml + "\n</recollquery>\n";
+
+    QFileDialog fileDialog(this, tr("Choose file to save"));
+    fileDialog.setNameFilter(tr("Saved Queries (*.rclq)"));
+    fileDialog.setDefaultSuffix("rclq");
+    fileDialog.setAcceptMode(QFileDialog::AcceptSave);
+    fileDialog.setDirectory(prevDir());
+
+    if (!fileDialog.exec())
+        return;
+
+    QString s = fileDialog.selectedFiles().first();
+    if (s.isEmpty()) {
+        return;
+    }
+    
+    string tofile((const char *)s.toLocal8Bit());
+
+    LOGDEB(("RclMain::saveLastQuery: XML: [%s]\n", xml.c_str()));
+
+    int fd = ::open(tofile.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0600);
+    if (fd < 0) {
+        QMessageBox::warning(this, tr("Open failed"), 
+                                 tr("Could not open/create file"));
+        return;
+    }
+    if (::write(fd, xml.c_str(), xml.size()) != int(xml.size())) {
+        ::close(fd);
+        QMessageBox::warning(this, tr("Write failed"), 
+                                 tr("Could not write to file"));
+        return;
+    }
+    if (::close(fd) != 0) {
+        QMessageBox::warning(this, tr("Close failed"), tr("File close error"));
+        return;
+    }
+}
+
+
+void RclMain::loadSavedQuery()
+{
+    QString s = 
+        QFileDialog::getOpenFileName(this, "Open saved query", prevDir(), 
+                                     tr("Saved Queries (*.rclq)"));
+    if (s.isEmpty())
+        return;
+
+    string fromfile((const char *)s.toLocal8Bit());
+    string xml, reason;
+    if (!file_to_string(fromfile, xml, &reason)) {
+        QMessageBox::warning(this, tr("Read failed"), 
+                             tr("Could not open file: ") + 
+                             QString::fromUtf8(reason.c_str()));
+        return;
+    }
+
+    // Try to parse as SearchData
+    RefCntr<SearchData> sd = xmlToSearchData(xml);
+    if (sd) {
+        showAdvSearchDialog();
+        asearchform->fromSearch(sd);
+        return;
+    }
+
+    // Try to parse as Simple Search
+    SSearchDef sdef;
+    if (xmlToSSearch(xml, sdef)) {
+        if (sSearch->fromXML(sdef))
+            return;
+    }
+    QMessageBox::warning(this, tr("Load error"), 
+                         tr("Could not load saved query"));
+}