]> gitweb.hamatoma.de Git - reqt/commitdiff
ReSearch: ignore binaries
authorHamatoma <hamatoma@gmx.de>
Tue, 29 Nov 2016 23:00:34 +0000 (00:00 +0100)
committerHamatoma <hamatoma@gmx.de>
Tue, 29 Nov 2016 23:00:34 +0000 (00:00 +0100)
appl/research/filefinder.cpp
appl/research/filefinder.hpp
appl/research/mainwindow.cpp
appl/research/mainwindow.hpp
appl/research/mainwindow.ui

index 34ff2d6685b92fedb135d98e4d02457dad7a45f9..dd1c9cddb65d1f7abe99ce2a3d329a882fa71f30 100644 (file)
@@ -19,7 +19,8 @@ FileFinder::FileFinder(QTableWidget& table, FileCache& cache) :
     m_text(NULL),
     m_inverseSearch(false),
     m_caseSensitive(false),
-    m_cache(cache)
+    m_cache(cache),
+    m_ignoreBinaries(false)
 {
     setSearchMode(smFiles);
 }
@@ -118,6 +119,33 @@ int FileFinder::ignoredFiles() const
 }
 
 
+/**
+ * Checks whether a file is a binary file.
+ *
+ * @param filename  filename with path
+ *
+ * @return  <i>false</i>: the first 16kByte of the file does not contain
+ *                      a NUL char ('\0')<br>
+ *          <i>true</i>: not readable or the file contains a NUL char
+ */
+bool FileFinder::isBinaryFile(const QString& filename)
+{
+    bool rc = true;
+    FILE* fp = fopen(filename.toLocal8Bit().data(), "rb");
+    if (fp != NULL){
+        // We read the first 16 kByte:
+        char buffer[16*1024 + 1];
+        int size = fread(buffer, 1, sizeof buffer - 1,  fp);
+        if (size >  0){
+            buffer[size] = '\0';
+            const char* ptr = strchr(buffer, '\0');
+            rc = ptr < buffer + size;
+        }
+        fclose(fp);
+    }
+    return rc;
+}
+
 /**
  * Handle a file found by the file search criteria.
  *
@@ -133,7 +161,8 @@ bool FileFinder::handleFile(const QString &full, const QString &path,
         found = searchWithRegExpr(full);
     } else if (m_text != NULL){
         found = searchText(full);
-    }
+    } else if (m_ignoreBinaries)
+        found = ! isBinaryFile(full);
     if (found){
         if (m_addNotDetach)
             addToTable(full, path, node, info);
@@ -152,33 +181,45 @@ bool FileFinder::handleFile(const QString &full, const QString &path,
  */
 bool FileFinder::searchText(const QString &filename)
 {
-    m_cache.addOrUpdate(filename);
-    const QStringList& lines = m_cache.lines(filename);
     bool rc = false;
-    Qt::CaseSensitivity mode = m_caseSensitive
-            ? Qt::CaseSensitive : Qt::CaseInsensitive;
-    if (m_inverseSearch){
-        rc = true;
-        for (int ix = 0; ix < lines.size(); ++ix){
-            if (lines[ix].indexOf(m_text, mode) >= 0){
-                rc = false;
-                break;
+    if (! m_ignoreBinaries || ! isBinaryFile(filename)){
+        m_cache.addOrUpdate(filename);
+        const QStringList& lines = m_cache.lines(filename);
+        Qt::CaseSensitivity mode = m_caseSensitive
+                ? Qt::CaseSensitive : Qt::CaseInsensitive;
+        if (m_inverseSearch){
+            rc = true;
+            for (int ix = 0; ix < lines.size(); ++ix){
+                if (lines[ix].indexOf(m_text, mode) >= 0){
+                    rc = false;
+                    break;
+                }
             }
-        }
-    } else {
-        rc = false;
-        for (int ix = 0; ix < lines.size(); ++ix){
-            if (lines[ix].indexOf(m_text, mode) >= 0){
-                rc = true;
-                break;
+        } else {
+            rc = false;
+            for (int ix = 0; ix < lines.size(); ++ix){
+                if (lines[ix].indexOf(m_text, mode) >= 0){
+                    rc = true;
+                    break;
+                }
             }
         }
+        if (! rc)
+            m_cache.remove(filename);
     }
-    if (! rc)
-        m_cache.remove(filename);
     return rc;
 }
 
+/**
+ * Sets the flag "ignore binaries".
+ *
+ * @param ignoreBinaries    <i>true</i>: binary files will not be found
+ */
+void FileFinder::setIgnoreBinaries(bool ignoreBinaries)
+{
+    m_ignoreBinaries = ignoreBinaries;
+}
+
 /**
  * Searches a regular expression in the file content.
  *
@@ -186,29 +227,31 @@ bool FileFinder::searchText(const QString &filename)
  * @return          <i>true</i>: the text has been found
  */
 bool FileFinder::searchWithRegExpr(const QString& filename){
-    m_cache.addOrUpdate(filename);
-    const QStringList& lines = m_cache.lines(filename);
-
     bool rc = false;
-    if (m_inverseSearch){
-       rc = true;
-       for (int ix = 0; ix < lines.size(); ++ix){
-           if (m_regularExpression->match(lines[ix]).hasMatch()){
-               rc = false;
-               break;
-           }
-       }
-    } else {
-        rc = false;
-        for (int ix = 0; ix < lines.size(); ++ix){
-            if (m_regularExpression->match(lines[ix]).hasMatch()){
-                rc = true;
-                break;
+    if (! m_ignoreBinaries || ! isBinaryFile(filename)){
+        m_cache.addOrUpdate(filename);
+        const QStringList& lines = m_cache.lines(filename);
+
+        if (m_inverseSearch){
+            rc = true;
+            for (int ix = 0; ix < lines.size(); ++ix){
+                if (m_regularExpression->match(lines[ix]).hasMatch()){
+                    rc = false;
+                    break;
+                }
+            }
+        } else {
+            rc = false;
+            for (int ix = 0; ix < lines.size(); ++ix){
+                if (m_regularExpression->match(lines[ix]).hasMatch()){
+                    rc = true;
+                    break;
+                }
             }
         }
+        if (rc)
+            m_cache.remove(filename);
     }
-    if (rc)
-        m_cache.remove(filename);
     return rc;
 }
 
index f30e40af1ca5cd42cb01359ad676142e5e070155..4a5714a17bcb23d24e7f369ccd17c3654e55cb9b 100644 (file)
@@ -19,9 +19,12 @@ public:
     void search(const QString& baseDirectory, const QString& patterns,
                 int minDepth, int maxDepth);
     void setAddNotDetach(bool addNotDetach);
+    void setIgnoreBinaries(bool ignoreBinaries);
     void setTextToSearch(const QString &text, bool caseSensitive,
         bool isRegularExpression, bool inverseSearch);
+
 private:
+    bool isBinaryFile(const QString &filename);
     bool searchWithRegExpr(const QString &filename);
     bool searchText(const QString &filename);
 private:
@@ -36,6 +39,7 @@ private:
     bool m_inverseSearch;
     bool m_caseSensitive;
     FileCache& m_cache;
+    bool m_ignoreBinaries;
 };
 
 #endif // FILEFINDER_H
index 252dec72d9ac338d42ff515896cc785341f35ce5..4b345dd32f492ef2f7b009b722e520a9c1c48aed 100644 (file)
@@ -66,25 +66,6 @@ int MainWindow::addSingleFile(bool addNotDetach, const QString& filename, int& a
     return rc;
 }
 
-/**
- * Gets an integer from a combobox.
- *
- * If the text is not an integer the default value will be used.
- *
- * @param combobox      the source of the integer
- * @param defaultValue  the value if the source value is invalid
- */
-int MainWindow::comboboxToInt(QComboBox& combobox, int defaultValue){
-       QString text = combobox.currentText();
-       uint rc = 0;
-       if (ReQStringUtils::lengthOfUInt(text, 0, 10, &rc) != text.length()){
-               say(LOG_ERROR, tr("not an integer: %1 using instead: %2").arg(text).arg(defaultValue));
-               combobox.setCurrentText(QString::number(defaultValue));
-               rc = (uint) defaultValue;
-       }
-       return (int) rc;
-}
-
 /**
  * Initializes the Graphical User Interface.
  */
@@ -125,7 +106,9 @@ void MainWindow::initializeGui(){
        ui->tableWidget->setColumnWidth(colDate, 175);
        switchFilter(true);
        if (m_test){
-        ui->comboBoxBaseDirectory->setCurrentText("/home/mhm");
+        //ui->comboBoxBaseDirectory->setCurrentText("/home/mhm");
+        //ui->comboBoxFilePatterns->setCurrentText("pflege.odt");
+        onAdd();
        }
 }
 
@@ -234,10 +217,10 @@ void MainWindow::onFilter()
     qint64 start = QDateTime::currentMSecsSinceEpoch();
        FileFilter filter(*ui->tableWidget, *ui->listWidgetHits, *m_fileCache,
                                          *m_lastHitPosition);
-       int from = comboboxToInt(*ui->comboBoxFromHit, 0);
-       int pageSize = comboboxToInt(*ui->comboBoxPageSize, s_defaultPageSize);
-       int above = comboboxToInt(*ui->comboBoxLinesAbove, 0);
-       int below = comboboxToInt(*ui->comboBoxLinesBelow, 0);
+    int from = comboInt(ui->comboBoxFromHit, 0);
+    int pageSize = comboInt(ui->comboBoxPageSize, s_defaultPageSize);
+    int above = comboInt(ui->comboBoxLinesAbove, 0);
+    int below = comboInt(ui->comboBoxLinesBelow, 0);
     ui->pushButtonFilter->setEnabled(false);
        filter.filter(ui->comboBoxIncludingPattern->currentText(),
                                  ui->comboBoxExcludingPattern->currentText(),
@@ -370,6 +353,7 @@ void MainWindow::searchFiles(bool addNotDetach)
        } else {
                QDateTime olderThan = comboDate(ui->comboBoxOlder);
                QDateTime youngerThan = comboDate(ui->comboBoxYounger);
+        m_fileFinder->setIgnoreBinaries(ui->checkBoxIgnoreBinary->isChecked());
                m_fileFinder->setOlderThan(olderThan.toMSecsSinceEpoch() <= 0
                                ? NULL : new QDateTime(olderThan));
                m_fileFinder->setYoungerThan(olderThan.toMSecsSinceEpoch() <= 0
index ec9c81f58aec3481381dbfe0a2dcc5091450f9fa..805065736b572144be8854dca2b9083ce9f912c7 100644 (file)
@@ -33,7 +33,6 @@ public:
 
 private:
     int addSingleFile(bool addNotDetach, const QString &filename, int &alreadyFound);
-    int comboboxToInt(QComboBox &combobox, int defaultValue);
     void initializeGui();
     void logHits();
     void onAddTimer();
index f13990e465124c9e783dd40f60fbd6f50ecba4e7..8cae06083be3ee399573b28bbfeef6bea6f91a80 100644 (file)
                     </property>
                    </spacer>
                   </item>
+                  <item>
+                   <widget class="QCheckBox" name="checkBoxIgnoreBinary">
+                    <property name="text">
+                     <string>Ignore binaries</string>
+                    </property>
+                    <property name="checked">
+                     <bool>true</bool>
+                    </property>
+                   </widget>
+                  </item>
                  </layout>
                 </item>
                 <item row="2" column="0">