| 239 | } |
| 240 | |
| 241 | void ScriptHandler::RegisterScriptAction(void *, calldata_t *data) |
| 242 | { |
| 243 | const char *actionName; |
| 244 | if (!calldata_get_string(data, nameParam.data(), &actionName) || |
| 245 | strlen(actionName) == 0) { |
| 246 | blog(LOG_WARNING, "[%s] failed! \"%s\" parameter missing!", |
| 247 | registerScriptActionDeclString.data(), nameParam.data()); |
| 248 | RETURN_FAILURE(); |
| 249 | } |
| 250 | obs_data_t *defaultSettingsPtr = nullptr; |
| 251 | if (!calldata_get_ptr(data, defaultSettingsParam.data(), |
| 252 | &defaultSettingsPtr)) { |
| 253 | blog(LOG_WARNING, "[%s] failed! \"%s\" parameter missing!", |
| 254 | registerActionFuncName.data(), |
| 255 | defaultSettingsParam.data()); |
| 256 | RETURN_FAILURE(); |
| 257 | } |
| 258 | std::lock_guard<std::mutex> lock(_mutex); |
| 259 | OBSData defaultSettings(defaultSettingsPtr); |
| 260 | obs_data_release(defaultSettingsPtr); |
| 261 | |
| 262 | if (_actions.count(actionName) > 0) { |
| 263 | blog(LOG_WARNING, "[%s] failed! Action \"%s\" already exists!", |
| 264 | registerActionFuncName.data(), actionName); |
| 265 | RETURN_FAILURE(); |
| 266 | } |
| 267 | |
| 268 | const std::string id = nameToScriptID(actionName); |
| 269 | auto triggerSignalName = getTriggerSignal(actionName, true); |
| 270 | auto completionSignalName = getCompletionSignal(actionName, true); |
| 271 | auto propertiesSignalName = getPropertiesSignal(actionName, true); |
| 272 | auto newInstanceSignalName = getNewInstanceSignal(actionName, true); |
| 273 | auto deletedInstanceSignalName = |
| 274 | getDeletedInstanceSignal(actionName, true); |
| 275 | |
| 276 | const auto createScriptAction = |
| 277 | [id, defaultSettings, propertiesSignalName, triggerSignalName, |
| 278 | completionSignalName, newInstanceSignalName, |
| 279 | deletedInstanceSignalName]( |
| 280 | Macro *m) -> std::shared_ptr<MacroAction> { |
| 281 | return std::make_shared<MacroActionScript>( |
| 282 | m, id, defaultSettings, propertiesSignalName, |
| 283 | triggerSignalName, completionSignalName, |
| 284 | newInstanceSignalName, deletedInstanceSignalName); |
| 285 | }; |
| 286 | if (!MacroActionFactory::Register(id, {createScriptAction, |
| 287 | MacroSegmentScriptEdit::Create, |
| 288 | actionName})) { |
| 289 | blog(LOG_WARNING, |
| 290 | "[%s] failed! Action id \"%s\" already exists!", |
| 291 | registerActionFuncName.data(), id.c_str()); |
| 292 | RETURN_FAILURE(); |
| 293 | } |
| 294 | |
| 295 | blog(LOG_INFO, "[%s] successful for \"%s\"", |
| 296 | registerActionFuncName.data(), actionName); |
| 297 | |
| 298 | calldata_set_string(data, triggerSignalParam.data(), |
nothing calls this directly
no test coverage detected