From bdf1023b16535a774b03f7ba23f56c3a0643bdf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 18:58:58 +0100 Subject: [PATCH 01/41] handler: request and response types --- CMakeLists.txt | 4 +++ src/rpc/RpcRequest.cpp | 27 ++++++++++++++++ src/rpc/RpcRequest.h | 46 ++++++++++++++++++++++++++ src/rpc/RpcResponse.cpp | 48 +++++++++++++++++++++++++++ src/rpc/RpcResponse.h | 72 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 197 insertions(+) create mode 100644 src/rpc/RpcRequest.cpp create mode 100644 src/rpc/RpcRequest.h create mode 100644 src/rpc/RpcResponse.cpp create mode 100644 src/rpc/RpcResponse.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 435a4e37..f53ba576 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,8 @@ set(obs-websocket_SOURCES src/WSEvents.cpp src/Config.cpp src/Utils.cpp + src/rpc/RpcRequest.cpp + src/rpc/RpcResponse.h src/forms/settings-dialog.cpp) set(obs-websocket_HEADERS @@ -56,6 +58,8 @@ set(obs-websocket_HEADERS src/WSEvents.h src/Config.h src/Utils.h + src/rpc/RpcRequest.h + src/rpc/RpcResponse.h src/forms/settings-dialog.h) # --- Platform-independent build settings --- diff --git a/src/rpc/RpcRequest.cpp b/src/rpc/RpcRequest.cpp new file mode 100644 index 00000000..277565da --- /dev/null +++ b/src/rpc/RpcRequest.cpp @@ -0,0 +1,27 @@ +/* +obs-websocket +Copyright (C) 2016-2019 Stéphane Lepin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see +*/ + +#include "RpcRequest.h" + +RpcRequest::RpcRequest(const QString& messageId, const QString& methodName, obs_data_t* params) : + _messageId(messageId), + _methodName(methodName) +{ + _parameters = obs_data_create(); + obs_data_apply(_parameters, params); +} diff --git a/src/rpc/RpcRequest.h b/src/rpc/RpcRequest.h new file mode 100644 index 00000000..4231be03 --- /dev/null +++ b/src/rpc/RpcRequest.h @@ -0,0 +1,46 @@ +/* +obs-websocket +Copyright (C) 2016-2019 Stéphane Lepin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see +*/ + +#pragma once + +#include +#include +#include "../obs-websocket.h" + +class RpcRequest +{ +public: + explicit RpcRequest(const QString& messageId, const QString& methodName, obs_data_t* params); + + const QString& messageId() const { + return _messageId; + } + + const QString& methodName() const { + return _methodName; + } + + const obs_data_t* parameters() const { + return _parameters; + } + +private: + const QString _messageId; + const QString _methodName; + OBSDataAutoRelease _parameters; +}; diff --git a/src/rpc/RpcResponse.cpp b/src/rpc/RpcResponse.cpp new file mode 100644 index 00000000..028c4247 --- /dev/null +++ b/src/rpc/RpcResponse.cpp @@ -0,0 +1,48 @@ +/* +obs-websocket +Copyright (C) 2016-2019 Stéphane Lepin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see +*/ + +#include "RpcResponse.h" +#include "RpcRequest.h" + +RpcResponse::RpcResponse( + ResponseStatus status, const QString& messageId, + const QString& methodName, obs_data_t* additionalFields +) : + _status(status), + _messageId(messageId), + _methodName(methodName), + _additionalFields(nullptr) +{ + if (additionalFields) { + _additionalFields = obs_data_create(); + obs_data_apply(_additionalFields, additionalFields); + } +} + +const RpcResponse::RpcResponse ok(const RpcRequest& request, obs_data_t* additionalFields) +{ + RpcResponse response(ResponseStatus::Ok, request.messageId(), request.methodName(), additionalFields); + return response; +} + +const RpcResponse::RpcResponse fail(const RpcRequest& request, const QString& errorMessage) +{ + RpcResponse response(ResponseStatus::Error, request.messageId(), request.methodName()); + response._errorMessage = errorMessage; + return response; +} diff --git a/src/rpc/RpcResponse.h b/src/rpc/RpcResponse.h new file mode 100644 index 00000000..613b3276 --- /dev/null +++ b/src/rpc/RpcResponse.h @@ -0,0 +1,72 @@ +/* +obs-websocket +Copyright (C) 2016-2019 Stéphane Lepin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see +*/ + +#pragma once + +#include +#include +#include "../obs-websocket.h" + +class RpcRequest; + +enum ResponseStatus +{ + Unknown, + Ok, + Error +}; + +class RpcResponse +{ +public: + static RpcResponse ofRequest(const RpcRequest& request); + static const RpcResponse ok(const RpcRequest& request, obs_data_t* additionalFields = nullptr); + static const RpcResponse fail(const RpcRequest& request, const QString& errorMessage); + + ResponseStatus status() { + return _status; + } + + const QString& messageId() const { + return _messageId; + } + + const QString& methodName() const { + return _methodName; + } + + const QString& errorMessage() const { + return _errorMessage; + } + + const obs_data_t* parameters() const { + return _additionalFields; + } + +private: + explicit RpcResponse( + ResponseStatus status, + const QString& messageId, const QString& methodName, + obs_data_t* additionalFields = nullptr + ); + const ResponseStatus _status; + const QString _messageId; + const QString _methodName; + QString _errorMessage; + OBSDataAutoRelease _additionalFields; +}; From ee6e2411443900945be350e80682f3d5e8c9a059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 19:08:19 +0100 Subject: [PATCH 02/41] RpcRequest: add has* methods --- src/rpc/RpcRequest.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++ src/rpc/RpcRequest.h | 24 +++++++------ 2 files changed, 91 insertions(+), 11 deletions(-) diff --git a/src/rpc/RpcRequest.cpp b/src/rpc/RpcRequest.cpp index 277565da..d2ee224c 100644 --- a/src/rpc/RpcRequest.cpp +++ b/src/rpc/RpcRequest.cpp @@ -25,3 +25,81 @@ RpcRequest::RpcRequest(const QString& messageId, const QString& methodName, obs_ _parameters = obs_data_create(); obs_data_apply(_parameters, params); } + +const QString& RpcRequest::messageId() const +{ + return _messageId; +} + +const QString& RpcRequest::methodName() const +{ + return _methodName; +} + +const obs_data_t* RpcRequest::parameters() const +{ + return _parameters; +} + +bool RpcRequest::hasField(QString name, obs_data_type expectedFieldType, obs_data_number_type expectedNumberType) +{ + if (!_parameters || name.isEmpty() || name.isNull()) { + return false; + } + + OBSDataItemAutoRelease dataItem = obs_data_item_byname(_parameters, name.toUtf8()); + if (!dataItem) { + return false; + } + + if (expectedFieldType != OBS_DATA_NULL) { + obs_data_type fieldType = obs_data_item_gettype(dataItem); + if (fieldType != expectedFieldType) { + return false; + } + + if (fieldType == OBS_DATA_NUMBER && expectedNumberType != OBS_DATA_NUM_INVALID) { + obs_data_number_type numberType = obs_data_item_numtype(dataItem); + if (numberType != expectedNumberType) { + return false; + } + } + } + + return true; +} + +bool RpcRequest::hasBool(QString fieldName) +{ + return this->hasField(fieldName, OBS_DATA_BOOLEAN); +} + +bool RpcRequest::hasString(QString fieldName) +{ + return this->hasField(fieldName, OBS_DATA_STRING); +} + +bool RpcRequest::hasNumber(QString fieldName, obs_data_number_type expectedNumberType) +{ + return this->hasField(fieldName, OBS_DATA_NUMBER, expectedNumberType); +} + +bool RpcRequest::hasInteger(QString fieldName) +{ + return this->hasNumber(fieldName, OBS_DATA_NUM_INT); +} + +bool RpcRequest::hasDouble(QString fieldName) +{ + return this->hasNumber(fieldName, OBS_DATA_NUM_DOUBLE); +} + +bool RpcRequest::hasArray(QString fieldName) +{ + return this->hasField(fieldName, OBS_DATA_ARRAY); +} + +bool RpcRequest::hasObject(QString fieldName) +{ + return this->hasField(fieldName, OBS_DATA_OBJECT); +} diff --git a/src/rpc/RpcRequest.h b/src/rpc/RpcRequest.h index 4231be03..2a7f125f 100644 --- a/src/rpc/RpcRequest.h +++ b/src/rpc/RpcRequest.h @@ -27,17 +27,19 @@ class RpcRequest public: explicit RpcRequest(const QString& messageId, const QString& methodName, obs_data_t* params); - const QString& messageId() const { - return _messageId; - } - - const QString& methodName() const { - return _methodName; - } - - const obs_data_t* parameters() const { - return _parameters; - } + const QString& messageId() const; + const QString& methodName() const; + const obs_data_t* parameters() const; + + bool hasField(QString fieldName, obs_data_type expectedFieldType = OBS_DATA_NULL, + obs_data_number_type expectedNumberType = OBS_DATA_NUM_INVALID); + bool hasBool(QString fieldName); + bool hasString(QString fieldName); + bool hasNumber(QString fieldName, obs_data_number_type expectedNumberType = OBS_DATA_NUM_INVALID); + bool hasInteger(QString fieldName); + bool hasDouble(QString fieldName); + bool hasArray(QString fieldName); + bool hasObject(QString fieldName); private: const QString _messageId; From ffa6371e3d42363489679d68128f3e56906e0c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 19:12:42 +0100 Subject: [PATCH 03/41] WSRequestHandler: fix main --- src/WSRequestHandler.cpp | 155 +++++++++------------------- src/WSRequestHandler.h | 218 +++++++++++++++++---------------------- 2 files changed, 143 insertions(+), 230 deletions(-) diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index 8b31c0b7..26029955 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -24,7 +24,7 @@ #include "WSRequestHandler.h" -QHash WSRequestHandler::messageMap{ +QHash WSRequestHandler::messageMap { { "GetVersion", WSRequestHandler::HandleGetVersion }, { "GetAuthRequired", WSRequestHandler::HandleGetAuthRequired }, { "Authenticate", WSRequestHandler::HandleAuthenticate }, @@ -148,141 +148,80 @@ QSet WSRequestHandler::authNotRequired { }; WSRequestHandler::WSRequestHandler(ConnectionProperties& connProperties) : - _messageId(0), - _requestType(""), - data(nullptr), _connProperties(connProperties) { } -std::string WSRequestHandler::processIncomingMessage(std::string& textMessage) { - if (GetConfig()->DebugEnabled) { - blog(LOG_INFO, "Request >> '%s'", textMessage.c_str()); - } +// std::string WSRequestHandler::processIncomingMessage(std::string& textMessage) { +// if (GetConfig()->DebugEnabled) { +// blog(LOG_INFO, "Request >> '%s'", textMessage.c_str()); +// } - OBSDataAutoRelease responseData = processRequest(textMessage); - std::string response = obs_data_get_json(responseData); +// OBSDataAutoRelease responseData = processRequest(textMessage); +// std::string response = obs_data_get_json(responseData); - if (GetConfig()->DebugEnabled) { - blog(LOG_INFO, "Response << '%s'", response.c_str()); - } +// if (GetConfig()->DebugEnabled) { +// blog(LOG_INFO, "Response << '%s'", response.c_str()); +// } - return response; -} +// return response; +// } -HandlerResponse WSRequestHandler::processRequest(std::string& textMessage){ - std::string msgContainer(textMessage); - const char* msg = msgContainer.c_str(); +RpcResponse WSRequestHandler::processRequest(const RpcRequest& request){ + // std::string msgContainer(textMessage); + // const char* msg = msgContainer.c_str(); - data = obs_data_create_from_json(msg); - if (!data) { - blog(LOG_ERROR, "invalid JSON payload received for '%s'", msg); - return SendErrorResponse("invalid JSON payload"); - } + // data = obs_data_create_from_json(msg); + // if (!data) { + // blog(LOG_ERROR, "invalid JSON payload received for '%s'", msg); + // return SendErrorResponse("invalid JSON payload"); + // } if (!hasField("request-type") || !hasField("message-id")) { return SendErrorResponse("missing request parameters"); } - _requestType = obs_data_get_string(data, "request-type"); - _messageId = obs_data_get_string(data, "message-id"); + // _requestType = obs_data_get_string(data, "request-type"); + // _messageId = obs_data_get_string(data, "message-id"); if (GetConfig()->AuthRequired - && (!authNotRequired.contains(_requestType)) + && (!authNotRequired.contains(request.methodName())) && (!_connProperties.isAuthenticated())) { - return SendErrorResponse("Not Authenticated"); + return RpcResponse::fail(request, "Not Authenticated"); } - HandlerResponse (*handlerFunc)(WSRequestHandler*) = (messageMap[_requestType]); + RpcResponse (*handlerFunc)(const RpcRequest&) = (messageMap[request.methodName()]); if (!handlerFunc) { - return SendErrorResponse("invalid request type"); + return RpcResponse::fail(request, "invalid request type"); } - return handlerFunc(this); + return handlerFunc(request); } -WSRequestHandler::~WSRequestHandler() { -} +// HandlerResponse WSRequestHandler::SendOKResponse(obs_data_t* additionalFields) { +// return SendResponse("ok", additionalFields); +// } -HandlerResponse WSRequestHandler::SendOKResponse(obs_data_t* additionalFields) { - return SendResponse("ok", additionalFields); -} +// HandlerResponse WSRequestHandler::SendErrorResponse(QString errorMessage) { +// OBSDataAutoRelease fields = obs_data_create(); +// obs_data_set_string(fields, "error", errorMessage.toUtf8().constData()); -HandlerResponse WSRequestHandler::SendErrorResponse(QString errorMessage) { - OBSDataAutoRelease fields = obs_data_create(); - obs_data_set_string(fields, "error", errorMessage.toUtf8().constData()); +// return SendResponse("error", fields); +// } - return SendResponse("error", fields); -} +// HandlerResponse WSRequestHandler::SendErrorResponse(obs_data_t* additionalFields) { +// return SendResponse("error", additionalFields); +// } -HandlerResponse WSRequestHandler::SendErrorResponse(obs_data_t* additionalFields) { - return SendResponse("error", additionalFields); -} +// HandlerResponse WSRequestHandler::SendResponse(const char* status, obs_data_t* fields) { +// obs_data_t* response = obs_data_create(); +// obs_data_set_string(response, "message-id", _messageId); +// obs_data_set_string(response, "status", status); -HandlerResponse WSRequestHandler::SendResponse(const char* status, obs_data_t* fields) { - obs_data_t* response = obs_data_create(); - obs_data_set_string(response, "message-id", _messageId); - obs_data_set_string(response, "status", status); +// if (fields) { +// obs_data_apply(response, fields); +// } - if (fields) { - obs_data_apply(response, fields); - } - - return response; -} - -bool WSRequestHandler::hasField(QString name, obs_data_type expectedFieldType, obs_data_number_type expectedNumberType) { - if (!data || name.isEmpty() || name.isNull()) { - return false; - } - - OBSDataItemAutoRelease dataItem = obs_data_item_byname(data, name.toUtf8()); - if (!dataItem) { - return false; - } - - if (expectedFieldType != OBS_DATA_NULL) { - obs_data_type fieldType = obs_data_item_gettype(dataItem); - if (fieldType != expectedFieldType) { - return false; - } - - if (fieldType == OBS_DATA_NUMBER && expectedNumberType != OBS_DATA_NUM_INVALID) { - obs_data_number_type numberType = obs_data_item_numtype(dataItem); - if (numberType != expectedNumberType) { - return false; - } - } - } - - return true; -} - -bool WSRequestHandler::hasBool(QString fieldName) { - return this->hasField(fieldName, OBS_DATA_BOOLEAN); -} - -bool WSRequestHandler::hasString(QString fieldName) { - return this->hasField(fieldName, OBS_DATA_STRING); -} - -bool WSRequestHandler::hasNumber(QString fieldName, obs_data_number_type expectedNumberType) { - return this->hasField(fieldName, OBS_DATA_NUMBER, expectedNumberType); -} - -bool WSRequestHandler::hasInteger(QString fieldName) { - return this->hasNumber(fieldName, OBS_DATA_NUM_INT); -} - -bool WSRequestHandler::hasDouble(QString fieldName) { - return this->hasNumber(fieldName, OBS_DATA_NUM_DOUBLE); -} - -bool WSRequestHandler::hasArray(QString fieldName) { - return this->hasField(fieldName, OBS_DATA_ARRAY); -} - -bool WSRequestHandler::hasObject(QString fieldName) { - return this->hasField(fieldName, OBS_DATA_OBJECT); -} +// return response; +// } diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index 0e729e55..ec8d484d 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -30,160 +30,134 @@ with this program. If not, see #include "ConnectionProperties.h" +#include "rpc/RpcRequest.h" +#include "rpc/RpcResponse.h" + #include "obs-websocket.h" -typedef obs_data_t* HandlerResponse; - -class WSRequestHandler : public QObject { - Q_OBJECT - +class WSRequestHandler { public: explicit WSRequestHandler(ConnectionProperties& connProperties); - ~WSRequestHandler(); - std::string processIncomingMessage(std::string& textMessage); - - bool hasField(QString fieldName, obs_data_type expectedFieldType = OBS_DATA_NULL, - obs_data_number_type expectedNumberType = OBS_DATA_NUM_INVALID); - bool hasBool(QString fieldName); - bool hasString(QString fieldName); - bool hasNumber(QString fieldName, obs_data_number_type expectedNumberType = OBS_DATA_NUM_INVALID); - bool hasInteger(QString fieldName); - bool hasDouble(QString fieldName); - bool hasArray(QString fieldName); - bool hasObject(QString fieldName); - - HandlerResponse SendOKResponse(obs_data_t* additionalFields = nullptr); - HandlerResponse SendErrorResponse(QString errorMessage); - HandlerResponse SendErrorResponse(obs_data_t* additionalFields = nullptr); - HandlerResponse SendResponse(const char* status, obs_data_t* additionalFields = nullptr); - - obs_data_t* parameters() { - return this->data; - } + RpcResponse processRequest(const RpcRequest& textMessage); private: - const char* _messageId; - const char* _requestType; ConnectionProperties& _connProperties; - OBSDataAutoRelease data; - HandlerResponse processRequest(std::string& textMessage); - - static QHash messageMap; + static QHash messageMap; static QSet authNotRequired; - static HandlerResponse HandleGetVersion(WSRequestHandler* req); - static HandlerResponse HandleGetAuthRequired(WSRequestHandler* req); - static HandlerResponse HandleAuthenticate(WSRequestHandler* req); + static RpcResponse HandleGetVersion(const RpcRequest&); + static RpcResponse HandleGetAuthRequired(const RpcRequest&); + static RpcResponse HandleAuthenticate(const RpcRequest&); - static HandlerResponse HandleGetStats(WSRequestHandler* req); - static HandlerResponse HandleSetHeartbeat(WSRequestHandler* req); - static HandlerResponse HandleGetVideoInfo(WSRequestHandler* req); + static RpcResponse HandleGetStats(const RpcRequest&); + static RpcResponse HandleSetHeartbeat(const RpcRequest&); + static RpcResponse HandleGetVideoInfo(const RpcRequest&); - static HandlerResponse HandleSetFilenameFormatting(WSRequestHandler* req); - static HandlerResponse HandleGetFilenameFormatting(WSRequestHandler* req); + static RpcResponse HandleSetFilenameFormatting(const RpcRequest&); + static RpcResponse HandleGetFilenameFormatting(const RpcRequest&); - static HandlerResponse HandleBroadcastCustomMessage(WSRequestHandler* req); + static RpcResponse HandleBroadcastCustomMessage(const RpcRequest&); - static HandlerResponse HandleSetCurrentScene(WSRequestHandler* req); - static HandlerResponse HandleGetCurrentScene(WSRequestHandler* req); - static HandlerResponse HandleGetSceneList(WSRequestHandler* req); + static RpcResponse HandleSetCurrentScene(const RpcRequest&); + static RpcResponse HandleGetCurrentScene(const RpcRequest&); + static RpcResponse HandleGetSceneList(const RpcRequest&); - static HandlerResponse HandleSetSceneItemRender(WSRequestHandler* req); - static HandlerResponse HandleSetSceneItemPosition(WSRequestHandler* req); - static HandlerResponse HandleSetSceneItemTransform(WSRequestHandler* req); - static HandlerResponse HandleSetSceneItemCrop(WSRequestHandler* req); - static HandlerResponse HandleGetSceneItemProperties(WSRequestHandler* req); - static HandlerResponse HandleSetSceneItemProperties(WSRequestHandler* req); - static HandlerResponse HandleResetSceneItem(WSRequestHandler* req); - static HandlerResponse HandleDuplicateSceneItem(WSRequestHandler* req); - static HandlerResponse HandleDeleteSceneItem(WSRequestHandler* req); - static HandlerResponse HandleReorderSceneItems(WSRequestHandler* req); + static RpcResponse HandleSetSceneItemRender(const RpcRequest&); + static RpcResponse HandleSetSceneItemPosition(const RpcRequest&); + static RpcResponse HandleSetSceneItemTransform(const RpcRequest&); + static RpcResponse HandleSetSceneItemCrop(const RpcRequest&); + static RpcResponse HandleGetSceneItemProperties(const RpcRequest&); + static RpcResponse HandleSetSceneItemProperties(const RpcRequest&); + static RpcResponse HandleResetSceneItem(const RpcRequest&); + static RpcResponse HandleDuplicateSceneItem(const RpcRequest&); + static RpcResponse HandleDeleteSceneItem(const RpcRequest&); + static RpcResponse HandleReorderSceneItems(const RpcRequest&); - static HandlerResponse HandleGetStreamingStatus(WSRequestHandler* req); - static HandlerResponse HandleStartStopStreaming(WSRequestHandler* req); - static HandlerResponse HandleStartStopRecording(WSRequestHandler* req); + static RpcResponse HandleGetStreamingStatus(const RpcRequest&); + static RpcResponse HandleStartStopStreaming(const RpcRequest&); + static RpcResponse HandleStartStopRecording(const RpcRequest&); - static HandlerResponse HandleStartStreaming(WSRequestHandler* req); - static HandlerResponse HandleStopStreaming(WSRequestHandler* req); + static RpcResponse HandleStartStreaming(const RpcRequest&); + static RpcResponse HandleStopStreaming(const RpcRequest&); - static HandlerResponse HandleStartRecording(WSRequestHandler* req); - static HandlerResponse HandleStopRecording(WSRequestHandler* req); - static HandlerResponse HandlePauseRecording(WSRequestHandler* req); - static HandlerResponse HandleResumeRecording(WSRequestHandler* req); + static RpcResponse HandleStartRecording(const RpcRequest&); + static RpcResponse HandleStopRecording(const RpcRequest&); + static RpcResponse HandlePauseRecording(const RpcRequest&); + static RpcResponse HandleResumeRecording(const RpcRequest&); - static HandlerResponse HandleStartStopReplayBuffer(WSRequestHandler* req); - static HandlerResponse HandleStartReplayBuffer(WSRequestHandler* req); - static HandlerResponse HandleStopReplayBuffer(WSRequestHandler* req); - static HandlerResponse HandleSaveReplayBuffer(WSRequestHandler* req); + static RpcResponse HandleStartStopReplayBuffer(const RpcRequest&); + static RpcResponse HandleStartReplayBuffer(const RpcRequest&); + static RpcResponse HandleStopReplayBuffer(const RpcRequest&); + static RpcResponse HandleSaveReplayBuffer(const RpcRequest&); - static HandlerResponse HandleSetRecordingFolder(WSRequestHandler* req); - static HandlerResponse HandleGetRecordingFolder(WSRequestHandler* req); + static RpcResponse HandleSetRecordingFolder(const RpcRequest&); + static RpcResponse HandleGetRecordingFolder(const RpcRequest&); - static HandlerResponse HandleGetTransitionList(WSRequestHandler* req); - static HandlerResponse HandleGetCurrentTransition(WSRequestHandler* req); - static HandlerResponse HandleSetCurrentTransition(WSRequestHandler* req); + static RpcResponse HandleGetTransitionList(const RpcRequest&); + static RpcResponse HandleGetCurrentTransition(const RpcRequest&); + static RpcResponse HandleSetCurrentTransition(const RpcRequest&); - static HandlerResponse HandleSetVolume(WSRequestHandler* req); - static HandlerResponse HandleGetVolume(WSRequestHandler* req); - static HandlerResponse HandleToggleMute(WSRequestHandler* req); - static HandlerResponse HandleSetMute(WSRequestHandler* req); - static HandlerResponse HandleGetMute(WSRequestHandler* req); - static HandlerResponse HandleSetSyncOffset(WSRequestHandler* req); - static HandlerResponse HandleGetSyncOffset(WSRequestHandler* req); - static HandlerResponse HandleGetSpecialSources(WSRequestHandler* req); - static HandlerResponse HandleGetSourcesList(WSRequestHandler* req); - static HandlerResponse HandleGetSourceTypesList(WSRequestHandler* req); - static HandlerResponse HandleGetSourceSettings(WSRequestHandler* req); - static HandlerResponse HandleSetSourceSettings(WSRequestHandler* req); - static HandlerResponse HandleTakeSourceScreenshot(WSRequestHandler* req); + static RpcResponse HandleSetVolume(const RpcRequest&); + static RpcResponse HandleGetVolume(const RpcRequest&); + static RpcResponse HandleToggleMute(const RpcRequest&); + static RpcResponse HandleSetMute(const RpcRequest&); + static RpcResponse HandleGetMute(const RpcRequest&); + static RpcResponse HandleSetSyncOffset(const RpcRequest&); + static RpcResponse HandleGetSyncOffset(const RpcRequest&); + static RpcResponse HandleGetSpecialSources(const RpcRequest&); + static RpcResponse HandleGetSourcesList(const RpcRequest&); + static RpcResponse HandleGetSourceTypesList(const RpcRequest&); + static RpcResponse HandleGetSourceSettings(const RpcRequest&); + static RpcResponse HandleSetSourceSettings(const RpcRequest&); + static RpcResponse HandleTakeSourceScreenshot(const RpcRequest&); - static HandlerResponse HandleGetSourceFilters(WSRequestHandler* req); - static HandlerResponse HandleGetSourceFilterInfo(WSRequestHandler* req); - static HandlerResponse HandleAddFilterToSource(WSRequestHandler* req); - static HandlerResponse HandleRemoveFilterFromSource(WSRequestHandler* req); - static HandlerResponse HandleReorderSourceFilter(WSRequestHandler* req); - static HandlerResponse HandleMoveSourceFilter(WSRequestHandler* req); - static HandlerResponse HandleSetSourceFilterSettings(WSRequestHandler* req); - static HandlerResponse HandleSetSourceFilterVisibility(WSRequestHandler* req); + static RpcResponse HandleGetSourceFilters(const RpcRequest&); + static RpcResponse HandleGetSourceFilterInfo(const RpcRequest&); + static RpcResponse HandleAddFilterToSource(const RpcRequest&); + static RpcResponse HandleRemoveFilterFromSource(const RpcRequest&); + static RpcResponse HandleReorderSourceFilter(const RpcRequest&); + static RpcResponse HandleMoveSourceFilter(const RpcRequest&); + static RpcResponse HandleSetSourceFilterSettings(const RpcRequest&); + static RpcResponse HandleSetSourceFilterVisibility(const RpcRequest&); - static HandlerResponse HandleSetCurrentSceneCollection(WSRequestHandler* req); - static HandlerResponse HandleGetCurrentSceneCollection(WSRequestHandler* req); - static HandlerResponse HandleListSceneCollections(WSRequestHandler* req); + static RpcResponse HandleSetCurrentSceneCollection(const RpcRequest&); + static RpcResponse HandleGetCurrentSceneCollection(const RpcRequest&); + static RpcResponse HandleListSceneCollections(const RpcRequest&); - static HandlerResponse HandleSetCurrentProfile(WSRequestHandler* req); - static HandlerResponse HandleGetCurrentProfile(WSRequestHandler* req); - static HandlerResponse HandleListProfiles(WSRequestHandler* req); + static RpcResponse HandleSetCurrentProfile(const RpcRequest&); + static RpcResponse HandleGetCurrentProfile(const RpcRequest&); + static RpcResponse HandleListProfiles(const RpcRequest&); - static HandlerResponse HandleSetStreamSettings(WSRequestHandler* req); - static HandlerResponse HandleGetStreamSettings(WSRequestHandler* req); - static HandlerResponse HandleSaveStreamSettings(WSRequestHandler* req); + static RpcResponse HandleSetStreamSettings(const RpcRequest&); + static RpcResponse HandleGetStreamSettings(const RpcRequest&); + static RpcResponse HandleSaveStreamSettings(const RpcRequest&); #if BUILD_CAPTIONS - static HandlerResponse HandleSendCaptions(WSRequestHandler * req); + static RpcResponse HandleSendCaptions(WSRequestHandler * req); #endif - static HandlerResponse HandleSetTransitionDuration(WSRequestHandler* req); - static HandlerResponse HandleGetTransitionDuration(WSRequestHandler* req); + static RpcResponse HandleSetTransitionDuration(const RpcRequest& request); + static RpcResponse HandleGetTransitionDuration(const RpcRequest& request); - static HandlerResponse HandleGetStudioModeStatus(WSRequestHandler* req); - static HandlerResponse HandleGetPreviewScene(WSRequestHandler* req); - static HandlerResponse HandleSetPreviewScene(WSRequestHandler* req); - static HandlerResponse HandleTransitionToProgram(WSRequestHandler* req); - static HandlerResponse HandleEnableStudioMode(WSRequestHandler* req); - static HandlerResponse HandleDisableStudioMode(WSRequestHandler* req); - static HandlerResponse HandleToggleStudioMode(WSRequestHandler* req); + static RpcResponse HandleGetStudioModeStatus(const RpcRequest& request); + static RpcResponse HandleGetPreviewScene(const RpcRequest& request); + static RpcResponse HandleSetPreviewScene(const RpcRequest& request); + static RpcResponse HandleTransitionToProgram(const RpcRequest& request); + static RpcResponse HandleEnableStudioMode(const RpcRequest& request); + static RpcResponse HandleDisableStudioMode(const RpcRequest& request); + static RpcResponse HandleToggleStudioMode(const RpcRequest& request); - static HandlerResponse HandleSetTextGDIPlusProperties(WSRequestHandler* req); - static HandlerResponse HandleGetTextGDIPlusProperties(WSRequestHandler* req); + static RpcResponse HandleSetTextGDIPlusProperties(const RpcRequest& request); + static RpcResponse HandleGetTextGDIPlusProperties(const RpcRequest& request); - static HandlerResponse HandleSetTextFreetype2Properties(WSRequestHandler* req); - static HandlerResponse HandleGetTextFreetype2Properties(WSRequestHandler* req); + static RpcResponse HandleSetTextFreetype2Properties(const RpcRequest& request); + static RpcResponse HandleGetTextFreetype2Properties(const RpcRequest& request); - static HandlerResponse HandleSetBrowserSourceProperties(WSRequestHandler* req); - static HandlerResponse HandleGetBrowserSourceProperties(WSRequestHandler* req); + static RpcResponse HandleSetBrowserSourceProperties(const RpcRequest& request); + static RpcResponse HandleGetBrowserSourceProperties(const RpcRequest& request); - static HandlerResponse HandleListOutputs(WSRequestHandler* req); - static HandlerResponse HandleGetOutputInfo(WSRequestHandler* req); - static HandlerResponse HandleStartOutput(WSRequestHandler* req); - static HandlerResponse HandleStopOutput(WSRequestHandler* req); + static RpcResponse HandleListOutputs(const RpcRequest& request); + static RpcResponse HandleGetOutputInfo(const RpcRequest& request); + static RpcResponse HandleStartOutput(const RpcRequest& request); + static RpcResponse HandleStopOutput(const RpcRequest& request); }; From d1ee9d83b52b9c1830d49d987b898b5f9c3bcb0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 19:13:46 +0100 Subject: [PATCH 04/41] RpcResponse: allow additional fields in responses --- src/rpc/RpcResponse.cpp | 4 ++-- src/rpc/RpcResponse.h | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/rpc/RpcResponse.cpp b/src/rpc/RpcResponse.cpp index 028c4247..7a9bf585 100644 --- a/src/rpc/RpcResponse.cpp +++ b/src/rpc/RpcResponse.cpp @@ -40,9 +40,9 @@ const RpcResponse::RpcResponse ok(const RpcRequest& request, obs_data_t* additio return response; } -const RpcResponse::RpcResponse fail(const RpcRequest& request, const QString& errorMessage) +const RpcResponse::RpcResponse fail(const RpcRequest& request, const QString& errorMessage, obs_data_t* additionalFields) { - RpcResponse response(ResponseStatus::Error, request.messageId(), request.methodName()); + RpcResponse response(ResponseStatus::Error, request.messageId(), request.methodName(), additionalFields); response._errorMessage = errorMessage; return response; } diff --git a/src/rpc/RpcResponse.h b/src/rpc/RpcResponse.h index 613b3276..11adfcf5 100644 --- a/src/rpc/RpcResponse.h +++ b/src/rpc/RpcResponse.h @@ -36,7 +36,10 @@ class RpcResponse public: static RpcResponse ofRequest(const RpcRequest& request); static const RpcResponse ok(const RpcRequest& request, obs_data_t* additionalFields = nullptr); - static const RpcResponse fail(const RpcRequest& request, const QString& errorMessage); + static const RpcResponse fail( + const RpcRequest& request, const QString& errorMessage, + obs_data_t* additionalFields = nullptr + ); ResponseStatus status() { return _status; From e6dbc9bfdf71ae9b4872f0f8f8c85a014c155a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 19:24:26 +0100 Subject: [PATCH 05/41] WSRequestHandler(General): fixes --- src/WSRequestHandler_General.cpp | 82 ++++++++++++++++---------------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index ecb3f48f..9b864af9 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -66,10 +66,10 @@ const char *describe_scale_type(int scale) { * @category general * @since 0.3 */ -HandlerResponse WSRequestHandler::HandleGetVersion(WSRequestHandler* req) { +RpcResponse WSRequestHandler::HandleGetVersion(const RpcRequest& request) { QString obsVersion = Utils::OBSVersionString(); - QList names = req->messageMap.keys(); + QList names = messageMap.keys(); names.sort(Qt::CaseInsensitive); // (Palakis) OBS' data arrays only support object arrays, so I improvised. @@ -85,7 +85,7 @@ HandlerResponse WSRequestHandler::HandleGetVersion(WSRequestHandler* req) { obs_data_set_string(data, "obs-studio-version", obsVersion.toUtf8()); obs_data_set_string(data, "available-requests", requests.toUtf8()); - return req->SendOKResponse(data); + return RpcResponse::ok(request, data); } /** @@ -101,7 +101,7 @@ HandlerResponse WSRequestHandler::HandleGetVersion(WSRequestHandler* req) { * @category general * @since 0.3 */ -HandlerResponse WSRequestHandler::HandleGetAuthRequired(WSRequestHandler* req) { +RpcResponse WSRequestHandler::HandleGetAuthRequired(const RpcRequest& request) { bool authRequired = GetConfig()->AuthRequired; OBSDataAutoRelease data = obs_data_create(); @@ -115,7 +115,7 @@ HandlerResponse WSRequestHandler::HandleGetAuthRequired(WSRequestHandler* req) { config->Salt.toUtf8()); } - return req->SendOKResponse(data); + return RpcResponse::ok(request, data); } /** @@ -128,26 +128,26 @@ HandlerResponse WSRequestHandler::HandleGetAuthRequired(WSRequestHandler* req) { * @category general * @since 0.3 */ -HandlerResponse WSRequestHandler::HandleAuthenticate(WSRequestHandler* req) { - if (!req->hasField("auth")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::HandleAuthenticate(const RpcRequest& request) { + if (!request.hasField("auth")) { + return RpcResponse::fail(request, "missing request parameters"); } - if (req->_connProperties.isAuthenticated()) { - return req->SendErrorResponse("already authenticated"); + if (_connProperties.isAuthenticated()) { + return RpcResponse::fail(request, "already authenticated"); } - QString auth = obs_data_get_string(req->data, "auth"); + QString auth = obs_data_get_string(request.parameters(), "auth"); if (auth.isEmpty()) { - return req->SendErrorResponse("auth not specified!"); + return RpcResponse::fail(request, "auth not specified!"); } if (GetConfig()->CheckAuth(auth) == false) { - return req->SendErrorResponse("Authentication Failed."); + return RpcResponse::fail(request, "Authentication Failed."); } - req->_connProperties.setAuthenticated(true); - return req->SendOKResponse(); + _connProperties.setAuthenticated(true); + return RpcResponse::ok(request); } /** @@ -160,17 +160,17 @@ HandlerResponse WSRequestHandler::HandleAuthenticate(WSRequestHandler* req) { * @category general * @since 4.3.0 */ -HandlerResponse WSRequestHandler::HandleSetHeartbeat(WSRequestHandler* req) { - if (!req->hasField("enable")) { - return req->SendErrorResponse("Heartbeat parameter missing"); +RpcResponse WSRequestHandler::HandleSetHeartbeat(const RpcRequest& request) { + if (!request.hasField("enable")) { + return RpcResponse::fail(request, "Heartbeat parameter missing"); } auto events = GetEventsSystem(); - events->HeartbeatIsActive = obs_data_get_bool(req->data, "enable"); + events->HeartbeatIsActive = obs_data_get_bool(request.parameters(), "enable"); OBSDataAutoRelease response = obs_data_create(); obs_data_set_bool(response, "enable", events->HeartbeatIsActive); - return req->SendOKResponse(response); + return RpcResponse::ok(request, response); } /** @@ -183,18 +183,18 @@ HandlerResponse WSRequestHandler::HandleSetHeartbeat(WSRequestHandler* req) { * @category general * @since 4.3.0 */ -HandlerResponse WSRequestHandler::HandleSetFilenameFormatting(WSRequestHandler* req) { - if (!req->hasField("filename-formatting")) { - return req->SendErrorResponse(" parameter missing"); +RpcResponse WSRequestHandler::HandleSetFilenameFormatting(const RpcRequest& request) { + if (!request.hasField("filename-formatting")) { + return RpcResponse::fail(request, " parameter missing"); } - QString filenameFormatting = obs_data_get_string(req->data, "filename-formatting"); + QString filenameFormatting = obs_data_get_string(request.parameters(), "filename-formatting"); if (filenameFormatting.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return RpcResponse::fail(request, "invalid request parameters"); } Utils::SetFilenameFormatting(filenameFormatting.toUtf8()); - return req->SendOKResponse(); + return RpcResponse::ok(request); } /** @@ -207,10 +207,10 @@ HandlerResponse WSRequestHandler::HandleSetFilenameFormatting(WSRequestHandler* * @category general * @since 4.3.0 */ -HandlerResponse WSRequestHandler::HandleGetFilenameFormatting(WSRequestHandler* req) { +RpcResponse WSRequestHandler::HandleGetFilenameFormatting(const RpcRequest& request) { OBSDataAutoRelease response = obs_data_create(); obs_data_set_string(response, "filename-formatting", Utils::GetFilenameFormatting()); - return req->SendOKResponse(response); + return RpcResponse::ok(request, response); } /** @@ -223,12 +223,12 @@ HandlerResponse WSRequestHandler::HandleGetFilenameFormatting(WSRequestHandler* * @category general * @since 4.6.0 */ -HandlerResponse WSRequestHandler::HandleGetStats(WSRequestHandler* req) { +RpcResponse WSRequestHandler::HandleGetStats(const RpcRequest& request) { OBSDataAutoRelease stats = GetEventsSystem()->GetStats(); OBSDataAutoRelease response = obs_data_create(); obs_data_set_obj(response, "stats", stats); - return req->SendOKResponse(response); + return RpcResponse::ok(request, response); } /** @@ -242,26 +242,26 @@ HandlerResponse WSRequestHandler::HandleGetStats(WSRequestHandler* req) { * @category general * @since 4.7.0 */ -HandlerResponse WSRequestHandler::HandleBroadcastCustomMessage(WSRequestHandler* req) { - if (!req->hasField("realm") || !req->hasField("data")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::HandleBroadcastCustomMessage(const RpcRequest& request) { + if (!request.hasField("realm") || !request.hasField("data")) { + return RpcResponse::fail(request, "missing request parameters"); } - QString realm = obs_data_get_string(req->data, "realm"); - OBSDataAutoRelease data = obs_data_get_obj(req->data, "data"); + QString realm = obs_data_get_string(request.parameters(), "realm"); + OBSDataAutoRelease data = obs_data_get_obj(request.parameters(), "data"); if (realm.isEmpty()) { - return req->SendErrorResponse("realm not specified!"); + return RpcResponse::fail(request, "realm not specified!"); } if (!data) { - return req->SendErrorResponse("data not specified!"); + return RpcResponse::fail(request, "data not specified!"); } auto events = GetEventsSystem(); events->OnBroadcastCustomMessage(realm, data); - return req->SendOKResponse(); + return RpcResponse::ok(request); } @@ -283,9 +283,10 @@ HandlerResponse WSRequestHandler::HandleBroadcastCustomMessage(WSRequestHandler* * @category general * @since 4.6.0 */ -HandlerResponse WSRequestHandler::HandleGetVideoInfo(WSRequestHandler* req) { +RpcResponse WSRequestHandler::HandleGetVideoInfo(const RpcRequest& request) { obs_video_info ovi; obs_get_video_info(&ovi); + OBSDataAutoRelease response = obs_data_create(); obs_data_set_int(response, "baseWidth", ovi.base_width); obs_data_set_int(response, "baseHeight", ovi.base_height); @@ -296,5 +297,6 @@ HandlerResponse WSRequestHandler::HandleGetVideoInfo(WSRequestHandler* req) { obs_data_set_string(response, "colorSpace", describe_color_space(ovi.colorspace)); obs_data_set_string(response, "colorRange", describe_color_range(ovi.range)); obs_data_set_string(response, "scaleType", describe_scale_type(ovi.scale_type)); - return req->SendOKResponse(response); + + return RpcResponse::ok(request, response); } From 31559051f6d2e7d1471e6191eb876c6dce982bae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 19:38:15 +0100 Subject: [PATCH 06/41] WSRequestHandler: request handler as object methods --- src/WSRequestHandler.cpp | 192 +++++++++++++++++++-------------------- src/WSRequestHandler.h | 186 ++++++++++++++++++------------------- 2 files changed, 190 insertions(+), 188 deletions(-) diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index 26029955..e6a5e064 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -24,124 +24,124 @@ #include "WSRequestHandler.h" -QHash WSRequestHandler::messageMap { - { "GetVersion", WSRequestHandler::HandleGetVersion }, - { "GetAuthRequired", WSRequestHandler::HandleGetAuthRequired }, - { "Authenticate", WSRequestHandler::HandleAuthenticate }, +const QHash WSRequestHandler::messageMap { + { "GetVersion", &WSRequestHandler::GetVersion }, + { "GetAuthRequired", &WSRequestHandler::GetAuthRequired }, + { "Authenticate", &WSRequestHandler::Authenticate }, - { "GetStats", WSRequestHandler::HandleGetStats }, - { "SetHeartbeat", WSRequestHandler::HandleSetHeartbeat }, - { "GetVideoInfo", WSRequestHandler::HandleGetVideoInfo }, + { "GetStats", &WSRequestHandler::GetStats }, + { "SetHeartbeat", &WSRequestHandler::SetHeartbeat }, + { "GetVideoInfo", &WSRequestHandler::GetVideoInfo }, - { "SetFilenameFormatting", WSRequestHandler::HandleSetFilenameFormatting }, - { "GetFilenameFormatting", WSRequestHandler::HandleGetFilenameFormatting }, + { "SetFilenameFormatting", &WSRequestHandler::SetFilenameFormatting }, + { "GetFilenameFormatting", &WSRequestHandler::GetFilenameFormatting }, - { "BroadcastCustomMessage", WSRequestHandler::HandleBroadcastCustomMessage }, + { "BroadcastCustomMessage", &WSRequestHandler::BroadcastCustomMessage }, - { "SetCurrentScene", WSRequestHandler::HandleSetCurrentScene }, - { "GetCurrentScene", WSRequestHandler::HandleGetCurrentScene }, - { "GetSceneList", WSRequestHandler::HandleGetSceneList }, + { "SetCurrentScene", &WSRequestHandler::SetCurrentScene }, + { "GetCurrentScene", &WSRequestHandler::GetCurrentScene }, + { "GetSceneList", &WSRequestHandler::GetSceneList }, - { "SetSourceRender", WSRequestHandler::HandleSetSceneItemRender }, // Retrocompat - { "SetSceneItemRender", WSRequestHandler::HandleSetSceneItemRender }, - { "SetSceneItemPosition", WSRequestHandler::HandleSetSceneItemPosition }, - { "SetSceneItemTransform", WSRequestHandler::HandleSetSceneItemTransform }, - { "SetSceneItemCrop", WSRequestHandler::HandleSetSceneItemCrop }, - { "GetSceneItemProperties", WSRequestHandler::HandleGetSceneItemProperties }, - { "SetSceneItemProperties", WSRequestHandler::HandleSetSceneItemProperties }, - { "ResetSceneItem", WSRequestHandler::HandleResetSceneItem }, - { "DeleteSceneItem", WSRequestHandler::HandleDeleteSceneItem }, - { "DuplicateSceneItem", WSRequestHandler::HandleDuplicateSceneItem }, - { "ReorderSceneItems", WSRequestHandler::HandleReorderSceneItems }, + { "SetSourceRender", &WSRequestHandler::SetSceneItemRender }, // Retrocompat + { "SetSceneItemRender", &WSRequestHandler::SetSceneItemRender }, + { "SetSceneItemPosition", &WSRequestHandler::SetSceneItemPosition }, + { "SetSceneItemTransform", &WSRequestHandler::SetSceneItemTransform }, + { "SetSceneItemCrop", &WSRequestHandler::SetSceneItemCrop }, + { "GetSceneItemProperties", &WSRequestHandler::GetSceneItemProperties }, + { "SetSceneItemProperties", &WSRequestHandler::SetSceneItemProperties }, + { "ResetSceneItem", &WSRequestHandler::ResetSceneItem }, + { "DeleteSceneItem", &WSRequestHandler::DeleteSceneItem }, + { "DuplicateSceneItem", &WSRequestHandler::DuplicateSceneItem }, + { "ReorderSceneItems", &WSRequestHandler::ReorderSceneItems }, - { "GetStreamingStatus", WSRequestHandler::HandleGetStreamingStatus }, - { "StartStopStreaming", WSRequestHandler::HandleStartStopStreaming }, - { "StartStopRecording", WSRequestHandler::HandleStartStopRecording }, + { "GetStreamingStatus", &WSRequestHandler::GetStreamingStatus }, + { "StartStopStreaming", &WSRequestHandler::StartStopStreaming }, + { "StartStopRecording", &WSRequestHandler::StartStopRecording }, - { "StartStreaming", WSRequestHandler::HandleStartStreaming }, - { "StopStreaming", WSRequestHandler::HandleStopStreaming }, + { "StartStreaming", &WSRequestHandler::StartStreaming }, + { "StopStreaming", &WSRequestHandler::StopStreaming }, - { "StartRecording", WSRequestHandler::HandleStartRecording }, - { "StopRecording", WSRequestHandler::HandleStopRecording }, - { "PauseRecording", WSRequestHandler::HandlePauseRecording }, - { "ResumeRecording", WSRequestHandler::HandleResumeRecording }, + { "StartRecording", &WSRequestHandler::StartRecording }, + { "StopRecording", &WSRequestHandler::StopRecording }, + { "PauseRecording", &WSRequestHandler::PauseRecording }, + { "ResumeRecording", &WSRequestHandler::ResumeRecording }, - { "StartStopReplayBuffer", WSRequestHandler::HandleStartStopReplayBuffer }, - { "StartReplayBuffer", WSRequestHandler::HandleStartReplayBuffer }, - { "StopReplayBuffer", WSRequestHandler::HandleStopReplayBuffer }, - { "SaveReplayBuffer", WSRequestHandler::HandleSaveReplayBuffer }, + { "StartStopReplayBuffer", &WSRequestHandler::StartStopReplayBuffer }, + { "StartReplayBuffer", &WSRequestHandler::StartReplayBuffer }, + { "StopReplayBuffer", &WSRequestHandler::StopReplayBuffer }, + { "SaveReplayBuffer", &WSRequestHandler::SaveReplayBuffer }, - { "SetRecordingFolder", WSRequestHandler::HandleSetRecordingFolder }, - { "GetRecordingFolder", WSRequestHandler::HandleGetRecordingFolder }, + { "SetRecordingFolder", &WSRequestHandler::SetRecordingFolder }, + { "GetRecordingFolder", &WSRequestHandler::GetRecordingFolder }, - { "GetTransitionList", WSRequestHandler::HandleGetTransitionList }, - { "GetCurrentTransition", WSRequestHandler::HandleGetCurrentTransition }, - { "SetCurrentTransition", WSRequestHandler::HandleSetCurrentTransition }, - { "SetTransitionDuration", WSRequestHandler::HandleSetTransitionDuration }, - { "GetTransitionDuration", WSRequestHandler::HandleGetTransitionDuration }, + { "GetTransitionList", &WSRequestHandler::GetTransitionList }, + { "GetCurrentTransition", &WSRequestHandler::GetCurrentTransition }, + { "SetCurrentTransition", &WSRequestHandler::SetCurrentTransition }, + { "SetTransitionDuration", &WSRequestHandler::SetTransitionDuration }, + { "GetTransitionDuration", &WSRequestHandler::GetTransitionDuration }, - { "SetVolume", WSRequestHandler::HandleSetVolume }, - { "GetVolume", WSRequestHandler::HandleGetVolume }, - { "ToggleMute", WSRequestHandler::HandleToggleMute }, - { "SetMute", WSRequestHandler::HandleSetMute }, - { "GetMute", WSRequestHandler::HandleGetMute }, - { "SetSyncOffset", WSRequestHandler::HandleSetSyncOffset }, - { "GetSyncOffset", WSRequestHandler::HandleGetSyncOffset }, - { "GetSpecialSources", WSRequestHandler::HandleGetSpecialSources }, - { "GetSourcesList", WSRequestHandler::HandleGetSourcesList }, - { "GetSourceTypesList", WSRequestHandler::HandleGetSourceTypesList }, - { "GetSourceSettings", WSRequestHandler::HandleGetSourceSettings }, - { "SetSourceSettings", WSRequestHandler::HandleSetSourceSettings }, - { "TakeSourceScreenshot", WSRequestHandler::HandleTakeSourceScreenshot }, + { "SetVolume", &WSRequestHandler::SetVolume }, + { "GetVolume", &WSRequestHandler::GetVolume }, + { "ToggleMute", &WSRequestHandler::ToggleMute }, + { "SetMute", &WSRequestHandler::SetMute }, + { "GetMute", &WSRequestHandler::GetMute }, + { "SetSyncOffset", &WSRequestHandler::SetSyncOffset }, + { "GetSyncOffset", &WSRequestHandler::GetSyncOffset }, + { "GetSpecialSources", &WSRequestHandler::GetSpecialSources }, + { "GetSourcesList", &WSRequestHandler::GetSourcesList }, + { "GetSourceTypesList", &WSRequestHandler::GetSourceTypesList }, + { "GetSourceSettings", &WSRequestHandler::GetSourceSettings }, + { "SetSourceSettings", &WSRequestHandler::SetSourceSettings }, + { "TakeSourceScreenshot", &WSRequestHandler::TakeSourceScreenshot }, - { "GetSourceFilters", WSRequestHandler::HandleGetSourceFilters }, - { "GetSourceFilterInfo", WSRequestHandler::HandleGetSourceFilterInfo }, - { "AddFilterToSource", WSRequestHandler::HandleAddFilterToSource }, - { "RemoveFilterFromSource", WSRequestHandler::HandleRemoveFilterFromSource }, - { "ReorderSourceFilter", WSRequestHandler::HandleReorderSourceFilter }, - { "MoveSourceFilter", WSRequestHandler::HandleMoveSourceFilter }, - { "SetSourceFilterSettings", WSRequestHandler::HandleSetSourceFilterSettings }, - { "SetSourceFilterVisibility", WSRequestHandler::HandleSetSourceFilterVisibility }, + { "GetSourceFilters", &WSRequestHandler::GetSourceFilters }, + { "GetSourceFilterInfo", &WSRequestHandler::GetSourceFilterInfo }, + { "AddFilterToSource", &WSRequestHandler::AddFilterToSource }, + { "RemoveFilterFromSource", &WSRequestHandler::RemoveFilterFromSource }, + { "ReorderSourceFilter", &WSRequestHandler::ReorderSourceFilter }, + { "MoveSourceFilter", &WSRequestHandler::MoveSourceFilter }, + { "SetSourceFilterSettings", &WSRequestHandler::SetSourceFilterSettings }, + { "SetSourceFilterVisibility", &WSRequestHandler::SetSourceFilterVisibility }, - { "SetCurrentSceneCollection", WSRequestHandler::HandleSetCurrentSceneCollection }, - { "GetCurrentSceneCollection", WSRequestHandler::HandleGetCurrentSceneCollection }, - { "ListSceneCollections", WSRequestHandler::HandleListSceneCollections }, + { "SetCurrentSceneCollection", &WSRequestHandler::SetCurrentSceneCollection }, + { "GetCurrentSceneCollection", &WSRequestHandler::GetCurrentSceneCollection }, + { "ListSceneCollections", &WSRequestHandler::ListSceneCollections }, - { "SetCurrentProfile", WSRequestHandler::HandleSetCurrentProfile }, - { "GetCurrentProfile", WSRequestHandler::HandleGetCurrentProfile }, - { "ListProfiles", WSRequestHandler::HandleListProfiles }, + { "SetCurrentProfile", &WSRequestHandler::SetCurrentProfile }, + { "GetCurrentProfile", &WSRequestHandler::GetCurrentProfile }, + { "ListProfiles", &WSRequestHandler::ListProfiles }, - { "SetStreamSettings", WSRequestHandler::HandleSetStreamSettings }, - { "GetStreamSettings", WSRequestHandler::HandleGetStreamSettings }, - { "SaveStreamSettings", WSRequestHandler::HandleSaveStreamSettings }, + { "SetStreamSettings", &WSRequestHandler::SetStreamSettings }, + { "GetStreamSettings", &WSRequestHandler::GetStreamSettings }, + { "SaveStreamSettings", &WSRequestHandler::SaveStreamSettings }, #if BUILD_CAPTIONS - { "SendCaptions", WSRequestHandler::HandleSendCaptions }, + { "SendCaptions", &WSRequestHandler::SendCaptions }, #endif - { "GetStudioModeStatus", WSRequestHandler::HandleGetStudioModeStatus }, - { "GetPreviewScene", WSRequestHandler::HandleGetPreviewScene }, - { "SetPreviewScene", WSRequestHandler::HandleSetPreviewScene }, - { "TransitionToProgram", WSRequestHandler::HandleTransitionToProgram }, - { "EnableStudioMode", WSRequestHandler::HandleEnableStudioMode }, - { "DisableStudioMode", WSRequestHandler::HandleDisableStudioMode }, - { "ToggleStudioMode", WSRequestHandler::HandleToggleStudioMode }, + { "GetStudioModeStatus", &WSRequestHandler::GetStudioModeStatus }, + { "GetPreviewScene", &WSRequestHandler::GetPreviewScene }, + { "SetPreviewScene", &WSRequestHandler::SetPreviewScene }, + { "TransitionToProgram", &WSRequestHandler::TransitionToProgram }, + { "EnableStudioMode", &WSRequestHandler::EnableStudioMode }, + { "DisableStudioMode", &WSRequestHandler::DisableStudioMode }, + { "ToggleStudioMode", &WSRequestHandler::ToggleStudioMode }, - { "SetTextGDIPlusProperties", WSRequestHandler::HandleSetTextGDIPlusProperties }, - { "GetTextGDIPlusProperties", WSRequestHandler::HandleGetTextGDIPlusProperties }, + { "SetTextGDIPlusProperties", &WSRequestHandler::SetTextGDIPlusProperties }, + { "GetTextGDIPlusProperties", &WSRequestHandler::GetTextGDIPlusProperties }, - { "SetTextFreetype2Properties", WSRequestHandler::HandleSetTextFreetype2Properties }, - { "GetTextFreetype2Properties", WSRequestHandler::HandleGetTextFreetype2Properties }, + { "SetTextFreetype2Properties", &WSRequestHandler::SetTextFreetype2Properties }, + { "GetTextFreetype2Properties", &WSRequestHandler::GetTextFreetype2Properties }, - { "GetBrowserSourceProperties", WSRequestHandler::HandleGetBrowserSourceProperties }, - { "SetBrowserSourceProperties", WSRequestHandler::HandleSetBrowserSourceProperties }, + { "GetBrowserSourceProperties", &WSRequestHandler::GetBrowserSourceProperties }, + { "SetBrowserSourceProperties", &WSRequestHandler::SetBrowserSourceProperties }, - { "ListOutputs", WSRequestHandler::HandleListOutputs }, - { "GetOutputInfo", WSRequestHandler::HandleGetOutputInfo }, - { "StartOutput", WSRequestHandler::HandleStartOutput }, - { "StopOutput", WSRequestHandler::HandleStopOutput } + { "ListOutputs", &WSRequestHandler::ListOutputs }, + { "GetOutputInfo", &WSRequestHandler::GetOutputInfo }, + { "StartOutput", &WSRequestHandler::StartOutput }, + { "StopOutput", &WSRequestHandler::StopOutput } }; -QSet WSRequestHandler::authNotRequired { +const QSet WSRequestHandler::authNotRequired { "GetVersion", "GetAuthRequired", "Authenticate" @@ -177,9 +177,9 @@ RpcResponse WSRequestHandler::processRequest(const RpcRequest& request){ // return SendErrorResponse("invalid JSON payload"); // } - if (!hasField("request-type") || !hasField("message-id")) { - return SendErrorResponse("missing request parameters"); - } + // if (!hasField("request-type") || !hasField("message-id")) { + // return SendErrorResponse("missing request parameters"); + // } // _requestType = obs_data_get_string(data, "request-type"); // _messageId = obs_data_get_string(data, "message-id"); diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index ec8d484d..f302c021 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -35,6 +35,8 @@ with this program. If not, see #include "obs-websocket.h" +typedef RpcResponse(WSRequestHandler::*RpcMethodHandler)(const RpcRequest&); + class WSRequestHandler { public: explicit WSRequestHandler(ConnectionProperties& connProperties); @@ -43,121 +45,121 @@ class WSRequestHandler { private: ConnectionProperties& _connProperties; - static QHash messageMap; - static QSet authNotRequired; + static const QHash messageMap; + static const QSet authNotRequired; - static RpcResponse HandleGetVersion(const RpcRequest&); - static RpcResponse HandleGetAuthRequired(const RpcRequest&); - static RpcResponse HandleAuthenticate(const RpcRequest&); + RpcResponse GetVersion(const RpcRequest&); + RpcResponse GetAuthRequired(const RpcRequest&); + RpcResponse Authenticate(const RpcRequest&); - static RpcResponse HandleGetStats(const RpcRequest&); - static RpcResponse HandleSetHeartbeat(const RpcRequest&); - static RpcResponse HandleGetVideoInfo(const RpcRequest&); + RpcResponse GetStats(const RpcRequest&); + RpcResponse SetHeartbeat(const RpcRequest&); + RpcResponse GetVideoInfo(const RpcRequest&); - static RpcResponse HandleSetFilenameFormatting(const RpcRequest&); - static RpcResponse HandleGetFilenameFormatting(const RpcRequest&); + RpcResponse SetFilenameFormatting(const RpcRequest&); + RpcResponse GetFilenameFormatting(const RpcRequest&); - static RpcResponse HandleBroadcastCustomMessage(const RpcRequest&); + RpcResponse BroadcastCustomMessage(const RpcRequest&); - static RpcResponse HandleSetCurrentScene(const RpcRequest&); - static RpcResponse HandleGetCurrentScene(const RpcRequest&); - static RpcResponse HandleGetSceneList(const RpcRequest&); + RpcResponse SetCurrentScene(const RpcRequest&); + RpcResponse GetCurrentScene(const RpcRequest&); + RpcResponse GetSceneList(const RpcRequest&); - static RpcResponse HandleSetSceneItemRender(const RpcRequest&); - static RpcResponse HandleSetSceneItemPosition(const RpcRequest&); - static RpcResponse HandleSetSceneItemTransform(const RpcRequest&); - static RpcResponse HandleSetSceneItemCrop(const RpcRequest&); - static RpcResponse HandleGetSceneItemProperties(const RpcRequest&); - static RpcResponse HandleSetSceneItemProperties(const RpcRequest&); - static RpcResponse HandleResetSceneItem(const RpcRequest&); - static RpcResponse HandleDuplicateSceneItem(const RpcRequest&); - static RpcResponse HandleDeleteSceneItem(const RpcRequest&); - static RpcResponse HandleReorderSceneItems(const RpcRequest&); + RpcResponse SetSceneItemRender(const RpcRequest&); + RpcResponse SetSceneItemPosition(const RpcRequest&); + RpcResponse SetSceneItemTransform(const RpcRequest&); + RpcResponse SetSceneItemCrop(const RpcRequest&); + RpcResponse GetSceneItemProperties(const RpcRequest&); + RpcResponse SetSceneItemProperties(const RpcRequest&); + RpcResponse ResetSceneItem(const RpcRequest&); + RpcResponse DuplicateSceneItem(const RpcRequest&); + RpcResponse DeleteSceneItem(const RpcRequest&); + RpcResponse ReorderSceneItems(const RpcRequest&); - static RpcResponse HandleGetStreamingStatus(const RpcRequest&); - static RpcResponse HandleStartStopStreaming(const RpcRequest&); - static RpcResponse HandleStartStopRecording(const RpcRequest&); + RpcResponse GetStreamingStatus(const RpcRequest&); + RpcResponse StartStopStreaming(const RpcRequest&); + RpcResponse StartStopRecording(const RpcRequest&); - static RpcResponse HandleStartStreaming(const RpcRequest&); - static RpcResponse HandleStopStreaming(const RpcRequest&); + RpcResponse StartStreaming(const RpcRequest&); + RpcResponse StopStreaming(const RpcRequest&); - static RpcResponse HandleStartRecording(const RpcRequest&); - static RpcResponse HandleStopRecording(const RpcRequest&); - static RpcResponse HandlePauseRecording(const RpcRequest&); - static RpcResponse HandleResumeRecording(const RpcRequest&); + RpcResponse StartRecording(const RpcRequest&); + RpcResponse StopRecording(const RpcRequest&); + RpcResponse PauseRecording(const RpcRequest&); + RpcResponse ResumeRecording(const RpcRequest&); - static RpcResponse HandleStartStopReplayBuffer(const RpcRequest&); - static RpcResponse HandleStartReplayBuffer(const RpcRequest&); - static RpcResponse HandleStopReplayBuffer(const RpcRequest&); - static RpcResponse HandleSaveReplayBuffer(const RpcRequest&); + RpcResponse StartStopReplayBuffer(const RpcRequest&); + RpcResponse StartReplayBuffer(const RpcRequest&); + RpcResponse StopReplayBuffer(const RpcRequest&); + RpcResponse SaveReplayBuffer(const RpcRequest&); - static RpcResponse HandleSetRecordingFolder(const RpcRequest&); - static RpcResponse HandleGetRecordingFolder(const RpcRequest&); + RpcResponse SetRecordingFolder(const RpcRequest&); + RpcResponse GetRecordingFolder(const RpcRequest&); - static RpcResponse HandleGetTransitionList(const RpcRequest&); - static RpcResponse HandleGetCurrentTransition(const RpcRequest&); - static RpcResponse HandleSetCurrentTransition(const RpcRequest&); + RpcResponse GetTransitionList(const RpcRequest&); + RpcResponse GetCurrentTransition(const RpcRequest&); + RpcResponse SetCurrentTransition(const RpcRequest&); - static RpcResponse HandleSetVolume(const RpcRequest&); - static RpcResponse HandleGetVolume(const RpcRequest&); - static RpcResponse HandleToggleMute(const RpcRequest&); - static RpcResponse HandleSetMute(const RpcRequest&); - static RpcResponse HandleGetMute(const RpcRequest&); - static RpcResponse HandleSetSyncOffset(const RpcRequest&); - static RpcResponse HandleGetSyncOffset(const RpcRequest&); - static RpcResponse HandleGetSpecialSources(const RpcRequest&); - static RpcResponse HandleGetSourcesList(const RpcRequest&); - static RpcResponse HandleGetSourceTypesList(const RpcRequest&); - static RpcResponse HandleGetSourceSettings(const RpcRequest&); - static RpcResponse HandleSetSourceSettings(const RpcRequest&); - static RpcResponse HandleTakeSourceScreenshot(const RpcRequest&); + RpcResponse SetVolume(const RpcRequest&); + RpcResponse GetVolume(const RpcRequest&); + RpcResponse ToggleMute(const RpcRequest&); + RpcResponse SetMute(const RpcRequest&); + RpcResponse GetMute(const RpcRequest&); + RpcResponse SetSyncOffset(const RpcRequest&); + RpcResponse GetSyncOffset(const RpcRequest&); + RpcResponse GetSpecialSources(const RpcRequest&); + RpcResponse GetSourcesList(const RpcRequest&); + RpcResponse GetSourceTypesList(const RpcRequest&); + RpcResponse GetSourceSettings(const RpcRequest&); + RpcResponse SetSourceSettings(const RpcRequest&); + RpcResponse TakeSourceScreenshot(const RpcRequest&); - static RpcResponse HandleGetSourceFilters(const RpcRequest&); - static RpcResponse HandleGetSourceFilterInfo(const RpcRequest&); - static RpcResponse HandleAddFilterToSource(const RpcRequest&); - static RpcResponse HandleRemoveFilterFromSource(const RpcRequest&); - static RpcResponse HandleReorderSourceFilter(const RpcRequest&); - static RpcResponse HandleMoveSourceFilter(const RpcRequest&); - static RpcResponse HandleSetSourceFilterSettings(const RpcRequest&); - static RpcResponse HandleSetSourceFilterVisibility(const RpcRequest&); + RpcResponse GetSourceFilters(const RpcRequest&); + RpcResponse GetSourceFilterInfo(const RpcRequest&); + RpcResponse AddFilterToSource(const RpcRequest&); + RpcResponse RemoveFilterFromSource(const RpcRequest&); + RpcResponse ReorderSourceFilter(const RpcRequest&); + RpcResponse MoveSourceFilter(const RpcRequest&); + RpcResponse SetSourceFilterSettings(const RpcRequest&); + RpcResponse SetSourceFilterVisibility(const RpcRequest&); - static RpcResponse HandleSetCurrentSceneCollection(const RpcRequest&); - static RpcResponse HandleGetCurrentSceneCollection(const RpcRequest&); - static RpcResponse HandleListSceneCollections(const RpcRequest&); + RpcResponse SetCurrentSceneCollection(const RpcRequest&); + RpcResponse GetCurrentSceneCollection(const RpcRequest&); + RpcResponse ListSceneCollections(const RpcRequest&); - static RpcResponse HandleSetCurrentProfile(const RpcRequest&); - static RpcResponse HandleGetCurrentProfile(const RpcRequest&); - static RpcResponse HandleListProfiles(const RpcRequest&); + RpcResponse SetCurrentProfile(const RpcRequest&); + RpcResponse GetCurrentProfile(const RpcRequest&); + RpcResponse ListProfiles(const RpcRequest&); - static RpcResponse HandleSetStreamSettings(const RpcRequest&); - static RpcResponse HandleGetStreamSettings(const RpcRequest&); - static RpcResponse HandleSaveStreamSettings(const RpcRequest&); + RpcResponse SetStreamSettings(const RpcRequest&); + RpcResponse GetStreamSettings(const RpcRequest&); + RpcResponse SaveStreamSettings(const RpcRequest&); #if BUILD_CAPTIONS - static RpcResponse HandleSendCaptions(WSRequestHandler * req); + RpcResponse SendCaptions(WSRequestHandler * req); #endif - static RpcResponse HandleSetTransitionDuration(const RpcRequest& request); - static RpcResponse HandleGetTransitionDuration(const RpcRequest& request); + RpcResponse SetTransitionDuration(const RpcRequest& request); + RpcResponse GetTransitionDuration(const RpcRequest& request); - static RpcResponse HandleGetStudioModeStatus(const RpcRequest& request); - static RpcResponse HandleGetPreviewScene(const RpcRequest& request); - static RpcResponse HandleSetPreviewScene(const RpcRequest& request); - static RpcResponse HandleTransitionToProgram(const RpcRequest& request); - static RpcResponse HandleEnableStudioMode(const RpcRequest& request); - static RpcResponse HandleDisableStudioMode(const RpcRequest& request); - static RpcResponse HandleToggleStudioMode(const RpcRequest& request); + RpcResponse GetStudioModeStatus(const RpcRequest& request); + RpcResponse GetPreviewScene(const RpcRequest& request); + RpcResponse SetPreviewScene(const RpcRequest& request); + RpcResponse TransitionToProgram(const RpcRequest& request); + RpcResponse EnableStudioMode(const RpcRequest& request); + RpcResponse DisableStudioMode(const RpcRequest& request); + RpcResponse ToggleStudioMode(const RpcRequest& request); - static RpcResponse HandleSetTextGDIPlusProperties(const RpcRequest& request); - static RpcResponse HandleGetTextGDIPlusProperties(const RpcRequest& request); + RpcResponse SetTextGDIPlusProperties(const RpcRequest& request); + RpcResponse GetTextGDIPlusProperties(const RpcRequest& request); - static RpcResponse HandleSetTextFreetype2Properties(const RpcRequest& request); - static RpcResponse HandleGetTextFreetype2Properties(const RpcRequest& request); + RpcResponse SetTextFreetype2Properties(const RpcRequest& request); + RpcResponse GetTextFreetype2Properties(const RpcRequest& request); - static RpcResponse HandleSetBrowserSourceProperties(const RpcRequest& request); - static RpcResponse HandleGetBrowserSourceProperties(const RpcRequest& request); + RpcResponse SetBrowserSourceProperties(const RpcRequest& request); + RpcResponse GetBrowserSourceProperties(const RpcRequest& request); - static RpcResponse HandleListOutputs(const RpcRequest& request); - static RpcResponse HandleGetOutputInfo(const RpcRequest& request); - static RpcResponse HandleStartOutput(const RpcRequest& request); - static RpcResponse HandleStopOutput(const RpcRequest& request); + RpcResponse ListOutputs(const RpcRequest& request); + RpcResponse GetOutputInfo(const RpcRequest& request); + RpcResponse StartOutput(const RpcRequest& request); + RpcResponse StopOutput(const RpcRequest& request); }; From 5b54d8135e093903a9738dab931b8f0d9a83289e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 19:41:19 +0100 Subject: [PATCH 07/41] WSRequestHandler: fixes --- src/WSRequestHandler.cpp | 186 +++++++++++++++++++-------------------- src/WSRequestHandler.h | 44 +++++---- 2 files changed, 114 insertions(+), 116 deletions(-) diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index e6a5e064..89416e2c 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -25,120 +25,120 @@ #include "WSRequestHandler.h" const QHash WSRequestHandler::messageMap { - { "GetVersion", &WSRequestHandler::GetVersion }, - { "GetAuthRequired", &WSRequestHandler::GetAuthRequired }, - { "Authenticate", &WSRequestHandler::Authenticate }, +// { "GetVersion", &WSRequestHandler::GetVersion }, +// { "GetAuthRequired", &WSRequestHandler::GetAuthRequired }, +// { "Authenticate", &WSRequestHandler::Authenticate }, - { "GetStats", &WSRequestHandler::GetStats }, - { "SetHeartbeat", &WSRequestHandler::SetHeartbeat }, - { "GetVideoInfo", &WSRequestHandler::GetVideoInfo }, +// { "GetStats", &WSRequestHandler::GetStats }, +// { "SetHeartbeat", &WSRequestHandler::SetHeartbeat }, +// { "GetVideoInfo", &WSRequestHandler::GetVideoInfo }, - { "SetFilenameFormatting", &WSRequestHandler::SetFilenameFormatting }, - { "GetFilenameFormatting", &WSRequestHandler::GetFilenameFormatting }, +// { "SetFilenameFormatting", &WSRequestHandler::SetFilenameFormatting }, +// { "GetFilenameFormatting", &WSRequestHandler::GetFilenameFormatting }, - { "BroadcastCustomMessage", &WSRequestHandler::BroadcastCustomMessage }, +// { "BroadcastCustomMessage", &WSRequestHandler::BroadcastCustomMessage }, - { "SetCurrentScene", &WSRequestHandler::SetCurrentScene }, - { "GetCurrentScene", &WSRequestHandler::GetCurrentScene }, - { "GetSceneList", &WSRequestHandler::GetSceneList }, +// { "SetCurrentScene", &WSRequestHandler::SetCurrentScene }, +// { "GetCurrentScene", &WSRequestHandler::GetCurrentScene }, +// { "GetSceneList", &WSRequestHandler::GetSceneList }, - { "SetSourceRender", &WSRequestHandler::SetSceneItemRender }, // Retrocompat - { "SetSceneItemRender", &WSRequestHandler::SetSceneItemRender }, - { "SetSceneItemPosition", &WSRequestHandler::SetSceneItemPosition }, - { "SetSceneItemTransform", &WSRequestHandler::SetSceneItemTransform }, - { "SetSceneItemCrop", &WSRequestHandler::SetSceneItemCrop }, - { "GetSceneItemProperties", &WSRequestHandler::GetSceneItemProperties }, - { "SetSceneItemProperties", &WSRequestHandler::SetSceneItemProperties }, - { "ResetSceneItem", &WSRequestHandler::ResetSceneItem }, - { "DeleteSceneItem", &WSRequestHandler::DeleteSceneItem }, - { "DuplicateSceneItem", &WSRequestHandler::DuplicateSceneItem }, - { "ReorderSceneItems", &WSRequestHandler::ReorderSceneItems }, +// { "SetSourceRender", &WSRequestHandler::SetSceneItemRender }, // Retrocompat +// { "SetSceneItemRender", &WSRequestHandler::SetSceneItemRender }, +// { "SetSceneItemPosition", &WSRequestHandler::SetSceneItemPosition }, +// { "SetSceneItemTransform", &WSRequestHandler::SetSceneItemTransform }, +// { "SetSceneItemCrop", &WSRequestHandler::SetSceneItemCrop }, +// { "GetSceneItemProperties", &WSRequestHandler::GetSceneItemProperties }, +// { "SetSceneItemProperties", &WSRequestHandler::SetSceneItemProperties }, +// { "ResetSceneItem", &WSRequestHandler::ResetSceneItem }, +// { "DeleteSceneItem", &WSRequestHandler::DeleteSceneItem }, +// { "DuplicateSceneItem", &WSRequestHandler::DuplicateSceneItem }, +// { "ReorderSceneItems", &WSRequestHandler::ReorderSceneItems }, - { "GetStreamingStatus", &WSRequestHandler::GetStreamingStatus }, - { "StartStopStreaming", &WSRequestHandler::StartStopStreaming }, - { "StartStopRecording", &WSRequestHandler::StartStopRecording }, +// { "GetStreamingStatus", &WSRequestHandler::GetStreamingStatus }, +// { "StartStopStreaming", &WSRequestHandler::StartStopStreaming }, +// { "StartStopRecording", &WSRequestHandler::StartStopRecording }, - { "StartStreaming", &WSRequestHandler::StartStreaming }, - { "StopStreaming", &WSRequestHandler::StopStreaming }, +// { "StartStreaming", &WSRequestHandler::StartStreaming }, +// { "StopStreaming", &WSRequestHandler::StopStreaming }, - { "StartRecording", &WSRequestHandler::StartRecording }, - { "StopRecording", &WSRequestHandler::StopRecording }, - { "PauseRecording", &WSRequestHandler::PauseRecording }, - { "ResumeRecording", &WSRequestHandler::ResumeRecording }, +// { "StartRecording", &WSRequestHandler::StartRecording }, +// { "StopRecording", &WSRequestHandler::StopRecording }, +// { "PauseRecording", &WSRequestHandler::PauseRecording }, +// { "ResumeRecording", &WSRequestHandler::ResumeRecording }, - { "StartStopReplayBuffer", &WSRequestHandler::StartStopReplayBuffer }, - { "StartReplayBuffer", &WSRequestHandler::StartReplayBuffer }, - { "StopReplayBuffer", &WSRequestHandler::StopReplayBuffer }, - { "SaveReplayBuffer", &WSRequestHandler::SaveReplayBuffer }, +// { "StartStopReplayBuffer", &WSRequestHandler::StartStopReplayBuffer }, +// { "StartReplayBuffer", &WSRequestHandler::StartReplayBuffer }, +// { "StopReplayBuffer", &WSRequestHandler::StopReplayBuffer }, +// { "SaveReplayBuffer", &WSRequestHandler::SaveReplayBuffer }, - { "SetRecordingFolder", &WSRequestHandler::SetRecordingFolder }, - { "GetRecordingFolder", &WSRequestHandler::GetRecordingFolder }, +// { "SetRecordingFolder", &WSRequestHandler::SetRecordingFolder }, +// { "GetRecordingFolder", &WSRequestHandler::GetRecordingFolder }, - { "GetTransitionList", &WSRequestHandler::GetTransitionList }, - { "GetCurrentTransition", &WSRequestHandler::GetCurrentTransition }, - { "SetCurrentTransition", &WSRequestHandler::SetCurrentTransition }, - { "SetTransitionDuration", &WSRequestHandler::SetTransitionDuration }, - { "GetTransitionDuration", &WSRequestHandler::GetTransitionDuration }, +// { "GetTransitionList", &WSRequestHandler::GetTransitionList }, +// { "GetCurrentTransition", &WSRequestHandler::GetCurrentTransition }, +// { "SetCurrentTransition", &WSRequestHandler::SetCurrentTransition }, +// { "SetTransitionDuration", &WSRequestHandler::SetTransitionDuration }, +// { "GetTransitionDuration", &WSRequestHandler::GetTransitionDuration }, - { "SetVolume", &WSRequestHandler::SetVolume }, - { "GetVolume", &WSRequestHandler::GetVolume }, - { "ToggleMute", &WSRequestHandler::ToggleMute }, - { "SetMute", &WSRequestHandler::SetMute }, - { "GetMute", &WSRequestHandler::GetMute }, - { "SetSyncOffset", &WSRequestHandler::SetSyncOffset }, - { "GetSyncOffset", &WSRequestHandler::GetSyncOffset }, - { "GetSpecialSources", &WSRequestHandler::GetSpecialSources }, - { "GetSourcesList", &WSRequestHandler::GetSourcesList }, - { "GetSourceTypesList", &WSRequestHandler::GetSourceTypesList }, - { "GetSourceSettings", &WSRequestHandler::GetSourceSettings }, - { "SetSourceSettings", &WSRequestHandler::SetSourceSettings }, - { "TakeSourceScreenshot", &WSRequestHandler::TakeSourceScreenshot }, +// { "SetVolume", &WSRequestHandler::SetVolume }, +// { "GetVolume", &WSRequestHandler::GetVolume }, +// { "ToggleMute", &WSRequestHandler::ToggleMute }, +// { "SetMute", &WSRequestHandler::SetMute }, +// { "GetMute", &WSRequestHandler::GetMute }, +// { "SetSyncOffset", &WSRequestHandler::SetSyncOffset }, +// { "GetSyncOffset", &WSRequestHandler::GetSyncOffset }, +// { "GetSpecialSources", &WSRequestHandler::GetSpecialSources }, +// { "GetSourcesList", &WSRequestHandler::GetSourcesList }, +// { "GetSourceTypesList", &WSRequestHandler::GetSourceTypesList }, +// { "GetSourceSettings", &WSRequestHandler::GetSourceSettings }, +// { "SetSourceSettings", &WSRequestHandler::SetSourceSettings }, +// { "TakeSourceScreenshot", &WSRequestHandler::TakeSourceScreenshot }, - { "GetSourceFilters", &WSRequestHandler::GetSourceFilters }, - { "GetSourceFilterInfo", &WSRequestHandler::GetSourceFilterInfo }, - { "AddFilterToSource", &WSRequestHandler::AddFilterToSource }, - { "RemoveFilterFromSource", &WSRequestHandler::RemoveFilterFromSource }, - { "ReorderSourceFilter", &WSRequestHandler::ReorderSourceFilter }, - { "MoveSourceFilter", &WSRequestHandler::MoveSourceFilter }, - { "SetSourceFilterSettings", &WSRequestHandler::SetSourceFilterSettings }, - { "SetSourceFilterVisibility", &WSRequestHandler::SetSourceFilterVisibility }, +// { "GetSourceFilters", &WSRequestHandler::GetSourceFilters }, +// { "GetSourceFilterInfo", &WSRequestHandler::GetSourceFilterInfo }, +// { "AddFilterToSource", &WSRequestHandler::AddFilterToSource }, +// { "RemoveFilterFromSource", &WSRequestHandler::RemoveFilterFromSource }, +// { "ReorderSourceFilter", &WSRequestHandler::ReorderSourceFilter }, +// { "MoveSourceFilter", &WSRequestHandler::MoveSourceFilter }, +// { "SetSourceFilterSettings", &WSRequestHandler::SetSourceFilterSettings }, +// { "SetSourceFilterVisibility", &WSRequestHandler::SetSourceFilterVisibility }, - { "SetCurrentSceneCollection", &WSRequestHandler::SetCurrentSceneCollection }, - { "GetCurrentSceneCollection", &WSRequestHandler::GetCurrentSceneCollection }, - { "ListSceneCollections", &WSRequestHandler::ListSceneCollections }, +// { "SetCurrentSceneCollection", &WSRequestHandler::SetCurrentSceneCollection }, +// { "GetCurrentSceneCollection", &WSRequestHandler::GetCurrentSceneCollection }, +// { "ListSceneCollections", &WSRequestHandler::ListSceneCollections }, - { "SetCurrentProfile", &WSRequestHandler::SetCurrentProfile }, - { "GetCurrentProfile", &WSRequestHandler::GetCurrentProfile }, - { "ListProfiles", &WSRequestHandler::ListProfiles }, +// { "SetCurrentProfile", &WSRequestHandler::SetCurrentProfile }, +// { "GetCurrentProfile", &WSRequestHandler::GetCurrentProfile }, +// { "ListProfiles", &WSRequestHandler::ListProfiles }, - { "SetStreamSettings", &WSRequestHandler::SetStreamSettings }, - { "GetStreamSettings", &WSRequestHandler::GetStreamSettings }, - { "SaveStreamSettings", &WSRequestHandler::SaveStreamSettings }, -#if BUILD_CAPTIONS - { "SendCaptions", &WSRequestHandler::SendCaptions }, -#endif +// { "SetStreamSettings", &WSRequestHandler::SetStreamSettings }, +// { "GetStreamSettings", &WSRequestHandler::GetStreamSettings }, +// { "SaveStreamSettings", &WSRequestHandler::SaveStreamSettings }, +// #if BUILD_CAPTIONS +// { "SendCaptions", &WSRequestHandler::SendCaptions }, +// #endif - { "GetStudioModeStatus", &WSRequestHandler::GetStudioModeStatus }, - { "GetPreviewScene", &WSRequestHandler::GetPreviewScene }, - { "SetPreviewScene", &WSRequestHandler::SetPreviewScene }, - { "TransitionToProgram", &WSRequestHandler::TransitionToProgram }, - { "EnableStudioMode", &WSRequestHandler::EnableStudioMode }, - { "DisableStudioMode", &WSRequestHandler::DisableStudioMode }, - { "ToggleStudioMode", &WSRequestHandler::ToggleStudioMode }, +// { "GetStudioModeStatus", &WSRequestHandler::GetStudioModeStatus }, +// { "GetPreviewScene", &WSRequestHandler::GetPreviewScene }, +// { "SetPreviewScene", &WSRequestHandler::SetPreviewScene }, +// { "TransitionToProgram", &WSRequestHandler::TransitionToProgram }, +// { "EnableStudioMode", &WSRequestHandler::EnableStudioMode }, +// { "DisableStudioMode", &WSRequestHandler::DisableStudioMode }, +// { "ToggleStudioMode", &WSRequestHandler::ToggleStudioMode }, - { "SetTextGDIPlusProperties", &WSRequestHandler::SetTextGDIPlusProperties }, - { "GetTextGDIPlusProperties", &WSRequestHandler::GetTextGDIPlusProperties }, +// { "SetTextGDIPlusProperties", &WSRequestHandler::SetTextGDIPlusProperties }, +// { "GetTextGDIPlusProperties", &WSRequestHandler::GetTextGDIPlusProperties }, - { "SetTextFreetype2Properties", &WSRequestHandler::SetTextFreetype2Properties }, - { "GetTextFreetype2Properties", &WSRequestHandler::GetTextFreetype2Properties }, +// { "SetTextFreetype2Properties", &WSRequestHandler::SetTextFreetype2Properties }, +// { "GetTextFreetype2Properties", &WSRequestHandler::GetTextFreetype2Properties }, - { "GetBrowserSourceProperties", &WSRequestHandler::GetBrowserSourceProperties }, - { "SetBrowserSourceProperties", &WSRequestHandler::SetBrowserSourceProperties }, +// { "GetBrowserSourceProperties", &WSRequestHandler::GetBrowserSourceProperties }, +// { "SetBrowserSourceProperties", &WSRequestHandler::SetBrowserSourceProperties }, - { "ListOutputs", &WSRequestHandler::ListOutputs }, - { "GetOutputInfo", &WSRequestHandler::GetOutputInfo }, - { "StartOutput", &WSRequestHandler::StartOutput }, - { "StopOutput", &WSRequestHandler::StopOutput } +// { "ListOutputs", &WSRequestHandler::ListOutputs }, +// { "GetOutputInfo", &WSRequestHandler::GetOutputInfo }, +// { "StartOutput", &WSRequestHandler::StartOutput }, +// { "StopOutput", &WSRequestHandler::StopOutput } }; const QSet WSRequestHandler::authNotRequired { diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index f302c021..2f9e510d 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -19,11 +19,9 @@ with this program. If not, see #pragma once +#include #include #include -#include -#include -#include #include #include @@ -135,31 +133,31 @@ class WSRequestHandler { RpcResponse GetStreamSettings(const RpcRequest&); RpcResponse SaveStreamSettings(const RpcRequest&); #if BUILD_CAPTIONS - RpcResponse SendCaptions(WSRequestHandler * req); + RpcResponse SendCaptions(const RpcRequest&); #endif - RpcResponse SetTransitionDuration(const RpcRequest& request); - RpcResponse GetTransitionDuration(const RpcRequest& request); + RpcResponse SetTransitionDuration(const RpcRequest&); + RpcResponse GetTransitionDuration(const RpcRequest&); - RpcResponse GetStudioModeStatus(const RpcRequest& request); - RpcResponse GetPreviewScene(const RpcRequest& request); - RpcResponse SetPreviewScene(const RpcRequest& request); - RpcResponse TransitionToProgram(const RpcRequest& request); - RpcResponse EnableStudioMode(const RpcRequest& request); - RpcResponse DisableStudioMode(const RpcRequest& request); - RpcResponse ToggleStudioMode(const RpcRequest& request); + RpcResponse GetStudioModeStatus(const RpcRequest&); + RpcResponse GetPreviewScene(const RpcRequest&); + RpcResponse SetPreviewScene(const RpcRequest&); + RpcResponse TransitionToProgram(const RpcRequest&); + RpcResponse EnableStudioMode(const RpcRequest&); + RpcResponse DisableStudioMode(const RpcRequest&); + RpcResponse ToggleStudioMode(const RpcRequest&); - RpcResponse SetTextGDIPlusProperties(const RpcRequest& request); - RpcResponse GetTextGDIPlusProperties(const RpcRequest& request); + RpcResponse SetTextGDIPlusProperties(const RpcRequest&); + RpcResponse GetTextGDIPlusProperties(const RpcRequest&); - RpcResponse SetTextFreetype2Properties(const RpcRequest& request); - RpcResponse GetTextFreetype2Properties(const RpcRequest& request); + RpcResponse SetTextFreetype2Properties(const RpcRequest&); + RpcResponse GetTextFreetype2Properties(const RpcRequest&); - RpcResponse SetBrowserSourceProperties(const RpcRequest& request); - RpcResponse GetBrowserSourceProperties(const RpcRequest& request); + RpcResponse SetBrowserSourceProperties(const RpcRequest&); + RpcResponse GetBrowserSourceProperties(const RpcRequest&); - RpcResponse ListOutputs(const RpcRequest& request); - RpcResponse GetOutputInfo(const RpcRequest& request); - RpcResponse StartOutput(const RpcRequest& request); - RpcResponse StopOutput(const RpcRequest& request); + RpcResponse ListOutputs(const RpcRequest&); + RpcResponse GetOutputInfo(const RpcRequest&); + RpcResponse StartOutput(const RpcRequest&); + RpcResponse StopOutput(const RpcRequest&); }; From f0bed24742c65929846f5dd942c34d5b33aec824 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 19:49:06 +0100 Subject: [PATCH 08/41] WSRequestHandler: fix map --- src/WSRequestHandler.cpp | 194 ++++++++++++++++++++------------------- src/WSRequestHandler.h | 1 + 2 files changed, 100 insertions(+), 95 deletions(-) diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index 89416e2c..ea559748 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -17,6 +17,8 @@ * with this program. If not, see */ +#include + #include #include "Config.h" @@ -24,121 +26,123 @@ #include "WSRequestHandler.h" +using namespace std::placeholders; + const QHash WSRequestHandler::messageMap { -// { "GetVersion", &WSRequestHandler::GetVersion }, -// { "GetAuthRequired", &WSRequestHandler::GetAuthRequired }, -// { "Authenticate", &WSRequestHandler::Authenticate }, + { "GetVersion", &WSRequestHandler::GetVersion }, + { "GetAuthRequired", &WSRequestHandler::GetAuthRequired }, + { "Authenticate", &WSRequestHandler::Authenticate }, -// { "GetStats", &WSRequestHandler::GetStats }, -// { "SetHeartbeat", &WSRequestHandler::SetHeartbeat }, -// { "GetVideoInfo", &WSRequestHandler::GetVideoInfo }, + { "GetStats", &WSRequestHandler::GetStats }, + { "SetHeartbeat", &WSRequestHandler::SetHeartbeat }, + { "GetVideoInfo", &WSRequestHandler::GetVideoInfo }, -// { "SetFilenameFormatting", &WSRequestHandler::SetFilenameFormatting }, -// { "GetFilenameFormatting", &WSRequestHandler::GetFilenameFormatting }, + { "SetFilenameFormatting", &WSRequestHandler::SetFilenameFormatting }, + { "GetFilenameFormatting", &WSRequestHandler::GetFilenameFormatting }, -// { "BroadcastCustomMessage", &WSRequestHandler::BroadcastCustomMessage }, + { "BroadcastCustomMessage", &WSRequestHandler::BroadcastCustomMessage }, -// { "SetCurrentScene", &WSRequestHandler::SetCurrentScene }, -// { "GetCurrentScene", &WSRequestHandler::GetCurrentScene }, -// { "GetSceneList", &WSRequestHandler::GetSceneList }, + { "SetCurrentScene", &WSRequestHandler::SetCurrentScene }, + { "GetCurrentScene", &WSRequestHandler::GetCurrentScene }, + { "GetSceneList", &WSRequestHandler::GetSceneList }, -// { "SetSourceRender", &WSRequestHandler::SetSceneItemRender }, // Retrocompat -// { "SetSceneItemRender", &WSRequestHandler::SetSceneItemRender }, -// { "SetSceneItemPosition", &WSRequestHandler::SetSceneItemPosition }, -// { "SetSceneItemTransform", &WSRequestHandler::SetSceneItemTransform }, -// { "SetSceneItemCrop", &WSRequestHandler::SetSceneItemCrop }, -// { "GetSceneItemProperties", &WSRequestHandler::GetSceneItemProperties }, -// { "SetSceneItemProperties", &WSRequestHandler::SetSceneItemProperties }, -// { "ResetSceneItem", &WSRequestHandler::ResetSceneItem }, -// { "DeleteSceneItem", &WSRequestHandler::DeleteSceneItem }, -// { "DuplicateSceneItem", &WSRequestHandler::DuplicateSceneItem }, -// { "ReorderSceneItems", &WSRequestHandler::ReorderSceneItems }, + { "SetSourceRender", &WSRequestHandler::SetSceneItemRender }, // Retrocompat + { "SetSceneItemRender", &WSRequestHandler::SetSceneItemRender }, + { "SetSceneItemPosition", &WSRequestHandler::SetSceneItemPosition }, + { "SetSceneItemTransform", &WSRequestHandler::SetSceneItemTransform }, + { "SetSceneItemCrop", &WSRequestHandler::SetSceneItemCrop }, + { "GetSceneItemProperties", &WSRequestHandler::GetSceneItemProperties }, + { "SetSceneItemProperties", &WSRequestHandler::SetSceneItemProperties }, + { "ResetSceneItem", &WSRequestHandler::ResetSceneItem }, + { "DeleteSceneItem", &WSRequestHandler::DeleteSceneItem }, + { "DuplicateSceneItem", &WSRequestHandler::DuplicateSceneItem }, + { "ReorderSceneItems", &WSRequestHandler::ReorderSceneItems }, -// { "GetStreamingStatus", &WSRequestHandler::GetStreamingStatus }, -// { "StartStopStreaming", &WSRequestHandler::StartStopStreaming }, -// { "StartStopRecording", &WSRequestHandler::StartStopRecording }, + { "GetStreamingStatus", &WSRequestHandler::GetStreamingStatus }, + { "StartStopStreaming", &WSRequestHandler::StartStopStreaming }, + { "StartStopRecording", &WSRequestHandler::StartStopRecording }, -// { "StartStreaming", &WSRequestHandler::StartStreaming }, -// { "StopStreaming", &WSRequestHandler::StopStreaming }, + { "StartStreaming", &WSRequestHandler::StartStreaming }, + { "StopStreaming", &WSRequestHandler::StopStreaming }, -// { "StartRecording", &WSRequestHandler::StartRecording }, -// { "StopRecording", &WSRequestHandler::StopRecording }, -// { "PauseRecording", &WSRequestHandler::PauseRecording }, -// { "ResumeRecording", &WSRequestHandler::ResumeRecording }, + { "StartRecording", &WSRequestHandler::StartRecording }, + { "StopRecording", &WSRequestHandler::StopRecording }, + { "PauseRecording", &WSRequestHandler::PauseRecording }, + { "ResumeRecording", &WSRequestHandler::ResumeRecording }, -// { "StartStopReplayBuffer", &WSRequestHandler::StartStopReplayBuffer }, -// { "StartReplayBuffer", &WSRequestHandler::StartReplayBuffer }, -// { "StopReplayBuffer", &WSRequestHandler::StopReplayBuffer }, -// { "SaveReplayBuffer", &WSRequestHandler::SaveReplayBuffer }, + { "StartStopReplayBuffer", &WSRequestHandler::StartStopReplayBuffer }, + { "StartReplayBuffer", &WSRequestHandler::StartReplayBuffer }, + { "StopReplayBuffer", &WSRequestHandler::StopReplayBuffer }, + { "SaveReplayBuffer", &WSRequestHandler::SaveReplayBuffer }, -// { "SetRecordingFolder", &WSRequestHandler::SetRecordingFolder }, -// { "GetRecordingFolder", &WSRequestHandler::GetRecordingFolder }, + { "SetRecordingFolder", &WSRequestHandler::SetRecordingFolder }, + { "GetRecordingFolder", &WSRequestHandler::GetRecordingFolder }, -// { "GetTransitionList", &WSRequestHandler::GetTransitionList }, -// { "GetCurrentTransition", &WSRequestHandler::GetCurrentTransition }, -// { "SetCurrentTransition", &WSRequestHandler::SetCurrentTransition }, -// { "SetTransitionDuration", &WSRequestHandler::SetTransitionDuration }, -// { "GetTransitionDuration", &WSRequestHandler::GetTransitionDuration }, + { "GetTransitionList", &WSRequestHandler::GetTransitionList }, + { "GetCurrentTransition", &WSRequestHandler::GetCurrentTransition }, + { "SetCurrentTransition", &WSRequestHandler::SetCurrentTransition }, + { "SetTransitionDuration", &WSRequestHandler::SetTransitionDuration }, + { "GetTransitionDuration", &WSRequestHandler::GetTransitionDuration }, -// { "SetVolume", &WSRequestHandler::SetVolume }, -// { "GetVolume", &WSRequestHandler::GetVolume }, -// { "ToggleMute", &WSRequestHandler::ToggleMute }, -// { "SetMute", &WSRequestHandler::SetMute }, -// { "GetMute", &WSRequestHandler::GetMute }, -// { "SetSyncOffset", &WSRequestHandler::SetSyncOffset }, -// { "GetSyncOffset", &WSRequestHandler::GetSyncOffset }, -// { "GetSpecialSources", &WSRequestHandler::GetSpecialSources }, -// { "GetSourcesList", &WSRequestHandler::GetSourcesList }, -// { "GetSourceTypesList", &WSRequestHandler::GetSourceTypesList }, -// { "GetSourceSettings", &WSRequestHandler::GetSourceSettings }, -// { "SetSourceSettings", &WSRequestHandler::SetSourceSettings }, -// { "TakeSourceScreenshot", &WSRequestHandler::TakeSourceScreenshot }, + { "SetVolume", &WSRequestHandler::SetVolume }, + { "GetVolume", &WSRequestHandler::GetVolume }, + { "ToggleMute", &WSRequestHandler::ToggleMute }, + { "SetMute", &WSRequestHandler::SetMute }, + { "GetMute", &WSRequestHandler::GetMute }, + { "SetSyncOffset", &WSRequestHandler::SetSyncOffset }, + { "GetSyncOffset", &WSRequestHandler::GetSyncOffset }, + { "GetSpecialSources", &WSRequestHandler::GetSpecialSources }, + { "GetSourcesList", &WSRequestHandler::GetSourcesList }, + { "GetSourceTypesList", &WSRequestHandler::GetSourceTypesList }, + { "GetSourceSettings", &WSRequestHandler::GetSourceSettings }, + { "SetSourceSettings", &WSRequestHandler::SetSourceSettings }, + { "TakeSourceScreenshot", &WSRequestHandler::TakeSourceScreenshot }, -// { "GetSourceFilters", &WSRequestHandler::GetSourceFilters }, -// { "GetSourceFilterInfo", &WSRequestHandler::GetSourceFilterInfo }, -// { "AddFilterToSource", &WSRequestHandler::AddFilterToSource }, -// { "RemoveFilterFromSource", &WSRequestHandler::RemoveFilterFromSource }, -// { "ReorderSourceFilter", &WSRequestHandler::ReorderSourceFilter }, -// { "MoveSourceFilter", &WSRequestHandler::MoveSourceFilter }, -// { "SetSourceFilterSettings", &WSRequestHandler::SetSourceFilterSettings }, -// { "SetSourceFilterVisibility", &WSRequestHandler::SetSourceFilterVisibility }, + { "GetSourceFilters", &WSRequestHandler::GetSourceFilters }, + { "GetSourceFilterInfo", &WSRequestHandler::GetSourceFilterInfo }, + { "AddFilterToSource", &WSRequestHandler::AddFilterToSource }, + { "RemoveFilterFromSource", &WSRequestHandler::RemoveFilterFromSource }, + { "ReorderSourceFilter", &WSRequestHandler::ReorderSourceFilter }, + { "MoveSourceFilter", &WSRequestHandler::MoveSourceFilter }, + { "SetSourceFilterSettings", &WSRequestHandler::SetSourceFilterSettings }, + { "SetSourceFilterVisibility", &WSRequestHandler::SetSourceFilterVisibility }, -// { "SetCurrentSceneCollection", &WSRequestHandler::SetCurrentSceneCollection }, -// { "GetCurrentSceneCollection", &WSRequestHandler::GetCurrentSceneCollection }, -// { "ListSceneCollections", &WSRequestHandler::ListSceneCollections }, + { "SetCurrentSceneCollection", &WSRequestHandler::SetCurrentSceneCollection }, + { "GetCurrentSceneCollection", &WSRequestHandler::GetCurrentSceneCollection }, + { "ListSceneCollections", &WSRequestHandler::ListSceneCollections }, -// { "SetCurrentProfile", &WSRequestHandler::SetCurrentProfile }, -// { "GetCurrentProfile", &WSRequestHandler::GetCurrentProfile }, -// { "ListProfiles", &WSRequestHandler::ListProfiles }, + { "SetCurrentProfile", &WSRequestHandler::SetCurrentProfile }, + { "GetCurrentProfile", &WSRequestHandler::GetCurrentProfile }, + { "ListProfiles", &WSRequestHandler::ListProfiles }, -// { "SetStreamSettings", &WSRequestHandler::SetStreamSettings }, -// { "GetStreamSettings", &WSRequestHandler::GetStreamSettings }, -// { "SaveStreamSettings", &WSRequestHandler::SaveStreamSettings }, -// #if BUILD_CAPTIONS -// { "SendCaptions", &WSRequestHandler::SendCaptions }, -// #endif + { "SetStreamSettings", &WSRequestHandler::SetStreamSettings }, + { "GetStreamSettings", &WSRequestHandler::GetStreamSettings }, + { "SaveStreamSettings", &WSRequestHandler::SaveStreamSettings }, +#if BUILD_CAPTIONS + { "SendCaptions", &WSRequestHandler::SendCaptions }, +#endif -// { "GetStudioModeStatus", &WSRequestHandler::GetStudioModeStatus }, -// { "GetPreviewScene", &WSRequestHandler::GetPreviewScene }, -// { "SetPreviewScene", &WSRequestHandler::SetPreviewScene }, -// { "TransitionToProgram", &WSRequestHandler::TransitionToProgram }, -// { "EnableStudioMode", &WSRequestHandler::EnableStudioMode }, -// { "DisableStudioMode", &WSRequestHandler::DisableStudioMode }, -// { "ToggleStudioMode", &WSRequestHandler::ToggleStudioMode }, + { "GetStudioModeStatus", &WSRequestHandler::GetStudioModeStatus }, + { "GetPreviewScene", &WSRequestHandler::GetPreviewScene }, + { "SetPreviewScene", &WSRequestHandler::SetPreviewScene }, + { "TransitionToProgram", &WSRequestHandler::TransitionToProgram }, + { "EnableStudioMode", &WSRequestHandler::EnableStudioMode }, + { "DisableStudioMode", &WSRequestHandler::DisableStudioMode }, + { "ToggleStudioMode", &WSRequestHandler::ToggleStudioMode }, -// { "SetTextGDIPlusProperties", &WSRequestHandler::SetTextGDIPlusProperties }, -// { "GetTextGDIPlusProperties", &WSRequestHandler::GetTextGDIPlusProperties }, + { "SetTextGDIPlusProperties", &WSRequestHandler::SetTextGDIPlusProperties }, + { "GetTextGDIPlusProperties", &WSRequestHandler::GetTextGDIPlusProperties }, -// { "SetTextFreetype2Properties", &WSRequestHandler::SetTextFreetype2Properties }, -// { "GetTextFreetype2Properties", &WSRequestHandler::GetTextFreetype2Properties }, + { "SetTextFreetype2Properties", &WSRequestHandler::SetTextFreetype2Properties }, + { "GetTextFreetype2Properties", &WSRequestHandler::GetTextFreetype2Properties }, -// { "GetBrowserSourceProperties", &WSRequestHandler::GetBrowserSourceProperties }, -// { "SetBrowserSourceProperties", &WSRequestHandler::SetBrowserSourceProperties }, + { "GetBrowserSourceProperties", &WSRequestHandler::GetBrowserSourceProperties }, + { "SetBrowserSourceProperties", &WSRequestHandler::SetBrowserSourceProperties }, -// { "ListOutputs", &WSRequestHandler::ListOutputs }, -// { "GetOutputInfo", &WSRequestHandler::GetOutputInfo }, -// { "StartOutput", &WSRequestHandler::StartOutput }, -// { "StopOutput", &WSRequestHandler::StopOutput } + { "ListOutputs", &WSRequestHandler::ListOutputs }, + { "GetOutputInfo", &WSRequestHandler::GetOutputInfo }, + { "StartOutput", &WSRequestHandler::StartOutput }, + { "StopOutput", &WSRequestHandler::StopOutput } }; const QSet WSRequestHandler::authNotRequired { @@ -191,12 +195,12 @@ RpcResponse WSRequestHandler::processRequest(const RpcRequest& request){ return RpcResponse::fail(request, "Not Authenticated"); } - RpcResponse (*handlerFunc)(const RpcRequest&) = (messageMap[request.methodName()]); + RpcMethodHandler handlerFunc = messageMap[request.methodName()]; if (!handlerFunc) { return RpcResponse::fail(request, "invalid request type"); } - return handlerFunc(request); + return std::bind(handlerFunc, _1)(request); } // HandlerResponse WSRequestHandler::SendOKResponse(obs_data_t* additionalFields) { diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index 2f9e510d..da93330b 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -33,6 +33,7 @@ with this program. If not, see #include "obs-websocket.h" +class WSRequestHandler; typedef RpcResponse(WSRequestHandler::*RpcMethodHandler)(const RpcRequest&); class WSRequestHandler { From 528d81106e7f97ad74de535451f62f771c55f869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 19:52:05 +0100 Subject: [PATCH 09/41] WSRequestHandler(processRequest): fix bind call --- src/WSRequestHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index ea559748..843db11a 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -200,7 +200,7 @@ RpcResponse WSRequestHandler::processRequest(const RpcRequest& request){ return RpcResponse::fail(request, "invalid request type"); } - return std::bind(handlerFunc, _1)(request); + return std::bind(handlerFunc, this, _1)(request); } // HandlerResponse WSRequestHandler::SendOKResponse(obs_data_t* additionalFields) { From d2bb1ddc294887abf99335665b88368a81530a06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 19:58:57 +0100 Subject: [PATCH 10/41] RpcRequest: fix accessors --- src/rpc/RpcRequest.cpp | 20 ++++++++++---------- src/rpc/RpcRequest.h | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/rpc/RpcRequest.cpp b/src/rpc/RpcRequest.cpp index d2ee224c..0d4b635a 100644 --- a/src/rpc/RpcRequest.cpp +++ b/src/rpc/RpcRequest.cpp @@ -36,12 +36,12 @@ const QString& RpcRequest::methodName() const return _methodName; } -const obs_data_t* RpcRequest::parameters() const +const OBSData RpcRequest::parameters() const { - return _parameters; + return OBSData(_parameters); } -bool RpcRequest::hasField(QString name, obs_data_type expectedFieldType, obs_data_number_type expectedNumberType) +const bool RpcRequest::hasField(QString name, obs_data_type expectedFieldType, obs_data_number_type expectedNumberType) const { if (!_parameters || name.isEmpty() || name.isNull()) { return false; @@ -69,37 +69,37 @@ bool RpcRequest::hasField(QString name, obs_data_type expectedFieldType, obs_dat return true; } -bool RpcRequest::hasBool(QString fieldName) +const bool RpcRequest::hasBool(QString fieldName) const { return this->hasField(fieldName, OBS_DATA_BOOLEAN); } -bool RpcRequest::hasString(QString fieldName) +const bool RpcRequest::hasString(QString fieldName) const { return this->hasField(fieldName, OBS_DATA_STRING); } -bool RpcRequest::hasNumber(QString fieldName, obs_data_number_type expectedNumberType) +const bool RpcRequest::hasNumber(QString fieldName, obs_data_number_type expectedNumberType) const { return this->hasField(fieldName, OBS_DATA_NUMBER, expectedNumberType); } -bool RpcRequest::hasInteger(QString fieldName) +const bool RpcRequest::hasInteger(QString fieldName) const { return this->hasNumber(fieldName, OBS_DATA_NUM_INT); } -bool RpcRequest::hasDouble(QString fieldName) +const bool RpcRequest::hasDouble(QString fieldName) const { return this->hasNumber(fieldName, OBS_DATA_NUM_DOUBLE); } -bool RpcRequest::hasArray(QString fieldName) +const bool RpcRequest::hasArray(QString fieldName) const { return this->hasField(fieldName, OBS_DATA_ARRAY); } -bool RpcRequest::hasObject(QString fieldName) +const bool RpcRequest::hasObject(QString fieldName) const { return this->hasField(fieldName, OBS_DATA_OBJECT); } diff --git a/src/rpc/RpcRequest.h b/src/rpc/RpcRequest.h index 2a7f125f..ffea9e26 100644 --- a/src/rpc/RpcRequest.h +++ b/src/rpc/RpcRequest.h @@ -29,17 +29,17 @@ public: const QString& messageId() const; const QString& methodName() const; - const obs_data_t* parameters() const; + const OBSData parameters() const; - bool hasField(QString fieldName, obs_data_type expectedFieldType = OBS_DATA_NULL, - obs_data_number_type expectedNumberType = OBS_DATA_NUM_INVALID); - bool hasBool(QString fieldName); - bool hasString(QString fieldName); - bool hasNumber(QString fieldName, obs_data_number_type expectedNumberType = OBS_DATA_NUM_INVALID); - bool hasInteger(QString fieldName); - bool hasDouble(QString fieldName); - bool hasArray(QString fieldName); - bool hasObject(QString fieldName); + const bool hasField(QString fieldName, obs_data_type expectedFieldType = OBS_DATA_NULL, + obs_data_number_type expectedNumberType = OBS_DATA_NUM_INVALID) const; + const bool hasBool(QString fieldName) const; + const bool hasString(QString fieldName) const; + const bool hasNumber(QString fieldName, obs_data_number_type expectedNumberType = OBS_DATA_NUM_INVALID) const; + const bool hasInteger(QString fieldName) const; + const bool hasDouble(QString fieldName) const; + const bool hasArray(QString fieldName) const; + const bool hasObject(QString fieldName) const; private: const QString _messageId; From a12f1dcb13fe049949845ef02a62f0b6ca875222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:05:07 +0100 Subject: [PATCH 11/41] RpcRequest: create ok and error response builders --- src/rpc/RpcRequest.cpp | 11 +++++++++++ src/rpc/RpcRequest.h | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/src/rpc/RpcRequest.cpp b/src/rpc/RpcRequest.cpp index 0d4b635a..c5ce10de 100644 --- a/src/rpc/RpcRequest.cpp +++ b/src/rpc/RpcRequest.cpp @@ -17,6 +17,7 @@ with this program. If not, see */ #include "RpcRequest.h" +#include "RpcResponse.h" RpcRequest::RpcRequest(const QString& messageId, const QString& methodName, obs_data_t* params) : _messageId(messageId), @@ -41,6 +42,16 @@ const OBSData RpcRequest::parameters() const return OBSData(_parameters); } +const RpcResponse RpcRequest::okResponse(obs_data_t* additionalFields) const +{ + return RpcResponse::ok(*this, additionalFields); +} + +const RpcResponse RpcRequest::errorResponse(const QString& errorMessage, obs_data_t* additionalFields) const +{ + return RpcResponse::fail(*this, errorMessage, additionalFields); +} + const bool RpcRequest::hasField(QString name, obs_data_type expectedFieldType, obs_data_number_type expectedNumberType) const { if (!_parameters || name.isEmpty() || name.isNull()) { diff --git a/src/rpc/RpcRequest.h b/src/rpc/RpcRequest.h index ffea9e26..cbd788c9 100644 --- a/src/rpc/RpcRequest.h +++ b/src/rpc/RpcRequest.h @@ -22,6 +22,10 @@ with this program. If not, see #include #include "../obs-websocket.h" +// forward declarations +class RpcResponse; +enum ResponseStatus; + class RpcRequest { public: @@ -31,6 +35,9 @@ public: const QString& methodName() const; const OBSData parameters() const; + const RpcResponse okResponse(obs_data_t* additionalFields = nullptr) const; + const RpcResponse errorResponse(const QString& errorMessage, obs_data_t* additionalFields = nullptr) const; + const bool hasField(QString fieldName, obs_data_type expectedFieldType = OBS_DATA_NULL, obs_data_number_type expectedNumberType = OBS_DATA_NUM_INVALID) const; const bool hasBool(QString fieldName) const; From f09cbfddbcd75cadc724330f228a5f15cc3a7aa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:08:09 +0100 Subject: [PATCH 12/41] WSRequestHandler(General): fixes --- src/WSRequestHandler_General.cpp | 42 +++++++++++++++++--------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index 9b864af9..dee61248 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -66,7 +66,7 @@ const char *describe_scale_type(int scale) { * @category general * @since 0.3 */ -RpcResponse WSRequestHandler::HandleGetVersion(const RpcRequest& request) { +RpcResponse WSRequestHandler::GetVersion(const RpcRequest& request) { QString obsVersion = Utils::OBSVersionString(); QList names = messageMap.keys(); @@ -85,7 +85,7 @@ RpcResponse WSRequestHandler::HandleGetVersion(const RpcRequest& request) { obs_data_set_string(data, "obs-studio-version", obsVersion.toUtf8()); obs_data_set_string(data, "available-requests", requests.toUtf8()); - return RpcResponse::ok(request, data); + return request.okResponse(data); } /** @@ -101,7 +101,7 @@ RpcResponse WSRequestHandler::HandleGetVersion(const RpcRequest& request) { * @category general * @since 0.3 */ -RpcResponse WSRequestHandler::HandleGetAuthRequired(const RpcRequest& request) { +RpcResponse WSRequestHandler::GetAuthRequired(const RpcRequest& request) { bool authRequired = GetConfig()->AuthRequired; OBSDataAutoRelease data = obs_data_create(); @@ -115,7 +115,7 @@ RpcResponse WSRequestHandler::HandleGetAuthRequired(const RpcRequest& request) { config->Salt.toUtf8()); } - return RpcResponse::ok(request, data); + return request.okResponse(data); } /** @@ -128,7 +128,7 @@ RpcResponse WSRequestHandler::HandleGetAuthRequired(const RpcRequest& request) { * @category general * @since 0.3 */ -RpcResponse WSRequestHandler::HandleAuthenticate(const RpcRequest& request) { +RpcResponse WSRequestHandler::Authenticate(const RpcRequest& request) { if (!request.hasField("auth")) { return RpcResponse::fail(request, "missing request parameters"); } @@ -147,7 +147,7 @@ RpcResponse WSRequestHandler::HandleAuthenticate(const RpcRequest& request) { } _connProperties.setAuthenticated(true); - return RpcResponse::ok(request); + return request.okResponse(); } /** @@ -160,7 +160,7 @@ RpcResponse WSRequestHandler::HandleAuthenticate(const RpcRequest& request) { * @category general * @since 4.3.0 */ -RpcResponse WSRequestHandler::HandleSetHeartbeat(const RpcRequest& request) { +RpcResponse WSRequestHandler::SetHeartbeat(const RpcRequest& request) { if (!request.hasField("enable")) { return RpcResponse::fail(request, "Heartbeat parameter missing"); } @@ -170,7 +170,8 @@ RpcResponse WSRequestHandler::HandleSetHeartbeat(const RpcRequest& request) { OBSDataAutoRelease response = obs_data_create(); obs_data_set_bool(response, "enable", events->HeartbeatIsActive); - return RpcResponse::ok(request, response); + + return request.okResponse(response); } /** @@ -183,7 +184,7 @@ RpcResponse WSRequestHandler::HandleSetHeartbeat(const RpcRequest& request) { * @category general * @since 4.3.0 */ -RpcResponse WSRequestHandler::HandleSetFilenameFormatting(const RpcRequest& request) { +RpcResponse WSRequestHandler::SetFilenameFormatting(const RpcRequest& request) { if (!request.hasField("filename-formatting")) { return RpcResponse::fail(request, " parameter missing"); } @@ -194,7 +195,8 @@ RpcResponse WSRequestHandler::HandleSetFilenameFormatting(const RpcRequest& requ } Utils::SetFilenameFormatting(filenameFormatting.toUtf8()); - return RpcResponse::ok(request); + + return request.okResponse(); } /** @@ -207,10 +209,11 @@ RpcResponse WSRequestHandler::HandleSetFilenameFormatting(const RpcRequest& requ * @category general * @since 4.3.0 */ -RpcResponse WSRequestHandler::HandleGetFilenameFormatting(const RpcRequest& request) { +RpcResponse WSRequestHandler::GetFilenameFormatting(const RpcRequest& request) { OBSDataAutoRelease response = obs_data_create(); obs_data_set_string(response, "filename-formatting", Utils::GetFilenameFormatting()); - return RpcResponse::ok(request, response); + + return request.okResponse(response); } /** @@ -223,12 +226,13 @@ RpcResponse WSRequestHandler::HandleGetFilenameFormatting(const RpcRequest& requ * @category general * @since 4.6.0 */ -RpcResponse WSRequestHandler::HandleGetStats(const RpcRequest& request) { +RpcResponse WSRequestHandler::GetStats(const RpcRequest& request) { OBSDataAutoRelease stats = GetEventsSystem()->GetStats(); OBSDataAutoRelease response = obs_data_create(); obs_data_set_obj(response, "stats", stats); - return RpcResponse::ok(request, response); + + return request.okResponse(response); } /** @@ -242,7 +246,7 @@ RpcResponse WSRequestHandler::HandleGetStats(const RpcRequest& request) { * @category general * @since 4.7.0 */ -RpcResponse WSRequestHandler::HandleBroadcastCustomMessage(const RpcRequest& request) { +RpcResponse WSRequestHandler::BroadcastCustomMessage(const RpcRequest& request) { if (!request.hasField("realm") || !request.hasField("data")) { return RpcResponse::fail(request, "missing request parameters"); } @@ -261,7 +265,7 @@ RpcResponse WSRequestHandler::HandleBroadcastCustomMessage(const RpcRequest& req auto events = GetEventsSystem(); events->OnBroadcastCustomMessage(realm, data); - return RpcResponse::ok(request); + return request.okResponse(); } @@ -283,7 +287,7 @@ RpcResponse WSRequestHandler::HandleBroadcastCustomMessage(const RpcRequest& req * @category general * @since 4.6.0 */ -RpcResponse WSRequestHandler::HandleGetVideoInfo(const RpcRequest& request) { +RpcResponse WSRequestHandler::GetVideoInfo(const RpcRequest& request) { obs_video_info ovi; obs_get_video_info(&ovi); @@ -297,6 +301,6 @@ RpcResponse WSRequestHandler::HandleGetVideoInfo(const RpcRequest& request) { obs_data_set_string(response, "colorSpace", describe_color_space(ovi.colorspace)); obs_data_set_string(response, "colorRange", describe_color_range(ovi.range)); obs_data_set_string(response, "scaleType", describe_scale_type(ovi.scale_type)); - - return RpcResponse::ok(request, response); + + return request.okResponse(response); } From f660036a251911a8cebfb02f423add78730fe5eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:09:43 +0100 Subject: [PATCH 13/41] RpcRequest: rename okResponse to success --- src/WSRequestHandler_General.cpp | 18 +++++++++--------- src/rpc/RpcRequest.cpp | 4 ++-- src/rpc/RpcRequest.h | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index dee61248..f402fdc5 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -85,7 +85,7 @@ RpcResponse WSRequestHandler::GetVersion(const RpcRequest& request) { obs_data_set_string(data, "obs-studio-version", obsVersion.toUtf8()); obs_data_set_string(data, "available-requests", requests.toUtf8()); - return request.okResponse(data); + return request.success(data); } /** @@ -115,7 +115,7 @@ RpcResponse WSRequestHandler::GetAuthRequired(const RpcRequest& request) { config->Salt.toUtf8()); } - return request.okResponse(data); + return request.success(data); } /** @@ -147,7 +147,7 @@ RpcResponse WSRequestHandler::Authenticate(const RpcRequest& request) { } _connProperties.setAuthenticated(true); - return request.okResponse(); + return request.success(); } /** @@ -171,7 +171,7 @@ RpcResponse WSRequestHandler::SetHeartbeat(const RpcRequest& request) { OBSDataAutoRelease response = obs_data_create(); obs_data_set_bool(response, "enable", events->HeartbeatIsActive); - return request.okResponse(response); + return request.success(response); } /** @@ -196,7 +196,7 @@ RpcResponse WSRequestHandler::SetFilenameFormatting(const RpcRequest& request) { Utils::SetFilenameFormatting(filenameFormatting.toUtf8()); - return request.okResponse(); + return request.success(); } /** @@ -213,7 +213,7 @@ RpcResponse WSRequestHandler::GetFilenameFormatting(const RpcRequest& request) { OBSDataAutoRelease response = obs_data_create(); obs_data_set_string(response, "filename-formatting", Utils::GetFilenameFormatting()); - return request.okResponse(response); + return request.success(response); } /** @@ -232,7 +232,7 @@ RpcResponse WSRequestHandler::GetStats(const RpcRequest& request) { OBSDataAutoRelease response = obs_data_create(); obs_data_set_obj(response, "stats", stats); - return request.okResponse(response); + return request.success(response); } /** @@ -265,7 +265,7 @@ RpcResponse WSRequestHandler::BroadcastCustomMessage(const RpcRequest& request) auto events = GetEventsSystem(); events->OnBroadcastCustomMessage(realm, data); - return request.okResponse(); + return request.success(); } @@ -302,5 +302,5 @@ RpcResponse WSRequestHandler::GetVideoInfo(const RpcRequest& request) { obs_data_set_string(response, "colorRange", describe_color_range(ovi.range)); obs_data_set_string(response, "scaleType", describe_scale_type(ovi.scale_type)); - return request.okResponse(response); + return request.success(response); } diff --git a/src/rpc/RpcRequest.cpp b/src/rpc/RpcRequest.cpp index c5ce10de..a341a5e1 100644 --- a/src/rpc/RpcRequest.cpp +++ b/src/rpc/RpcRequest.cpp @@ -42,12 +42,12 @@ const OBSData RpcRequest::parameters() const return OBSData(_parameters); } -const RpcResponse RpcRequest::okResponse(obs_data_t* additionalFields) const +const RpcResponse RpcRequest::success(obs_data_t* additionalFields) const { return RpcResponse::ok(*this, additionalFields); } -const RpcResponse RpcRequest::errorResponse(const QString& errorMessage, obs_data_t* additionalFields) const +const RpcResponse RpcRequest::failed(const QString& errorMessage, obs_data_t* additionalFields) const { return RpcResponse::fail(*this, errorMessage, additionalFields); } diff --git a/src/rpc/RpcRequest.h b/src/rpc/RpcRequest.h index cbd788c9..1611164d 100644 --- a/src/rpc/RpcRequest.h +++ b/src/rpc/RpcRequest.h @@ -35,8 +35,8 @@ public: const QString& methodName() const; const OBSData parameters() const; - const RpcResponse okResponse(obs_data_t* additionalFields = nullptr) const; - const RpcResponse errorResponse(const QString& errorMessage, obs_data_t* additionalFields = nullptr) const; + const RpcResponse success(obs_data_t* additionalFields = nullptr) const; + const RpcResponse failed(const QString& errorMessage, obs_data_t* additionalFields = nullptr) const; const bool hasField(QString fieldName, obs_data_type expectedFieldType = OBS_DATA_NULL, obs_data_number_type expectedNumberType = OBS_DATA_NUM_INVALID) const; From ba9201831b7cf50acfe5f18e0b5bb78449a01c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:12:38 +0100 Subject: [PATCH 14/41] WSRequestHandler(General): fix error returns --- src/WSRequestHandler_General.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index f402fdc5..bab1a6e0 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -130,20 +130,20 @@ RpcResponse WSRequestHandler::GetAuthRequired(const RpcRequest& request) { */ RpcResponse WSRequestHandler::Authenticate(const RpcRequest& request) { if (!request.hasField("auth")) { - return RpcResponse::fail(request, "missing request parameters"); + return request.failed("missing request parameters"); } if (_connProperties.isAuthenticated()) { - return RpcResponse::fail(request, "already authenticated"); + return request.failed("already authenticated"); } QString auth = obs_data_get_string(request.parameters(), "auth"); if (auth.isEmpty()) { - return RpcResponse::fail(request, "auth not specified!"); + return request.failed("auth not specified!"); } if (GetConfig()->CheckAuth(auth) == false) { - return RpcResponse::fail(request, "Authentication Failed."); + return request.failed("Authentication Failed."); } _connProperties.setAuthenticated(true); @@ -162,7 +162,7 @@ RpcResponse WSRequestHandler::Authenticate(const RpcRequest& request) { */ RpcResponse WSRequestHandler::SetHeartbeat(const RpcRequest& request) { if (!request.hasField("enable")) { - return RpcResponse::fail(request, "Heartbeat parameter missing"); + return request.failed("Heartbeat parameter missing"); } auto events = GetEventsSystem(); @@ -186,12 +186,12 @@ RpcResponse WSRequestHandler::SetHeartbeat(const RpcRequest& request) { */ RpcResponse WSRequestHandler::SetFilenameFormatting(const RpcRequest& request) { if (!request.hasField("filename-formatting")) { - return RpcResponse::fail(request, " parameter missing"); + return request.failed(" parameter missing"); } QString filenameFormatting = obs_data_get_string(request.parameters(), "filename-formatting"); if (filenameFormatting.isEmpty()) { - return RpcResponse::fail(request, "invalid request parameters"); + return request.failed("invalid request parameters"); } Utils::SetFilenameFormatting(filenameFormatting.toUtf8()); @@ -248,18 +248,18 @@ RpcResponse WSRequestHandler::GetStats(const RpcRequest& request) { */ RpcResponse WSRequestHandler::BroadcastCustomMessage(const RpcRequest& request) { if (!request.hasField("realm") || !request.hasField("data")) { - return RpcResponse::fail(request, "missing request parameters"); + return request.failed("missing request parameters"); } QString realm = obs_data_get_string(request.parameters(), "realm"); OBSDataAutoRelease data = obs_data_get_obj(request.parameters(), "data"); if (realm.isEmpty()) { - return RpcResponse::fail(request, "realm not specified!"); + return request.failed("realm not specified!"); } if (!data) { - return RpcResponse::fail(request, "data not specified!"); + return request.failed("data not specified!"); } auto events = GetEventsSystem(); From 0485cf51ffc6bdda7a37b251b77fb9c0b6b11b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:17:11 +0100 Subject: [PATCH 15/41] WSRequestHandler(Outputs): fixes --- src/WSRequestHandler_Outputs.cpp | 43 +++++++++++++++++--------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/WSRequestHandler_Outputs.cpp b/src/WSRequestHandler_Outputs.cpp index 45469411..dad0bf19 100644 --- a/src/WSRequestHandler_Outputs.cpp +++ b/src/WSRequestHandler_Outputs.cpp @@ -1,3 +1,5 @@ +#include + #include "WSRequestHandler.h" /** @@ -57,16 +59,16 @@ obs_data_t* getOutputInfo(obs_output_t* output) return data; } -HandlerResponse findOutputOrFail(WSRequestHandler* req, std::function callback) +RpcResponse findOutputOrFail(const RpcRequest& request, std::function callback) { - if (!req->hasField("outputName")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("outputName")) { + return request.failed("missing request parameters"); } - const char* outputName = obs_data_get_string(req->parameters(), "outputName"); + const char* outputName = obs_data_get_string(request.parameters(), "outputName"); OBSOutputAutoRelease output = obs_get_output_by_name(outputName); if (!output) { - return req->SendErrorResponse("specified output doesn't exist"); + return request.failed("specified output doesn't exist"); } return callback(output); @@ -82,7 +84,7 @@ HandlerResponse findOutputOrFail(WSRequestHandler* req, std::functionSendOKResponse(fields); + + return request.success(fields); } /** @@ -112,14 +115,14 @@ HandlerResponse WSRequestHandler::HandleListOutputs(WSRequestHandler* req) * @category outputs * @since 4.7.0 */ -HandlerResponse WSRequestHandler::HandleGetOutputInfo(WSRequestHandler* req) +RpcResponse WSRequestHandler::GetOutputInfo(const RpcRequest& request) { - return findOutputOrFail(req, [req](obs_output_t* output) { + return findOutputOrFail(request, [request](obs_output_t* output) { OBSDataAutoRelease outputInfo = getOutputInfo(output); OBSDataAutoRelease fields = obs_data_create(); obs_data_set_obj(fields, "outputInfo", outputInfo); - return req->SendOKResponse(fields); + return request.success(fields); }); } @@ -133,21 +136,21 @@ HandlerResponse WSRequestHandler::HandleGetOutputInfo(WSRequestHandler* req) * @category outputs * @since 4.7.0 */ -HandlerResponse WSRequestHandler::HandleStartOutput(WSRequestHandler* req) +RpcResponse WSRequestHandler::StartOutput(const RpcRequest& request) { - return findOutputOrFail(req, [req](obs_output_t* output) { + return findOutputOrFail(request, [request](obs_output_t* output) { if (obs_output_active(output)) { - return req->SendErrorResponse("output already active"); + return request.failed("output already active"); } bool success = obs_output_start(output); if (!success) { QString lastError = obs_output_get_last_error(output); QString errorMessage = QString("output start failed: %1").arg(lastError); - return req->SendErrorResponse(errorMessage); + return request.failed(errorMessage); } - return req->SendOKResponse(); + return request.success(); }); } @@ -162,20 +165,20 @@ HandlerResponse WSRequestHandler::HandleStartOutput(WSRequestHandler* req) * @category outputs * @since 4.7.0 */ -HandlerResponse WSRequestHandler::HandleStopOutput(WSRequestHandler* req) +RpcResponse WSRequestHandler::StopOutput(const RpcRequest& request) { - return findOutputOrFail(req, [req](obs_output_t* output) { + return findOutputOrFail(request, [request](obs_output_t* output) { if (!obs_output_active(output)) { - return req->SendErrorResponse("output not active"); + return request.failed("output not active"); } - bool forceStop = obs_data_get_bool(req->data, "force"); + bool forceStop = obs_data_get_bool(request.parameters(), "force"); if (forceStop) { obs_output_force_stop(output); } else { obs_output_stop(output); } - return req->SendOKResponse(); + return request.success(); }); } From 03c4fdc607f0036b392179a7e52b065a9400bb11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:21:40 +0100 Subject: [PATCH 16/41] WSRequestHandler(Profiles): fixes --- src/WSRequestHandler_Profiles.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/WSRequestHandler_Profiles.cpp b/src/WSRequestHandler_Profiles.cpp index 4bcc7d4d..d008931e 100644 --- a/src/WSRequestHandler_Profiles.cpp +++ b/src/WSRequestHandler_Profiles.cpp @@ -12,19 +12,19 @@ * @category profiles * @since 4.0.0 */ -HandlerResponse WSRequestHandler::HandleSetCurrentProfile(WSRequestHandler* req) { - if (!req->hasField("profile-name")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::SetCurrentProfile(const RpcRequest& request) { + if (!request.hasField("profile-name")) { + return request.failed("missing request parameters"); } - QString profileName = obs_data_get_string(req->data, "profile-name"); + QString profileName = obs_data_get_string(request.parameters(), "profile-name"); if (profileName.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } // TODO : check if profile exists obs_frontend_set_current_profile(profileName.toUtf8()); - return req->SendOKResponse(); + return request.success(); } /** @@ -37,10 +37,10 @@ HandlerResponse WSRequestHandler::HandleSetCurrentProfile(WSRequestHandler* req) * @category profiles * @since 4.0.0 */ -HandlerResponse WSRequestHandler::HandleGetCurrentProfile(WSRequestHandler* req) { +RpcResponse WSRequestHandler::GetCurrentProfile(const RpcRequest& request) { OBSDataAutoRelease response = obs_data_create(); obs_data_set_string(response, "profile-name", obs_frontend_get_current_profile()); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -53,7 +53,7 @@ HandlerResponse WSRequestHandler::HandleGetCurrentProfile(WSRequestHandler* req) * @category profiles * @since 4.0.0 */ -HandlerResponse WSRequestHandler::HandleListProfiles(WSRequestHandler* req) { +RpcResponse WSRequestHandler::ListProfiles(const RpcRequest& request) { char** profiles = obs_frontend_get_profiles(); OBSDataArrayAutoRelease list = Utils::StringListToArray(profiles, "profile-name"); bfree(profiles); @@ -61,5 +61,5 @@ HandlerResponse WSRequestHandler::HandleListProfiles(WSRequestHandler* req) { OBSDataAutoRelease response = obs_data_create(); obs_data_set_array(response, "profiles", list); - return req->SendOKResponse(response); + return request.success(response); } From 7e1b05933fa01116bbcdf34052d5defa140446d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:25:00 +0100 Subject: [PATCH 17/41] WSRequestHandler(Recording): fixes --- src/WSRequestHandler_Recording.cpp | 55 +++++++++++++++--------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/src/WSRequestHandler_Recording.cpp b/src/WSRequestHandler_Recording.cpp index 9164a404..330843d3 100644 --- a/src/WSRequestHandler_Recording.cpp +++ b/src/WSRequestHandler_Recording.cpp @@ -1,16 +1,17 @@ #include "WSRequestHandler.h" +#include #include #include "Utils.h" -HandlerResponse ifCanPause(WSRequestHandler* req, std::function callback) +RpcResponse ifCanPause(const RpcRequest& request, std::function callback) { if (!obs_frontend_recording_active()) { - return req->SendErrorResponse("recording is not active"); + return request.failed("recording is not active"); } if (!Utils::RecordingPauseSupported()) { - return req->SendErrorResponse("recording pauses are not available in this version of OBS Studio"); + return request.failed("recording pauses are not available in this version of OBS Studio"); } return callback(); @@ -24,9 +25,9 @@ HandlerResponse ifCanPause(WSRequestHandler* req, std::functionSendOKResponse(); + return request.success(); } /** @@ -38,13 +39,13 @@ HandlerResponse WSRequestHandler::HandleStartStopRecording(WSRequestHandler* req * @category recording * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleStartRecording(WSRequestHandler* req) { +RpcResponse WSRequestHandler::StartRecording(const RpcRequest& request) { if (obs_frontend_recording_active()) { - return req->SendErrorResponse("recording already active"); + return request.failed("recording already active"); } obs_frontend_recording_start(); - return req->SendOKResponse(); + return request.success(); } /** @@ -56,13 +57,13 @@ HandlerResponse WSRequestHandler::HandleStartRecording(WSRequestHandler* req) { * @category recording * @since 4.1.0 */ - HandlerResponse WSRequestHandler::HandleStopRecording(WSRequestHandler* req) { + RpcResponse WSRequestHandler::StopRecording(const RpcRequest& request) { if (!obs_frontend_recording_active()) { - return req->SendErrorResponse("recording not active"); + return request.failed("recording not active"); } obs_frontend_recording_stop(); - return req->SendOKResponse(); + return request.success(); } /** @@ -74,14 +75,14 @@ HandlerResponse WSRequestHandler::HandleStartRecording(WSRequestHandler* req) { * @category recording * @since 4.7.0 */ -HandlerResponse WSRequestHandler::HandlePauseRecording(WSRequestHandler* req) { - return ifCanPause(req, [req]() { +RpcResponse WSRequestHandler::PauseRecording(const RpcRequest& request) { + return ifCanPause(request, [request]() { if (Utils::RecordingPaused()) { - return req->SendErrorResponse("recording already paused"); + return request.failed("recording already paused"); } Utils::PauseRecording(true); - return req->SendOKResponse(); + return request.success(); }); } @@ -94,14 +95,14 @@ HandlerResponse WSRequestHandler::HandlePauseRecording(WSRequestHandler* req) { * @category recording * @since 4.7.0 */ -HandlerResponse WSRequestHandler::HandleResumeRecording(WSRequestHandler* req) { - return ifCanPause(req, [req]() { +RpcResponse WSRequestHandler::ResumeRecording(const RpcRequest& request) { + return ifCanPause(request, [request]() { if (!Utils::RecordingPaused()) { - return req->SendErrorResponse("recording is not paused"); + return request.failed("recording is not paused"); } Utils::PauseRecording(false); - return req->SendOKResponse(); + return request.success(); }); } @@ -120,18 +121,18 @@ HandlerResponse WSRequestHandler::HandleResumeRecording(WSRequestHandler* req) { * @category recording * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleSetRecordingFolder(WSRequestHandler* req) { - if (!req->hasField("rec-folder")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::SetRecordingFolder(const RpcRequest& request) { + if (!request.hasField("rec-folder")) { + return request.failed("missing request parameters"); } - const char* newRecFolder = obs_data_get_string(req->data, "rec-folder"); + const char* newRecFolder = obs_data_get_string(request.parameters(), "rec-folder"); bool success = Utils::SetRecordingFolder(newRecFolder); if (!success) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } - return req->SendOKResponse(); + return request.success(); } /** @@ -144,11 +145,11 @@ HandlerResponse WSRequestHandler::HandleSetRecordingFolder(WSRequestHandler* req * @category recording * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleGetRecordingFolder(WSRequestHandler* req) { +RpcResponse WSRequestHandler::GetRecordingFolder(const RpcRequest& request) { const char* recFolder = Utils::GetRecordingFolder(); OBSDataAutoRelease response = obs_data_create(); obs_data_set_string(response, "rec-folder", recFolder); - return req->SendOKResponse(response); + return request.success(response); } From 50d3a2600ebc77ff1c35aa6d77a4ce3ce6fd32c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:25:28 +0100 Subject: [PATCH 18/41] WSRequestHandler(ReplayBuffer): fixes --- src/WSRequestHandler_ReplayBuffer.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/WSRequestHandler_ReplayBuffer.cpp b/src/WSRequestHandler_ReplayBuffer.cpp index 86add84a..510b8f05 100644 --- a/src/WSRequestHandler_ReplayBuffer.cpp +++ b/src/WSRequestHandler_ReplayBuffer.cpp @@ -10,13 +10,13 @@ * @category replay buffer * @since 4.2.0 */ -HandlerResponse WSRequestHandler::HandleStartStopReplayBuffer(WSRequestHandler* req) { +RpcResponse WSRequestHandler::StartStopReplayBuffer(const RpcRequest& request) { if (obs_frontend_replay_buffer_active()) { obs_frontend_replay_buffer_stop(); } else { Utils::StartReplayBuffer(); } - return req->SendOKResponse(); + return request.success(); } /** @@ -31,17 +31,17 @@ HandlerResponse WSRequestHandler::HandleStartStopReplayBuffer(WSRequestHandler* * @category replay buffer * @since 4.2.0 */ -HandlerResponse WSRequestHandler::HandleStartReplayBuffer(WSRequestHandler* req) { +RpcResponse WSRequestHandler::StartReplayBuffer(const RpcRequest& request) { if (!Utils::ReplayBufferEnabled()) { - return req->SendErrorResponse("replay buffer disabled in settings"); + return request.failed("replay buffer disabled in settings"); } if (obs_frontend_replay_buffer_active() == true) { - return req->SendErrorResponse("replay buffer already active"); + return request.failed("replay buffer already active"); } Utils::StartReplayBuffer(); - return req->SendOKResponse(); + return request.success(); } /** @@ -53,12 +53,12 @@ HandlerResponse WSRequestHandler::HandleStartReplayBuffer(WSRequestHandler* req) * @category replay buffer * @since 4.2.0 */ -HandlerResponse WSRequestHandler::HandleStopReplayBuffer(WSRequestHandler* req) { +RpcResponse WSRequestHandler::StopReplayBuffer(const RpcRequest& request) { if (obs_frontend_replay_buffer_active() == true) { obs_frontend_replay_buffer_stop(); - return req->SendOKResponse(); + return request.success(); } else { - return req->SendErrorResponse("replay buffer not active"); + return request.failed("replay buffer not active"); } } @@ -72,9 +72,9 @@ HandlerResponse WSRequestHandler::HandleStopReplayBuffer(WSRequestHandler* req) * @category replay buffer * @since 4.2.0 */ -HandlerResponse WSRequestHandler::HandleSaveReplayBuffer(WSRequestHandler* req) { +RpcResponse WSRequestHandler::SaveReplayBuffer(const RpcRequest& request) { if (!obs_frontend_replay_buffer_active()) { - return req->SendErrorResponse("replay buffer not active"); + return request.failed("replay buffer not active"); } OBSOutputAutoRelease replayOutput = obs_frontend_get_replay_buffer_output(); @@ -84,5 +84,5 @@ HandlerResponse WSRequestHandler::HandleSaveReplayBuffer(WSRequestHandler* req) proc_handler_call(ph, "save", &cd); calldata_free(&cd); - return req->SendOKResponse(); + return request.success(); } From fd09a0ce544556c86557646be65a62dedd984f0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:26:00 +0100 Subject: [PATCH 19/41] WSRequestHandler(SceneCollections): fixes --- src/WSRequestHandler_SceneCollections.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/WSRequestHandler_SceneCollections.cpp b/src/WSRequestHandler_SceneCollections.cpp index d4159321..df62ebfb 100644 --- a/src/WSRequestHandler_SceneCollections.cpp +++ b/src/WSRequestHandler_SceneCollections.cpp @@ -12,19 +12,19 @@ * @category scene collections * @since 4.0.0 */ -HandlerResponse WSRequestHandler::HandleSetCurrentSceneCollection(WSRequestHandler* req) { - if (!req->hasField("sc-name")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::SetCurrentSceneCollection(const RpcRequest& request) { + if (!request.hasField("sc-name")) { + return request.failed("missing request parameters"); } - QString sceneCollection = obs_data_get_string(req->data, "sc-name"); + QString sceneCollection = obs_data_get_string(request.parameters(), "sc-name"); if (sceneCollection.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } // TODO : Check if specified profile exists and if changing is allowed obs_frontend_set_current_scene_collection(sceneCollection.toUtf8()); - return req->SendOKResponse(); + return request.success(); } /** @@ -37,12 +37,12 @@ HandlerResponse WSRequestHandler::HandleSetCurrentSceneCollection(WSRequestHandl * @category scene collections * @since 4.0.0 */ -HandlerResponse WSRequestHandler::HandleGetCurrentSceneCollection(WSRequestHandler* req) { +RpcResponse WSRequestHandler::GetCurrentSceneCollection(const RpcRequest& request) { OBSDataAutoRelease response = obs_data_create(); obs_data_set_string(response, "sc-name", obs_frontend_get_current_scene_collection()); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -55,7 +55,7 @@ HandlerResponse WSRequestHandler::HandleGetCurrentSceneCollection(WSRequestHandl * @category scene collections * @since 4.0.0 */ -HandlerResponse WSRequestHandler::HandleListSceneCollections(WSRequestHandler* req) { +RpcResponse WSRequestHandler::ListSceneCollections(const RpcRequest& request) { char** sceneCollections = obs_frontend_get_scene_collections(); OBSDataArrayAutoRelease list = Utils::StringListToArray(sceneCollections, "sc-name"); @@ -64,5 +64,5 @@ HandlerResponse WSRequestHandler::HandleListSceneCollections(WSRequestHandler* r OBSDataAutoRelease response = obs_data_create(); obs_data_set_array(response, "scene-collections", list); - return req->SendOKResponse(response); + return request.success(response); } From f6693d5587d41de248276a110144a4807b50810f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:26:44 +0100 Subject: [PATCH 20/41] WSRequestHandler(Transitions): fixes --- src/WSRequestHandler_Transitions.cpp | 34 ++++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/WSRequestHandler_Transitions.cpp b/src/WSRequestHandler_Transitions.cpp index 7295736b..7c22687c 100644 --- a/src/WSRequestHandler_Transitions.cpp +++ b/src/WSRequestHandler_Transitions.cpp @@ -14,7 +14,7 @@ * @category transitions * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleGetTransitionList(WSRequestHandler* req) { +RpcResponse WSRequestHandler::GetTransitionList(const RpcRequest& request) { OBSSourceAutoRelease currentTransition = obs_frontend_get_current_transition(); obs_frontend_source_list transitionList = {}; obs_frontend_get_transitions(&transitionList); @@ -34,7 +34,7 @@ HandlerResponse WSRequestHandler::HandleGetTransitionList(WSRequestHandler* req) obs_source_get_name(currentTransition)); obs_data_set_array(response, "transitions", transitions); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -48,7 +48,7 @@ HandlerResponse WSRequestHandler::HandleGetTransitionList(WSRequestHandler* req) * @category transitions * @since 0.3 */ -HandlerResponse WSRequestHandler::HandleGetCurrentTransition(WSRequestHandler* req) { +RpcResponse WSRequestHandler::GetCurrentTransition(const RpcRequest& request) { OBSSourceAutoRelease currentTransition = obs_frontend_get_current_transition(); OBSDataAutoRelease response = obs_data_create(); @@ -58,7 +58,7 @@ HandlerResponse WSRequestHandler::HandleGetCurrentTransition(WSRequestHandler* r if (!obs_transition_fixed(currentTransition)) obs_data_set_int(response, "duration", obs_frontend_get_transition_duration()); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -71,18 +71,18 @@ HandlerResponse WSRequestHandler::HandleGetCurrentTransition(WSRequestHandler* r * @category transitions * @since 0.3 */ -HandlerResponse WSRequestHandler::HandleSetCurrentTransition(WSRequestHandler* req) { - if (!req->hasField("transition-name")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::SetCurrentTransition(const RpcRequest& request) { + if (!request.hasField("transition-name")) { + return request.failed("missing request parameters"); } - QString name = obs_data_get_string(req->data, "transition-name"); + QString name = obs_data_get_string(request.parameters(), "transition-name"); bool success = Utils::SetTransitionByName(name); if (!success) { - return req->SendErrorResponse("requested transition does not exist"); + return request.failed("requested transition does not exist"); } - return req->SendOKResponse(); + return request.success(); } /** @@ -95,14 +95,14 @@ HandlerResponse WSRequestHandler::HandleSetCurrentTransition(WSRequestHandler* r * @category transitions * @since 4.0.0 */ -HandlerResponse WSRequestHandler::HandleSetTransitionDuration(WSRequestHandler* req) { - if (!req->hasField("duration")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::SetTransitionDuration(const RpcRequest& request) { + if (!request.hasField("duration")) { + return request.failed("missing request parameters"); } - int ms = obs_data_get_int(req->data, "duration"); + int ms = obs_data_get_int(request.parameters(), "duration"); obs_frontend_set_transition_duration(ms); - return req->SendOKResponse(); + return request.success(); } /** @@ -115,8 +115,8 @@ HandlerResponse WSRequestHandler::HandleSetTransitionDuration(WSRequestHandler* * @category transitions * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleGetTransitionDuration(WSRequestHandler* req) { +RpcResponse WSRequestHandler::GetTransitionDuration(const RpcRequest& request) { OBSDataAutoRelease response = obs_data_create(); obs_data_set_int(response, "transition-duration", obs_frontend_get_transition_duration()); - return req->SendOKResponse(response); + return request.success(response); } From 93a456ca8214dee30f7fb3b49cfb2bc606d4f358 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:27:27 +0100 Subject: [PATCH 21/41] WSRequestHandler(StudioMode): fixes --- src/WSRequestHandler_StudioMode.cpp | 50 ++++++++++++++--------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/WSRequestHandler_StudioMode.cpp b/src/WSRequestHandler_StudioMode.cpp index bfcdae4e..67928ee4 100644 --- a/src/WSRequestHandler_StudioMode.cpp +++ b/src/WSRequestHandler_StudioMode.cpp @@ -12,13 +12,13 @@ * @category studio mode * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleGetStudioModeStatus(WSRequestHandler* req) { +RpcResponse WSRequestHandler::GetStudioModeStatus(const RpcRequest& request) { bool previewActive = obs_frontend_preview_program_mode_active(); OBSDataAutoRelease response = obs_data_create(); obs_data_set_bool(response, "studio-mode", previewActive); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -33,9 +33,9 @@ HandlerResponse WSRequestHandler::HandleGetStudioModeStatus(WSRequestHandler* re * @category studio mode * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleGetPreviewScene(WSRequestHandler* req) { +RpcResponse WSRequestHandler::GetPreviewScene(const RpcRequest& request) { if (!obs_frontend_preview_program_mode_active()) { - return req->SendErrorResponse("studio mode not enabled"); + return request.failed("studio mode not enabled"); } OBSSourceAutoRelease scene = obs_frontend_get_current_preview_scene(); @@ -45,7 +45,7 @@ HandlerResponse WSRequestHandler::HandleGetPreviewScene(WSRequestHandler* req) { obs_data_set_string(data, "name", obs_source_get_name(scene)); obs_data_set_array(data, "sources", sceneItems); - return req->SendOKResponse(data); + return request.success(data); } /** @@ -59,23 +59,23 @@ HandlerResponse WSRequestHandler::HandleGetPreviewScene(WSRequestHandler* req) { * @category studio mode * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleSetPreviewScene(WSRequestHandler* req) { +RpcResponse WSRequestHandler::SetPreviewScene(const RpcRequest& request) { if (!obs_frontend_preview_program_mode_active()) { - return req->SendErrorResponse("studio mode not enabled"); + return request.failed("studio mode not enabled"); } - if (!req->hasField("scene-name")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("scene-name")) { + return request.failed("missing request parameters"); } - const char* scene_name = obs_data_get_string(req->data, "scene-name"); + const char* scene_name = obs_data_get_string(request.parameters(), "scene-name"); OBSScene scene = Utils::GetSceneFromNameOrCurrent(scene_name); if (!scene) { - return req->SendErrorResponse("specified scene doesn't exist"); + return request.failed("specified scene doesn't exist"); } obs_frontend_set_current_preview_scene(obs_scene_get_source(scene)); - return req->SendOKResponse(); + return request.success(); } /** @@ -91,25 +91,25 @@ HandlerResponse WSRequestHandler::HandleSetPreviewScene(WSRequestHandler* req) { * @category studio mode * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleTransitionToProgram(WSRequestHandler* req) { +RpcResponse WSRequestHandler::TransitionToProgram(const RpcRequest& request) { if (!obs_frontend_preview_program_mode_active()) { - return req->SendErrorResponse("studio mode not enabled"); + return request.failed("studio mode not enabled"); } - if (req->hasField("with-transition")) { + if (request.hasField("with-transition")) { OBSDataAutoRelease transitionInfo = - obs_data_get_obj(req->data, "with-transition"); + obs_data_get_obj(request.parameters(), "with-transition"); if (obs_data_has_user_value(transitionInfo, "name")) { QString transitionName = obs_data_get_string(transitionInfo, "name"); if (transitionName.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } bool success = Utils::SetTransitionByName(transitionName); if (!success) { - return req->SendErrorResponse("specified transition doesn't exist"); + return request.failed("specified transition doesn't exist"); } } @@ -121,7 +121,7 @@ HandlerResponse WSRequestHandler::HandleTransitionToProgram(WSRequestHandler* re } obs_frontend_preview_program_trigger_transition(); - return req->SendOKResponse(); + return request.success(); } /** @@ -132,9 +132,9 @@ HandlerResponse WSRequestHandler::HandleTransitionToProgram(WSRequestHandler* re * @category studio mode * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleEnableStudioMode(WSRequestHandler* req) { +RpcResponse WSRequestHandler::EnableStudioMode(const RpcRequest& request) { obs_frontend_set_preview_program_mode(true); - return req->SendOKResponse(); + return request.success(); } /** @@ -145,9 +145,9 @@ HandlerResponse WSRequestHandler::HandleEnableStudioMode(WSRequestHandler* req) * @category studio mode * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleDisableStudioMode(WSRequestHandler* req) { +RpcResponse WSRequestHandler::DisableStudioMode(const RpcRequest& request) { obs_frontend_set_preview_program_mode(false); - return req->SendOKResponse(); + return request.success(); } /** @@ -158,8 +158,8 @@ HandlerResponse WSRequestHandler::HandleDisableStudioMode(WSRequestHandler* req) * @category studio mode * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleToggleStudioMode(WSRequestHandler* req) { +RpcResponse WSRequestHandler::ToggleStudioMode(const RpcRequest& request) { bool previewProgramMode = obs_frontend_preview_program_mode_active(); obs_frontend_set_preview_program_mode(!previewProgramMode); - return req->SendOKResponse(); + return request.success(); } From 9323e1cf592defbc695325328c977ce0ab9c0c7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:28:42 +0100 Subject: [PATCH 22/41] WSRequestHandler(Streaming): fixes --- src/WSRequestHandler_Streaming.cpp | 56 +++++++++++++++--------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/WSRequestHandler_Streaming.cpp b/src/WSRequestHandler_Streaming.cpp index 0daea177..58bb6631 100644 --- a/src/WSRequestHandler_Streaming.cpp +++ b/src/WSRequestHandler_Streaming.cpp @@ -20,7 +20,7 @@ * @category streaming * @since 0.3 */ -HandlerResponse WSRequestHandler::HandleGetStreamingStatus(WSRequestHandler* req) { +RpcResponse WSRequestHandler::GetStreamingStatus(const RpcRequest& request) { auto events = GetEventsSystem(); OBSDataAutoRelease data = obs_data_create(); @@ -39,7 +39,7 @@ HandlerResponse WSRequestHandler::HandleGetStreamingStatus(WSRequestHandler* req obs_data_set_string(data, "rec-timecode", recordingTimecode.toUtf8().constData()); } - return req->SendOKResponse(data); + return request.success(data); } /** @@ -50,11 +50,11 @@ HandlerResponse WSRequestHandler::HandleGetStreamingStatus(WSRequestHandler* req * @category streaming * @since 0.3 */ -HandlerResponse WSRequestHandler::HandleStartStopStreaming(WSRequestHandler* req) { +RpcResponse WSRequestHandler::StartStopStreaming(const RpcRequest& request) { if (obs_frontend_streaming_active()) - return HandleStopStreaming(req); + return StopStreaming(request); else - return HandleStartStreaming(req); + return StartStreaming(request); } /** @@ -76,15 +76,15 @@ HandlerResponse WSRequestHandler::HandleStartStopStreaming(WSRequestHandler* req * @category streaming * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleStartStreaming(WSRequestHandler* req) { +RpcResponse WSRequestHandler::StartStreaming(const RpcRequest& request) { if (obs_frontend_streaming_active() == false) { OBSService configuredService = obs_frontend_get_streaming_service(); OBSService newService = nullptr; // TODO: fix service memory leak - if (req->hasField("stream")) { - OBSDataAutoRelease streamData = obs_data_get_obj(req->data, "stream"); + if (request.hasField("stream")) { + OBSDataAutoRelease streamData = obs_data_get_obj(request.parameters(), "stream"); OBSDataAutoRelease newSettings = obs_data_get_obj(streamData, "settings"); OBSDataAutoRelease newMetadata = obs_data_get_obj(streamData, "metadata"); @@ -157,9 +157,9 @@ HandlerResponse WSRequestHandler::HandleStartStreaming(WSRequestHandler* req) { obs_frontend_set_streaming_service(configuredService); } - return req->SendOKResponse(); + return request.success(); } else { - return req->SendErrorResponse("streaming already active"); + return request.failed("streaming already active"); } } @@ -172,12 +172,12 @@ HandlerResponse WSRequestHandler::HandleStartStreaming(WSRequestHandler* req) { * @category streaming * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleStopStreaming(WSRequestHandler* req) { +RpcResponse WSRequestHandler::StopStreaming(const RpcRequest& request) { if (obs_frontend_streaming_active() == true) { obs_frontend_streaming_stop(); - return req->SendOKResponse(); + return request.success(); } else { - return req->SendErrorResponse("streaming not active"); + return request.failed("streaming not active"); } } @@ -198,16 +198,16 @@ HandlerResponse WSRequestHandler::HandleStopStreaming(WSRequestHandler* req) { * @category streaming * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleSetStreamSettings(WSRequestHandler* req) { +RpcResponse WSRequestHandler::SetStreamSettings(const RpcRequest& request) { OBSService service = obs_frontend_get_streaming_service(); - OBSDataAutoRelease requestSettings = obs_data_get_obj(req->data, "settings"); + OBSDataAutoRelease requestSettings = obs_data_get_obj(request.parameters(), "settings"); if (!requestSettings) { - return req->SendErrorResponse("'settings' are required'"); + return request.failed("'settings' are required'"); } QString serviceType = obs_service_get_type(service); - QString requestedType = obs_data_get_string(req->data, "type"); + QString requestedType = obs_data_get_string(request.parameters(), "type"); if (requestedType != nullptr && requestedType != serviceType) { OBSDataAutoRelease hotkeys = obs_hotkeys_save_service(service); @@ -231,7 +231,7 @@ HandlerResponse WSRequestHandler::HandleSetStreamSettings(WSRequestHandler* req) } //if save is specified we should immediately save the streaming service - if (obs_data_get_bool(req->data, "save")) { + if (obs_data_get_bool(request.parameters(), "save")) { obs_frontend_save_streaming_service(); } @@ -241,7 +241,7 @@ HandlerResponse WSRequestHandler::HandleSetStreamSettings(WSRequestHandler* req) obs_data_set_string(response, "type", requestedType.toUtf8()); obs_data_set_obj(response, "settings", serviceSettings); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -260,7 +260,7 @@ HandlerResponse WSRequestHandler::HandleSetStreamSettings(WSRequestHandler* req) * @category streaming * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleGetStreamSettings(WSRequestHandler* req) { +RpcResponse WSRequestHandler::GetStreamSettings(const RpcRequest& request) { OBSService service = obs_frontend_get_streaming_service(); const char* serviceType = obs_service_get_type(service); @@ -270,7 +270,7 @@ HandlerResponse WSRequestHandler::HandleGetStreamSettings(WSRequestHandler* req) obs_data_set_string(response, "type", serviceType); obs_data_set_obj(response, "settings", settings); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -281,9 +281,9 @@ HandlerResponse WSRequestHandler::HandleGetStreamSettings(WSRequestHandler* req) * @category streaming * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleSaveStreamSettings(WSRequestHandler* req) { +RpcResponse WSRequestHandler::SaveStreamSettings(const RpcRequest& request) { obs_frontend_save_streaming_service(); - return req->SendOKResponse(); + return request.success(); } @@ -299,18 +299,18 @@ HandlerResponse WSRequestHandler::HandleSaveStreamSettings(WSRequestHandler* req * @since 4.6.0 */ #if BUILD_CAPTIONS -HandlerResponse WSRequestHandler::HandleSendCaptions(WSRequestHandler* req) { - if (!req->hasField("text")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::SendCaptions(const RpcRequest& request) { + if (!request.hasField("text")) { + return request.failed("missing request parameters"); } OBSOutputAutoRelease output = obs_frontend_get_streaming_output(); if (output) { - const char* caption = obs_data_get_string(req->data, "text"); + const char* caption = obs_data_get_string(request.parameters(), "text"); obs_output_output_caption_text1(output, caption); } - return req->SendOKResponse(); + return request.success(); } #endif From c9d6d109956c4f524909a550cac9c69f0fa33fd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:29:22 +0100 Subject: [PATCH 23/41] WSRequesthandler(Scenes): fixes --- src/WSRequestHandler_Scenes.cpp | 34 ++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/WSRequestHandler_Scenes.cpp b/src/WSRequestHandler_Scenes.cpp index 3a8754b4..9399ac5d 100644 --- a/src/WSRequestHandler_Scenes.cpp +++ b/src/WSRequestHandler_Scenes.cpp @@ -18,19 +18,19 @@ * @category scenes * @since 0.3 */ -HandlerResponse WSRequestHandler::HandleSetCurrentScene(WSRequestHandler* req) { - if (!req->hasField("scene-name")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::SetCurrentScene(const RpcRequest& request) { + if (!request.hasField("scene-name")) { + return request.failed("missing request parameters"); } - const char* sceneName = obs_data_get_string(req->data, "scene-name"); + const char* sceneName = obs_data_get_string(request.parameters(), "scene-name"); OBSSourceAutoRelease source = obs_get_source_by_name(sceneName); if (source) { obs_frontend_set_current_scene(source); - return req->SendOKResponse(); + return request.success(); } else { - return req->SendErrorResponse("requested scene does not exist"); + return request.failed("requested scene does not exist"); } } @@ -45,7 +45,7 @@ HandlerResponse WSRequestHandler::HandleSetCurrentScene(WSRequestHandler* req) { * @category scenes * @since 0.3 */ -HandlerResponse WSRequestHandler::HandleGetCurrentScene(WSRequestHandler* req) { +RpcResponse WSRequestHandler::GetCurrentScene(const RpcRequest& request) { OBSSourceAutoRelease currentScene = obs_frontend_get_current_scene(); OBSDataArrayAutoRelease sceneItems = Utils::GetSceneItems(currentScene); @@ -53,7 +53,7 @@ HandlerResponse WSRequestHandler::HandleGetCurrentScene(WSRequestHandler* req) { obs_data_set_string(data, "name", obs_source_get_name(currentScene)); obs_data_set_array(data, "sources", sceneItems); - return req->SendOKResponse(data); + return request.success(data); } /** @@ -67,7 +67,7 @@ HandlerResponse WSRequestHandler::HandleGetCurrentScene(WSRequestHandler* req) { * @category scenes * @since 0.3 */ -HandlerResponse WSRequestHandler::HandleGetSceneList(WSRequestHandler* req) { +RpcResponse WSRequestHandler::GetSceneList(const RpcRequest& request) { OBSSourceAutoRelease currentScene = obs_frontend_get_current_scene(); OBSDataArrayAutoRelease scenes = Utils::GetScenes(); @@ -76,7 +76,7 @@ HandlerResponse WSRequestHandler::HandleGetSceneList(WSRequestHandler* req) { obs_source_get_name(currentScene)); obs_data_set_array(data, "scenes", scenes); - return req->SendOKResponse(data); + return request.success(data); } /** @@ -92,16 +92,16 @@ HandlerResponse WSRequestHandler::HandleGetSceneList(WSRequestHandler* req) { * @category scenes * @since 4.5.0 */ -HandlerResponse WSRequestHandler::HandleReorderSceneItems(WSRequestHandler* req) { - QString sceneName = obs_data_get_string(req->data, "scene"); +RpcResponse WSRequestHandler::ReorderSceneItems(const RpcRequest& request) { + QString sceneName = obs_data_get_string(request.parameters(), "scene"); OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { - return req->SendErrorResponse("requested scene doesn't exist"); + return request.failed("requested scene doesn't exist"); } - OBSDataArrayAutoRelease items = obs_data_get_array(req->data, "items"); + OBSDataArrayAutoRelease items = obs_data_get_array(request.parameters(), "items"); if (!items) { - return req->SendErrorResponse("sceneItem order not specified"); + return request.failed("sceneItem order not specified"); } struct reorder_context { @@ -143,8 +143,8 @@ HandlerResponse WSRequestHandler::HandleReorderSceneItems(WSRequestHandler* req) }, &ctx); if (!ctx.success) { - return req->SendErrorResponse(ctx.errorMessage); + return request.failed(ctx.errorMessage); } - return req->SendOKResponse(); + return request.success(); } From 928dc308105dd43ae8980a58e5af5081d9213f64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:30:44 +0100 Subject: [PATCH 24/41] WSRequestHandler(Sources): fixes --- src/WSRequestHandler_Sources.cpp | 602 +++++++++++++++---------------- 1 file changed, 301 insertions(+), 301 deletions(-) diff --git a/src/WSRequestHandler_Sources.cpp b/src/WSRequestHandler_Sources.cpp index b071bc18..03a5adef 100644 --- a/src/WSRequestHandler_Sources.cpp +++ b/src/WSRequestHandler_Sources.cpp @@ -21,7 +21,7 @@ * @category sources * @since 4.3.0 */ -HandlerResponse WSRequestHandler::HandleGetSourcesList(WSRequestHandler* req) +RpcResponse WSRequestHandler::GetSourcesList(const RpcRequest& request) { OBSDataArrayAutoRelease sourcesArray = obs_data_array_create(); @@ -64,7 +64,7 @@ HandlerResponse WSRequestHandler::HandleGetSourcesList(WSRequestHandler* req) OBSDataAutoRelease response = obs_data_create(); obs_data_set_array(response, "sources", sourcesArray); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -89,7 +89,7 @@ HandlerResponse WSRequestHandler::HandleGetSourcesList(WSRequestHandler* req) * @category sources * @since 4.3.0 */ -HandlerResponse WSRequestHandler::HandleGetSourceTypesList(WSRequestHandler* req) +RpcResponse WSRequestHandler::GetSourceTypesList(const RpcRequest& request) { OBSDataArrayAutoRelease idsArray = obs_data_array_create(); @@ -142,7 +142,7 @@ HandlerResponse WSRequestHandler::HandleGetSourceTypesList(WSRequestHandler* req OBSDataAutoRelease response = obs_data_create(); obs_data_set_array(response, "types", idsArray); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -159,20 +159,20 @@ HandlerResponse WSRequestHandler::HandleGetSourceTypesList(WSRequestHandler* req * @category sources * @since 4.0.0 */ -HandlerResponse WSRequestHandler::HandleGetVolume(WSRequestHandler* req) +RpcResponse WSRequestHandler::GetVolume(const RpcRequest& request) { - if (!req->hasField("source")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("source")) { + return request.failed("missing request parameters"); } - QString sourceName = obs_data_get_string(req->data, "source"); + QString sourceName = obs_data_get_string(request.parameters(), "source"); if (sourceName.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName.toUtf8()); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } OBSDataAutoRelease response = obs_data_create(); @@ -180,7 +180,7 @@ HandlerResponse WSRequestHandler::HandleGetVolume(WSRequestHandler* req) obs_data_set_double(response, "volume", obs_source_get_volume(source)); obs_data_set_bool(response, "muted", obs_source_muted(source)); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -194,26 +194,26 @@ HandlerResponse WSRequestHandler::HandleGetVolume(WSRequestHandler* req) * @category sources * @since 4.0.0 */ -HandlerResponse WSRequestHandler::HandleSetVolume(WSRequestHandler* req) +RpcResponse WSRequestHandler::SetVolume(const RpcRequest& request) { - if (!req->hasField("source") || !req->hasField("volume")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("source") || !request.hasField("volume")) { + return request.failed("missing request parameters"); } - QString sourceName = obs_data_get_string(req->data, "source"); - float sourceVolume = obs_data_get_double(req->data, "volume"); + QString sourceName = obs_data_get_string(request.parameters(), "source"); + float sourceVolume = obs_data_get_double(request.parameters(), "volume"); if (sourceName.isEmpty() || sourceVolume < 0.0 || sourceVolume > 1.0) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName.toUtf8()); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } obs_source_set_volume(source, sourceVolume); - return req->SendOKResponse(); + return request.success(); } /** @@ -229,27 +229,27 @@ HandlerResponse WSRequestHandler::HandleSetVolume(WSRequestHandler* req) * @category sources * @since 4.0.0 */ -HandlerResponse WSRequestHandler::HandleGetMute(WSRequestHandler* req) +RpcResponse WSRequestHandler::GetMute(const RpcRequest& request) { - if (!req->hasField("source")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("source")) { + return request.failed("missing request parameters"); } - QString sourceName = obs_data_get_string(req->data, "source"); + QString sourceName = obs_data_get_string(request.parameters(), "source"); if (sourceName.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName.toUtf8()); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } OBSDataAutoRelease response = obs_data_create(); obs_data_set_string(response, "name", obs_source_get_name(source)); obs_data_set_bool(response, "muted", obs_source_muted(source)); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -263,26 +263,26 @@ HandlerResponse WSRequestHandler::HandleGetMute(WSRequestHandler* req) * @category sources * @since 4.0.0 */ -HandlerResponse WSRequestHandler::HandleSetMute(WSRequestHandler* req) +RpcResponse WSRequestHandler::SetMute(const RpcRequest& request) { - if (!req->hasField("source") || !req->hasField("mute")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("source") || !request.hasField("mute")) { + return request.failed("missing request parameters"); } - QString sourceName = obs_data_get_string(req->data, "source"); - bool mute = obs_data_get_bool(req->data, "mute"); + QString sourceName = obs_data_get_string(request.parameters(), "source"); + bool mute = obs_data_get_bool(request.parameters(), "mute"); if (sourceName.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName.toUtf8()); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } obs_source_set_muted(source, mute); - return req->SendOKResponse(); + return request.success(); } /** @@ -295,24 +295,24 @@ HandlerResponse WSRequestHandler::HandleSetMute(WSRequestHandler* req) * @category sources * @since 4.0.0 */ -HandlerResponse WSRequestHandler::HandleToggleMute(WSRequestHandler* req) +RpcResponse WSRequestHandler::ToggleMute(const RpcRequest& request) { - if (!req->hasField("source")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("source")) { + return request.failed("missing request parameters"); } - QString sourceName = obs_data_get_string(req->data, "source"); + QString sourceName = obs_data_get_string(request.parameters(), "source"); if (sourceName.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName.toUtf8()); if (!source) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } obs_source_set_muted(source, !obs_source_muted(source)); - return req->SendOKResponse(); + return request.success(); } /** @@ -326,26 +326,26 @@ HandlerResponse WSRequestHandler::HandleToggleMute(WSRequestHandler* req) * @category sources * @since 4.2.0 */ -HandlerResponse WSRequestHandler::HandleSetSyncOffset(WSRequestHandler* req) +RpcResponse WSRequestHandler::SetSyncOffset(const RpcRequest& request) { - if (!req->hasField("source") || !req->hasField("offset")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("source") || !request.hasField("offset")) { + return request.failed("missing request parameters"); } - QString sourceName = obs_data_get_string(req->data, "source"); - int64_t sourceSyncOffset = (int64_t)obs_data_get_int(req->data, "offset"); + QString sourceName = obs_data_get_string(request.parameters(), "source"); + int64_t sourceSyncOffset = (int64_t)obs_data_get_int(request.parameters(), "offset"); if (sourceName.isEmpty() || sourceSyncOffset < 0) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName.toUtf8()); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } obs_source_set_sync_offset(source, sourceSyncOffset); - return req->SendOKResponse(); + return request.success(); } /** @@ -361,27 +361,27 @@ HandlerResponse WSRequestHandler::HandleSetSyncOffset(WSRequestHandler* req) * @category sources * @since 4.2.0 */ -HandlerResponse WSRequestHandler::HandleGetSyncOffset(WSRequestHandler* req) +RpcResponse WSRequestHandler::GetSyncOffset(const RpcRequest& request) { - if (!req->hasField("source")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("source")) { + return request.failed("missing request parameters"); } - QString sourceName = obs_data_get_string(req->data, "source"); + QString sourceName = obs_data_get_string(request.parameters(), "source"); if (sourceName.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName.toUtf8()); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } OBSDataAutoRelease response = obs_data_create(); obs_data_set_string(response, "name", obs_source_get_name(source)); obs_data_set_int(response, "offset", obs_source_get_sync_offset(source)); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -399,24 +399,24 @@ HandlerResponse WSRequestHandler::HandleGetSyncOffset(WSRequestHandler* req) * @category sources * @since 4.3.0 */ -HandlerResponse WSRequestHandler::HandleGetSourceSettings(WSRequestHandler* req) +RpcResponse WSRequestHandler::GetSourceSettings(const RpcRequest& request) { - if (!req->hasField("sourceName")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("sourceName")) { + return request.failed("missing request parameters"); } - const char* sourceName = obs_data_get_string(req->data, "sourceName"); + const char* sourceName = obs_data_get_string(request.parameters(), "sourceName"); OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } - if (req->hasField("sourceType")) { + if (request.hasField("sourceType")) { QString actualSourceType = obs_source_get_id(source); - QString requestedType = obs_data_get_string(req->data, "sourceType"); + QString requestedType = obs_data_get_string(request.parameters(), "sourceType"); if (actualSourceType != requestedType) { - return req->SendErrorResponse("specified source exists but is not of expected type"); + return request.failed("specified source exists but is not of expected type"); } } @@ -427,7 +427,7 @@ HandlerResponse WSRequestHandler::HandleGetSourceSettings(WSRequestHandler* req) obs_data_set_string(response, "sourceType", obs_source_get_id(source)); obs_data_set_obj(response, "sourceSettings", sourceSettings); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -446,29 +446,29 @@ HandlerResponse WSRequestHandler::HandleGetSourceSettings(WSRequestHandler* req) * @category sources * @since 4.3.0 */ -HandlerResponse WSRequestHandler::HandleSetSourceSettings(WSRequestHandler* req) +RpcResponse WSRequestHandler::SetSourceSettings(const RpcRequest& request) { - if (!req->hasField("sourceName") || !req->hasField("sourceSettings")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("sourceName") || !request.hasField("sourceSettings")) { + return request.failed("missing request parameters"); } - const char* sourceName = obs_data_get_string(req->data, "sourceName"); + const char* sourceName = obs_data_get_string(request.parameters(), "sourceName"); OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } - if (req->hasField("sourceType")) { + if (request.hasField("sourceType")) { QString actualSourceType = obs_source_get_id(source); - QString requestedType = obs_data_get_string(req->data, "sourceType"); + QString requestedType = obs_data_get_string(request.parameters(), "sourceType"); if (actualSourceType != requestedType) { - return req->SendErrorResponse("specified source exists but is not of expected type"); + return request.failed("specified source exists but is not of expected type"); } } OBSDataAutoRelease currentSettings = obs_source_get_settings(source); - OBSDataAutoRelease newSettings = obs_data_get_obj(req->data, "sourceSettings"); + OBSDataAutoRelease newSettings = obs_data_get_obj(request.parameters(), "sourceSettings"); OBSDataAutoRelease sourceSettings = obs_data_create(); obs_data_apply(sourceSettings, currentSettings); @@ -482,7 +482,7 @@ HandlerResponse WSRequestHandler::HandleSetSourceSettings(WSRequestHandler* req) obs_data_set_string(response, "sourceType", obs_source_get_id(source)); obs_data_set_obj(response, "sourceSettings", sourceSettings); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -524,27 +524,27 @@ HandlerResponse WSRequestHandler::HandleSetSourceSettings(WSRequestHandler* req) * @category sources * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleGetTextGDIPlusProperties(WSRequestHandler* req) +RpcResponse WSRequestHandler::GetTextGDIPlusProperties(const RpcRequest& request) { - const char* sourceName = obs_data_get_string(req->data, "source"); + const char* sourceName = obs_data_get_string(request.parameters(), "source"); if (!sourceName) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } QString sourceId = obs_source_get_id(source); if (sourceId != "text_gdiplus") { - return req->SendErrorResponse("not a text gdi plus source"); + return request.failed("not a text gdi plus source"); } OBSDataAutoRelease response = obs_source_get_settings(source); obs_data_set_string(response, "source", obs_source_get_name(source)); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -585,77 +585,77 @@ HandlerResponse WSRequestHandler::HandleGetTextGDIPlusProperties(WSRequestHandle * @category sources * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleSetTextGDIPlusProperties(WSRequestHandler* req) +RpcResponse WSRequestHandler::SetTextGDIPlusProperties(const RpcRequest& request) { - if (!req->hasField("source")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("source")) { + return request.failed("missing request parameters"); } - const char* sourceName = obs_data_get_string(req->data, "source"); + const char* sourceName = obs_data_get_string(request.parameters(), "source"); if (!sourceName) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } QString sourceId = obs_source_get_id(source); if (sourceId != "text_gdiplus") { - return req->SendErrorResponse("not a text gdi plus source"); + return request.failed("not a text gdi plus source"); } OBSDataAutoRelease settings = obs_source_get_settings(source); - if (req->hasField("align")) { - obs_data_set_string(settings, "align", obs_data_get_string(req->data, "align")); + if (request.hasField("align")) { + obs_data_set_string(settings, "align", obs_data_get_string(request.parameters(), "align")); } - if (req->hasField("bk_color")) { - obs_data_set_int(settings, "bk_color", obs_data_get_int(req->data, "bk_color")); + if (request.hasField("bk_color")) { + obs_data_set_int(settings, "bk_color", obs_data_get_int(request.parameters(), "bk_color")); } - if (req->hasField("bk-opacity")) { - obs_data_set_int(settings, "bk_opacity", obs_data_get_int(req->data, "bk_opacity")); + if (request.hasField("bk-opacity")) { + obs_data_set_int(settings, "bk_opacity", obs_data_get_int(request.parameters(), "bk_opacity")); } - if (req->hasField("chatlog")) { - obs_data_set_bool(settings, "chatlog", obs_data_get_bool(req->data, "chatlog")); + if (request.hasField("chatlog")) { + obs_data_set_bool(settings, "chatlog", obs_data_get_bool(request.parameters(), "chatlog")); } - if (req->hasField("chatlog_lines")) { - obs_data_set_int(settings, "chatlog_lines", obs_data_get_int(req->data, "chatlog_lines")); + if (request.hasField("chatlog_lines")) { + obs_data_set_int(settings, "chatlog_lines", obs_data_get_int(request.parameters(), "chatlog_lines")); } - if (req->hasField("color")) { - obs_data_set_int(settings, "color", obs_data_get_int(req->data, "color")); + if (request.hasField("color")) { + obs_data_set_int(settings, "color", obs_data_get_int(request.parameters(), "color")); } - if (req->hasField("extents")) { - obs_data_set_bool(settings, "extents", obs_data_get_bool(req->data, "extents")); + if (request.hasField("extents")) { + obs_data_set_bool(settings, "extents", obs_data_get_bool(request.parameters(), "extents")); } - if (req->hasField("extents_wrap")) { - obs_data_set_bool(settings, "extents_wrap", obs_data_get_bool(req->data, "extents_wrap")); + if (request.hasField("extents_wrap")) { + obs_data_set_bool(settings, "extents_wrap", obs_data_get_bool(request.parameters(), "extents_wrap")); } - if (req->hasField("extents_cx")) { - obs_data_set_int(settings, "extents_cx", obs_data_get_int(req->data, "extents_cx")); + if (request.hasField("extents_cx")) { + obs_data_set_int(settings, "extents_cx", obs_data_get_int(request.parameters(), "extents_cx")); } - if (req->hasField("extents_cy")) { - obs_data_set_int(settings, "extents_cy", obs_data_get_int(req->data, "extents_cy")); + if (request.hasField("extents_cy")) { + obs_data_set_int(settings, "extents_cy", obs_data_get_int(request.parameters(), "extents_cy")); } - if (req->hasField("file")) { - obs_data_set_string(settings, "file", obs_data_get_string(req->data, "file")); + if (request.hasField("file")) { + obs_data_set_string(settings, "file", obs_data_get_string(request.parameters(), "file")); } - if (req->hasField("font")) { + if (request.hasField("font")) { OBSDataAutoRelease font_obj = obs_data_get_obj(settings, "font"); if (font_obj) { - OBSDataAutoRelease req_font_obj = obs_data_get_obj(req->data, "font"); + OBSDataAutoRelease req_font_obj = obs_data_get_obj(request.parameters(), "font"); if (obs_data_has_user_value(req_font_obj, "face")) { obs_data_set_string(font_obj, "face", obs_data_get_string(req_font_obj, "face")); @@ -675,57 +675,57 @@ HandlerResponse WSRequestHandler::HandleSetTextGDIPlusProperties(WSRequestHandle } } - if (req->hasField("gradient")) { - obs_data_set_bool(settings, "gradient", obs_data_get_bool(req->data, "gradient")); + if (request.hasField("gradient")) { + obs_data_set_bool(settings, "gradient", obs_data_get_bool(request.parameters(), "gradient")); } - if (req->hasField("gradient_color")) { - obs_data_set_int(settings, "gradient_color", obs_data_get_int(req->data, "gradient_color")); + if (request.hasField("gradient_color")) { + obs_data_set_int(settings, "gradient_color", obs_data_get_int(request.parameters(), "gradient_color")); } - if (req->hasField("gradient_dir")) { - obs_data_set_double(settings, "gradient_dir", obs_data_get_double(req->data, "gradient_dir")); + if (request.hasField("gradient_dir")) { + obs_data_set_double(settings, "gradient_dir", obs_data_get_double(request.parameters(), "gradient_dir")); } - if (req->hasField("gradient_opacity")) { - obs_data_set_int(settings, "gradient_opacity", obs_data_get_int(req->data, "gradient_opacity")); + if (request.hasField("gradient_opacity")) { + obs_data_set_int(settings, "gradient_opacity", obs_data_get_int(request.parameters(), "gradient_opacity")); } - if (req->hasField("outline")) { - obs_data_set_bool(settings, "outline", obs_data_get_bool(req->data, "outline")); + if (request.hasField("outline")) { + obs_data_set_bool(settings, "outline", obs_data_get_bool(request.parameters(), "outline")); } - if (req->hasField("outline_size")) { - obs_data_set_int(settings, "outline_size", obs_data_get_int(req->data, "outline_size")); + if (request.hasField("outline_size")) { + obs_data_set_int(settings, "outline_size", obs_data_get_int(request.parameters(), "outline_size")); } - if (req->hasField("outline_color")) { - obs_data_set_int(settings, "outline_color", obs_data_get_int(req->data, "outline_color")); + if (request.hasField("outline_color")) { + obs_data_set_int(settings, "outline_color", obs_data_get_int(request.parameters(), "outline_color")); } - if (req->hasField("outline_opacity")) { - obs_data_set_int(settings, "outline_opacity", obs_data_get_int(req->data, "outline_opacity")); + if (request.hasField("outline_opacity")) { + obs_data_set_int(settings, "outline_opacity", obs_data_get_int(request.parameters(), "outline_opacity")); } - if (req->hasField("read_from_file")) { - obs_data_set_bool(settings, "read_from_file", obs_data_get_bool(req->data, "read_from_file")); + if (request.hasField("read_from_file")) { + obs_data_set_bool(settings, "read_from_file", obs_data_get_bool(request.parameters(), "read_from_file")); } - if (req->hasField("text")) { - obs_data_set_string(settings, "text", obs_data_get_string(req->data, "text")); + if (request.hasField("text")) { + obs_data_set_string(settings, "text", obs_data_get_string(request.parameters(), "text")); } - if (req->hasField("valign")) { - obs_data_set_string(settings, "valign", obs_data_get_string(req->data, "valign")); + if (request.hasField("valign")) { + obs_data_set_string(settings, "valign", obs_data_get_string(request.parameters(), "valign")); } - if (req->hasField("vertical")) { - obs_data_set_bool(settings, "vertical", obs_data_get_bool(req->data, "vertical")); + if (request.hasField("vertical")) { + obs_data_set_bool(settings, "vertical", obs_data_get_bool(request.parameters(), "vertical")); } obs_source_update(source, settings); - return req->SendOKResponse(); + return request.success(); } /** @@ -755,27 +755,27 @@ HandlerResponse WSRequestHandler::HandleSetTextGDIPlusProperties(WSRequestHandle * @category sources * @since 4.5.0 */ -HandlerResponse WSRequestHandler::HandleGetTextFreetype2Properties(WSRequestHandler* req) +RpcResponse WSRequestHandler::GetTextFreetype2Properties(const RpcRequest& request) { - const char* sourceName = obs_data_get_string(req->data, "source"); + const char* sourceName = obs_data_get_string(request.parameters(), "source"); if (!sourceName) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } QString sourceId = obs_source_get_id(source); if (sourceId != "text_ft2_source") { - return req->SendErrorResponse("not a freetype 2 source"); + return request.failed("not a freetype 2 source"); } OBSDataAutoRelease response = obs_source_get_settings(source); obs_data_set_string(response, "source", sourceName); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -803,45 +803,45 @@ HandlerResponse WSRequestHandler::HandleGetTextFreetype2Properties(WSRequestHand * @category sources * @since 4.5.0 */ -HandlerResponse WSRequestHandler::HandleSetTextFreetype2Properties(WSRequestHandler* req) +RpcResponse WSRequestHandler::SetTextFreetype2Properties(const RpcRequest& request) { - const char* sourceName = obs_data_get_string(req->data, "source"); + const char* sourceName = obs_data_get_string(request.parameters(), "source"); if (!sourceName) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } QString sourceId = obs_source_get_id(source); if (sourceId != "text_ft2_source") { - return req->SendErrorResponse("not text freetype 2 source"); + return request.failed("not text freetype 2 source"); } OBSDataAutoRelease settings = obs_source_get_settings(source); - if (req->hasField("color1")) { - obs_data_set_int(settings, "color1", obs_data_get_int(req->data, "color1")); + if (request.hasField("color1")) { + obs_data_set_int(settings, "color1", obs_data_get_int(request.parameters(), "color1")); } - if (req->hasField("color2")) { - obs_data_set_int(settings, "color2", obs_data_get_int(req->data, "color2")); + if (request.hasField("color2")) { + obs_data_set_int(settings, "color2", obs_data_get_int(request.parameters(), "color2")); } - if (req->hasField("custom_width")) { - obs_data_set_int(settings, "custom_width", obs_data_get_int(req->data, "custom_width")); + if (request.hasField("custom_width")) { + obs_data_set_int(settings, "custom_width", obs_data_get_int(request.parameters(), "custom_width")); } - if (req->hasField("drop_shadow")) { - obs_data_set_bool(settings, "drop_shadow", obs_data_get_bool(req->data, "drop_shadow")); + if (request.hasField("drop_shadow")) { + obs_data_set_bool(settings, "drop_shadow", obs_data_get_bool(request.parameters(), "drop_shadow")); } - if (req->hasField("font")) { + if (request.hasField("font")) { OBSDataAutoRelease font_obj = obs_data_get_obj(settings, "font"); if (font_obj) { - OBSDataAutoRelease req_font_obj = obs_data_get_obj(req->data, "font"); + OBSDataAutoRelease req_font_obj = obs_data_get_obj(request.parameters(), "font"); if (obs_data_has_user_value(req_font_obj, "face")) { obs_data_set_string(font_obj, "face", obs_data_get_string(req_font_obj, "face")); @@ -861,33 +861,33 @@ HandlerResponse WSRequestHandler::HandleSetTextFreetype2Properties(WSRequestHand } } - if (req->hasField("from_file")) { - obs_data_set_bool(settings, "from_file", obs_data_get_bool(req->data, "from_file")); + if (request.hasField("from_file")) { + obs_data_set_bool(settings, "from_file", obs_data_get_bool(request.parameters(), "from_file")); } - if (req->hasField("log_mode")) { - obs_data_set_bool(settings, "log_mode", obs_data_get_bool(req->data, "log_mode")); + if (request.hasField("log_mode")) { + obs_data_set_bool(settings, "log_mode", obs_data_get_bool(request.parameters(), "log_mode")); } - if (req->hasField("outline")) { - obs_data_set_bool(settings, "outline", obs_data_get_bool(req->data, "outline")); + if (request.hasField("outline")) { + obs_data_set_bool(settings, "outline", obs_data_get_bool(request.parameters(), "outline")); } - if (req->hasField("text")) { - obs_data_set_string(settings, "text", obs_data_get_string(req->data, "text")); + if (request.hasField("text")) { + obs_data_set_string(settings, "text", obs_data_get_string(request.parameters(), "text")); } - if (req->hasField("text_file")) { - obs_data_set_string(settings, "text_file", obs_data_get_string(req->data, "text_file")); + if (request.hasField("text_file")) { + obs_data_set_string(settings, "text_file", obs_data_get_string(request.parameters(), "text_file")); } - if (req->hasField("word_wrap")) { - obs_data_set_bool(settings, "word_wrap", obs_data_get_bool(req->data, "word_wrap")); + if (request.hasField("word_wrap")) { + obs_data_set_bool(settings, "word_wrap", obs_data_get_bool(request.parameters(), "word_wrap")); } obs_source_update(source, settings); - return req->SendOKResponse(); + return request.success(); } /** @@ -910,27 +910,27 @@ HandlerResponse WSRequestHandler::HandleSetTextFreetype2Properties(WSRequestHand * @category sources * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleGetBrowserSourceProperties(WSRequestHandler* req) +RpcResponse WSRequestHandler::GetBrowserSourceProperties(const RpcRequest& request) { - const char* sourceName = obs_data_get_string(req->data, "source"); + const char* sourceName = obs_data_get_string(request.parameters(), "source"); if (!sourceName) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } QString sourceId = obs_source_get_id(source); if (sourceId != "browser_source" && sourceId != "linuxbrowser-source") { - return req->SendErrorResponse("not a browser source"); + return request.failed("not a browser source"); } OBSDataAutoRelease response = obs_source_get_settings(source); obs_data_set_string(response, "source", obs_source_get_name(source)); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -952,68 +952,68 @@ HandlerResponse WSRequestHandler::HandleGetBrowserSourceProperties(WSRequestHand * @category sources * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleSetBrowserSourceProperties(WSRequestHandler* req) +RpcResponse WSRequestHandler::SetBrowserSourceProperties(const RpcRequest& request) { - if (!req->hasField("source")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("source")) { + return request.failed("missing request parameters"); } - const char* sourceName = obs_data_get_string(req->data, "source"); + const char* sourceName = obs_data_get_string(request.parameters(), "source"); if (!sourceName) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } QString sourceId = obs_source_get_id(source); if(sourceId != "browser_source" && sourceId != "linuxbrowser-source") { - return req->SendErrorResponse("not a browser source"); + return request.failed("not a browser source"); } OBSDataAutoRelease settings = obs_source_get_settings(source); - if (req->hasField("restart_when_active")) { - obs_data_set_bool(settings, "restart_when_active", obs_data_get_bool(req->data, "restart_when_active")); + if (request.hasField("restart_when_active")) { + obs_data_set_bool(settings, "restart_when_active", obs_data_get_bool(request.parameters(), "restart_when_active")); } - if (req->hasField("shutdown")) { - obs_data_set_bool(settings, "shutdown", obs_data_get_bool(req->data, "shutdown")); + if (request.hasField("shutdown")) { + obs_data_set_bool(settings, "shutdown", obs_data_get_bool(request.parameters(), "shutdown")); } - if (req->hasField("is_local_file")) { - obs_data_set_bool(settings, "is_local_file", obs_data_get_bool(req->data, "is_local_file")); + if (request.hasField("is_local_file")) { + obs_data_set_bool(settings, "is_local_file", obs_data_get_bool(request.parameters(), "is_local_file")); } - if (req->hasField("local_file")) { - obs_data_set_string(settings, "local_file", obs_data_get_string(req->data, "local_file")); + if (request.hasField("local_file")) { + obs_data_set_string(settings, "local_file", obs_data_get_string(request.parameters(), "local_file")); } - if (req->hasField("url")) { - obs_data_set_string(settings, "url", obs_data_get_string(req->data, "url")); + if (request.hasField("url")) { + obs_data_set_string(settings, "url", obs_data_get_string(request.parameters(), "url")); } - if (req->hasField("css")) { - obs_data_set_string(settings, "css", obs_data_get_string(req->data, "css")); + if (request.hasField("css")) { + obs_data_set_string(settings, "css", obs_data_get_string(request.parameters(), "css")); } - if (req->hasField("width")) { - obs_data_set_int(settings, "width", obs_data_get_int(req->data, "width")); + if (request.hasField("width")) { + obs_data_set_int(settings, "width", obs_data_get_int(request.parameters(), "width")); } - if (req->hasField("height")) { - obs_data_set_int(settings, "height", obs_data_get_int(req->data, "height")); + if (request.hasField("height")) { + obs_data_set_int(settings, "height", obs_data_get_int(request.parameters(), "height")); } - if (req->hasField("fps")) { - obs_data_set_int(settings, "fps", obs_data_get_int(req->data, "fps")); + if (request.hasField("fps")) { + obs_data_set_int(settings, "fps", obs_data_get_int(request.parameters(), "fps")); } obs_source_update(source, settings); - return req->SendOKResponse(); + return request.success(); } /** @@ -1030,7 +1030,7 @@ HandlerResponse WSRequestHandler::HandleSetBrowserSourceProperties(WSRequestHand * @category sources * @since 4.1.0 */ -HandlerResponse WSRequestHandler::HandleGetSpecialSources(WSRequestHandler* req) +RpcResponse WSRequestHandler::GetSpecialSources(const RpcRequest& request) { OBSDataAutoRelease response = obs_data_create(); @@ -1052,7 +1052,7 @@ HandlerResponse WSRequestHandler::HandleGetSpecialSources(WSRequestHandler* req) } } - return req->SendOKResponse(response); + return request.success(response); } /** @@ -1071,23 +1071,23 @@ HandlerResponse WSRequestHandler::HandleGetSpecialSources(WSRequestHandler* req) * @category sources * @since 4.5.0 */ -HandlerResponse WSRequestHandler::HandleGetSourceFilters(WSRequestHandler* req) +RpcResponse WSRequestHandler::GetSourceFilters(const RpcRequest& request) { - if (!req->hasField("sourceName")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("sourceName")) { + return request.failed("missing request parameters"); } - const char* sourceName = obs_data_get_string(req->data, "sourceName"); + const char* sourceName = obs_data_get_string(request.parameters(), "sourceName"); OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } OBSDataArrayAutoRelease filters = Utils::GetSourceFiltersList(source, true); OBSDataAutoRelease response = obs_data_create(); obs_data_set_array(response, "filters", filters); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -1106,26 +1106,26 @@ HandlerResponse WSRequestHandler::HandleGetSourceFilters(WSRequestHandler* req) * @category sources * @since 4.7.0 */ -HandlerResponse WSRequestHandler::HandleGetSourceFilterInfo(WSRequestHandler* req) +RpcResponse WSRequestHandler::GetSourceFilterInfo(const RpcRequest& request) { - if (!req->hasField("sourceName") || !req->hasField("filterName")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("sourceName") || !request.hasField("filterName")) { + return request.failed("missing request parameters"); } - const char* sourceName = obs_data_get_string(req->data, "sourceName"); + const char* sourceName = obs_data_get_string(request.parameters(), "sourceName"); OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } - const char* filterName = obs_data_get_string(req->data, "filterName"); + const char* filterName = obs_data_get_string(request.parameters(), "filterName"); OBSSourceAutoRelease filter = obs_source_get_filter_by_name(source, filterName); if (!filter) { - return req->SendErrorResponse("specified filter doesn't exist on specified source"); + return request.failed("specified filter doesn't exist on specified source"); } OBSDataAutoRelease response = Utils::GetSourceFilterInfo(filter, true); - return req->SendOKResponse(response); + return request.success(response); } /** @@ -1141,40 +1141,40 @@ HandlerResponse WSRequestHandler::HandleGetSourceFilterInfo(WSRequestHandler* re * @category sources * @since 4.5.0 */ -HandlerResponse WSRequestHandler::HandleAddFilterToSource(WSRequestHandler* req) +RpcResponse WSRequestHandler::AddFilterToSource(const RpcRequest& request) { - if (!req->hasField("sourceName") || !req->hasField("filterName") || - !req->hasField("filterType") || !req->hasField("filterSettings")) + if (!request.hasField("sourceName") || !request.hasField("filterName") || + !request.hasField("filterType") || !request.hasField("filterSettings")) { - return req->SendErrorResponse("missing request parameters"); + return request.failed("missing request parameters"); } - const char* sourceName = obs_data_get_string(req->data, "sourceName"); - const char* filterName = obs_data_get_string(req->data, "filterName"); - const char* filterType = obs_data_get_string(req->data, "filterType"); - OBSDataAutoRelease filterSettings = obs_data_get_obj(req->data, "filterSettings"); + const char* sourceName = obs_data_get_string(request.parameters(), "sourceName"); + const char* filterName = obs_data_get_string(request.parameters(), "filterName"); + const char* filterType = obs_data_get_string(request.parameters(), "filterType"); + OBSDataAutoRelease filterSettings = obs_data_get_obj(request.parameters(), "filterSettings"); OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } OBSSourceAutoRelease existingFilter = obs_source_get_filter_by_name(source, filterName); if (existingFilter) { - return req->SendErrorResponse("filter name already taken"); + return request.failed("filter name already taken"); } OBSSourceAutoRelease filter = obs_source_create_private(filterType, filterName, filterSettings); if (!filter) { - return req->SendErrorResponse("filter creation failed"); + return request.failed("filter creation failed"); } if (obs_source_get_type(filter) != OBS_SOURCE_TYPE_FILTER) { - return req->SendErrorResponse("invalid filter type"); + return request.failed("invalid filter type"); } obs_source_filter_add(source, filter); - return req->SendOKResponse(); + return request.success(); } /** @@ -1188,28 +1188,28 @@ HandlerResponse WSRequestHandler::HandleAddFilterToSource(WSRequestHandler* req) * @category sources * @since 4.5.0 */ -HandlerResponse WSRequestHandler::HandleRemoveFilterFromSource(WSRequestHandler* req) +RpcResponse WSRequestHandler::RemoveFilterFromSource(const RpcRequest& request) { - if (!req->hasField("sourceName") || !req->hasField("filterName")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("sourceName") || !request.hasField("filterName")) { + return request.failed("missing request parameters"); } - const char* sourceName = obs_data_get_string(req->data, "sourceName"); - const char* filterName = obs_data_get_string(req->data, "filterName"); + const char* sourceName = obs_data_get_string(request.parameters(), "sourceName"); + const char* filterName = obs_data_get_string(request.parameters(), "filterName"); OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } OBSSourceAutoRelease filter = obs_source_get_filter_by_name(source, filterName); if (!filter) { - return req->SendErrorResponse("specified filter doesn't exist"); + return request.failed("specified filter doesn't exist"); } obs_source_filter_remove(source, filter); - return req->SendOKResponse(); + return request.success(); } /** @@ -1224,28 +1224,28 @@ HandlerResponse WSRequestHandler::HandleRemoveFilterFromSource(WSRequestHandler* * @category sources * @since 4.5.0 */ -HandlerResponse WSRequestHandler::HandleReorderSourceFilter(WSRequestHandler* req) +RpcResponse WSRequestHandler::ReorderSourceFilter(const RpcRequest& request) { - if (!req->hasField("sourceName") || !req->hasField("filterName") || !req->hasField("newIndex")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("sourceName") || !request.hasField("filterName") || !request.hasField("newIndex")) { + return request.failed("missing request parameters"); } - const char* sourceName = obs_data_get_string(req->data, "sourceName"); - const char* filterName = obs_data_get_string(req->data, "filterName"); - int newIndex = obs_data_get_int(req->data, "newIndex"); + const char* sourceName = obs_data_get_string(request.parameters(), "sourceName"); + const char* filterName = obs_data_get_string(request.parameters(), "filterName"); + int newIndex = obs_data_get_int(request.parameters(), "newIndex"); if (newIndex < 0) { - return req->SendErrorResponse("invalid index"); + return request.failed("invalid index"); } OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } OBSSourceAutoRelease filter = obs_source_get_filter_by_name(source, filterName); if (!filter) { - return req->SendErrorResponse("specified filter doesn't exist"); + return request.failed("specified filter doesn't exist"); } struct filterSearch { @@ -1265,7 +1265,7 @@ HandlerResponse WSRequestHandler::HandleReorderSourceFilter(WSRequestHandler* re int lastFilterIndex = ctx.i + 1; if (newIndex > lastFilterIndex) { - return req->SendErrorResponse("index out of bounds"); + return request.failed("index out of bounds"); } int currentIndex = ctx.filterIndex; @@ -1282,7 +1282,7 @@ HandlerResponse WSRequestHandler::HandleReorderSourceFilter(WSRequestHandler* re } } - return req->SendOKResponse(); + return request.success(); } /** @@ -1297,24 +1297,24 @@ HandlerResponse WSRequestHandler::HandleReorderSourceFilter(WSRequestHandler* re * @category sources * @since 4.5.0 */ -HandlerResponse WSRequestHandler::HandleMoveSourceFilter(WSRequestHandler* req) +RpcResponse WSRequestHandler::MoveSourceFilter(const RpcRequest& request) { - if (!req->hasField("sourceName") || !req->hasField("filterName") || !req->hasField("movementType")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("sourceName") || !request.hasField("filterName") || !request.hasField("movementType")) { + return request.failed("missing request parameters"); } - const char* sourceName = obs_data_get_string(req->data, "sourceName"); - const char* filterName = obs_data_get_string(req->data, "filterName"); - QString movementType(obs_data_get_string(req->data, "movementType")); + const char* sourceName = obs_data_get_string(request.parameters(), "sourceName"); + const char* filterName = obs_data_get_string(request.parameters(), "filterName"); + QString movementType(obs_data_get_string(request.parameters(), "movementType")); OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } OBSSourceAutoRelease filter = obs_source_get_filter_by_name(source, filterName); if (!filter) { - return req->SendErrorResponse("specified filter doesn't exist"); + return request.failed("specified filter doesn't exist"); } obs_order_movement movement; @@ -1331,12 +1331,12 @@ HandlerResponse WSRequestHandler::HandleMoveSourceFilter(WSRequestHandler* req) movement = OBS_ORDER_MOVE_BOTTOM; } else { - return req->SendErrorResponse("invalid value for movementType: must be either 'up', 'down', 'top' or 'bottom'."); + return request.failed("invalid value for movementType: must be either 'up', 'down', 'top' or 'bottom'."); } obs_source_filter_set_order(source, filter, movement); - return req->SendOKResponse(); + return request.success(); } /** @@ -1351,31 +1351,31 @@ HandlerResponse WSRequestHandler::HandleMoveSourceFilter(WSRequestHandler* req) * @category sources * @since 4.5.0 */ -HandlerResponse WSRequestHandler::HandleSetSourceFilterSettings(WSRequestHandler* req) +RpcResponse WSRequestHandler::SetSourceFilterSettings(const RpcRequest& request) { - if (!req->hasField("sourceName") || !req->hasField("filterName") || !req->hasField("filterSettings")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("sourceName") || !request.hasField("filterName") || !request.hasField("filterSettings")) { + return request.failed("missing request parameters"); } - const char* sourceName = obs_data_get_string(req->data, "sourceName"); - const char* filterName = obs_data_get_string(req->data, "filterName"); - OBSDataAutoRelease newFilterSettings = obs_data_get_obj(req->data, "filterSettings"); + const char* sourceName = obs_data_get_string(request.parameters(), "sourceName"); + const char* filterName = obs_data_get_string(request.parameters(), "filterName"); + OBSDataAutoRelease newFilterSettings = obs_data_get_obj(request.parameters(), "filterSettings"); OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } OBSSourceAutoRelease filter = obs_source_get_filter_by_name(source, filterName); if (!filter) { - return req->SendErrorResponse("specified filter doesn't exist"); + return request.failed("specified filter doesn't exist"); } OBSDataAutoRelease settings = obs_source_get_settings(filter); obs_data_apply(settings, newFilterSettings); obs_source_update(filter, settings); - return req->SendOKResponse(); + return request.success(); } /** @@ -1390,28 +1390,28 @@ HandlerResponse WSRequestHandler::HandleSetSourceFilterSettings(WSRequestHandler * @category sources * @since 4.7.0 */ -HandlerResponse WSRequestHandler::HandleSetSourceFilterVisibility(WSRequestHandler* req) +RpcResponse WSRequestHandler::SetSourceFilterVisibility(const RpcRequest& request) { - if (!req->hasField("sourceName") || !req->hasField("filterName") || !req->hasField("filterEnabled")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("sourceName") || !request.hasField("filterName") || !request.hasField("filterEnabled")) { + return request.failed("missing request parameters"); } - const char* sourceName = obs_data_get_string(req->data, "sourceName"); + const char* sourceName = obs_data_get_string(request.parameters(), "sourceName"); OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist"); + return request.failed("specified source doesn't exist"); } - const char* filterName = obs_data_get_string(req->data, "filterName"); + const char* filterName = obs_data_get_string(request.parameters(), "filterName"); OBSSourceAutoRelease filter = obs_source_get_filter_by_name(source, filterName); if (!filter) { - return req->SendErrorResponse("specified filter doesn't exist on specified source"); + return request.failed("specified filter doesn't exist on specified source"); } - bool filterEnabled = obs_data_get_bool(req->data, "filterEnabled"); + bool filterEnabled = obs_data_get_bool(request.parameters(), "filterEnabled"); obs_source_set_enabled(filter, filterEnabled); - return req->SendOKResponse(); + return request.success(); } /** @@ -1439,19 +1439,19 @@ HandlerResponse WSRequestHandler::HandleSetSourceFilterVisibility(WSRequestHandl * @category sources * @since 4.6.0 */ -HandlerResponse WSRequestHandler::HandleTakeSourceScreenshot(WSRequestHandler* req) { - if (!req->hasField("sourceName")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::TakeSourceScreenshot(const RpcRequest& request) { + if (!request.hasField("sourceName")) { + return request.failed("missing request parameters"); } - if (!req->hasField("embedPictureFormat") && !req->hasField("saveToFilePath")) { - return req->SendErrorResponse("At least 'embedPictureFormat' or 'saveToFilePath' must be specified"); + if (!request.hasField("embedPictureFormat") && !request.hasField("saveToFilePath")) { + return request.failed("At least 'embedPictureFormat' or 'saveToFilePath' must be specified"); } - const char* sourceName = obs_data_get_string(req->data, "sourceName"); + const char* sourceName = obs_data_get_string(request.parameters(), "sourceName"); OBSSourceAutoRelease source = obs_get_source_by_name(sourceName); if (!source) { - return req->SendErrorResponse("specified source doesn't exist");; + return request.failed("specified source doesn't exist");; } const uint32_t sourceWidth = obs_source_get_base_width(source); @@ -1461,18 +1461,18 @@ HandlerResponse WSRequestHandler::HandleTakeSourceScreenshot(WSRequestHandler* r uint32_t imgWidth = sourceWidth; uint32_t imgHeight = sourceHeight; - if (req->hasField("width")) { - imgWidth = obs_data_get_int(req->data, "width"); + if (request.hasField("width")) { + imgWidth = obs_data_get_int(request.parameters(), "width"); - if (!req->hasField("height")) { + if (!request.hasField("height")) { imgHeight = ((double)imgWidth / sourceAspectRatio); } } - if (req->hasField("height")) { - imgHeight = obs_data_get_int(req->data, "height"); + if (request.hasField("height")) { + imgHeight = obs_data_get_int(request.parameters(), "height"); - if (!req->hasField("width")) { + if (!request.hasField("width")) { imgWidth = ((double)imgHeight * sourceAspectRatio); } } @@ -1524,25 +1524,25 @@ HandlerResponse WSRequestHandler::HandleTakeSourceScreenshot(WSRequestHandler* r obs_leave_graphics(); if (!renderSuccess) { - return req->SendErrorResponse("Source render failed"); + return request.failed("Source render failed"); } OBSDataAutoRelease response = obs_data_create(); - if (req->hasField("embedPictureFormat")) { - const char* pictureFormat = obs_data_get_string(req->data, "embedPictureFormat"); + if (request.hasField("embedPictureFormat")) { + const char* pictureFormat = obs_data_get_string(request.parameters(), "embedPictureFormat"); QByteArrayList supportedFormats = QImageWriter::supportedImageFormats(); if (!supportedFormats.contains(pictureFormat)) { QString errorMessage = QString("Unsupported picture format: %1").arg(pictureFormat); - return req->SendErrorResponse(errorMessage.toUtf8()); + return request.failed(errorMessage.toUtf8()); } QByteArray encodedImgBytes; QBuffer buffer(&encodedImgBytes); buffer.open(QBuffer::WriteOnly); if (!sourceImage.save(&buffer, pictureFormat)) { - return req->SendErrorResponse("Embed image encoding failed"); + return request.failed("Embed image encoding failed"); } buffer.close(); @@ -1554,17 +1554,17 @@ HandlerResponse WSRequestHandler::HandleTakeSourceScreenshot(WSRequestHandler* r obs_data_set_string(response, "img", imgBase64.toUtf8()); } - if (req->hasField("saveToFilePath")) { - QString filePathStr = obs_data_get_string(req->data, "saveToFilePath"); + if (request.hasField("saveToFilePath")) { + QString filePathStr = obs_data_get_string(request.parameters(), "saveToFilePath"); QFileInfo filePathInfo(filePathStr); QString absoluteFilePath = filePathInfo.absoluteFilePath(); if (!sourceImage.save(absoluteFilePath)) { - return req->SendErrorResponse("Image save failed"); + return request.failed("Image save failed"); } obs_data_set_string(response, "imageFile", absoluteFilePath.toUtf8()); } obs_data_set_string(response, "sourceName", obs_source_get_name(source)); - return req->SendOKResponse(response); + return request.success(response); } From 9389ceaf4f3cdf1b1beebd310afc919bd7c03cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:33:13 +0100 Subject: [PATCH 25/41] WSRequestHandler(SceneItems): fixes --- src/WSRequestHandler_SceneItems.cpp | 230 ++++++++++++++-------------- 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/src/WSRequestHandler_SceneItems.cpp b/src/WSRequestHandler_SceneItems.cpp index e2e6d188..5bce4d6f 100644 --- a/src/WSRequestHandler_SceneItems.cpp +++ b/src/WSRequestHandler_SceneItems.cpp @@ -38,31 +38,31 @@ * @category scene items * @since 4.3.0 */ -HandlerResponse WSRequestHandler::HandleGetSceneItemProperties(WSRequestHandler* req) { - if (!req->hasField("item")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::GetSceneItemProperties(const RpcRequest& request) { + if (!request.hasField("item")) { + return request.failed("missing request parameters"); } - QString itemName = obs_data_get_string(req->data, "item"); + QString itemName = obs_data_get_string(request.parameters(), "item"); if (itemName.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } - QString sceneName = obs_data_get_string(req->data, "scene-name"); + QString sceneName = obs_data_get_string(request.parameters(), "scene-name"); OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { - return req->SendErrorResponse("requested scene doesn't exist"); + return request.failed("requested scene doesn't exist"); } OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromName(scene, itemName); if (!sceneItem) { - return req->SendErrorResponse("specified scene item doesn't exist"); + return request.failed("specified scene item doesn't exist"); } OBSDataAutoRelease data = Utils::GetSceneItemPropertiesData(sceneItem); obs_data_set_string(data, "name", itemName.toUtf8()); - return req->SendOKResponse(data); + return request.success(data); } /** @@ -93,38 +93,38 @@ HandlerResponse WSRequestHandler::HandleGetSceneItemProperties(WSRequestHandler* * @category scene items * @since 4.3.0 */ -HandlerResponse WSRequestHandler::HandleSetSceneItemProperties(WSRequestHandler* req) { - if (!req->hasField("item")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::SetSceneItemProperties(const RpcRequest& request) { + if (!request.hasField("item")) { + return request.failed("missing request parameters"); } - QString itemName = obs_data_get_string(req->data, "item"); + QString itemName = obs_data_get_string(request.parameters(), "item"); if (itemName.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } - QString sceneName = obs_data_get_string(req->data, "scene-name"); + QString sceneName = obs_data_get_string(request.parameters(), "scene-name"); OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { - return req->SendErrorResponse("requested scene doesn't exist"); + return request.failed("requested scene doesn't exist"); } OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromName(scene, itemName); if (!sceneItem) { - return req->SendErrorResponse("specified scene item doesn't exist"); + return request.failed("specified scene item doesn't exist"); } bool badRequest = false; - OBSDataAutoRelease errorMessage = obs_data_create(); + OBSDataAutoRelease errorData = obs_data_create(); obs_sceneitem_defer_update_begin(sceneItem); - if (req->hasField("position")) { + if (request.hasField("position")) { vec2 oldPosition; OBSDataAutoRelease positionError = obs_data_create(); obs_sceneitem_get_pos(sceneItem, &oldPosition); - OBSDataAutoRelease reqPosition = obs_data_get_obj(req->data, "position"); + OBSDataAutoRelease reqPosition = obs_data_get_obj(request.parameters(), "position"); vec2 newPosition = oldPosition; if (obs_data_has_user_value(reqPosition, "x")) { newPosition.x = obs_data_get_int(reqPosition, "x"); @@ -140,20 +140,20 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemProperties(WSRequestHandler* else { badRequest = true; obs_data_set_string(positionError, "alignment", "invalid"); - obs_data_set_obj(errorMessage, "position", positionError); + obs_data_set_obj(errorData, "position", positionError); } } obs_sceneitem_set_pos(sceneItem, &newPosition); } - if (req->hasField("rotation")) { - obs_sceneitem_set_rot(sceneItem, (float)obs_data_get_double(req->data, "rotation")); + if (request.hasField("rotation")) { + obs_sceneitem_set_rot(sceneItem, (float)obs_data_get_double(request.parameters(), "rotation")); } - if (req->hasField("scale")) { + if (request.hasField("scale")) { vec2 oldScale; obs_sceneitem_get_scale(sceneItem, &oldScale); - OBSDataAutoRelease reqScale = obs_data_get_obj(req->data, "scale"); + OBSDataAutoRelease reqScale = obs_data_get_obj(request.parameters(), "scale"); vec2 newScale = oldScale; if (obs_data_has_user_value(reqScale, "x")) { newScale.x = obs_data_get_double(reqScale, "x"); @@ -164,10 +164,10 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemProperties(WSRequestHandler* obs_sceneitem_set_scale(sceneItem, &newScale); } - if (req->hasField("crop")) { + if (request.hasField("crop")) { obs_sceneitem_crop oldCrop; obs_sceneitem_get_crop(sceneItem, &oldCrop); - OBSDataAutoRelease reqCrop = obs_data_get_obj(req->data, "crop"); + OBSDataAutoRelease reqCrop = obs_data_get_obj(request.parameters(), "crop"); obs_sceneitem_crop newCrop = oldCrop; if (obs_data_has_user_value(reqCrop, "top")) { newCrop.top = obs_data_get_int(reqCrop, "top"); @@ -184,18 +184,18 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemProperties(WSRequestHandler* obs_sceneitem_set_crop(sceneItem, &newCrop); } - if (req->hasField("visible")) { - obs_sceneitem_set_visible(sceneItem, obs_data_get_bool(req->data, "visible")); + if (request.hasField("visible")) { + obs_sceneitem_set_visible(sceneItem, obs_data_get_bool(request.parameters(), "visible")); } - if (req->hasField("locked")) { - obs_sceneitem_set_locked(sceneItem, obs_data_get_bool(req->data, "locked")); + if (request.hasField("locked")) { + obs_sceneitem_set_locked(sceneItem, obs_data_get_bool(request.parameters(), "locked")); } - if (req->hasField("bounds")) { + if (request.hasField("bounds")) { bool badBounds = false; OBSDataAutoRelease boundsError = obs_data_create(); - OBSDataAutoRelease reqBounds = obs_data_get_obj(req->data, "bounds"); + OBSDataAutoRelease reqBounds = obs_data_get_obj(request.parameters(), "bounds"); if (obs_data_has_user_value(reqBounds, "type")) { QString newBoundsType = obs_data_get_string(reqBounds, "type"); if (newBoundsType == "OBS_BOUNDS_NONE") { @@ -245,17 +245,17 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemProperties(WSRequestHandler* } } if (badBounds) { - obs_data_set_obj(errorMessage, "bounds", boundsError); + obs_data_set_obj(errorData, "bounds", boundsError); } } obs_sceneitem_defer_update_end(sceneItem); if (badRequest) { - return req->SendErrorResponse(errorMessage); + return request.failed("invalid properties", errorData); } - return req->SendOKResponse(); + return request.success(); } /** @@ -269,27 +269,27 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemProperties(WSRequestHandler* * @category scene items * @since 4.2.0 */ -HandlerResponse WSRequestHandler::HandleResetSceneItem(WSRequestHandler* req) { +RpcResponse WSRequestHandler::ResetSceneItem(const RpcRequest& request) { // TODO: remove this request, or refactor it to ResetSource - if (!req->hasField("item")) { - return req->SendErrorResponse("missing request parameters"); + if (!request.hasField("item")) { + return request.failed("missing request parameters"); } - const char* itemName = obs_data_get_string(req->data, "item"); + const char* itemName = obs_data_get_string(request.parameters(), "item"); if (!itemName) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } - const char* sceneName = obs_data_get_string(req->data, "scene-name"); + const char* sceneName = obs_data_get_string(request.parameters(), "scene-name"); OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { - return req->SendErrorResponse("requested scene doesn't exist"); + return request.failed("requested scene doesn't exist"); } OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromName(scene, itemName); if (!sceneItem) { - return req->SendErrorResponse("specified scene item doesn't exist"); + return request.failed("specified scene item doesn't exist"); } OBSSource sceneItemSource = obs_sceneitem_get_source(sceneItem); @@ -297,7 +297,7 @@ HandlerResponse WSRequestHandler::HandleResetSceneItem(WSRequestHandler* req) { OBSDataAutoRelease settings = obs_source_get_settings(sceneItemSource); obs_source_update(sceneItemSource, settings); - return req->SendOKResponse(); + return request.success(); } /** @@ -313,34 +313,34 @@ HandlerResponse WSRequestHandler::HandleResetSceneItem(WSRequestHandler* req) { * @since 0.3 * @deprecated Since 4.3.0. Prefer the use of SetSceneItemProperties. */ -HandlerResponse WSRequestHandler::HandleSetSceneItemRender(WSRequestHandler* req) { - if (!req->hasField("source") || - !req->hasField("render")) +RpcResponse WSRequestHandler::SetSceneItemRender(const RpcRequest& request) { + if (!request.hasField("source") || + !request.hasField("render")) { - return req->SendErrorResponse("missing request parameters"); + return request.failed("missing request parameters"); } - const char* itemName = obs_data_get_string(req->data, "source"); - bool isVisible = obs_data_get_bool(req->data, "render"); + const char* itemName = obs_data_get_string(request.parameters(), "source"); + bool isVisible = obs_data_get_bool(request.parameters(), "render"); if (!itemName) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } - const char* sceneName = obs_data_get_string(req->data, "scene-name"); + const char* sceneName = obs_data_get_string(request.parameters(), "scene-name"); OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { - return req->SendErrorResponse("requested scene doesn't exist"); + return request.failed("requested scene doesn't exist"); } OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromName(scene, itemName); if (!sceneItem) { - return req->SendErrorResponse("specified scene item doesn't exist"); + return request.failed("specified scene item doesn't exist"); } obs_sceneitem_set_visible(sceneItem, isVisible); - return req->SendOKResponse(); + return request.success(); } /** @@ -358,34 +358,34 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemRender(WSRequestHandler* req * @since 4.0.0 * @deprecated Since 4.3.0. Prefer the use of SetSceneItemProperties. */ -HandlerResponse WSRequestHandler::HandleSetSceneItemPosition(WSRequestHandler* req) { - if (!req->hasField("item") || - !req->hasField("x") || !req->hasField("y")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::SetSceneItemPosition(const RpcRequest& request) { + if (!request.hasField("item") || + !request.hasField("x") || !request.hasField("y")) { + return request.failed("missing request parameters"); } - QString itemName = obs_data_get_string(req->data, "item"); + QString itemName = obs_data_get_string(request.parameters(), "item"); if (itemName.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } - QString sceneName = obs_data_get_string(req->data, "scene-name"); + QString sceneName = obs_data_get_string(request.parameters(), "scene-name"); OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { - return req->SendErrorResponse("requested scene could not be found"); + return request.failed("requested scene could not be found"); } OBSSceneItem sceneItem = Utils::GetSceneItemFromName(scene, itemName); if (!sceneItem) { - return req->SendErrorResponse("specified scene item doesn't exist"); + return request.failed("specified scene item doesn't exist"); } vec2 item_position = { 0 }; - item_position.x = obs_data_get_double(req->data, "x"); - item_position.y = obs_data_get_double(req->data, "y"); + item_position.x = obs_data_get_double(request.parameters(), "x"); + item_position.y = obs_data_get_double(request.parameters(), "y"); obs_sceneitem_set_pos(sceneItem, &item_position); - return req->SendOKResponse(); + return request.success(); } /** @@ -403,34 +403,34 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemPosition(WSRequestHandler* r * @since 4.0.0 * @deprecated Since 4.3.0. Prefer the use of SetSceneItemProperties. */ -HandlerResponse WSRequestHandler::HandleSetSceneItemTransform(WSRequestHandler* req) { - if (!req->hasField("item") || - !req->hasField("x-scale") || - !req->hasField("y-scale") || - !req->hasField("rotation")) +RpcResponse WSRequestHandler::SetSceneItemTransform(const RpcRequest& request) { + if (!request.hasField("item") || + !request.hasField("x-scale") || + !request.hasField("y-scale") || + !request.hasField("rotation")) { - return req->SendErrorResponse("missing request parameters"); + return request.failed("missing request parameters"); } - QString itemName = obs_data_get_string(req->data, "item"); + QString itemName = obs_data_get_string(request.parameters(), "item"); if (itemName.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } - QString sceneName = obs_data_get_string(req->data, "scene-name"); + QString sceneName = obs_data_get_string(request.parameters(), "scene-name"); OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { - return req->SendErrorResponse("requested scene doesn't exist"); + return request.failed("requested scene doesn't exist"); } vec2 scale; - scale.x = obs_data_get_double(req->data, "x-scale"); - scale.y = obs_data_get_double(req->data, "y-scale"); - float rotation = obs_data_get_double(req->data, "rotation"); + scale.x = obs_data_get_double(request.parameters(), "x-scale"); + scale.y = obs_data_get_double(request.parameters(), "y-scale"); + float rotation = obs_data_get_double(request.parameters(), "rotation"); OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromName(scene, itemName); if (!sceneItem) { - return req->SendErrorResponse("specified scene item doesn't exist"); + return request.failed("specified scene item doesn't exist"); } obs_sceneitem_defer_update_begin(sceneItem); @@ -440,7 +440,7 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemTransform(WSRequestHandler* obs_sceneitem_defer_update_end(sceneItem); - return req->SendOKResponse(); + return request.success(); } /** @@ -459,36 +459,36 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemTransform(WSRequestHandler* * @since 4.1.0 * @deprecated Since 4.3.0. Prefer the use of SetSceneItemProperties. */ -HandlerResponse WSRequestHandler::HandleSetSceneItemCrop(WSRequestHandler* req) { - if (!req->hasField("item")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::SetSceneItemCrop(const RpcRequest& request) { + if (!request.hasField("item")) { + return request.failed("missing request parameters"); } - QString itemName = obs_data_get_string(req->data, "item"); + QString itemName = obs_data_get_string(request.parameters(), "item"); if (itemName.isEmpty()) { - return req->SendErrorResponse("invalid request parameters"); + return request.failed("invalid request parameters"); } - QString sceneName = obs_data_get_string(req->data, "scene-name"); + QString sceneName = obs_data_get_string(request.parameters(), "scene-name"); OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { - return req->SendErrorResponse("requested scene doesn't exist"); + return request.failed("requested scene doesn't exist"); } OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromName(scene, itemName); if (!sceneItem) { - return req->SendErrorResponse("specified scene item doesn't exist"); + return request.failed("specified scene item doesn't exist"); } struct obs_sceneitem_crop crop = { 0 }; - crop.top = obs_data_get_int(req->data, "top"); - crop.bottom = obs_data_get_int(req->data, "bottom"); - crop.left = obs_data_get_int(req->data, "left"); - crop.right = obs_data_get_int(req->data, "right"); + crop.top = obs_data_get_int(request.parameters(), "top"); + crop.bottom = obs_data_get_int(request.parameters(), "bottom"); + crop.left = obs_data_get_int(request.parameters(), "left"); + crop.right = obs_data_get_int(request.parameters(), "right"); obs_sceneitem_set_crop(sceneItem, &crop); - return req->SendOKResponse(); + return request.success(); } /** @@ -504,26 +504,26 @@ HandlerResponse WSRequestHandler::HandleSetSceneItemCrop(WSRequestHandler* req) * @category scene items * @since 4.5.0 */ -HandlerResponse WSRequestHandler::HandleDeleteSceneItem(WSRequestHandler* req) { - if (!req->hasField("item")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::DeleteSceneItem(const RpcRequest& request) { + if (!request.hasField("item")) { + return request.failed("missing request parameters"); } - const char* sceneName = obs_data_get_string(req->data, "scene"); + const char* sceneName = obs_data_get_string(request.parameters(), "scene"); OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { - return req->SendErrorResponse("requested scene doesn't exist"); + return request.failed("requested scene doesn't exist"); } - OBSDataAutoRelease item = obs_data_get_obj(req->data, "item"); + OBSDataAutoRelease item = obs_data_get_obj(request.parameters(), "item"); OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromItem(scene, item); if (!sceneItem) { - return req->SendErrorResponse("item with id/name combination not found in specified scene"); + return request.failed("item with id/name combination not found in specified scene"); } obs_sceneitem_remove(sceneItem); - return req->SendOKResponse(); + return request.success(); } struct DuplicateSceneItemData { @@ -557,27 +557,27 @@ static void DuplicateSceneItem(void *_data, obs_scene_t *scene) { * @category scene items * @since 4.5.0 */ -HandlerResponse WSRequestHandler::HandleDuplicateSceneItem(WSRequestHandler* req) { - if (!req->hasField("item")) { - return req->SendErrorResponse("missing request parameters"); +RpcResponse WSRequestHandler::DuplicateSceneItem(const RpcRequest& request) { + if (!request.hasField("item")) { + return request.failed("missing request parameters"); } - const char* fromSceneName = obs_data_get_string(req->data, "fromScene"); + const char* fromSceneName = obs_data_get_string(request.parameters(), "fromScene"); OBSScene fromScene = Utils::GetSceneFromNameOrCurrent(fromSceneName); if (!fromScene) { - return req->SendErrorResponse("requested fromScene doesn't exist"); + return request.failed("requested fromScene doesn't exist"); } - const char* toSceneName = obs_data_get_string(req->data, "toScene"); + const char* toSceneName = obs_data_get_string(request.parameters(), "toScene"); OBSScene toScene = Utils::GetSceneFromNameOrCurrent(toSceneName); if (!toScene) { - return req->SendErrorResponse("requested toScene doesn't exist"); + return request.failed("requested toScene doesn't exist"); } - OBSDataAutoRelease item = obs_data_get_obj(req->data, "item"); + OBSDataAutoRelease item = obs_data_get_obj(request.parameters(), "item"); OBSSceneItemAutoRelease referenceItem = Utils::GetSceneItemFromItem(fromScene, item); if (!referenceItem) { - return req->SendErrorResponse("item with id/name combination not found in specified scene"); + return request.failed("item with id/name combination not found in specified scene"); } DuplicateSceneItemData data; @@ -590,7 +590,7 @@ HandlerResponse WSRequestHandler::HandleDuplicateSceneItem(WSRequestHandler* req obs_sceneitem_t *newItem = data.newItem; if (!newItem) { - return req->SendErrorResponse("Error duplicating scene item"); + return request.failed("Error duplicating scene item"); } OBSDataAutoRelease itemData = obs_data_create(); @@ -601,5 +601,5 @@ HandlerResponse WSRequestHandler::HandleDuplicateSceneItem(WSRequestHandler* req obs_data_set_obj(responseData, "item", itemData); obs_data_set_string(responseData, "scene", obs_source_get_name(obs_scene_get_source(toScene))); - return req->SendOKResponse(responseData); + return request.success(responseData); } From 973b4b9f70059c78c69e86977622a3462fecfd7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:33:26 +0100 Subject: [PATCH 26/41] RpcRequest: fix forward declarations --- src/rpc/RpcRequest.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/rpc/RpcRequest.h b/src/rpc/RpcRequest.h index 1611164d..04df4005 100644 --- a/src/rpc/RpcRequest.h +++ b/src/rpc/RpcRequest.h @@ -24,7 +24,6 @@ with this program. If not, see // forward declarations class RpcResponse; -enum ResponseStatus; class RpcRequest { From f83317f7c884cf5339e5b17b7e02c14103a6e845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:39:39 +0100 Subject: [PATCH 27/41] WSRequestHandler(SceneItems): fix DuplicateSceneItem --- src/WSRequestHandler_SceneItems.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/WSRequestHandler_SceneItems.cpp b/src/WSRequestHandler_SceneItems.cpp index 5bce4d6f..bb6697fc 100644 --- a/src/WSRequestHandler_SceneItems.cpp +++ b/src/WSRequestHandler_SceneItems.cpp @@ -526,18 +526,6 @@ RpcResponse WSRequestHandler::DeleteSceneItem(const RpcRequest& request) { return request.success(); } -struct DuplicateSceneItemData { - obs_sceneitem_t *referenceItem; - obs_source_t *fromSource; - obs_sceneitem_t *newItem; -}; - -static void DuplicateSceneItem(void *_data, obs_scene_t *scene) { - DuplicateSceneItemData *data = (DuplicateSceneItemData *)_data; - data->newItem = obs_scene_add(scene, data->fromSource); - obs_sceneitem_set_visible(data->newItem, obs_sceneitem_visible(data->referenceItem)); -} - /** * Duplicates a scene item. * @@ -558,6 +546,12 @@ static void DuplicateSceneItem(void *_data, obs_scene_t *scene) { * @since 4.5.0 */ RpcResponse WSRequestHandler::DuplicateSceneItem(const RpcRequest& request) { + struct DuplicateSceneItemData { + obs_sceneitem_t *referenceItem; + obs_source_t *fromSource; + obs_sceneitem_t *newItem; + }; + if (!request.hasField("item")) { return request.failed("missing request parameters"); } @@ -585,7 +579,11 @@ RpcResponse WSRequestHandler::DuplicateSceneItem(const RpcRequest& request) { data.referenceItem = referenceItem; obs_enter_graphics(); - obs_scene_atomic_update(toScene, DuplicateSceneItem, &data); + obs_scene_atomic_update(toScene, [](void *_data, obs_scene_t *scene) { + auto data = (DuplicateSceneItemData*)_data; + data->newItem = obs_scene_add(scene, data->fromSource); + obs_sceneitem_set_visible(data->newItem, obs_sceneitem_visible(data->referenceItem)); + }, &data); obs_leave_graphics(); obs_sceneitem_t *newItem = data.newItem; From 2f244ae37eb099811e71210bd47d71ad1c51a7ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 20:54:06 +0100 Subject: [PATCH 28/41] WSRequestHandler(SceneItems): fix error message --- src/WSRequestHandler_SceneItems.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WSRequestHandler_SceneItems.cpp b/src/WSRequestHandler_SceneItems.cpp index bb6697fc..ff44e86c 100644 --- a/src/WSRequestHandler_SceneItems.cpp +++ b/src/WSRequestHandler_SceneItems.cpp @@ -252,7 +252,7 @@ RpcResponse WSRequestHandler::SetSceneItemProperties(const RpcRequest& request) obs_sceneitem_defer_update_end(sceneItem); if (badRequest) { - return request.failed("invalid properties", errorData); + return request.failed("error", errorData); } return request.success(); From 5864864123359d573592f1e2bc6af7383bf167d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 21:07:58 +0100 Subject: [PATCH 29/41] WSServer: reimplement protocol --- CMakeLists.txt | 2 + src/WSRequestHandler.cpp | 58 --------------------- src/WSServer.cpp | 14 ++++- src/protocol/OBSRemoteProtocol.cpp | 82 ++++++++++++++++++++++++++++++ src/protocol/OBSRemoteProtocol.h | 34 +++++++++++++ src/rpc/RpcResponse.h | 4 +- 6 files changed, 132 insertions(+), 62 deletions(-) create mode 100644 src/protocol/OBSRemoteProtocol.cpp create mode 100644 src/protocol/OBSRemoteProtocol.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f53ba576..ea0a0fab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,7 @@ set(obs-websocket_SOURCES src/Utils.cpp src/rpc/RpcRequest.cpp src/rpc/RpcResponse.h + src/protocol/OBSRemoteProtocol.cpp src/forms/settings-dialog.cpp) set(obs-websocket_HEADERS @@ -60,6 +61,7 @@ set(obs-websocket_HEADERS src/Utils.h src/rpc/RpcRequest.h src/rpc/RpcResponse.h + src/protocol/OBSRemoteProtocol.h src/forms/settings-dialog.h) # --- Platform-independent build settings --- diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index 843db11a..0f10fad6 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -156,38 +156,7 @@ WSRequestHandler::WSRequestHandler(ConnectionProperties& connProperties) : { } -// std::string WSRequestHandler::processIncomingMessage(std::string& textMessage) { -// if (GetConfig()->DebugEnabled) { -// blog(LOG_INFO, "Request >> '%s'", textMessage.c_str()); -// } - -// OBSDataAutoRelease responseData = processRequest(textMessage); -// std::string response = obs_data_get_json(responseData); - -// if (GetConfig()->DebugEnabled) { -// blog(LOG_INFO, "Response << '%s'", response.c_str()); -// } - -// return response; -// } - RpcResponse WSRequestHandler::processRequest(const RpcRequest& request){ - // std::string msgContainer(textMessage); - // const char* msg = msgContainer.c_str(); - - // data = obs_data_create_from_json(msg); - // if (!data) { - // blog(LOG_ERROR, "invalid JSON payload received for '%s'", msg); - // return SendErrorResponse("invalid JSON payload"); - // } - - // if (!hasField("request-type") || !hasField("message-id")) { - // return SendErrorResponse("missing request parameters"); - // } - - // _requestType = obs_data_get_string(data, "request-type"); - // _messageId = obs_data_get_string(data, "message-id"); - if (GetConfig()->AuthRequired && (!authNotRequired.contains(request.methodName())) && (!_connProperties.isAuthenticated())) @@ -202,30 +171,3 @@ RpcResponse WSRequestHandler::processRequest(const RpcRequest& request){ return std::bind(handlerFunc, this, _1)(request); } - -// HandlerResponse WSRequestHandler::SendOKResponse(obs_data_t* additionalFields) { -// return SendResponse("ok", additionalFields); -// } - -// HandlerResponse WSRequestHandler::SendErrorResponse(QString errorMessage) { -// OBSDataAutoRelease fields = obs_data_create(); -// obs_data_set_string(fields, "error", errorMessage.toUtf8().constData()); - -// return SendResponse("error", fields); -// } - -// HandlerResponse WSRequestHandler::SendErrorResponse(obs_data_t* additionalFields) { -// return SendResponse("error", additionalFields); -// } - -// HandlerResponse WSRequestHandler::SendResponse(const char* status, obs_data_t* fields) { -// obs_data_t* response = obs_data_create(); -// obs_data_set_string(response, "message-id", _messageId); -// obs_data_set_string(response, "status", status); - -// if (fields) { -// obs_data_apply(response, fields); -// } - -// return response; -// } diff --git a/src/WSServer.cpp b/src/WSServer.cpp index 1b062b97..cb211289 100644 --- a/src/WSServer.cpp +++ b/src/WSServer.cpp @@ -31,6 +31,7 @@ with this program. If not, see #include "obs-websocket.h" #include "Config.h" #include "Utils.h" +#include "protocol/OBSRemoteProtocol.h" QT_USE_NAMESPACE @@ -171,8 +172,17 @@ void WSServer::onMessage(connection_hdl hdl, server::message_ptr message) ConnectionProperties& connProperties = _connectionProperties[hdl]; locker.unlock(); - WSRequestHandler handler(connProperties); - std::string response = handler.processIncomingMessage(payload); + if (GetConfig()->DebugEnabled) { + blog(LOG_INFO, "Request >> '%s'", payload.c_str()); + } + + WSRequestHandler requestHandler(connProperties); + OBSRemoteProtocol protocol(requestHandler); + std::string response = protocol.processMessage(payload); + + if (GetConfig()->DebugEnabled) { + blog(LOG_INFO, "Response << '%s'", response.c_str()); + } websocketpp::lib::error_code errorCode; _server.send(hdl, response, websocketpp::frame::opcode::text, errorCode); diff --git a/src/protocol/OBSRemoteProtocol.cpp b/src/protocol/OBSRemoteProtocol.cpp new file mode 100644 index 00000000..468e0310 --- /dev/null +++ b/src/protocol/OBSRemoteProtocol.cpp @@ -0,0 +1,82 @@ +/* +obs-websocket +Copyright (C) 2016-2019 Stéphane Lepin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see +*/ + +#include "OBSRemoteProtocol.h" +#include "../WSRequestHandler.h" + +std::string buildResponse(QString messageId, QString status, obs_data_t* fields = nullptr) { + obs_data_t* response = obs_data_create(); + obs_data_set_string(response, "message-id", messageId.toUtf8().constData()); + obs_data_set_string(response, "status", status.toUtf8().constData()); + + if (fields) { + obs_data_apply(response, fields); + } + + std::string responseString = obs_data_get_json(response); + return responseString; +} + +std::string successResponse(QString messageId, obs_data_t* fields = nullptr) { + return buildResponse(messageId, "ok", fields); +} + +std::string errorResponse(QString messageId, QString errorMessage, obs_data_t* additionalFields = nullptr) { + OBSDataAutoRelease fields = obs_data_create(); + obs_data_set_string(fields, "error", errorMessage.toUtf8().constData()); + return buildResponse(messageId, "error", fields); +} + +OBSRemoteProtocol::OBSRemoteProtocol(WSRequestHandler& requestHandler) : + _requestHandler(requestHandler) +{ +} + +std::string OBSRemoteProtocol::processMessage(std::string message) +{ + std::string msgContainer(message); + const char* msg = msgContainer.c_str(); + + OBSDataAutoRelease data = obs_data_create_from_json(msg); + if (!data) { + blog(LOG_ERROR, "invalid JSON payload received for '%s'", msg); + return errorResponse(nullptr, "invalid JSON payload"); + } + + if (!obs_data_has_user_value(data, "request-type") || !obs_data_has_user_value(data, "message-id")) { + return errorResponse(nullptr, "missing request parameters"); + } + + QString methodName = obs_data_get_string(data, "request-type"); + QString messageId = obs_data_get_string(data, "message-id"); + + OBSDataAutoRelease params = obs_data_create(); + + RpcRequest request(messageId, methodName, params); + RpcResponse response = _requestHandler.processRequest(request); + + OBSData additionalFields = response.additionalFields(); + switch (response.status()) { + case Ok: + return successResponse(messageId, additionalFields); + case Error: + return errorResponse(messageId, response.errorMessage(), additionalFields); + } + + return std::string(); +} diff --git a/src/protocol/OBSRemoteProtocol.h b/src/protocol/OBSRemoteProtocol.h new file mode 100644 index 00000000..f1751b87 --- /dev/null +++ b/src/protocol/OBSRemoteProtocol.h @@ -0,0 +1,34 @@ +/* +obs-websocket +Copyright (C) 2016-2019 Stéphane Lepin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see +*/ + +#pragma once + +#include +#include + +class WSRequestHandler; + +class OBSRemoteProtocol +{ +public: + explicit OBSRemoteProtocol(WSRequestHandler& requestHandler); + std::string processMessage(std::string message); + +private: + WSRequestHandler& _requestHandler; +}; diff --git a/src/rpc/RpcResponse.h b/src/rpc/RpcResponse.h index 11adfcf5..caf9bdd7 100644 --- a/src/rpc/RpcResponse.h +++ b/src/rpc/RpcResponse.h @@ -57,8 +57,8 @@ public: return _errorMessage; } - const obs_data_t* parameters() const { - return _additionalFields; + const OBSData additionalFields() const { + return OBSData(_additionalFields); } private: From d25b65c12406db8e49de702c4fd3ed8093c2c648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 22:59:36 +0100 Subject: [PATCH 30/41] RpcResponse: fixes --- CMakeLists.txt | 2 +- src/protocol/OBSRemoteProtocol.cpp | 4 ++-- src/rpc/RpcResponse.cpp | 10 +++++----- src/rpc/RpcResponse.h | 15 +++++---------- 4 files changed, 13 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ea0a0fab..1c2145c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,7 +47,7 @@ set(obs-websocket_SOURCES src/Config.cpp src/Utils.cpp src/rpc/RpcRequest.cpp - src/rpc/RpcResponse.h + src/rpc/RpcResponse.cpp src/protocol/OBSRemoteProtocol.cpp src/forms/settings-dialog.cpp) diff --git a/src/protocol/OBSRemoteProtocol.cpp b/src/protocol/OBSRemoteProtocol.cpp index 468e0310..a3d4f986 100644 --- a/src/protocol/OBSRemoteProtocol.cpp +++ b/src/protocol/OBSRemoteProtocol.cpp @@ -72,9 +72,9 @@ std::string OBSRemoteProtocol::processMessage(std::string message) OBSData additionalFields = response.additionalFields(); switch (response.status()) { - case Ok: + case RpcResponse::Status::Ok: return successResponse(messageId, additionalFields); - case Error: + case RpcResponse::Status::Error: return errorResponse(messageId, response.errorMessage(), additionalFields); } diff --git a/src/rpc/RpcResponse.cpp b/src/rpc/RpcResponse.cpp index 7a9bf585..937c8d46 100644 --- a/src/rpc/RpcResponse.cpp +++ b/src/rpc/RpcResponse.cpp @@ -20,7 +20,7 @@ with this program. If not, see #include "RpcRequest.h" RpcResponse::RpcResponse( - ResponseStatus status, const QString& messageId, + Status status, const QString& messageId, const QString& methodName, obs_data_t* additionalFields ) : _status(status), @@ -34,15 +34,15 @@ RpcResponse::RpcResponse( } } -const RpcResponse::RpcResponse ok(const RpcRequest& request, obs_data_t* additionalFields) +const RpcResponse RpcResponse::ok(const RpcRequest& request, obs_data_t* additionalFields) { - RpcResponse response(ResponseStatus::Ok, request.messageId(), request.methodName(), additionalFields); + RpcResponse response(Status::Ok, request.messageId(), request.methodName(), additionalFields); return response; } -const RpcResponse::RpcResponse fail(const RpcRequest& request, const QString& errorMessage, obs_data_t* additionalFields) +const RpcResponse RpcResponse::fail(const RpcRequest& request, const QString& errorMessage, obs_data_t* additionalFields) { - RpcResponse response(ResponseStatus::Error, request.messageId(), request.methodName(), additionalFields); + RpcResponse response(Status::Error, request.messageId(), request.methodName(), additionalFields); response._errorMessage = errorMessage; return response; } diff --git a/src/rpc/RpcResponse.h b/src/rpc/RpcResponse.h index caf9bdd7..a6381bfd 100644 --- a/src/rpc/RpcResponse.h +++ b/src/rpc/RpcResponse.h @@ -24,16 +24,11 @@ with this program. If not, see class RpcRequest; -enum ResponseStatus -{ - Unknown, - Ok, - Error -}; - class RpcResponse { public: + enum Status { Unknown, Ok, Error }; + static RpcResponse ofRequest(const RpcRequest& request); static const RpcResponse ok(const RpcRequest& request, obs_data_t* additionalFields = nullptr); static const RpcResponse fail( @@ -41,7 +36,7 @@ public: obs_data_t* additionalFields = nullptr ); - ResponseStatus status() { + Status status() { return _status; } @@ -63,11 +58,11 @@ public: private: explicit RpcResponse( - ResponseStatus status, + Status status, const QString& messageId, const QString& methodName, obs_data_t* additionalFields = nullptr ); - const ResponseStatus _status; + const Status _status; const QString _messageId; const QString _methodName; QString _errorMessage; From e9f90b499059bd5a444d6b1a7d93b443aed137e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 15 Nov 2019 23:39:31 +0100 Subject: [PATCH 31/41] OBSRemoteProtocol: fix params --- src/protocol/OBSRemoteProtocol.cpp | 3 +++ src/rpc/RpcResponse.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/protocol/OBSRemoteProtocol.cpp b/src/protocol/OBSRemoteProtocol.cpp index a3d4f986..b8df9b81 100644 --- a/src/protocol/OBSRemoteProtocol.cpp +++ b/src/protocol/OBSRemoteProtocol.cpp @@ -66,6 +66,9 @@ std::string OBSRemoteProtocol::processMessage(std::string message) QString messageId = obs_data_get_string(data, "message-id"); OBSDataAutoRelease params = obs_data_create(); + obs_data_apply(params, data); + obs_data_unset_user_value(params, "request-type"); + obs_data_unset_user_value(params, "message-id"); RpcRequest request(messageId, methodName, params); RpcResponse response = _requestHandler.processRequest(request); diff --git a/src/rpc/RpcResponse.cpp b/src/rpc/RpcResponse.cpp index 937c8d46..17f9f6e9 100644 --- a/src/rpc/RpcResponse.cpp +++ b/src/rpc/RpcResponse.cpp @@ -38,7 +38,7 @@ const RpcResponse RpcResponse::ok(const RpcRequest& request, obs_data_t* additio { RpcResponse response(Status::Ok, request.messageId(), request.methodName(), additionalFields); return response; -} +} const RpcResponse RpcResponse::fail(const RpcRequest& request, const QString& errorMessage, obs_data_t* additionalFields) { From 6bfe533a20f31ddbd67ac2c5686368572f47b7ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Tue, 28 Jan 2020 16:16:19 +0100 Subject: [PATCH 32/41] chore: fix quality warnings --- src/WSRequestHandler_SceneItems.cpp | 2 +- src/rpc/RpcRequest.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/WSRequestHandler_SceneItems.cpp b/src/WSRequestHandler_SceneItems.cpp index ff44e86c..cd54de16 100644 --- a/src/WSRequestHandler_SceneItems.cpp +++ b/src/WSRequestHandler_SceneItems.cpp @@ -580,7 +580,7 @@ RpcResponse WSRequestHandler::DuplicateSceneItem(const RpcRequest& request) { obs_enter_graphics(); obs_scene_atomic_update(toScene, [](void *_data, obs_scene_t *scene) { - auto data = (DuplicateSceneItemData*)_data; + auto data = reinterpret_cast(_data); data->newItem = obs_scene_add(scene, data->fromSource); obs_sceneitem_set_visible(data->newItem, obs_sceneitem_visible(data->referenceItem)); }, &data); diff --git a/src/rpc/RpcRequest.cpp b/src/rpc/RpcRequest.cpp index a341a5e1..81b211b0 100644 --- a/src/rpc/RpcRequest.cpp +++ b/src/rpc/RpcRequest.cpp @@ -21,9 +21,9 @@ with this program. If not, see RpcRequest::RpcRequest(const QString& messageId, const QString& methodName, obs_data_t* params) : _messageId(messageId), - _methodName(methodName) + _methodName(methodName), + _parameters(obs_data_create()) { - _parameters = obs_data_create(); obs_data_apply(_parameters, params); } From 8b16abd3708ade975ed54e3e79839d2548f09967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Tue, 28 Jan 2020 16:38:57 +0100 Subject: [PATCH 33/41] OBSRemoteProtocol: fix mixed indents --- src/protocol/OBSRemoteProtocol.cpp | 42 +++++++++++++++--------------- src/protocol/OBSRemoteProtocol.h | 6 ++--- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/protocol/OBSRemoteProtocol.cpp b/src/protocol/OBSRemoteProtocol.cpp index b8df9b81..2d8810b1 100644 --- a/src/protocol/OBSRemoteProtocol.cpp +++ b/src/protocol/OBSRemoteProtocol.cpp @@ -28,28 +28,28 @@ std::string buildResponse(QString messageId, QString status, obs_data_t* fields obs_data_apply(response, fields); } - std::string responseString = obs_data_get_json(response); + std::string responseString = obs_data_get_json(response); return responseString; } std::string successResponse(QString messageId, obs_data_t* fields = nullptr) { - return buildResponse(messageId, "ok", fields); + return buildResponse(messageId, "ok", fields); } std::string errorResponse(QString messageId, QString errorMessage, obs_data_t* additionalFields = nullptr) { - OBSDataAutoRelease fields = obs_data_create(); + OBSDataAutoRelease fields = obs_data_create(); obs_data_set_string(fields, "error", errorMessage.toUtf8().constData()); - return buildResponse(messageId, "error", fields); + return buildResponse(messageId, "error", fields); } OBSRemoteProtocol::OBSRemoteProtocol(WSRequestHandler& requestHandler) : - _requestHandler(requestHandler) + _requestHandler(requestHandler) { } std::string OBSRemoteProtocol::processMessage(std::string message) { - std::string msgContainer(message); + std::string msgContainer(message); const char* msg = msgContainer.c_str(); OBSDataAutoRelease data = obs_data_create_from_json(msg); @@ -58,28 +58,28 @@ std::string OBSRemoteProtocol::processMessage(std::string message) return errorResponse(nullptr, "invalid JSON payload"); } - if (!obs_data_has_user_value(data, "request-type") || !obs_data_has_user_value(data, "message-id")) { - return errorResponse(nullptr, "missing request parameters"); - } + if (!obs_data_has_user_value(data, "request-type") || !obs_data_has_user_value(data, "message-id")) { + return errorResponse(nullptr, "missing request parameters"); + } - QString methodName = obs_data_get_string(data, "request-type"); - QString messageId = obs_data_get_string(data, "message-id"); + QString methodName = obs_data_get_string(data, "request-type"); + QString messageId = obs_data_get_string(data, "message-id"); - OBSDataAutoRelease params = obs_data_create(); + OBSDataAutoRelease params = obs_data_create(); obs_data_apply(params, data); obs_data_unset_user_value(params, "request-type"); obs_data_unset_user_value(params, "message-id"); - RpcRequest request(messageId, methodName, params); - RpcResponse response = _requestHandler.processRequest(request); + RpcRequest request(messageId, methodName, params); + RpcResponse response = _requestHandler.processRequest(request); - OBSData additionalFields = response.additionalFields(); - switch (response.status()) { + OBSData additionalFields = response.additionalFields(); + switch (response.status()) { case RpcResponse::Status::Ok: - return successResponse(messageId, additionalFields); - case RpcResponse::Status::Error: - return errorResponse(messageId, response.errorMessage(), additionalFields); - } + return successResponse(messageId, additionalFields); + case RpcResponse::Status::Error: + return errorResponse(messageId, response.errorMessage(), additionalFields); + } - return std::string(); + return std::string(); } diff --git a/src/protocol/OBSRemoteProtocol.h b/src/protocol/OBSRemoteProtocol.h index f1751b87..dd56fa98 100644 --- a/src/protocol/OBSRemoteProtocol.h +++ b/src/protocol/OBSRemoteProtocol.h @@ -26,9 +26,9 @@ class WSRequestHandler; class OBSRemoteProtocol { public: - explicit OBSRemoteProtocol(WSRequestHandler& requestHandler); - std::string processMessage(std::string message); + explicit OBSRemoteProtocol(WSRequestHandler& requestHandler); + std::string processMessage(std::string message); private: - WSRequestHandler& _requestHandler; + WSRequestHandler& _requestHandler; }; From 5e393ed3c417ac0859665fc2f67923534172fe46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Tue, 28 Jan 2020 16:41:42 +0100 Subject: [PATCH 34/41] OBSRemoteProtocol(buildResponse): fix release of obs_data_t --- src/protocol/OBSRemoteProtocol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/protocol/OBSRemoteProtocol.cpp b/src/protocol/OBSRemoteProtocol.cpp index 2d8810b1..4b3f7e7b 100644 --- a/src/protocol/OBSRemoteProtocol.cpp +++ b/src/protocol/OBSRemoteProtocol.cpp @@ -20,7 +20,7 @@ with this program. If not, see #include "../WSRequestHandler.h" std::string buildResponse(QString messageId, QString status, obs_data_t* fields = nullptr) { - obs_data_t* response = obs_data_create(); + OBSDataAutoRelease response = obs_data_create(); obs_data_set_string(response, "message-id", messageId.toUtf8().constData()); obs_data_set_string(response, "status", status.toUtf8().constData()); From 208c7f18b27be66f377ccbb0feab2fb15fb79226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Tue, 28 Jan 2020 16:49:35 +0100 Subject: [PATCH 35/41] OBSRemoteProtocol: refactor class + pass handler when calling processMessage --- src/WSServer.cpp | 4 +-- src/protocol/OBSRemoteProtocol.cpp | 55 ++++++++++++++---------------- src/protocol/OBSRemoteProtocol.h | 8 +++-- 3 files changed, 32 insertions(+), 35 deletions(-) diff --git a/src/WSServer.cpp b/src/WSServer.cpp index cb211289..69c25ec7 100644 --- a/src/WSServer.cpp +++ b/src/WSServer.cpp @@ -177,8 +177,8 @@ void WSServer::onMessage(connection_hdl hdl, server::message_ptr message) } WSRequestHandler requestHandler(connProperties); - OBSRemoteProtocol protocol(requestHandler); - std::string response = protocol.processMessage(payload); + OBSRemoteProtocol protocol; + std::string response = protocol.processMessage(requestHandler, payload); if (GetConfig()->DebugEnabled) { blog(LOG_INFO, "Response << '%s'", response.c_str()); diff --git a/src/protocol/OBSRemoteProtocol.cpp b/src/protocol/OBSRemoteProtocol.cpp index 4b3f7e7b..c520e8ba 100644 --- a/src/protocol/OBSRemoteProtocol.cpp +++ b/src/protocol/OBSRemoteProtocol.cpp @@ -19,35 +19,7 @@ with this program. If not, see #include "OBSRemoteProtocol.h" #include "../WSRequestHandler.h" -std::string buildResponse(QString messageId, QString status, obs_data_t* fields = nullptr) { - OBSDataAutoRelease response = obs_data_create(); - obs_data_set_string(response, "message-id", messageId.toUtf8().constData()); - obs_data_set_string(response, "status", status.toUtf8().constData()); - - if (fields) { - obs_data_apply(response, fields); - } - - std::string responseString = obs_data_get_json(response); - return responseString; -} - -std::string successResponse(QString messageId, obs_data_t* fields = nullptr) { - return buildResponse(messageId, "ok", fields); -} - -std::string errorResponse(QString messageId, QString errorMessage, obs_data_t* additionalFields = nullptr) { - OBSDataAutoRelease fields = obs_data_create(); - obs_data_set_string(fields, "error", errorMessage.toUtf8().constData()); - return buildResponse(messageId, "error", fields); -} - -OBSRemoteProtocol::OBSRemoteProtocol(WSRequestHandler& requestHandler) : - _requestHandler(requestHandler) -{ -} - -std::string OBSRemoteProtocol::processMessage(std::string message) +std::string OBSRemoteProtocol::processMessage(WSRequestHandler& requestHandler, std::string message) { std::string msgContainer(message); const char* msg = msgContainer.c_str(); @@ -71,7 +43,7 @@ std::string OBSRemoteProtocol::processMessage(std::string message) obs_data_unset_user_value(params, "message-id"); RpcRequest request(messageId, methodName, params); - RpcResponse response = _requestHandler.processRequest(request); + RpcResponse response = requestHandler.processRequest(request); OBSData additionalFields = response.additionalFields(); switch (response.status()) { @@ -83,3 +55,26 @@ std::string OBSRemoteProtocol::processMessage(std::string message) return std::string(); } + +std::string OBSRemoteProtocol::buildResponse(QString messageId, QString status, obs_data_t* fields) { + OBSDataAutoRelease response = obs_data_create(); + obs_data_set_string(response, "message-id", messageId.toUtf8().constData()); + obs_data_set_string(response, "status", status.toUtf8().constData()); + + if (fields) { + obs_data_apply(response, fields); + } + + std::string responseString = obs_data_get_json(response); + return responseString; +} + +std::string OBSRemoteProtocol::successResponse(QString messageId, obs_data_t* fields) { + return buildResponse(messageId, "ok", fields); +} + +std::string OBSRemoteProtocol::errorResponse(QString messageId, QString errorMessage, obs_data_t* additionalFields) { + OBSDataAutoRelease fields = obs_data_create(); + obs_data_set_string(fields, "error", errorMessage.toUtf8().constData()); + return buildResponse(messageId, "error", fields); +} diff --git a/src/protocol/OBSRemoteProtocol.h b/src/protocol/OBSRemoteProtocol.h index dd56fa98..6df77fac 100644 --- a/src/protocol/OBSRemoteProtocol.h +++ b/src/protocol/OBSRemoteProtocol.h @@ -20,15 +20,17 @@ with this program. If not, see #include #include +#include class WSRequestHandler; class OBSRemoteProtocol { public: - explicit OBSRemoteProtocol(WSRequestHandler& requestHandler); - std::string processMessage(std::string message); + std::string processMessage(WSRequestHandler& requestHandler, std::string message); private: - WSRequestHandler& _requestHandler; + std::string buildResponse(QString messageId, QString status, obs_data_t* fields = nullptr); + std::string successResponse(QString messageId, obs_data_t* fields = nullptr); + std::string errorResponse(QString messageId, QString errorMessage, obs_data_t* additionalFields = nullptr); }; From 6c34f00cfea06fdb89d5f7372174e897fe3e05af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Tue, 28 Jan 2020 16:52:11 +0100 Subject: [PATCH 36/41] OBSRemoteProtocol(errorResponse): add missing additionalFields --- src/protocol/OBSRemoteProtocol.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/protocol/OBSRemoteProtocol.cpp b/src/protocol/OBSRemoteProtocol.cpp index c520e8ba..0e0201d7 100644 --- a/src/protocol/OBSRemoteProtocol.cpp +++ b/src/protocol/OBSRemoteProtocol.cpp @@ -75,6 +75,9 @@ std::string OBSRemoteProtocol::successResponse(QString messageId, obs_data_t* fi std::string OBSRemoteProtocol::errorResponse(QString messageId, QString errorMessage, obs_data_t* additionalFields) { OBSDataAutoRelease fields = obs_data_create(); + if (additionalFields) { + obs_data_apply(fields, additionalFields); + } obs_data_set_string(fields, "error", errorMessage.toUtf8().constData()); return buildResponse(messageId, "error", fields); } From 631452567d900f453783a25835323871f43f0284 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Tue, 28 Jan 2020 17:02:25 +0100 Subject: [PATCH 37/41] OBSRemoteProtocol: correctly handling null message IDs --- src/protocol/OBSRemoteProtocol.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/protocol/OBSRemoteProtocol.cpp b/src/protocol/OBSRemoteProtocol.cpp index 0e0201d7..f0adb7c1 100644 --- a/src/protocol/OBSRemoteProtocol.cpp +++ b/src/protocol/OBSRemoteProtocol.cpp @@ -27,11 +27,11 @@ std::string OBSRemoteProtocol::processMessage(WSRequestHandler& requestHandler, OBSDataAutoRelease data = obs_data_create_from_json(msg); if (!data) { blog(LOG_ERROR, "invalid JSON payload received for '%s'", msg); - return errorResponse(nullptr, "invalid JSON payload"); + return errorResponse(QString::Null(), "invalid JSON payload"); } if (!obs_data_has_user_value(data, "request-type") || !obs_data_has_user_value(data, "message-id")) { - return errorResponse(nullptr, "missing request parameters"); + return errorResponse(QString::Null(), "missing request parameters"); } QString methodName = obs_data_get_string(data, "request-type"); @@ -58,7 +58,9 @@ std::string OBSRemoteProtocol::processMessage(WSRequestHandler& requestHandler, std::string OBSRemoteProtocol::buildResponse(QString messageId, QString status, obs_data_t* fields) { OBSDataAutoRelease response = obs_data_create(); - obs_data_set_string(response, "message-id", messageId.toUtf8().constData()); + if (!messageId.isNull()) { + obs_data_set_string(response, "message-id", messageId.toUtf8().constData()); + } obs_data_set_string(response, "status", status.toUtf8().constData()); if (fields) { From 46068573c5cd179356d85385a291b70dac39624b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Tue, 28 Jan 2020 18:37:25 +0100 Subject: [PATCH 38/41] events: decouple events encoding from event emit --- CMakeLists.txt | 6 ++-- src/Utils.cpp | 15 ++++++++++ src/Utils.h | 2 ++ src/WSEvents.cpp | 47 ++++++------------------------ src/WSServer.cpp | 9 +++++- src/WSServer.h | 4 +-- src/protocol/OBSRemoteProtocol.cpp | 38 ++++++++++++++++++++++-- src/protocol/OBSRemoteProtocol.h | 2 ++ src/rpc/RpcEvent.cpp | 47 ++++++++++++++++++++++++++++++ src/rpc/RpcEvent.h | 45 ++++++++++++++++++++++++++++ 10 files changed, 169 insertions(+), 46 deletions(-) create mode 100644 src/rpc/RpcEvent.cpp create mode 100644 src/rpc/RpcEvent.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c2145c0..520d4254 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,7 @@ set(obs-websocket_SOURCES src/Utils.cpp src/rpc/RpcRequest.cpp src/rpc/RpcResponse.cpp + src/rpc/RpcEvent.cpp src/protocol/OBSRemoteProtocol.cpp src/forms/settings-dialog.cpp) @@ -61,6 +62,7 @@ set(obs-websocket_HEADERS src/Utils.h src/rpc/RpcRequest.h src/rpc/RpcResponse.h + src/rpc/RpcEvent.h src/protocol/OBSRemoteProtocol.h src/forms/settings-dialog.h) @@ -180,8 +182,8 @@ if(UNIX AND NOT APPLE) install(TARGETS obs-websocket LIBRARY DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/obs-plugins") # Dirty fix for Ubuntu - install(TARGETS obs-websocket - LIBRARY DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/${UNAME_MACHINE}-linux-gnu/obs-plugins") + install(TARGETS obs-websocket + LIBRARY DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/${UNAME_MACHINE}-linux-gnu/obs-plugins") install(FILES ${locale_files} DESTINATION "${CMAKE_INSTALL_PREFIX}/share/obs/obs-plugins/obs-websocket/locale") diff --git a/src/Utils.cpp b/src/Utils.cpp index 243faf35..02b55e1d 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ +#include #include #include #include @@ -822,3 +823,17 @@ void Utils::PauseRecording(bool pause) pauseRecording(pause); } + +QString Utils::nsToTimestamp(uint64_t ns) +{ + uint64_t ms = ns / 1000000ULL; + uint64_t secs = ms / 1000ULL; + uint64_t minutes = secs / 60ULL; + + uint64_t hoursPart = minutes / 60ULL; + uint64_t minutesPart = minutes % 60ULL; + uint64_t secsPart = secs % 60ULL; + uint64_t msPart = ms % 1000ULL; + + return QString::asprintf("%02" PRIu64 ":%02" PRIu64 ":%02" PRIu64 ".%03" PRIu64, hoursPart, minutesPart, secsPart, msPart); +} diff --git a/src/Utils.h b/src/Utils.h index 89f01acc..bdd5da20 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -86,4 +86,6 @@ class Utils { static bool RecordingPauseSupported(); static bool RecordingPaused(); static void PauseRecording(bool pause); + + static QString nsToTimestamp(uint64_t ns); }; diff --git a/src/WSEvents.cpp b/src/WSEvents.cpp index 4e978cc4..143309e8 100644 --- a/src/WSEvents.cpp +++ b/src/WSEvents.cpp @@ -23,27 +23,15 @@ #include -#include "Config.h" -#include "Utils.h" #include "WSEvents.h" #include "obs-websocket.h" +#include "Config.h" +#include "Utils.h" +#include "rpc/RpcEvent.h" #define STATUS_INTERVAL 2000 -QString nsToTimestamp(uint64_t ns) { - uint64_t ms = ns / 1000000ULL; - uint64_t secs = ms / 1000ULL; - uint64_t minutes = secs / 60ULL; - - uint64_t hoursPart = minutes / 60ULL; - uint64_t minutesPart = minutes % 60ULL; - uint64_t secsPart = secs % 60ULL; - uint64_t msPart = ms % 1000ULL; - - return QString::asprintf("%02" PRIu64 ":%02" PRIu64 ":%02" PRIu64 ".%03" PRIu64, hoursPart, minutesPart, secsPart, msPart); -} - const char* sourceTypeToString(obs_source_type type) { switch (type) { case OBS_SOURCE_TYPE_INPUT: @@ -252,28 +240,11 @@ void WSEvents::FrontendEventHandler(enum obs_frontend_event event, void* private void WSEvents::broadcastUpdate(const char* updateType, obs_data_t* additionalFields = nullptr) { - OBSDataAutoRelease update = obs_data_create(); - obs_data_set_string(update, "update-type", updateType); + uint64_t streamTime = getStreamingTime(); + uint64_t recordingTime = getStreamingTime(); + RpcEvent event(QString(updateType), streamTime, recordingTime, additionalFields); - if (obs_frontend_streaming_active()) { - QString streamingTimecode = getStreamingTimecode(); - obs_data_set_string(update, "stream-timecode", streamingTimecode.toUtf8().constData()); - } - - if (obs_frontend_recording_active()) { - QString recordingTimecode = getRecordingTimecode(); - obs_data_set_string(update, "rec-timecode", recordingTimecode.toUtf8().constData()); - } - - if (additionalFields) - obs_data_apply(update, additionalFields); - - QString json = obs_data_get_json(update); - _srv->broadcast(json.toStdString()); - - if (GetConfig()->DebugEnabled) { - blog(LOG_INFO, "Update << '%s'", json.toUtf8().constData()); - } + _srv->broadcast(event); } void WSEvents::connectSourceSignals(obs_source_t* source) { @@ -410,11 +381,11 @@ uint64_t WSEvents::getRecordingTime() { } QString WSEvents::getStreamingTimecode() { - return nsToTimestamp(getStreamingTime()); + return Utils::nsToTimestamp(getStreamingTime()); } QString WSEvents::getRecordingTimecode() { - return nsToTimestamp(getRecordingTime()); + return Utils::nsToTimestamp(getRecordingTime()); } /** diff --git a/src/WSServer.cpp b/src/WSServer.cpp index 69c25ec7..c9f09362 100644 --- a/src/WSServer.cpp +++ b/src/WSServer.cpp @@ -125,8 +125,15 @@ void WSServer::stop() blog(LOG_INFO, "server stopped successfully"); } -void WSServer::broadcast(std::string message) +void WSServer::broadcast(const RpcEvent& event) { + OBSRemoteProtocol protocol; + std::string message = protocol.encodeEvent(event); + + if (GetConfig()->DebugEnabled) { + blog(LOG_INFO, "Update << '%s'", message.c_str()); + } + QMutexLocker locker(&_clMutex); for (connection_hdl hdl : _connections) { if (GetConfig()->AuthRequired) { diff --git a/src/WSServer.h b/src/WSServer.h index 76e978e3..723f51af 100644 --- a/src/WSServer.h +++ b/src/WSServer.h @@ -30,8 +30,8 @@ with this program. If not, see #include #include "ConnectionProperties.h" - #include "WSRequestHandler.h" +#include "rpc/RpcEvent.h" using websocketpp::connection_hdl; @@ -46,7 +46,7 @@ public: virtual ~WSServer(); void start(quint16 port); void stop(); - void broadcast(std::string message); + void broadcast(const RpcEvent& event); QThreadPool* threadPool() { return &_threadPool; } diff --git a/src/protocol/OBSRemoteProtocol.cpp b/src/protocol/OBSRemoteProtocol.cpp index f0adb7c1..002f0f54 100644 --- a/src/protocol/OBSRemoteProtocol.cpp +++ b/src/protocol/OBSRemoteProtocol.cpp @@ -16,8 +16,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ +#include + #include "OBSRemoteProtocol.h" #include "../WSRequestHandler.h" +#include "../rpc/RpcEvent.h" +#include "../Utils.h" std::string OBSRemoteProtocol::processMessage(WSRequestHandler& requestHandler, std::string message) { @@ -56,7 +60,33 @@ std::string OBSRemoteProtocol::processMessage(WSRequestHandler& requestHandler, return std::string(); } -std::string OBSRemoteProtocol::buildResponse(QString messageId, QString status, obs_data_t* fields) { +std::string OBSRemoteProtocol::encodeEvent(const RpcEvent& event) +{ + OBSDataAutoRelease eventData = obs_data_create(); + + OBSData additionalFields = event.fields(); + if (additionalFields) { + obs_data_apply(eventData, additionalFields); + } + + QString updateType = event.updateType(); + obs_data_set_string(eventData, "update-type", updateType.toUtf8().constData()); + + if (obs_frontend_streaming_active()) { + QString streamingTimecode = Utils::nsToTimestamp(event.streamTime()); + obs_data_set_string(eventData, "stream-timecode", streamingTimecode.toUtf8().constData()); + } + + if (obs_frontend_recording_active()) { + QString recordingTimecode = Utils::nsToTimestamp(event.recordingTime()); + obs_data_set_string(eventData, "rec-timecode", recordingTimecode.toUtf8().constData()); + } + + return std::string(obs_data_get_json(eventData)); +} + +std::string OBSRemoteProtocol::buildResponse(QString messageId, QString status, obs_data_t* fields) +{ OBSDataAutoRelease response = obs_data_create(); if (!messageId.isNull()) { obs_data_set_string(response, "message-id", messageId.toUtf8().constData()); @@ -71,11 +101,13 @@ std::string OBSRemoteProtocol::buildResponse(QString messageId, QString status, return responseString; } -std::string OBSRemoteProtocol::successResponse(QString messageId, obs_data_t* fields) { +std::string OBSRemoteProtocol::successResponse(QString messageId, obs_data_t* fields) +{ return buildResponse(messageId, "ok", fields); } -std::string OBSRemoteProtocol::errorResponse(QString messageId, QString errorMessage, obs_data_t* additionalFields) { +std::string OBSRemoteProtocol::errorResponse(QString messageId, QString errorMessage, obs_data_t* additionalFields) +{ OBSDataAutoRelease fields = obs_data_create(); if (additionalFields) { obs_data_apply(fields, additionalFields); diff --git a/src/protocol/OBSRemoteProtocol.h b/src/protocol/OBSRemoteProtocol.h index 6df77fac..03d8aa7d 100644 --- a/src/protocol/OBSRemoteProtocol.h +++ b/src/protocol/OBSRemoteProtocol.h @@ -23,11 +23,13 @@ with this program. If not, see #include class WSRequestHandler; +class RpcEvent; class OBSRemoteProtocol { public: std::string processMessage(WSRequestHandler& requestHandler, std::string message); + std::string encodeEvent(const RpcEvent& event); private: std::string buildResponse(QString messageId, QString status, obs_data_t* fields = nullptr); diff --git a/src/rpc/RpcEvent.cpp b/src/rpc/RpcEvent.cpp new file mode 100644 index 00000000..488aaaf2 --- /dev/null +++ b/src/rpc/RpcEvent.cpp @@ -0,0 +1,47 @@ +/* +obs-websocket +Copyright (C) 2016-2020 Stéphane Lepin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see +*/ + +#include "RpcEvent.h" + +RpcEvent::RpcEvent(const QString& updateType, uint64_t streamTime, uint64_t recordingTime, obs_data_t* fields) : + _updateType(updateType), + _streamTime(streamTime), + _recordingTime(recordingTime), + _fields(fields) +{ +} + +const QString& RpcEvent::updateType() const +{ + return _updateType; +} + +const uint64_t RpcEvent::streamTime() const +{ + return _streamTime; +} + +const uint64_t RpcEvent::recordingTime() const +{ + return _recordingTime; +} + +const OBSData RpcEvent::fields() const +{ + return OBSData(_fields); +} \ No newline at end of file diff --git a/src/rpc/RpcEvent.h b/src/rpc/RpcEvent.h new file mode 100644 index 00000000..b1deee67 --- /dev/null +++ b/src/rpc/RpcEvent.h @@ -0,0 +1,45 @@ +/* +obs-websocket +Copyright (C) 2016-2020 Stéphane Lepin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see +*/ + +#pragma once + +#include +#include + +#include "../obs-websocket.h" + +class RpcEvent +{ +public: + explicit RpcEvent( + const QString& updateType, + uint64_t streamTime, uint64_t recordingTime, + obs_data_t* fields = nullptr + ); + + const QString& updateType() const; + const uint64_t streamTime() const; + const uint64_t recordingTime() const; + const OBSData fields() const; + +private: + QString _updateType; + uint64_t _streamTime; + uint64_t _recordingTime; + OBSDataAutoRelease _fields; +}; From 774abd66faf51175ebf1280dd2e5bc29a938ddb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Tue, 28 Jan 2020 18:59:35 +0100 Subject: [PATCH 39/41] RpcEvent + RpcRequest: move accessors into declaration --- src/rpc/RpcEvent.cpp | 24 ++++-------------------- src/rpc/RpcEvent.h | 23 +++++++++++++++++++---- src/rpc/RpcRequest.cpp | 22 +++++----------------- src/rpc/RpcRequest.h | 17 ++++++++++++++--- 4 files changed, 42 insertions(+), 44 deletions(-) diff --git a/src/rpc/RpcEvent.cpp b/src/rpc/RpcEvent.cpp index 488aaaf2..2c20f6f9 100644 --- a/src/rpc/RpcEvent.cpp +++ b/src/rpc/RpcEvent.cpp @@ -24,24 +24,8 @@ RpcEvent::RpcEvent(const QString& updateType, uint64_t streamTime, uint64_t reco _recordingTime(recordingTime), _fields(fields) { -} - -const QString& RpcEvent::updateType() const -{ - return _updateType; -} - -const uint64_t RpcEvent::streamTime() const -{ - return _streamTime; -} - -const uint64_t RpcEvent::recordingTime() const -{ - return _recordingTime; -} - -const OBSData RpcEvent::fields() const -{ - return OBSData(_fields); + if (fields) { + _fields = obs_data_create(); + obs_data_apply(_fields, fields); + } } \ No newline at end of file diff --git a/src/rpc/RpcEvent.h b/src/rpc/RpcEvent.h index b1deee67..8910232f 100644 --- a/src/rpc/RpcEvent.h +++ b/src/rpc/RpcEvent.h @@ -32,10 +32,25 @@ public: obs_data_t* fields = nullptr ); - const QString& updateType() const; - const uint64_t streamTime() const; - const uint64_t recordingTime() const; - const OBSData fields() const; + const QString& updateType() const + { + return _updateType; + } + + const uint64_t streamTime() const + { + return _streamTime; + } + + const uint64_t recordingTime() const + { + return _recordingTime; + } + + const OBSData fields() const + { + return OBSData(_fields); + } private: QString _updateType; diff --git a/src/rpc/RpcRequest.cpp b/src/rpc/RpcRequest.cpp index 81b211b0..04d62cb9 100644 --- a/src/rpc/RpcRequest.cpp +++ b/src/rpc/RpcRequest.cpp @@ -22,24 +22,12 @@ with this program. If not, see RpcRequest::RpcRequest(const QString& messageId, const QString& methodName, obs_data_t* params) : _messageId(messageId), _methodName(methodName), - _parameters(obs_data_create()) + _parameters(nullptr) { - obs_data_apply(_parameters, params); -} - -const QString& RpcRequest::messageId() const -{ - return _messageId; -} - -const QString& RpcRequest::methodName() const -{ - return _methodName; -} - -const OBSData RpcRequest::parameters() const -{ - return OBSData(_parameters); + if (params) { + _parameters = obs_data_create(); + obs_data_apply(_parameters, params); + } } const RpcResponse RpcRequest::success(obs_data_t* additionalFields) const diff --git a/src/rpc/RpcRequest.h b/src/rpc/RpcRequest.h index 04df4005..3e360150 100644 --- a/src/rpc/RpcRequest.h +++ b/src/rpc/RpcRequest.h @@ -30,9 +30,20 @@ class RpcRequest public: explicit RpcRequest(const QString& messageId, const QString& methodName, obs_data_t* params); - const QString& messageId() const; - const QString& methodName() const; - const OBSData parameters() const; + const QString& messageId() const + { + return _messageId; + } + + const QString& methodName() const + { + return _methodName; + } + + const OBSData parameters() const + { + return OBSData(_parameters); + } const RpcResponse success(obs_data_t* additionalFields = nullptr) const; const RpcResponse failed(const QString& errorMessage, obs_data_t* additionalFields = nullptr) const; From 865cb4857b9561c1f6fec09f96fa62de25bbaa01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Wed, 29 Jan 2020 11:13:42 +0100 Subject: [PATCH 40/41] RpcEvent: refactor fields to additionalFields --- src/protocol/OBSRemoteProtocol.cpp | 2 +- src/rpc/RpcEvent.cpp | 14 +++++++++----- src/rpc/RpcEvent.h | 8 ++++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/protocol/OBSRemoteProtocol.cpp b/src/protocol/OBSRemoteProtocol.cpp index 002f0f54..318716ca 100644 --- a/src/protocol/OBSRemoteProtocol.cpp +++ b/src/protocol/OBSRemoteProtocol.cpp @@ -64,7 +64,7 @@ std::string OBSRemoteProtocol::encodeEvent(const RpcEvent& event) { OBSDataAutoRelease eventData = obs_data_create(); - OBSData additionalFields = event.fields(); + OBSData additionalFields = event.additionalFields(); if (additionalFields) { obs_data_apply(eventData, additionalFields); } diff --git a/src/rpc/RpcEvent.cpp b/src/rpc/RpcEvent.cpp index 2c20f6f9..a8d3b06b 100644 --- a/src/rpc/RpcEvent.cpp +++ b/src/rpc/RpcEvent.cpp @@ -18,14 +18,18 @@ with this program. If not, see #include "RpcEvent.h" -RpcEvent::RpcEvent(const QString& updateType, uint64_t streamTime, uint64_t recordingTime, obs_data_t* fields) : +RpcEvent::RpcEvent( + const QString& updateType, + uint64_t streamTime, uint64_t recordingTime, + obs_data_t* additionalFields +) : _updateType(updateType), _streamTime(streamTime), _recordingTime(recordingTime), - _fields(fields) + _additionalFields(nullptr) { - if (fields) { - _fields = obs_data_create(); - obs_data_apply(_fields, fields); + if (additionalFields) { + _additionalFields = obs_data_create(); + obs_data_apply(_additionalFields, additionalFields); } } \ No newline at end of file diff --git a/src/rpc/RpcEvent.h b/src/rpc/RpcEvent.h index 8910232f..6dd0df99 100644 --- a/src/rpc/RpcEvent.h +++ b/src/rpc/RpcEvent.h @@ -29,7 +29,7 @@ public: explicit RpcEvent( const QString& updateType, uint64_t streamTime, uint64_t recordingTime, - obs_data_t* fields = nullptr + obs_data_t* additionalFields = nullptr ); const QString& updateType() const @@ -47,14 +47,14 @@ public: return _recordingTime; } - const OBSData fields() const + const OBSData additionalFields() const { - return OBSData(_fields); + return OBSData(_additionalFields); } private: QString _updateType; uint64_t _streamTime; uint64_t _recordingTime; - OBSDataAutoRelease _fields; + OBSDataAutoRelease _additionalFields; }; From 02fea8938ac9600f34d57d5c50cd11401aa46418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Wed, 29 Jan 2020 13:16:47 +0100 Subject: [PATCH 41/41] OBSRemoteProtocol(processMessage): fix field order --- src/protocol/OBSRemoteProtocol.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/protocol/OBSRemoteProtocol.cpp b/src/protocol/OBSRemoteProtocol.cpp index 318716ca..e5b1da1a 100644 --- a/src/protocol/OBSRemoteProtocol.cpp +++ b/src/protocol/OBSRemoteProtocol.cpp @@ -64,11 +64,6 @@ std::string OBSRemoteProtocol::encodeEvent(const RpcEvent& event) { OBSDataAutoRelease eventData = obs_data_create(); - OBSData additionalFields = event.additionalFields(); - if (additionalFields) { - obs_data_apply(eventData, additionalFields); - } - QString updateType = event.updateType(); obs_data_set_string(eventData, "update-type", updateType.toUtf8().constData()); @@ -82,6 +77,11 @@ std::string OBSRemoteProtocol::encodeEvent(const RpcEvent& event) obs_data_set_string(eventData, "rec-timecode", recordingTimecode.toUtf8().constData()); } + OBSData additionalFields = event.additionalFields(); + if (additionalFields) { + obs_data_apply(eventData, additionalFields); + } + return std::string(obs_data_get_json(eventData)); }