qBittorrent
SearchHandler Class Reference

#include <searchhandler.h>

Inheritance diagram for SearchHandler:
Collaboration diagram for SearchHandler:

Signals

void searchFinished (bool cancelled=false)
 
void searchFailed ()
 
void newSearchResults (const QVector< SearchResult > &results)
 

Public Member Functions

bool isActive () const
 
QString pattern () const
 
SearchPluginManagermanager () const
 
QList< SearchResultresults () const
 
void cancelSearch ()
 

Private Member Functions

 SearchHandler (const QString &pattern, const QString &category, const QStringList &usedPlugins, SearchPluginManager *manager)
 
void readSearchOutput ()
 
void processFailed ()
 
void processFinished (int exitcode)
 
bool parseSearchResult (QStringView line, SearchResult &searchResult)
 

Private Attributes

const QString m_pattern
 
const QString m_category
 
const QStringList m_usedPlugins
 
SearchPluginManagerm_manager
 
QProcess * m_searchProcess
 
QTimer * m_searchTimeout
 
QByteArray m_searchResultLineTruncated
 
bool m_searchCancelled = false
 
QList< SearchResultm_results
 

Friends

class SearchPluginManager
 

Detailed Description

Definition at line 54 of file searchhandler.h.

Constructor & Destructor Documentation

◆ SearchHandler()

SearchHandler::SearchHandler ( const QString &  pattern,
const QString &  category,
const QStringList &  usedPlugins,
SearchPluginManager manager 
)
private

Definition at line 56 of file searchhandler.cpp.

