From 1e2fcf8bd54b8893197be67850b4a071bcedea5f Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 31 Oct 2019 09:43:56 -0700 Subject: [PATCH] Add screenshareStopped signal; use std::unique_ptr --- .../ScreenshareScriptingInterface.cpp | 36 ++++++++++++------- .../scripting/ScreenshareScriptingInterface.h | 7 ++++ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/interface/src/scripting/ScreenshareScriptingInterface.cpp b/interface/src/scripting/ScreenshareScriptingInterface.cpp index dd2748f84e..9e3bbb5319 100644 --- a/interface/src/scripting/ScreenshareScriptingInterface.cpp +++ b/interface/src/scripting/ScreenshareScriptingInterface.cpp @@ -10,7 +10,6 @@ // #include "ScreenshareScriptingInterface.h" -#include #include #include #include @@ -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::of(&QProcess::finished), + connect(_screenshareProcess.get(), QOverload::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(); + } +} diff --git a/interface/src/scripting/ScreenshareScriptingInterface.h b/interface/src/scripting/ScreenshareScriptingInterface.h index af84999f01..7cbbc9a398 100644 --- a/interface/src/scripting/ScreenshareScriptingInterface.h +++ b/interface/src/scripting/ScreenshareScriptingInterface.h @@ -2,6 +2,7 @@ #define hifi_ScreenshareScriptingInterface_h #include +#include #include #include @@ -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 _screenshareProcess{ nullptr }; }; #endif // hifi_ScreenshareScriptingInterface_h \ No newline at end of file