Add screenshareStopped signal; use std::unique_ptr<QProcess>

This commit is contained in:
Zach Fox 2019-10-31 09:43:56 -07:00
parent c22f5097c0
commit 1e2fcf8bd5
2 changed files with 30 additions and 13 deletions

View file

@ -10,7 +10,6 @@
//
#include "ScreenshareScriptingInterface.h"
#include <QProcess>
#include <QThread>
#include <QDesktopServices>
#include <QUrl>
@ -35,7 +34,12 @@ void ScreenshareScriptingInterface::startScreenshare(QString displayName, QStrin
return;
}
qDebug() << "ZRF: Inside startScreenshare(). `SCREENSHARE_EXE_PATH`:" << SCREENSHARE_EXE_PATH;
if (_screenshareProcess && _screenshareProcess->state() != QProcess::NotRunning) {
qDebug() << "Screenshare process already running. Aborting...";
return;
}
_screenshareProcess.reset(new QProcess(this));
QFileInfo screenshareExecutable(SCREENSHARE_EXE_PATH);
if (!screenshareExecutable.exists() || !screenshareExecutable.isFile()) {
@ -55,21 +59,27 @@ void ScreenshareScriptingInterface::startScreenshare(QString displayName, QStrin
arguments << "--apiKey=" + apiKey;
arguments << "--sessionID=" + sessionID;
QProcess* electronProcess = new QProcess(this);
connect(electronProcess, &QProcess::errorOccurred,
connect(_screenshareProcess.get(), &QProcess::errorOccurred,
[=](QProcess::ProcessError error) { qDebug() << "ZRF QProcess::errorOccurred. `error`:" << error; });
connect(electronProcess, &QProcess::started, [=]() { qDebug() << "ZRF QProcess::started"; });
connect(electronProcess, &QProcess::stateChanged,
connect(_screenshareProcess.get(), &QProcess::started, [=]() { qDebug() << "ZRF QProcess::started"; });
connect(_screenshareProcess.get(), &QProcess::stateChanged,
[=](QProcess::ProcessState newState) { qDebug() << "ZRF QProcess::stateChanged. `newState`:" << newState; });
connect(electronProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
connect(_screenshareProcess.get(), QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[=](int exitCode, QProcess::ExitStatus exitStatus) {
qDebug() << "ZRF QProcess::finished. `exitCode`:" << exitCode << "`exitStatus`:" << exitStatus;
emit screenshareStopped();
});
// Note for Milad:
// We'll have to have equivalent lines of code for MacOS.
#ifdef Q_OS_WIN
electronProcess->start(SCREENSHARE_EXE_PATH, arguments);
#endif
_screenshareProcess->start(SCREENSHARE_EXE_PATH, arguments);
};
void ScreenshareScriptingInterface::stopScreenshare() {
if (QThread::currentThread() != thread()) {
QMetaObject::invokeMethod(this, "stopScreenshare");
return;
}
if (_screenshareProcess->state() != QProcess::NotRunning) {
_screenshareProcess->terminate();
}
}

View file

@ -2,6 +2,7 @@
#define hifi_ScreenshareScriptingInterface_h
#include <QObject>
#include <QProcess>
#include <DependencyManager.h>
#include <PathUtils.h>
@ -12,6 +13,10 @@ public:
ScreenshareScriptingInterface();
Q_INVOKABLE void startScreenshare(QString displayName, QString userName, QString token, QString sessionID, QString apiKey);
Q_INVOKABLE void stopScreenshare();
signals:
void screenshareStopped();
private:
#if DEV_BUILD
@ -33,6 +38,8 @@ private:
const QString SCREENSHARE_EXE_PATH{ QCoreApplication::applicationDirPath() + "/hifi-screenshare/hifi-screenshare" };
#endif
#endif
std::unique_ptr<QProcess> _screenshareProcess{ nullptr };
};
#endif // hifi_ScreenshareScriptingInterface_h