57  : QObject {manager}
58  , m_pattern {pattern}
59  , m_category {category}
60  , m_usedPlugins {usedPlugins}
61  , m_manager {manager}
62  , m_searchProcess {new QProcess {this}}
63  , m_searchTimeout {new QTimer {this}}
64 {
65  // Load environment variables (proxy)
66  m_searchProcess->setEnvironment(QProcess::systemEnvironment());
67 
68  const QStringList params
69  {
71  m_usedPlugins.join(','),
73  };
74 
75  // Launch search
76  m_searchProcess->setProgram(Utils::ForeignApps::pythonInfo().executableName);
77  m_searchProcess->setArguments(params + m_pattern.split(' '));
78 
79  connect(m_searchProcess, &QProcess::errorOccurred, this, &SearchHandler::processFailed);
80  connect(m_searchProcess, &QProcess::readyReadStandardOutput, this, &SearchHandler::readSearchOutput);
81  connect(m_searchProcess, qOverload<int, QProcess::ExitStatus>(&QProcess::finished)
83 
84  m_searchTimeout->setSingleShot(true);
85  connect(m_searchTimeout, &QTimer::timeout, this, &SearchHandler::cancelSearch);
86  m_searchTimeout->start(180000); // 3 min
87 
88  // deferred start allows clients to handle starting-related signals
89  QTimer::singleShot(0, this, [this]() { m_searchProcess->start(QIODevice::ReadOnly); });
90 }
SearchPluginManager * manager() const
QString pattern() const
void readSearchOutput()
const QString m_pattern
Definition: searchhandler.h:83
const QStringList m_usedPlugins
Definition: searchhandler.h:85
QTimer * m_searchTimeout
Definition: searchhandler.h:88
QProcess * m_searchProcess
Definition: searchhandler.h:87
const QString m_category
Definition: searchhandler.h:84
SearchPluginManager * m_manager
Definition: searchhandler.h:86
void processFinished(int exitcode)
static QString engineLocation()
PythonInfo pythonInfo()
QString toNativePath(const QString &path)
Definition: fs.cpp:64

References cancelSearch(), SearchPluginManager::engineLocation(), m_category, m_manager, m_pattern, m_searchProcess, m_searchTimeout, m_usedPlugins, processFailed(), processFinished(), Utils::ForeignApps::pythonInfo(), readSearchOutput(), and Utils::Fs::toNativePath().

Here is the call graph for this function:

Member Function Documentation

◆ cancelSearch()

void SearchHandler::cancelSearch ( )

Definition at line 97 of file searchhandler.cpp.

98 {
99  if ((m_searchProcess->state() == QProcess::NotRunning) || m_searchCancelled)
100  return;
101 
102 #ifdef Q_OS_WIN
103  m_searchProcess->kill();
104 #else
105  m_searchProcess->terminate();
106 #endif
107  m_searchCancelled = true;
108  m_searchTimeout->stop();
109 }
bool m_searchCancelled
Definition: searchhandler.h:90

References m_searchCancelled, m_searchProcess, and m_searchTimeout.

Referenced by SearchJobWidget::cancelSearch(), and SearchHandler().

Here is the caller graph for this function:

◆ isActive()

bool SearchHandler::isActive ( ) const

Definition at line 92 of file searchhandler.cpp.

93 {
94  return (m_searchProcess->state() != QProcess::NotRunning);
95 }

References m_searchProcess.

◆ manager()

SearchPluginManager * SearchHandler::manager ( ) const

Definition at line 195 of file searchhandler.cpp.

196 {
197  return m_manager;
198 }

References m_manager.

Referenced by SearchJobWidget::downloadTorrent().

Here is the caller graph for this function:

◆ newSearchResults

void SearchHandler::newSearchResults ( const QVector< SearchResult > &  results)
signal

Referenced by readSearchOutput(), and SearchJobWidget::SearchJobWidget().

Here is the caller graph for this function:

◆ parseSearchResult()

bool SearchHandler::parseSearchResult ( QStringView  line,
SearchResult searchResult 
)
private

Definition at line 166 of file searchhandler.cpp.

167 {
168  const QList<QStringView> parts = line.split(u'|');
169  const int nbFields = parts.size();
170 
171  if (nbFields < (NB_PLUGIN_COLUMNS - 1)) return false; // -1 because desc_link is optional
172 
173  searchResult = SearchResult();
174  searchResult.fileUrl = parts.at(PL_DL_LINK).trimmed().toString(); // download URL
175  searchResult.fileName = parts.at(PL_NAME).trimmed().toString(); // Name
176  searchResult.fileSize = parts.at(PL_SIZE).trimmed().toLongLong(); // Size
177 
178  bool ok = false;
179 
180  searchResult.nbSeeders = parts.at(PL_SEEDS).trimmed().toLongLong(&ok); // Seeders
181  if (!ok || (searchResult.nbSeeders < 0))
182  searchResult.nbSeeders = -1;
183 
184  searchResult.nbLeechers = parts.at(PL_LEECHS).trimmed().toLongLong(&ok); // Leechers
185  if (!ok || (searchResult.nbLeechers < 0))
186  searchResult.nbLeechers = -1;
187 
188  searchResult.siteUrl = parts.at(PL_ENGINE_URL).trimmed().toString(); // Search site URL
189  if (nbFields == NB_PLUGIN_COLUMNS)
190  searchResult.descrLink = parts.at(PL_DESC_LINK).trimmed().toString(); // Description Link
191 
192  return true;
193 }
QString descrLink
Definition: searchhandler.h:49
QString fileUrl
Definition: searchhandler.h:44
qlonglong nbLeechers
Definition: searchhandler.h:47
qlonglong fileSize
Definition: searchhandler.h:45
qlonglong nbSeeders
Definition: searchhandler.h:46
QString siteUrl
Definition: searchhandler.h:48
QString fileName
Definition: searchhandler.h:43

References SearchResult::descrLink, SearchResult::fileName, SearchResult::fileSize, SearchResult::fileUrl, anonymous_namespace{searchhandler.cpp}::NB_PLUGIN_COLUMNS, SearchResult::nbLeechers, SearchResult::nbSeeders, anonymous_namespace{searchhandler.cpp}::PL_DESC_LINK, anonymous_namespace{searchhandler.cpp}::PL_DL_LINK, anonymous_namespace{searchhandler.cpp}::PL_ENGINE_URL, anonymous_namespace{searchhandler.cpp}::PL_LEECHS, anonymous_namespace{searchhandler.cpp}::PL_NAME, anonymous_namespace{searchhandler.cpp}::PL_SEEDS, anonymous_namespace{searchhandler.cpp}::PL_SIZE, and SearchResult::siteUrl.

Referenced by readSearchOutput().

Here is the caller graph for this function:

◆ pattern()

QString SearchHandler::pattern ( ) const

Definition at line 205 of file searchhandler.cpp.

206 {
207  return m_pattern;
208 }

References m_pattern.

Referenced by SearchJobWidget::SearchJobWidget().

Here is the caller graph for this function:

◆ processFailed()

void SearchHandler::processFailed ( )
private

Definition at line 157 of file searchhandler.cpp.

158 {
159  if (!m_searchCancelled)
160  emit searchFailed();
161 }
void searchFailed()

References m_searchCancelled, and searchFailed().

Referenced by SearchHandler().

Here is the caller graph for this function:

◆ processFinished()

void SearchHandler::processFinished ( int  exitcode)
private

Definition at line 114 of file searchhandler.cpp.

115 {
116  m_searchTimeout->stop();
117 
118  if (m_searchCancelled)
119  emit searchFinished(true);
120  else if ((m_searchProcess->exitStatus() == QProcess::NormalExit) && (exitcode == 0))
121  emit searchFinished(false);
122  else
123  emit searchFailed();
124 }
void searchFinished(bool cancelled=false)

References m_searchCancelled, m_searchProcess, m_searchTimeout, searchFailed(), and searchFinished().

Referenced by SearchHandler().

Here is the caller graph for this function:

◆ readSearchOutput()

void SearchHandler::readSearchOutput ( )
private

Definition at line 129 of file searchhandler.cpp.

130 {
131  QByteArray output = m_searchProcess->readAllStandardOutput();
132  output.replace('\r', "");
133 
134  QList<QByteArray> lines = output.split('\n');
135  if (!m_searchResultLineTruncated.isEmpty())
136  lines.prepend(m_searchResultLineTruncated + lines.takeFirst());
137  m_searchResultLineTruncated = lines.takeLast().trimmed();
138 
139  QVector<SearchResult> searchResultList;
140  searchResultList.reserve(lines.size());
141 
142  for (const QByteArray &line : asConst(lines))
143  {
144  SearchResult searchResult;
145  if (parseSearchResult(QString::fromUtf8(line), searchResult))
146  searchResultList << searchResult;
147  }
148 
149  if (!searchResultList.isEmpty())
150  {
151  for (const SearchResult &result : searchResultList)
152  m_results.append(result);
153  emit newSearchResults(searchResultList);
154  }
155 }
QList< SearchResult > m_results
Definition: searchhandler.h:91
bool parseSearchResult(QStringView line, SearchResult &searchResult)
QByteArray m_searchResultLineTruncated
Definition: searchhandler.h:89
void newSearchResults(const QVector< SearchResult > &results)
constexpr std::add_const_t< T > & asConst(T &t) noexcept
Definition: global.h:42

References asConst(), m_results, m_searchProcess, m_searchResultLineTruncated, newSearchResults(), update_qrc_files::output, and parseSearchResult().

Referenced by SearchHandler().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ results()

QList< SearchResult > SearchHandler::results ( ) const

Definition at line 200 of file searchhandler.cpp.

201 {
202  return m_results;
203 }

References m_results.

◆ searchFailed

void SearchHandler::searchFailed ( )
signal

Referenced by processFailed(), processFinished(), SearchJobWidget::SearchJobWidget(), and SearchController::startAction().

Here is the caller graph for this function:

◆ searchFinished

void SearchHandler::searchFinished ( bool  cancelled = false)
signal

Referenced by processFinished(), SearchJobWidget::SearchJobWidget(), and SearchController::startAction().

Here is the caller graph for this function:

Friends And Related Function Documentation

◆ SearchPluginManager

friend class SearchPluginManager
friend

Definition at line 59 of file searchhandler.h.

Member Data Documentation

◆ m_category

const QString SearchHandler::m_category
private

Definition at line 84 of file searchhandler.h.

Referenced by SearchHandler().

◆ m_manager

SearchPluginManager* SearchHandler::m_manager
private

Definition at line 86 of file searchhandler.h.

Referenced by manager(), and SearchHandler().

◆ m_pattern

const QString SearchHandler::m_pattern
private

Definition at line 83 of file searchhandler.h.

Referenced by pattern(), and SearchHandler().

◆ m_results

QList<SearchResult> SearchHandler::m_results
private

Definition at line 91 of file searchhandler.h.

Referenced by readSearchOutput(), and results().

◆ m_searchCancelled

bool SearchHandler::m_searchCancelled = false
private

Definition at line 90 of file searchhandler.h.

Referenced by cancelSearch(), processFailed(), and processFinished().

◆ m_searchProcess

QProcess* SearchHandler::m_searchProcess
private

◆ m_searchResultLineTruncated

QByteArray SearchHandler::m_searchResultLineTruncated
private

Definition at line 89 of file searchhandler.h.

Referenced by readSearchOutput().

◆ m_searchTimeout

QTimer* SearchHandler::m_searchTimeout
private

Definition at line 88 of file searchhandler.h.

Referenced by cancelSearch(), processFinished(), and SearchHandler().

◆ m_usedPlugins

const QStringList SearchHandler::m_usedPlugins
private

Definition at line 85 of file searchhandler.h.

Referenced by SearchHandler().


The documentation for this class was generated from the following files: