Integrated file selection dialogue with the main code. Improved the
[openvpnui.git] / src / filebrowse / searchworker.cpp
1 #include "searchworker.h"
2 #include <QDateTime>
3 #include <QSettings>
4 #include "globals.h"
5
6 SearchWorker::SearchWorker(QObject *parent) :
7 QThread(parent),
8 m_cancelled(NotCancelled)
9 {
10 }
11
12 SearchWorker::~SearchWorker()
13 {
14 }
15
16 void SearchWorker::startSearch(QString directory, QString searchTerm)
17 {
18 if (isRunning()) {
19 emit errorOccurred(tr("Search already in progress"), "");
20 return;
21 }
22 if (directory.isEmpty() || searchTerm.isEmpty()) {
23 emit errorOccurred(tr("Bad search parameters"), "");
24 return;
25 }
26
27 m_directory = directory;
28 m_searchTerm = searchTerm;
29 m_currentDirectory = directory;
30 m_cancelled.storeRelease(NotCancelled);
31 start();
32 }
33
34 void SearchWorker::cancel()
35 {
36 m_cancelled.storeRelease(Cancelled);
37 }
38
39 void SearchWorker::run() Q_DECL_OVERRIDE
40 {
41 QString errMsg = searchRecursively(m_directory, m_searchTerm.toLower());
42 if (!errMsg.isEmpty())
43 emit errorOccurred(errMsg, m_currentDirectory);
44
45 emit progressChanged("");
46 emit done();
47 }
48
49 QString SearchWorker::searchRecursively(QString directory, QString searchTerm)
50 {
51 // skip some system folders - they don't really have any interesting stuff
52 if (directory.startsWith("/proc") ||
53 directory.startsWith("/sys/block"))
54 return QString();
55
56 QDir dir(directory);
57 if (!dir.exists()) // skip "non-existent" directories (found in /dev)
58 return QString();
59
60 // update progress
61 m_currentDirectory = directory;
62 emit progressChanged(m_currentDirectory);
63
64 QSettings settings;
65 bool hiddenSetting = settings.value("show-hidden-files", false).toBool();
66 QDir::Filter hidden = hiddenSetting ? QDir::Hidden : (QDir::Filter)0;
67
68 // search dirs
69 QStringList names = dir.entryList(QDir::NoDotAndDotDot | QDir::AllDirs | hidden);
70 for (int i = 0 ; i < names.count() ; ++i) {
71 // stop if cancelled
72 if (m_cancelled.loadAcquire() == Cancelled)
73 return QString();
74
75 QString filename = names.at(i);
76 QString fullpath = dir.absoluteFilePath(filename);
77
78 if (filename.toLower().indexOf(searchTerm) >= 0)
79 emit matchFound(fullpath);
80
81 QFileInfo info(fullpath); // skip symlinks to prevent infinite loops
82 if (info.isSymLink())
83 continue;
84
85 QString errmsg = searchRecursively(fullpath, searchTerm);
86 if (!errmsg.isEmpty())
87 return errmsg;
88 }
89
90 // search files
91 names = dir.entryList(QDir::Files | hidden);
92 for (int i = 0 ; i < names.count() ; ++i) {
93 // stop if cancelled
94 if (m_cancelled.loadAcquire() == Cancelled)
95 return QString();
96
97 QString filename = names.at(i);
98 QString fullpath = dir.absoluteFilePath(filename);
99
100 if (filename.toLower().indexOf(searchTerm) >= 0)
101 emit matchFound(fullpath);
102 }
103
104 return QString();
105 }