From b0c578aa7f4459e6bc8207ec6f844e06ef0dcba6 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 12 Nov 2019 17:06:35 -0800 Subject: [PATCH] Improved HTTP request to proper endpoint - won't work until PR16459 is merged --- .../ScreenshareScriptingInterface.cpp | 225 ++++++++++-------- .../scripting/ScreenshareScriptingInterface.h | 5 + 2 files changed, 131 insertions(+), 99 deletions(-) diff --git a/interface/src/scripting/ScreenshareScriptingInterface.cpp b/interface/src/scripting/ScreenshareScriptingInterface.cpp index cf4e1b71b9..7032db87b0 100644 --- a/interface/src/scripting/ScreenshareScriptingInterface.cpp +++ b/interface/src/scripting/ScreenshareScriptingInterface.cpp @@ -21,9 +21,11 @@ #include #include +#include #include #include #include +#include #include "EntityScriptingInterface.h" #include "ScreenshareScriptingInterface.h" @@ -63,11 +65,15 @@ void ScreenshareScriptingInterface::startScreenshare(const QUuid& screenshareZon return; } - if (isPresenter && _screenshareProcess && _screenshareProcess->state() != QProcess::NotRunning) { + _screenshareZoneID = screenshareZoneID; + _smartboardEntityID = smartboardEntityID; + _isPresenter = isPresenter; + + if (_isPresenter && _screenshareProcess && _screenshareProcess->state() != QProcess::NotRunning) { return; } - if (isPresenter) { + if (_isPresenter) { _screenshareProcess.reset(new QProcess(this)); QFileInfo screenshareExecutable(SCREENSHARE_EXE_PATH); @@ -77,81 +83,31 @@ void ScreenshareScriptingInterface::startScreenshare(const QUuid& screenshareZon } } - QUuid currentDomainID = DependencyManager::get()->getDomainID(); - // `https://metaverse.highfidelity.com/api/v1/domain/:domain_id/screenshare`, - // passing the Domain ID that the user is connected to, as well as the `roomName`. - // The server will respond with the relevant OpenTok , Session ID, and API Key. - // Upon error-free response, do the logic below, passing in that info as necessary. - QNetworkAccessManager* manager = new QNetworkAccessManager(); - QObject::connect(manager, &QNetworkAccessManager::finished, this, [=](QNetworkReply* reply) { - if (reply->error()) { - qDebug() << "\n\n MN HERE: REPLY" << reply->errorString(); - return; - } + auto accountManager = DependencyManager::get(); + if (!accountManager) { + return; + } + auto addressManager = DependencyManager::get(); + if (!addressManager) { + return; + } - QString answer = reply->readAll(); - qDebug() << "\n\n MN HERE: REPLY" << answer; + QString currentDomainID = uuidStringWithoutCurlyBraces(addressManager->getDomainID()); + QString requestURLPath = "api/v1/domains"; + requestURLPath = requestURLPath.append(currentDomainID); + requestURLPath = requestURLPath.append("/screenshare"); - QByteArray answerByteArray = answer.toUtf8(); - QJsonDocument answerJSONObject = QJsonDocument::fromJson(answerByteArray); - - _token = answerJSONObject["token"].toString(); - _projectAPIKey = answerJSONObject["projectAPIKey"].toString(); - _sessionID = answerJSONObject["sessionID"].toString(); - qDebug() << "token:" << _token << " projectAPIKey:" << _projectAPIKey << " sessionID: " << _sessionID; - - if (isPresenter) { - QStringList arguments; - arguments << " "; - arguments << "--token=" + _token << " "; - arguments << "--projectAPIKey=" + _projectAPIKey << " "; - arguments << "--sessionID=" + _sessionID << " "; - - connect(_screenshareProcess.get(), &QProcess::errorOccurred, - [=](QProcess::ProcessError error) { qDebug() << "ZRF QProcess::errorOccurred. `error`:" << error; }); - connect(_screenshareProcess.get(), &QProcess::started, [=]() { qDebug() << "ZRF QProcess::started"; }); - connect(_screenshareProcess.get(), &QProcess::stateChanged, [=](QProcess::ProcessState newState) { - qDebug() << "ZRF QProcess::stateChanged. `newState`:" << newState; - }); - connect(_screenshareProcess.get(), QOverload::of(&QProcess::finished), - [=](int exitCode, QProcess::ExitStatus exitStatus) { - qDebug() << "ZRF QProcess::finished. `exitCode`:" << exitCode << "`exitStatus`:" << exitStatus; - emit screenshareStopped(); - }); - - _screenshareProcess->start(SCREENSHARE_EXE_PATH, arguments); - } - - if (!_screenshareViewerLocalWebEntityUUID.isNull()) { - return; - } - - auto esi = DependencyManager::get(); - if (!esi) { - return; - } - - EntityItemProperties localScreenshareWebEntityProps; - localScreenshareWebEntityProps.setType(LOCAL_SCREENSHARE_WEB_ENTITY_TYPE); - localScreenshareWebEntityProps.setMaxFPS(LOCAL_SCREENSHARE_WEB_ENTITY_FPS); - localScreenshareWebEntityProps.setLocalPosition(LOCAL_SCREENSHARE_WEB_ENTITY_LOCAL_POSITION); - localScreenshareWebEntityProps.setSourceUrl(LOCAL_SCREENSHARE_WEB_ENTITY_URL); - localScreenshareWebEntityProps.setParentID(smartboardEntityID); - localScreenshareWebEntityProps.setDimensions(LOCAL_SCREENSHARE_WEB_ENTITY_DIMENSIONS); - - // EntityPropertyFlags desiredSmartboardProperties; - // desiredSmartboardProperties += PROP_POSITION; - // desiredSmartboardProperties += PROP_DIMENSIONS; - // EntityItemProperties smartboardProps = esi->getEntityProperties(smartboardEntityID, desiredSmartboardProperties); - - QString hostType = "local"; - _screenshareViewerLocalWebEntityUUID = esi->addEntity(localScreenshareWebEntityProps, hostType); - - QNetworkRequest request; - QString tokboxURL = QProcessEnvironment::systemEnvironment().value("hifiScreenshareUrl"); - request.setUrl(QUrl(tokboxURL)); - manager->get(request); -}; + JSONCallbackParameters callbackParams; + callbackParams.callbackReceiver = this; + callbackParams.jsonCallbackMethod = "handleSuccessfulScreenshareInfoGet"; + callbackParams.errorCallbackMethod = "handleFailedScreenshareInfoGet"; + accountManager->sendRequest( + requestURLPath, + AccountManagerAuth::Required, + QNetworkAccessManager::PutOperation, + callbackParams + ); +} void ScreenshareScriptingInterface::stopScreenshare() { if (QThread::currentThread() != thread()) { @@ -173,35 +129,106 @@ void ScreenshareScriptingInterface::stopScreenshare() { _token = ""; _projectAPIKey = ""; _sessionID = ""; + _isPresenter = false; +} + +void ScreenshareScriptingInterface::handleSuccessfulScreenshareInfoGet(QNetworkReply* reply) { + QString answer = reply->readAll(); + qDebug() << "\n\n MN HERE: REPLY" << answer; + + QByteArray answerByteArray = answer.toUtf8(); + QJsonDocument answerJSONObject = QJsonDocument::fromJson(answerByteArray); + + QString status = answerJSONObject["status"].toString(); + if (status == "fail") { + qDebug() << "\n\n MN HERE: SCREENSHARE REPLY FAIL"; + return; + } + + _token = answerJSONObject["token"].toString(); + _projectAPIKey = answerJSONObject["projectAPIKey"].toString(); + _sessionID = answerJSONObject["sessionID"].toString(); + qDebug() << "token:" << _token << " projectAPIKey:" << _projectAPIKey << " sessionID: " << _sessionID; + + if (_isPresenter) { + QStringList arguments; + arguments << " "; + arguments << "--token=" + _token << " "; + arguments << "--projectAPIKey=" + _projectAPIKey << " "; + arguments << "--sessionID=" + _sessionID << " "; + + connect(_screenshareProcess.get(), &QProcess::errorOccurred, + [=](QProcess::ProcessError error) { qDebug() << "ZRF QProcess::errorOccurred. `error`:" << error; }); + connect(_screenshareProcess.get(), &QProcess::started, [=]() { qDebug() << "ZRF QProcess::started"; }); + connect(_screenshareProcess.get(), &QProcess::stateChanged, [=](QProcess::ProcessState newState) { + qDebug() << "ZRF QProcess::stateChanged. `newState`:" << newState; + }); + connect(_screenshareProcess.get(), QOverload::of(&QProcess::finished), + [=](int exitCode, QProcess::ExitStatus exitStatus) { + qDebug() << "ZRF QProcess::finished. `exitCode`:" << exitCode << "`exitStatus`:" << exitStatus; + emit screenshareStopped(); + }); + + _screenshareProcess->start(SCREENSHARE_EXE_PATH, arguments); + } + + if (!_screenshareViewerLocalWebEntityUUID.isNull()) { + return; + } + + auto esi = DependencyManager::get(); + if (!esi) { + return; + } + + EntityItemProperties localScreenshareWebEntityProps; + localScreenshareWebEntityProps.setType(LOCAL_SCREENSHARE_WEB_ENTITY_TYPE); + localScreenshareWebEntityProps.setMaxFPS(LOCAL_SCREENSHARE_WEB_ENTITY_FPS); + localScreenshareWebEntityProps.setLocalPosition(LOCAL_SCREENSHARE_WEB_ENTITY_LOCAL_POSITION); + localScreenshareWebEntityProps.setSourceUrl(LOCAL_SCREENSHARE_WEB_ENTITY_URL); + localScreenshareWebEntityProps.setParentID(_smartboardEntityID); + localScreenshareWebEntityProps.setDimensions(LOCAL_SCREENSHARE_WEB_ENTITY_DIMENSIONS); + + // The lines below will be used when writing the feature to ensure that the smartboard can be of any arbitrary size. + //EntityPropertyFlags desiredSmartboardProperties; + //desiredSmartboardProperties += PROP_POSITION; + //desiredSmartboardProperties += PROP_DIMENSIONS; + //EntityItemProperties smartboardProps = esi->getEntityProperties(smartboardEntityID, desiredSmartboardProperties); + + QString hostType = "local"; + _screenshareViewerLocalWebEntityUUID = esi->addEntity(localScreenshareWebEntityProps, hostType); +} + +void ScreenshareScriptingInterface::handleFailedScreenshareInfoGet(QNetworkReply* reply) { + qDebug() << "\n\n MN HERE: handleFailedScreenshareInfoGet():" << reply->errorString(); } void ScreenshareScriptingInterface::onWebEventReceived(const QUuid& entityID, const QVariant& message) { if (entityID == _screenshareViewerLocalWebEntityUUID) { + auto esi = DependencyManager::get(); + if (!esi) { + return; + } + + QByteArray jsonByteArray = QVariant(message).toString().toUtf8(); + QJsonDocument jsonObject = QJsonDocument::fromJson(jsonByteArray); + + if (jsonObject["app"] != "screenshare") { + return; + } + + if (jsonObject["method"] == "eventBridgeReady") { + QJsonObject responseObject; + responseObject.insert("app", "screenshare"); + responseObject.insert("method", "receiveConnectionInfo"); + QJsonObject responseObjectData; + responseObjectData.insert("token", _token); + responseObjectData.insert("projectAPIKey", _projectAPIKey); + responseObjectData.insert("sessionID", _sessionID); + responseObject.insert("data", responseObjectData); + auto esi = DependencyManager::get(); - if (!esi) { - return; - } - - QByteArray jsonByteArray = QVariant(message).toString().toUtf8(); - QJsonDocument jsonObject = QJsonDocument::fromJson(jsonByteArray); - - if (jsonObject["app"] != "screenshare") { - return; - } - - if (jsonObject["method"] == "eventBridgeReady") { - QJsonObject responseObject; - responseObject.insert("app", "screenshare"); - responseObject.insert("method", "receiveConnectionInfo"); - QJsonObject responseObjectData; - responseObjectData.insert("token", _token); - responseObjectData.insert("projectAPIKey", _projectAPIKey); - responseObjectData.insert("sessionID", _sessionID); - responseObject.insert("data", responseObjectData); - - auto esi = DependencyManager::get(); - esi->emitScriptEvent(_screenshareViewerLocalWebEntityUUID, responseObject.toVariantMap()); - } + esi->emitScriptEvent(_screenshareViewerLocalWebEntityUUID, responseObject.toVariantMap()); } } } diff --git a/interface/src/scripting/ScreenshareScriptingInterface.h b/interface/src/scripting/ScreenshareScriptingInterface.h index 56af8c1bb7..b0b5ba31b1 100644 --- a/interface/src/scripting/ScreenshareScriptingInterface.h +++ b/interface/src/scripting/ScreenshareScriptingInterface.h @@ -36,6 +36,8 @@ signals: private slots: void onWebEventReceived(const QUuid& entityID, const QVariant& message); + void handleSuccessfulScreenshareInfoGet(QNetworkReply* reply); + void handleFailedScreenshareInfoGet(QNetworkReply* reply); private: #if DEV_BUILD @@ -63,6 +65,9 @@ private: QString _token{ "" }; QString _projectAPIKey{ "" }; QString _sessionID{ "" }; + QUuid _screenshareZoneID; + QUuid _smartboardEntityID; + bool _isPresenter{ false }; }; #endif // hifi_ScreenshareScriptingInterface_h \ No newline at end of file