From f097b36c2e7e34c5a8e22894be9f9884daf4d0d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 2 Aug 2019 21:40:42 +0200 Subject: [PATCH 1/2] WSRequestHandler: add type checks for field test methods --- src/WSRequestHandler.cpp | 39 ++++++++++++++++++++++++++++++++++++--- src/WSRequestHandler.h | 8 +++++++- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index 4af1ad14..932b7e4b 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -226,9 +226,42 @@ HandlerResponse WSRequestHandler::SendResponse(const char* status, obs_data_t* f return response; } -bool WSRequestHandler::hasField(QString name) { - if (!data || name.isEmpty() || name.isNull()) +bool WSRequestHandler::hasField(QString name, obs_data_type expectedFieldType) { + if (!data || name.isEmpty() || name.isNull()) { return false; + } - return obs_data_has_user_value(data, name.toUtf8()); + obs_data_item_t* 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; + } + } + + 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) { + return this->hasField(fieldName, OBS_DATA_NUMBER); +} + +bool WSRequestHandler::hasArray(QString fieldName) { + return this->hasField(fieldName, OBS_DATA_ARRAY); +} + +bool WSRequestHandler::hasObject(QString fieldName) { + return this->hasField(fieldName, OBS_DATA_OBJECT); } diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index 4dea020b..372f8c36 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -41,7 +41,13 @@ class WSRequestHandler : public QObject { explicit WSRequestHandler(ConnectionProperties& connProperties); ~WSRequestHandler(); std::string processIncomingMessage(std::string& textMessage); - bool hasField(QString name); + + bool hasField(QString fieldName, obs_data_type expectedFieldType = OBS_DATA_NULL); + bool hasBool(QString fieldName); + bool hasString(QString fieldName); + bool hasNumber(QString fieldName); + bool hasArray(QString fieldName); + bool hasObject(QString fieldName); HandlerResponse SendOKResponse(obs_data_t* additionalFields = nullptr); HandlerResponse SendErrorResponse(QString errorMessage); From fb0d13a171a73b51bdeef8d636f8201ccb15320a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 2 Aug 2019 21:52:50 +0200 Subject: [PATCH 2/2] WSRequestHandler: add int and double type check methods --- src/WSRequestHandler.cpp | 21 ++++++++++++++++++--- src/WSRequestHandler.h | 7 +++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index 932b7e4b..1b936528 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -226,7 +226,7 @@ HandlerResponse WSRequestHandler::SendResponse(const char* status, obs_data_t* f return response; } -bool WSRequestHandler::hasField(QString name, obs_data_type expectedFieldType) { +bool WSRequestHandler::hasField(QString name, obs_data_type expectedFieldType, obs_data_number_type expectedNumberType) { if (!data || name.isEmpty() || name.isNull()) { return false; } @@ -241,6 +241,13 @@ bool WSRequestHandler::hasField(QString name, obs_data_type expectedFieldType) { 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; @@ -254,8 +261,16 @@ bool WSRequestHandler::hasString(QString fieldName) { return this->hasField(fieldName, OBS_DATA_STRING); } -bool WSRequestHandler::hasNumber(QString fieldName) { - return this->hasField(fieldName, OBS_DATA_NUMBER); +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) { diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index 372f8c36..d9265ebf 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -42,10 +42,13 @@ class WSRequestHandler : public QObject { ~WSRequestHandler(); std::string processIncomingMessage(std::string& textMessage); - bool hasField(QString fieldName, obs_data_type expectedFieldType = OBS_DATA_NULL); + 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); + 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);