From 9c4bd7a48705871bc37c7873cb9bfa9d8f877930 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Sat, 11 Jul 2020 05:00:10 -0700 Subject: [PATCH 1/5] Requests: Scene collection and profile name checking For `SetCurrentProfile` and `SetCurrentSceneCollection`, check if it exists before attempting to switch to it, and return an error if it does not exist. --- src/Utils.cpp | 20 ++++++++++++++++++++ src/Utils.h | 1 + src/WSRequestHandler_Profiles.cpp | 8 +++++++- src/WSRequestHandler_SceneCollections.cpp | 8 +++++++- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/Utils.cpp b/src/Utils.cpp index ab301606..4ac3577d 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -51,6 +51,26 @@ obs_bounds_type getBoundsTypeFromName(QString name) { return boundTypeNames.key(name); } +bool Utils::StringInStringList(char** strings, const char* string) { + size_t index = 0; + char* value = nullptr; + + while (1) { + value = strings[index]; + + if (value == nullptr) { + return false; + } + + if (strcmp(value, string) == 0) { + return true; + } + + index++; + } + return false; +} + obs_data_array_t* Utils::StringListToArray(char** strings, const char* key) { obs_data_array_t* list = obs_data_array_create(); diff --git a/src/Utils.h b/src/Utils.h index dbe2481f..69b86fc5 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -35,6 +35,7 @@ typedef void(*PauseRecordingFunction)(bool); typedef bool(*RecordingPausedFunction)(); namespace Utils { + bool StringInStringList(char** strings, const char* string); obs_data_array_t* StringListToArray(char** strings, const char* key); obs_data_array_t* GetSceneItems(obs_source_t* source); obs_data_t* GetSceneItemData(obs_sceneitem_t* item); diff --git a/src/WSRequestHandler_Profiles.cpp b/src/WSRequestHandler_Profiles.cpp index 78e3ce2d..12728021 100644 --- a/src/WSRequestHandler_Profiles.cpp +++ b/src/WSRequestHandler_Profiles.cpp @@ -22,7 +22,13 @@ RpcResponse WSRequestHandler::SetCurrentProfile(const RpcRequest& request) { return request.failed("invalid request parameters"); } - // TODO : check if profile exists + char** profiles = obs_frontend_get_profiles(); + bool profileExists = Utils::StringInStringList(profiles, profileName.toUtf8()); + bfree(profiles); + if (!profileExists) { + return request.failed("profile does not exist"); + } + obs_frontend_set_current_profile(profileName.toUtf8()); return request.success(); } diff --git a/src/WSRequestHandler_SceneCollections.cpp b/src/WSRequestHandler_SceneCollections.cpp index 1f87996b..50d6417c 100644 --- a/src/WSRequestHandler_SceneCollections.cpp +++ b/src/WSRequestHandler_SceneCollections.cpp @@ -22,7 +22,13 @@ RpcResponse WSRequestHandler::SetCurrentSceneCollection(const RpcRequest& reques return request.failed("invalid request parameters"); } - // TODO : Check if specified profile exists and if changing is allowed + char** collections = obs_frontend_get_profiles(); + bool collectionExists = Utils::StringInStringList(collections, sceneCollection.toUtf8()); + bfree(collections); + if (!collectionExists) { + return request.failed("collection does not exist"); + } + obs_frontend_set_current_scene_collection(sceneCollection.toUtf8()); return request.success(); } From 7f1c4a1c4c254679436bd5cd8cbfd0341fa86310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Tue, 15 Sep 2020 17:12:34 +0200 Subject: [PATCH 2/5] Utils: simplified string list lookup --- src/Utils.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Utils.cpp b/src/Utils.cpp index 4ac3577d..1abb27ab 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -52,15 +52,13 @@ obs_bounds_type getBoundsTypeFromName(QString name) { } bool Utils::StringInStringList(char** strings, const char* string) { + if (!strings) { + return false; + } + size_t index = 0; - char* value = nullptr; - - while (1) { - value = strings[index]; - - if (value == nullptr) { - return false; - } + while (strings[index] != NULL) { + char* value = strings[index]; if (strcmp(value, string) == 0) { return true; @@ -68,6 +66,7 @@ bool Utils::StringInStringList(char** strings, const char* string) { index++; } + return false; } From 539e636939432fbe2bb3cace0ee6ec37fd73ac26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Tue, 15 Sep 2020 17:14:53 +0200 Subject: [PATCH 3/5] requests(SceneCollections): fix typo (profiles instead of scene collections) --- src/WSRequestHandler_SceneCollections.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/WSRequestHandler_SceneCollections.cpp b/src/WSRequestHandler_SceneCollections.cpp index 1df49673..40ac5fb7 100644 --- a/src/WSRequestHandler_SceneCollections.cpp +++ b/src/WSRequestHandler_SceneCollections.cpp @@ -22,11 +22,11 @@ RpcResponse WSRequestHandler::SetCurrentSceneCollection(const RpcRequest& reques return request.failed("invalid request parameters"); } - char** collections = obs_frontend_get_profiles(); + char** collections = obs_frontend_get_scene_collections(); bool collectionExists = Utils::StringInStringList(collections, sceneCollection.toUtf8()); bfree(collections); if (!collectionExists) { - return request.failed("collection does not exist"); + return request.failed("scene collection does not exist"); } obs_frontend_set_current_scene_collection(sceneCollection.toUtf8()); From 0dd0d01e8f385e092f502f2b13c3b02f90a14b55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Tue, 15 Sep 2020 18:17:45 +0200 Subject: [PATCH 4/5] requests(Profiles + SceneCollections): don't use QString where it is not needed --- src/WSRequestHandler_Profiles.cpp | 8 ++++---- src/WSRequestHandler_SceneCollections.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/WSRequestHandler_Profiles.cpp b/src/WSRequestHandler_Profiles.cpp index b3e0bd8a..17cae4a3 100644 --- a/src/WSRequestHandler_Profiles.cpp +++ b/src/WSRequestHandler_Profiles.cpp @@ -17,19 +17,19 @@ RpcResponse WSRequestHandler::SetCurrentProfile(const RpcRequest& request) { return request.failed("missing request parameters"); } - QString profileName = obs_data_get_string(request.parameters(), "profile-name"); - if (profileName.isEmpty()) { + const char* profileName = obs_data_get_string(request.parameters(), "profile-name"); + if (!profileName) { return request.failed("invalid request parameters"); } char** profiles = obs_frontend_get_profiles(); - bool profileExists = Utils::StringInStringList(profiles, profileName.toUtf8()); + bool profileExists = Utils::StringInStringList(profiles, profileName); bfree(profiles); if (!profileExists) { return request.failed("profile does not exist"); } - obs_frontend_set_current_profile(profileName.toUtf8()); + obs_frontend_set_current_profile(profileName); return request.success(); } diff --git a/src/WSRequestHandler_SceneCollections.cpp b/src/WSRequestHandler_SceneCollections.cpp index 40ac5fb7..faf6299b 100644 --- a/src/WSRequestHandler_SceneCollections.cpp +++ b/src/WSRequestHandler_SceneCollections.cpp @@ -17,19 +17,19 @@ RpcResponse WSRequestHandler::SetCurrentSceneCollection(const RpcRequest& reques return request.failed("missing request parameters"); } - QString sceneCollection = obs_data_get_string(request.parameters(), "sc-name"); - if (sceneCollection.isEmpty()) { + const char* sceneCollection = obs_data_get_string(request.parameters(), "sc-name"); + if (!sceneCollection) { return request.failed("invalid request parameters"); } char** collections = obs_frontend_get_scene_collections(); - bool collectionExists = Utils::StringInStringList(collections, sceneCollection.toUtf8()); + bool collectionExists = Utils::StringInStringList(collections, sceneCollection); bfree(collections); if (!collectionExists) { return request.failed("scene collection does not exist"); } - obs_frontend_set_current_scene_collection(sceneCollection.toUtf8()); + obs_frontend_set_current_scene_collection(sceneCollection); return request.success(); } From a148f7fd7cce52bcf778ec6a48f8dd96194ed718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Wed, 16 Sep 2020 21:45:31 +0200 Subject: [PATCH 5/5] requests(Profiles + SceneCollections): fix crash on change --- src/WSRequestHandler_Profiles.cpp | 5 ++++- src/WSRequestHandler_SceneCollections.cpp | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/WSRequestHandler_Profiles.cpp b/src/WSRequestHandler_Profiles.cpp index 17cae4a3..55d39b83 100644 --- a/src/WSRequestHandler_Profiles.cpp +++ b/src/WSRequestHandler_Profiles.cpp @@ -29,7 +29,10 @@ RpcResponse WSRequestHandler::SetCurrentProfile(const RpcRequest& request) { return request.failed("profile does not exist"); } - obs_frontend_set_current_profile(profileName); + obs_queue_task(OBS_TASK_UI, [](void* param) { + obs_frontend_set_current_profile(reinterpret_cast(param)); + }, (void*)profileName, true); + return request.success(); } diff --git a/src/WSRequestHandler_SceneCollections.cpp b/src/WSRequestHandler_SceneCollections.cpp index faf6299b..77ce5d0a 100644 --- a/src/WSRequestHandler_SceneCollections.cpp +++ b/src/WSRequestHandler_SceneCollections.cpp @@ -29,7 +29,10 @@ RpcResponse WSRequestHandler::SetCurrentSceneCollection(const RpcRequest& reques return request.failed("scene collection does not exist"); } - obs_frontend_set_current_scene_collection(sceneCollection); + obs_queue_task(OBS_TASK_UI, [](void* param) { + obs_frontend_set_current_scene_collection(reinterpret_cast(param)); + }, (void*)sceneCollection, true); + return request.success(); }