Skip to content

Commit 780e08f

Browse files
committed
JSON getconfig API - allow filter to exclude all elements via "null" value
1 parent 8b417dc commit 780e08f

File tree

11 files changed

+103
-75
lines changed

11 files changed

+103
-75
lines changed

include/db/SettingsTable.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
#include <QJsonDocument>
1414

15-
const int GLOABL_INSTANCE_ID = std::numeric_limits<quint8>::max();;
15+
const int NO_INSTANCE_ID = std::numeric_limits<quint8>::max();;
1616
const char DEFAULT_CONFIG_VERSION[] = "2.0.0-alpha.8";
1717

1818
///
@@ -23,7 +23,7 @@ class SettingsTable : public DBManager
2323

2424
public:
2525
/// construct wrapper with settings table
26-
SettingsTable(quint8 instance = GLOABL_INSTANCE_ID, QObject* parent = nullptr);
26+
SettingsTable(quint8 instance = NO_INSTANCE_ID, QObject* parent = nullptr);
2727

2828
///
2929
/// @brief Create or update a settings record

include/hyperion/SettingsManager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class SettingsManager : public QObject
2323
/// @params instance Instance index of HyperionInstanceManager
2424
/// @params parent The parent hyperion instance
2525
///
26-
SettingsManager(quint8 instance = GLOABL_INSTANCE_ID, QObject* parent = nullptr);
26+
SettingsManager(quint8 instance = NO_INSTANCE_ID, QObject* parent = nullptr);
2727

2828
///
2929
/// @brief Save a complete JSON configuration

libsrc/api/API.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const int IMAGE_SCALE = 2000;
4040

4141
API::API(Logger *log, bool localConnection, QObject *parent)
4242
: QObject(parent),
43-
_currInstanceIndex (GLOABL_INSTANCE_ID)
43+
_currInstanceIndex (NO_INSTANCE_ID)
4444
, _hyperion (nullptr)
4545
, _authorized (false)
4646
, _adminAuthorized (false)

libsrc/api/JsonAPI.cpp

