34#include <score_plugin_media_export.h>
38#include <QtCore/qglobal.h>
41#include <QProcessEnvironment>
54class QWebSocketServer;
59class SCORE_PLUGIN_MEDIA_EXPORT PluginScanner :
public QObject
61 W_OBJECT(PluginScanner)
64 explicit PluginScanner(QString serverName, QObject* parent =
nullptr);
67 void setPuppet(
const QString& executable);
68 void setMaxInFlight(
int n);
70 void setProcessTimeout(
int ms);
73 void setReplyGracePeriod(
int ms);
75 void setEnvironmentProvider(std::function<QProcessEnvironment()> f);
79 void scan(QStringList pluginPaths);
81 bool scanning() const noexcept;
84 const QString& token() const noexcept {
return m_token; }
86 quint16 port() const noexcept;
90 void processIncomingMessage(const QString& message);
94 void scanned(QString path, QJsonObject obj)
95 E_SIGNAL(SCORE_PLUGIN_MEDIA_EXPORT, scanned, path, obj);
97 void scanFailed(QString path, QString reason)
98 E_SIGNAL(SCORE_PLUGIN_MEDIA_EXPORT, scanFailed, path, reason);
100 void done() E_SIGNAL(SCORE_PLUGIN_MEDIA_EXPORT, done);
106 QPointer<QProcess> process;
111 bool ensureListening();
113 void startOne(
const QString& path);
114 void resolveProcess(
int id);
115 void releaseProcess(QProcess* proc);
116 void beginGracePeriod(
int id);
117 void failIfStillUnresolved(
int id,
const QString& reason);
119 void cancelCurrentScan();
121 QWebSocketServer* m_server{};
122 QString m_serverName;
125 std::function<QProcessEnvironment()> m_env;
127 std::map<int, Record> m_records;
128 std::vector<QString> m_queue;
131 int m_maxInFlight{8};
132 int m_timeoutMs{10000};
134 bool m_scanRunning{};