Skip to content

Commit 333737f

Browse files
committed
Requests: Additions and code cleanup
1 parent 82d8a3d commit 333737f

11 files changed

+142
-22
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ set(obs-websocket_SOURCES
104104
src/requesthandler/RequestHandler_Sources.cpp
105105
src/requesthandler/RequestHandler_Scenes.cpp
106106
src/requesthandler/RequestHandler_Inputs.cpp
107+
src/requesthandler/RequestHandler_SceneItems.cpp
107108
src/requesthandler/RequestHandler_Stream.cpp
108109
src/requesthandler/rpc/Request.cpp
109110
src/requesthandler/rpc/RequestResult.cpp

src/requesthandler/RequestHandler.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ const std::map<std::string, RequestMethodHandler> RequestHandler::_handlerMap
6666
{"GetInputPropertiesListPropertyItems", &RequestHandler::GetInputPropertiesListPropertyItems},
6767
{"PressInputPropertiesButton", &RequestHandler::PressInputPropertiesButton},
6868

69+
// Scene Items
70+
{"GetSceneItemList", &RequestHandler::GetSceneItemList},
71+
{"GetGroupSceneItemList", &RequestHandler::GetGroupSceneItemList},
72+
{"CreateSceneItem", &RequestHandler::CreateSceneItem},
73+
{"RemoveSceneItem", &RequestHandler::RemoveSceneItem},
74+
6975
// Stream
7076
{"GetStreamStatus", &RequestHandler::GetStreamStatus},
7177
{"ToggleStream", &RequestHandler::ToggleStream},

src/requesthandler/RequestHandler.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "rpc/RequestResult.h"
99
#include "../obs-websocket.h"
1010
#include "../utils/Obs.h"
11+
#include "../plugin-macros.generated.h"
1112

1213
class RequestHandler;
1314
typedef RequestResult(RequestHandler::*RequestMethodHandler)(const Request&);
@@ -81,6 +82,12 @@ class RequestHandler {
8182
RequestResult GetInputPropertiesListPropertyItems(const Request&);
8283
RequestResult PressInputPropertiesButton(const Request&);
8384

85+
// Scene Items
86+
RequestResult GetSceneItemList(const Request&);
87+
RequestResult GetGroupSceneItemList(const Request&);
88+
RequestResult CreateSceneItem(const Request&);
89+
RequestResult RemoveSceneItem(const Request&);
90+
8491
// Stream
8592
RequestResult GetStreamStatus(const Request&);
8693
RequestResult ToggleStream(const Request&);

src/requesthandler/RequestHandler_Config.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#include <util/config-file.h>
33

44
#include "RequestHandler.h"
5-
#include "../plugin-macros.generated.h"
65

76
RequestResult RequestHandler::GetPersistentData(const Request& request)
87
{

src/requesthandler/RequestHandler_General.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include "../eventhandler/types/EventSubscription.h"
55
#include "../obs-websocket.h"
66
#include "../WebSocketServer.h"
7-
#include "../plugin-macros.generated.h"
87

98
RequestResult RequestHandler::GetVersion(const Request& request)
109
{
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#include "RequestHandler.h"
2+
3+
RequestResult RequestHandler::GetSceneItemList(const Request& request)
4+
{
5+
RequestStatus::RequestStatus statusCode;
6+
std::string comment;
7+
OBSSourceAutoRelease scene = request.ValidateScene("sceneName", statusCode, comment);
8+
if (!scene)
9+
return RequestResult::Error(statusCode, comment);
10+
11+
json responseData;
12+
responseData["sceneItems"] = Utils::Obs::ListHelper::GetSceneItemList(obs_scene_from_source(scene));
13+
14+
return RequestResult::Success(responseData);
15+
}
16+
17+
RequestResult RequestHandler::GetGroupSceneItemList(const Request& request)
18+
{
19+
RequestStatus::RequestStatus statusCode;
20+
std::string comment;
21+
OBSSourceAutoRelease scene = request.ValidateScene("sceneName", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_GROUP_ONLY);
22+
if (!scene)
23+
return RequestResult::Error(statusCode, comment);
24+
25+
json responseData;
26+
responseData["sceneItems"] = Utils::Obs::ListHelper::GetSceneItemList(obs_group_from_source(scene));
27+
28+
return RequestResult::Success(responseData);
29+
}
30+
31+
RequestResult RequestHandler::CreateSceneItem(const Request& request)
32+
{
33+
RequestStatus::RequestStatus statusCode;
34+
std::string comment;
35+
OBSSourceAutoRelease sceneSource = request.ValidateScene("sceneName", statusCode, comment);
36+
if (!sceneSource)
37+
return RequestResult::Error(statusCode, comment);
38+
39+
OBSScene scene = obs_scene_from_source(sceneSource);
40+
41+
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
42+
if (!source)
43+
return RequestResult::Error(statusCode, comment);
44+
45+
if (request.RequestData["sceneName"] == request.RequestData["sourceName"])
46+
return RequestResult::Error(RequestStatus::CannotAct, "You cannot create scene item of a scene within itself.");
47+
48+
bool sceneItemEnabled = true;
49+
if (request.RequestData.contains("sceneItemEnabled") && request.RequestData["sceneItemEnabled"].is_boolean())
50+
sceneItemEnabled = request.RequestData["sceneItemEnabled"];
51+
52+
obs_sceneitem_t *sceneItem = Utils::Obs::ActionHelper::CreateSceneItem(source, scene, sceneItemEnabled);
53+
54+
json responseData;
55+
responseData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
56+
57+
return RequestResult::Success(responseData);
58+
}
59+
60+
RequestResult RequestHandler::RemoveSceneItem(const Request& request)
61+
{
62+
RequestStatus::RequestStatus statusCode;
63+
std::string comment;
64+
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment);
65+
if (!sceneItem)
66+
return RequestResult::Error(statusCode, comment);
67+
68+
obs_sceneitem_remove(sceneItem);
69+
70+
return RequestResult::Success();
71+
}

src/requesthandler/RequestHandler_Scenes.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#include "RequestHandler.h"
2-
#include "../plugin-macros.generated.h"
32

43
RequestResult RequestHandler::GetSceneList(const Request& request)
54
{

src/requesthandler/RequestHandler_Sources.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
#include <QDir>
66

77
#include "RequestHandler.h"
8-
#include "../plugin-macros.generated.h"
98

109
QImage TakeSourceScreenshot(obs_source_t *source, bool &success, uint32_t requestedWidth = 0, uint32_t requestedHeight = 0)
1110
{

src/requesthandler/RequestHandler_Stream.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#include "RequestHandler.h"
2-
#include "../plugin-macros.generated.h"
32

43
RequestResult RequestHandler::GetStreamStatus(const Request& request)
54
{

src/requesthandler/rpc/Request.cpp

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -136,52 +136,58 @@ const bool Request::ValidateArray(const std::string keyName, RequestStatus::Requ
136136
return true;
137137
}
138138

139-
obs_source_t *Request::ValidateScene(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const
139+
obs_source_t *Request::ValidateSource(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const
140140
{
141141
if (!ValidateString(keyName, statusCode, comment))
142142
return nullptr;
143143

144-
std::string sceneName = RequestData[keyName];
144+
std::string sourceName = RequestData[keyName];
145145

146-
obs_source_t *ret = obs_get_source_by_name(sceneName.c_str());
146+
obs_source_t *ret = obs_get_source_by_name(sourceName.c_str());
147147
if (!ret) {
148148
statusCode = RequestStatus::ResourceNotFound;
149-
comment = std::string("No scene was found by the name of `") + sceneName + "`.";
149+
comment = std::string("No source was found by the name of `") + sourceName + "`.";
150150
return nullptr;
151151
}
152152

153+
return ret;
154+
}
155+
156+
obs_source_t *Request::ValidateScene(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter) const
157+
{
158+
obs_source_t *ret = ValidateSource(keyName, statusCode, comment);
159+
if (!ret)
160+
return nullptr;
161+
153162
if (obs_source_get_type(ret) != OBS_SOURCE_TYPE_SCENE) {
154163
obs_source_release(ret);
155164
statusCode = RequestStatus::InvalidResourceType;
156165
comment = "The specified source is not a scene.";
157166
return nullptr;
158167
}
159168

160-
OBSScene scene = obs_scene_from_source(ret);
161-
if (obs_scene_is_group(scene)) {
169+
bool isGroup = obs_source_is_group(ret);
170+
if (filter == OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY && isGroup) {
162171
obs_source_release(ret);
163172
statusCode = RequestStatus::InvalidResourceType;
164173
comment = "The specified source is not a scene.";
165174
return nullptr;
175+
} else if (filter == OBS_WEBSOCKET_SCENE_FILTER_GROUP_ONLY && !isGroup) {
176+
obs_source_release(ret);
177+
statusCode = RequestStatus::InvalidResourceType;
178+
comment = "The specified source is not a group.";
179+
return nullptr;
166180
}
167181

168182
return ret;
169183
}
170184

171185
obs_source_t *Request::ValidateInput(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const
172186
{
173-
if (!ValidateString(keyName, statusCode, comment))
187+
obs_source_t *ret = ValidateSource(keyName, statusCode, comment);
188+
if (!ret)
174189
return nullptr;
175190

176-
std::string inputName = RequestData[keyName];
177-
178-
obs_source_t *ret = obs_get_source_by_name(inputName.c_str());
179-
if (!ret) {
180-
statusCode = RequestStatus::ResourceNotFound;
181-
comment = std::string("No input was found by the name of `") + inputName + "`.";
182-
return nullptr;
183-
}
184-
185191
if (obs_source_get_type(ret) != OBS_SOURCE_TYPE_INPUT) {
186192
obs_source_release(ret);
187193
statusCode = RequestStatus::InvalidResourceType;
@@ -191,3 +197,28 @@ obs_source_t *Request::ValidateInput(const std::string keyName, RequestStatus::R
191197

192198
return ret;
193199
}
200+
201+
obs_sceneitem_t *Request::ValidateSceneItem(const std::string sceneKeyName, const std::string sceneItemIdKeyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter) const
202+
{
203+
OBSSource sceneSource = ValidateScene(sceneKeyName, statusCode, comment, filter);
204+
obs_source_release(sceneSource);
205+
if (!sceneSource)
206+
return nullptr;
207+
208+
if (!ValidateNumber(sceneItemIdKeyName, statusCode, comment, 0))
209+
return nullptr;
210+
211+
OBSScene scene = obs_scene_from_source(sceneSource);
212+
213+
int64_t sceneItemId = RequestData[sceneItemIdKeyName];
214+
215+
OBSSceneItem sceneItem = obs_scene_find_sceneitem_by_id(scene, sceneItemId);
216+
if (!sceneItem) {
217+
statusCode = RequestStatus::ResourceNotFound;
218+
comment = std::string("No scene items were found in scene `") + RequestData[sceneKeyName].get<std::string>() + "` with the ID `" + std::to_string(sceneItemId) + "`.";
219+
return nullptr;
220+
}
221+
222+
obs_sceneitem_addref(sceneItem);
223+
return sceneItem;
224+
}

src/requesthandler/rpc/Request.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44
#include "../../WebSocketSession.h"
55
#include "../../utils/Json.h"
66

7+
enum ObsWebSocketSceneFilter {
8+
OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY,
9+
OBS_WEBSOCKET_SCENE_FILTER_GROUP_ONLY,
10+
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP,
11+
};
12+
713
struct Request
814
{
915
Request(SessionPtr session, const std::string requestType, const json requestData = nullptr);
@@ -20,8 +26,11 @@ struct Request
2026
const bool ValidateObject(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty = false) const;
2127
const bool ValidateArray(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty = false) const;
2228

23-
obs_source_t *ValidateScene(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
29+
// All return values have incremented refcounts
30+
obs_source_t *ValidateSource(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
31+
obs_source_t *ValidateScene(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
2432
obs_source_t *ValidateInput(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
33+
obs_sceneitem_t *ValidateSceneItem(const std::string sceneKeyName, const std::string sceneItemIdKeyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
2534

2635
SessionPtr Session;
2736
const uint8_t RpcVersion;

0 commit comments

Comments
 (0)