6#include <QtCore/qstring.h>
7#include <QtCore/qprocess.h>
8#include <QtCore/qdir.h>
9#include <QtCore/qlibraryinfo.h>
10#include <QtCore/qdebug.h>
11#include <QtCore/qfileinfo.h>
12#include <QtCore/qobject.h>
13#include <QtCore/qtextstream.h>
14#include <QtCore/qcoreapplication.h>
18using namespace Qt::StringLiterals;
28 if (!sendCommand(
"quit"_L1, &errorMessage) || !m_process->waitForFinished(1000)) {
29 m_process->terminate();
30 m_process->waitForFinished();
38 const QString cmd =
"SetSource "_L1 + path;
39 return sendCommand(cmd, errorMessage);
44 const QString cmd =
"ActivateIdentifier "_L1 + identifier;
45 return sendCommand(cmd, errorMessage);
48bool AssistantClient::sendCommand(
const QString &cmd, QString *errorMessage)
51 qDebug() <<
"sendCommand " << cmd;
52 if (!ensureRunning(errorMessage))
54 if (!m_process->isWritable() || m_process->bytesToWrite() > 0) {
55 *errorMessage = QCoreApplication::translate(
"AssistantClient",
"Unable to send request: Assistant is not responding.");
58 QTextStream str(m_process);
65 return m_process && m_process->state() != QProcess::NotRunning;
70 QString app = QLibraryInfo::path(QLibraryInfo::BinariesPath) + QDir::separator();
71#if !defined(Q_OS_MACOS)
72 app +=
"assistant"_L1;
74 app +=
"Assistant.app/Contents/MacOS/Assistant"_L1;
87 qPrintable(QDir::toNativeSeparators(m_process->program())),
88 m_process->readAllStandardError().constData());
91void AssistantClient::processTerminated(
int exitCode, QProcess::ExitStatus exitStatus)
93 const QString binary = QDir::toNativeSeparators(m_process->program());
94 if (exitStatus != QProcess::NormalExit)
95 qWarning(
"%s: crashed.", qPrintable(binary));
96 else if (exitCode != 0)
97 qWarning(
"%s: terminated with exit code %d.", qPrintable(binary), exitCode);
106 m_process =
new QProcess;
107 auto exitHandler = [
this](
int exitCode, QProcess::ExitStatus exitStatus) {
this->processTerminated(exitCode, exitStatus); };
108 QObject::connect(m_process, &QProcess::finished, m_process, exitHandler);
109 auto readHandler = [
this]() {
this->readyReadStandardError(); };
110 QObject::connect(m_process, &QProcess::readyReadStandardError, m_process, readHandler);
113 const QString app = binary();
114 if (!QFileInfo(app).isFile()) {
115 *errorMessage = QCoreApplication::translate(
"AssistantClient",
"The binary '%1' does not exist.").arg(app);
119 qDebug() <<
"Running " << app;
121 QStringList args{u"-enableRemoteControl"_s};
122 m_process->start(app, args);
123 if (!m_process->waitForStarted()) {
124 *errorMessage = QCoreApplication::translate(
"AssistantClient",
"Unable to launch assistant (%1).").arg(app);
132 const int qtVersion = QT_VERSION;
134 QTextStream(&rc) <<
"qthelp://org.qt-project." << module <<
'.'
135 << (qtVersion >> 16) << ((qtVersion >> 8) & 0xFF) << (qtVersion & 0xFF)
136 <<
'/' << module <<
'/';
constexpr bool debugAssistantClient
bool showPage(const QString &path, QString *errorMessage) override
~AssistantClient() override
bool activateIdentifier(const QString &identifier, QString *errorMessage) override
QString documentUrl(const QString &module) const override
Combined button and popup list for selecting options.