Lines changed: 50 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ void JsonAPI::handleInstanceCommand(const JsonApiCommand& cmd, const QJsonObject
333333
// Execute the command for each valid instance
334334
for (const auto &instanceId : std::as_const(instanceIds))
335335
{
336-
if (isRunningInstanceRequired == InstanceCmd::MustRun_Yes || _currInstanceIndex == GLOABL_INSTANCE_ID)
336+
if (isRunningInstanceRequired == InstanceCmd::MustRun_Yes || _currInstanceIndex == NO_INSTANCE_ID)
337337
{
338338
if (handleInstanceSwitch(instanceId))
339339
{
@@ -911,8 +911,8 @@ void JsonAPI::handleConfigSetCommand(const QJsonObject &message, const JsonApiCo
911911
const QJsonObject globalSettings = config["global"].toObject().value("settings").toObject();
912912
if (!globalSettings.isEmpty())
913913
{
914-
const QJsonObject instanceZeroConfig = instancesNewConfigs.value(GLOABL_INSTANCE_ID);
915-
instancesNewConfigs.insert(GLOABL_INSTANCE_ID, JsonUtils::mergeJsonObjects(instanceZeroConfig, globalSettings));
914+
const QJsonObject instanceZeroConfig = instancesNewConfigs.value(NO_INSTANCE_ID);
915+
instancesNewConfigs.insert(NO_INSTANCE_ID, JsonUtils::mergeJsonObjects(instanceZeroConfig, globalSettings));
916916
}
917917

918918
QMapIterator<quint8, QJsonObject> iter (instancesNewConfigs);
@@ -959,10 +959,18 @@ void JsonAPI::handleConfigGetCommand(const QJsonObject &message, const JsonApiCo
959959
const QJsonObject globalConfig = filter["global"].toObject();
960960
if (!globalConfig.isEmpty())
961961
{
962-
const QJsonArray globalTypes = globalConfig["types"].toArray();
963-
for (const auto &type : globalTypes) {
964-
if (type.isString()) {
965-
globalFilterTypes.append(type.toString());
962+
QJsonValue const globalTypes = globalConfig["types"];
963+
if (globalTypes.isNull())
964+
{
965+
globalFilterTypes.append("__none__");
966+
}
967+
else
968+
{
969+
QJsonArray const globalTypesList = globalTypes.toArray();
970+
for (const auto &type : globalTypesList) {
971+
if (type.isString()) {
972+
globalFilterTypes.append(type.toString());
973+
}
966974
}
967975
}
968976
}
@@ -974,25 +982,41 @@ void JsonAPI::handleConfigGetCommand(const QJsonObject &message, const JsonApiCo
974982
if (!instances.isEmpty())
975983
{
976984
QSet<quint8> const configuredInstanceIds = _instanceManager->getInstanceIds();
977-
const QJsonArray instanceIds = instances["ids"].toArray();
978-
for (const auto &idx : instanceIds) {
979-
if (idx.isDouble()) {
980-
quint8 const instanceId = static_cast<quint8>(idx.toInt());
981-
if (configuredInstanceIds.contains(instanceId))
982-
{
983-
instanceListFilter.append(instanceId);
984-
}
985-
else
986-
{
987-
errorDetails.append(QString("Given instance number '%1' does not exist.").arg(instanceId));
985+
QJsonValue const instanceIds = instances["ids"];
986+
if (instanceIds.isNull())
987+
{
988+
instanceListFilter.append(NO_INSTANCE_ID);
989+
}
990+
else
991+
{
992+
QJsonArray const instaceIdsList = instanceIds.toArray();
993+
for (const auto &idx : instaceIdsList) {
994+
if (idx.isDouble()) {
995+
quint8 const instanceId = static_cast<quint8>(idx.toInt());
996+
if (configuredInstanceIds.contains(instanceId))
997+
{
998+
instanceListFilter.append(instanceId);
999+
}
1000+
else
1001+
{
1002+
errorDetails.append(QString("Given instance number '%1' does not exist.").arg(instanceId));
1003+
}
9881004
}
9891005
}
990-
}
9911006

992-
const QJsonArray instanceTypes = instances["types"].toArray();
993-
for (const auto &type : instanceTypes) {
994-
if (type.isString()) {
995-
instanceFilterTypes.append(type.toString());
1007+
QJsonValue const instanceTypes = instances["types"];
1008+
if (instanceTypes.isNull())
1009+
{
1010+
instanceFilterTypes.append("__none__");
1011+
}
1012+
else
1013+
{
1014+
QJsonArray const instaceTypesList = instanceTypes.toArray();
1015+
for (const auto &type : instaceTypesList) {
1016+
if (type.isString()) {
1017+
instanceFilterTypes.append(type.toString());
1018+
}
1019+
}
9961020
}
9971021
}
9981022
}
@@ -1005,14 +1029,7 @@ void JsonAPI::handleConfigGetCommand(const QJsonObject &message, const JsonApiCo
10051029
settings = JsonInfo::getConfiguration();
10061030
}
10071031

1008-
if (!settings.empty())
1009-
{
1010-
sendSuccessDataReplyWithError(settings, cmd, errorDetails);
1011-
}
1012-
else
1013-
{
1014-
sendErrorReply("Generating full config failed", cmd);
1015-
}
1032+
sendSuccessDataReplyWithError(settings, cmd, errorDetails);
10161033
}
10171034

10181035
void JsonAPI::handleConfigRestoreCommand(const QJsonObject &message, const JsonApiCommand& cmd)
@@ -1670,7 +1687,7 @@ QJsonObject JsonAPI::getBasicCommandReply(bool success, const QString &command,
16701687
reply["command"] = command;
16711688
reply["tan"] = tan;
16721689

1673-
if ((_currInstanceIndex != GLOABL_INSTANCE_ID) && instanceCmdType != InstanceCmd::No)
1690+
if ((_currInstanceIndex != NO_INSTANCE_ID) && instanceCmdType != InstanceCmd::No)
16741691
{
16751692
reply["instance"] = _currInstanceIndex;
16761693
}
@@ -1793,7 +1810,7 @@ void JsonAPI::handleInstanceStateChange(InstanceState state, quint8 instanceID,
17931810
if (!_hyperion.isNull() && _hyperion->getInstanceIndex() == instanceID)
17941811
{
17951812
_hyperion.reset(nullptr);
1796-
_jsonCB->setSubscriptionsTo(GLOABL_INSTANCE_ID);
1813+
_jsonCB->setSubscriptionsTo(NO_INSTANCE_ID);
17971814
}
17981815
}
17991816
break;

libsrc/api/JsonCallbacks.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ void JsonCallbacks::doCallback(Subscription::Type cmd, const QJsonArray& data)
340340

341341
if (Subscription::isInstanceSpecific(cmd))
342342
{
343-
if (_instanceID != GLOABL_INSTANCE_ID)
343+
if (_instanceID != NO_INSTANCE_ID)
344344
{
345345
obj.insert("instance", _instanceID);
346346
}
@@ -357,7 +357,7 @@ void JsonCallbacks::doCallback(Subscription::Type cmd, const QJsonObject& data)
357357

358358
if (Subscription::isInstanceSpecific(cmd))
359359
{
360-
if (_instanceID != GLOABL_INSTANCE_ID)
360+
if (_instanceID != NO_INSTANCE_ID)
361361
{
362362
obj.insert("instance", _instanceID);
363363
}

libsrc/api/JsonInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ QJsonObject JsonInfo::getGrabbers(const Hyperion* hyperion)
314314
{
315315
QJsonObject grabbers;
316316

317-
quint8 idx { GLOABL_INSTANCE_ID };
317+
quint8 idx { NO_INSTANCE_ID };
318318
if (hyperion != nullptr)
319319
{
320320
idx = hyperion->getInstanceIndex();

libsrc/db/DBConfigManager.cpp

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -317,11 +317,14 @@ QJsonObject DBConfigManager::getConfiguration(const QList<quint8>& instanceIdsFi
317317

318318
QJsonObject config;
319319

320-
QJsonObject globalConfig;
321-
MetaTable const metaTable;
322-
globalConfig.insert("uuid", metaTable.getUUID());
323-
globalConfig.insert("settings", settingsTable.getSettings(globalFilterTypes));
324-
config.insert("global", globalConfig);
320+
if (!globalFilterTypes.contains("__none__"))
321+
{
322+
QJsonObject globalConfig;
323+
MetaTable const metaTable;
324+
globalConfig.insert("uuid", metaTable.getUUID());
325+
globalConfig.insert("settings", settingsTable.getSettings(globalFilterTypes));
326+
config.insert("global", globalConfig);
327+
}
325328

326329
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
327330
QSet<quint8> instanceIds(instanceIdsFilter.begin(), instanceIdsFilter.end());
@@ -332,30 +335,33 @@ QJsonObject DBConfigManager::getConfiguration(const QList<quint8>& instanceIdsFi
332335
}
333336
#endif
334337

335-
if (instanceIds.isEmpty())
338+
if (!instanceIds.contains(NO_INSTANCE_ID))
336339
{
337-
instanceIds = instanceTable.getAllInstanceIDs();
338-
}
340+
if (instanceIds.isEmpty())
341+
{
342+
instanceIds = instanceTable.getAllInstanceIDs();
343+
}
339344

340-
QList<quint8> sortedInstanceIds = instanceIds.values();
341-
std::sort(sortedInstanceIds.begin(), sortedInstanceIds.end());
345+
QList<quint8> sortedInstanceIds = instanceIds.values();
346+
std::sort(sortedInstanceIds.begin(), sortedInstanceIds.end());
342347

343-
QJsonArray instanceIdList;
344-
QJsonArray configInstanceList;
345-
for (const quint8 instanceId : std::as_const(sortedInstanceIds))
346-
{
347-
QJsonObject instanceConfig;
348-
instanceConfig.insert("id",instanceId);
349-
instanceConfig.insert("name", instanceTable.getNamebyIndex(instanceId));
350-
instanceConfig.insert("enabled", instanceTable.isEnabled(instanceId));
351-
instanceConfig.insert("settings", settingsTable.getSettings(static_cast<quint8>(instanceId), instanceFilteredTypes));
352-
configInstanceList.append(instanceConfig);
353-
354-
instanceIdList.append(instanceId);
355-
}
348+
QJsonArray instanceIdList;
349+
QJsonArray configInstanceList;
350+
for (const quint8 instanceId : std::as_const(sortedInstanceIds))
351+
{
352+
QJsonObject instanceConfig;
353+
instanceConfig.insert("id",instanceId);
354+
instanceConfig.insert("name", instanceTable.getNamebyIndex(instanceId));
355+
instanceConfig.insert("enabled", instanceTable.isEnabled(instanceId));
356+
instanceConfig.insert("settings", settingsTable.getSettings(static_cast<quint8>(instanceId), instanceFilteredTypes));
357+
configInstanceList.append(instanceConfig);
358+
359+
instanceIdList.append(instanceId);
360+
}
356361

357-
config.insert("instanceIds", instanceIdList);
358-
config.insert("instances", configInstanceList);
362+
config.insert("instanceIds", instanceIdList);
363+
config.insert("instances", configInstanceList);
364+
}
359365

360366
if (!commiTransaction(idb))
361367
{

libsrc/db/SettingsTable.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -183,12 +183,17 @@ QJsonObject SettingsTable::getSettings(const QStringList& filteredTypes ) const
183183

184184
QJsonObject SettingsTable::getSettings(const QVariant& instance, const QStringList& filteredTypes ) const
185185
{
186+
if (filteredTypes.contains("__none__"))
187+
{
188+
return {};
189+
}
190+
186191
QJsonObject settingsObject;
187192
QStringList settingsKeys({ "type", "config" });
188193
QString settingsCondition;
189194
QVariantList conditionValues;
190195

191-
if (instance.isNull() || instance == GLOABL_INSTANCE_ID )
196+
if (instance.isNull() || instance == NO_INSTANCE_ID )
192197
{
193198
settingsCondition = "hyperion_inst IS NULL";
194199
}
@@ -240,7 +245,7 @@ QStringList SettingsTable::nonExtingTypes() const
240245
{
241246
QStringList testTypes;
242247
QString condition {"hyperion_inst"};
243-
if(_instance == GLOABL_INSTANCE_ID)
248+
if(_instance == NO_INSTANCE_ID)
244249
{
245250
condition += " IS NULL";
246251
testTypes = getGlobalSettingTypes().toList();
@@ -269,7 +274,7 @@ QPair<bool, QStringList> SettingsTable::addMissingDefaults()
269274
QStringList errorList;
270275

271276
QJsonObject defaultSettings;
272-
if (_instance == GLOABL_INSTANCE_ID)
277+
if (_instance == NO_INSTANCE_ID)
273278
{
274279
defaultSettings = getDefaultSettings().value("global").toObject();
275280
}
@@ -281,7 +286,7 @@ QPair<bool, QStringList> SettingsTable::addMissingDefaults()
281286
const QStringList missingTypes = nonExtingTypes();
282287
if (missingTypes.empty())
283288
{
284-
Debug(_log, "%s settings: No missing configuration items identified", _instance == GLOABL_INSTANCE_ID ? "Global" : QSTRING_CSTR(QString("Instance [%1]").arg(_instance)) );
289+
Debug(_log, "%s settings: No missing configuration items identified", _instance == NO_INSTANCE_ID ? "Global" : QSTRING_CSTR(QString("Instance [%1]").arg(_instance)) );
285290
return qMakePair (true, errorList );
286291
}
287292

@@ -294,7 +299,7 @@ QPair<bool, QStringList> SettingsTable::addMissingDefaults()
294299

295300
bool errorOccured {false};
296301

297-
Info(_log, "%s settings: Add default settings for %d missing configuration items", _instance == GLOABL_INSTANCE_ID ? "Global" : QSTRING_CSTR(QString("Instance [%1]").arg(_instance)), missingTypes.size() );
302+
Info(_log, "%s settings: Add default settings for %d missing configuration items", _instance == NO_INSTANCE_ID ? "Global" : QSTRING_CSTR(QString("Instance [%1]").arg(_instance)), missingTypes.size() );
298303
for (const auto &missingType: missingTypes)
299304
{
300305
if (!createSettingsRecord(missingType, JsonUtils::jsonValueToQString(defaultSettings.value(missingType))))
@@ -321,7 +326,7 @@ QPair<bool, QStringList> SettingsTable::addMissingDefaults()
321326

322327
if(errorList.isEmpty())
323328
{
324-
Debug(_log, "%s settings: Successfully defaulted settings for %d missing configuration items", _instance == GLOABL_INSTANCE_ID ? "Global" : QSTRING_CSTR(QString("Instance [%1]").arg(_instance)), missingTypes.size() );
329+
Debug(_log, "%s settings: Successfully defaulted settings for %d missing configuration items", _instance == NO_INSTANCE_ID ? "Global" : QSTRING_CSTR(QString("Instance [%1]").arg(_instance)), missingTypes.size() );
325330
}
326331

327332
return qMakePair (errorList.isEmpty(), errorList );

libsrc/forwarder/MessageForwarder.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ MessageForwarder::MessageForwarder(const QJsonDocument& config)
4444
, _isActive(false)
4545
, _priority(DEFAULT_FORWARDER_FLATBUFFFER_PRIORITY)
4646
, _isEnabled(false)
47-
, _toBeForwardedInstanceID(GLOABL_INSTANCE_ID)
47+
, _toBeForwardedInstanceID(NO_INSTANCE_ID)
4848
, _hyperion(nullptr)
4949
, _muxer(nullptr)
5050
, _messageForwarderFlatBufHelper(nullptr)
@@ -137,7 +137,7 @@ void MessageForwarder::handleSettingsUpdate(settings::type type, const QJsonDocu
137137
{
138138
if (type != settings::NETFORWARD) return;
139139

140-
quint8 const newInstanceID = config["instance"].toInt(GLOABL_INSTANCE_ID);
140+
quint8 const newInstanceID = config["instance"].toInt(NO_INSTANCE_ID);
141141
if (newInstanceID != _toBeForwardedInstanceID)
142142
{
143143
disconnect(_toBeForwardedInstanceID);

libsrc/hyperion/HyperionIManager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ QSharedPointer<Hyperion> HyperionIManager::getHyperionInstance(quint8 instanceId
3535

3636
if (!_runningInstances.isEmpty())
3737
{
38-
if (instanceId != GLOABL_INSTANCE_ID )
38+
if (instanceId != NO_INSTANCE_ID )
3939
{
4040
Warning(_log,"The requested instance index '%d' with name '%s' isn't running", instanceId, QSTRING_CSTR(_instanceTable->getNamebyIndex(instanceId)));
4141
}

0 commit comments

Comments
 (0)