/*********************************************************************************************************************************** Get option values from another process ***********************************************************************************************************************************/ VariantList * configProtocolOption(ProtocolClient *client, const VariantList *paramList) { FUNCTION_LOG_BEGIN(logLevelTrace); FUNCTION_LOG_PARAM(PROTOCOL_CLIENT, client); FUNCTION_LOG_PARAM(VARIANT_LIST, paramList); FUNCTION_LOG_END(); VariantList *result = NULL; MEM_CONTEXT_TEMP_BEGIN() { ProtocolCommand *command = protocolCommandNew(PROTOCOL_COMMAND_CONFIG_OPTION_STR); for (unsigned int paramIdx = 0; paramIdx < varLstSize(paramList); paramIdx++) protocolCommandParamAdd(command, varLstGet(paramList, paramIdx)); memContextSwitch(MEM_CONTEXT_OLD()); result = varVarLst(protocolClientExecute(client, command, true)); memContextSwitch(MEM_CONTEXT_TEMP()); } MEM_CONTEXT_TEMP_END(); FUNCTION_LOG_RETURN(VARIANT_LIST, result); }
/*********************************************************************************************************************************** Build JSON output from options ***********************************************************************************************************************************/ String * perlOptionJson(void) { FUNCTION_TEST_VOID(); String *result = NULL; MEM_CONTEXT_TEMP_BEGIN() { KeyValue *configKv = kvNew(); for (ConfigOption optionId = 0; optionId < CFG_OPTION_TOTAL; optionId++) { // Skip if not valid if (!cfgOptionValid(optionId)) continue; Variant *optionVar = varNewKv(kvNew()); // Add valid kvPut(varKv(optionVar), VARSTRDEF("valid"), BOOL_TRUE_VAR); // Add source const Variant *source = NULL; switch (cfgOptionSource(optionId)) { case cfgSourceParam: { source = VARSTRDEF("param"); break; } case cfgSourceConfig: { source = VARSTRDEF("config"); break; } case cfgSourceDefault: { source = VARSTRDEF("default"); break; } } kvPut(varKv(optionVar), VARSTRDEF("source"), source); // Add negate and reset kvPut(varKv(optionVar), VARSTRDEF("negate"), VARBOOL(cfgOptionNegate(optionId))); kvPut(varKv(optionVar), VARSTRDEF("reset"), VARBOOL(cfgOptionReset(optionId))); // Add value if it is set if (cfgOptionTest(optionId)) { const Variant *valueVar = NULL; switch (cfgDefOptionType(cfgOptionDefIdFromId(optionId))) { case cfgDefOptTypeBoolean: case cfgDefOptTypeFloat: case cfgDefOptTypeInteger: case cfgDefOptTypePath: case cfgDefOptTypeSize: case cfgDefOptTypeString: { valueVar = cfgOption(optionId); break; } case cfgDefOptTypeHash: { valueVar = varNewKv(kvNew()); const KeyValue *valueKv = cfgOptionKv(optionId); const VariantList *keyList = kvKeyList(valueKv); for (unsigned int listIdx = 0; listIdx < varLstSize(keyList); listIdx++) kvPut(varKv(valueVar), varLstGet(keyList, listIdx), kvGet(valueKv, varLstGet(keyList, listIdx))); break; } case cfgDefOptTypeList: { valueVar = varNewKv(kvNew()); const VariantList *valueList = cfgOptionLst(optionId); for (unsigned int listIdx = 0; listIdx < varLstSize(valueList); listIdx++) kvPut(varKv(valueVar), varLstGet(valueList, listIdx), BOOL_TRUE_VAR); break; } } kvPut(varKv(optionVar), VARSTRDEF("value"), valueVar); } kvPut(configKv, VARSTRZ(cfgOptionName(optionId)), optionVar); } memContextSwitch(MEM_CONTEXT_OLD()); result = jsonFromKv(configKv, 0); memContextSwitch(MEM_CONTEXT_TEMP()); } MEM_CONTEXT_TEMP_END(); FUNCTION_TEST_RETURN(result); }