diff --git a/src/json_help.c b/src/json_help.c new file mode 100644 index 00000000..6516bdd6 --- /dev/null +++ b/src/json_help.c @@ -0,0 +1,106 @@ +/* +Copyright (c) 2020 Roger Light + +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License v1.0 +and Eclipse Distribution License v1.0 which accompany this distribution. + +The Eclipse Public License is available at + http://www.eclipse.org/legal/epl-v10.html +and the Eclipse Distribution License is available at + http://www.eclipse.org/org/documents/edl-v10.php. + +Contributors: + Roger Light - initial implementation and documentation. +*/ + +#include "config.h" + +#include +#include + +#include "mosquitto_broker_internal.h" + + +int json_get_bool(cJSON *json, const char *name, bool *value, bool optional, bool default_value) +{ + cJSON *jtmp; + + if(optional == true){ + *value = default_value; + } + + jtmp = cJSON_GetObjectItemCaseSensitive(json, name); + if(jtmp){ + if(cJSON_IsBool(jtmp) == false){ + return MOSQ_ERR_INVAL; + } + *value = cJSON_IsTrue(jtmp); + }else{ + if(optional == false){ + return MOSQ_ERR_INVAL; + } + } + return MOSQ_ERR_SUCCESS; +} + + +int json_get_int(cJSON *json, const char *name, int *value, bool optional, int default_value) +{ + cJSON *jtmp; + + if(optional == true){ + *value = default_value; + } + + jtmp = cJSON_GetObjectItemCaseSensitive(json, name); + if(jtmp){ + if(cJSON_IsNumber(jtmp) == false){ + return MOSQ_ERR_INVAL; + } + *value = jtmp->valueint; + }else{ + if(optional == false){ + return MOSQ_ERR_INVAL; + } + } + return MOSQ_ERR_SUCCESS; +} + + +int json_get_string(cJSON *json, const char *name, char **value, bool optional) +{ + cJSON *jtmp; + + *value = NULL; + + jtmp = cJSON_GetObjectItemCaseSensitive(json, name); + if(jtmp){ + if(cJSON_IsString(jtmp) == false){ + return MOSQ_ERR_INVAL; + } + *value = jtmp->valuestring; + }else{ + if(optional == false){ + return MOSQ_ERR_INVAL; + } + } + return MOSQ_ERR_SUCCESS; +} + + +/* Return a number as a number, or attempt to convert a string to a number, or a bool to a number */ +double json_get_as_number(const cJSON *json) +{ + char *endptr = NULL; + + if(cJSON_IsNumber(json)){ + return json->valuedouble; + }else if(cJSON_IsString(json)){ + return strtod(json->valuestring, &endptr); + }else if(cJSON_IsBool(json)){ + return cJSON_IsTrue(json); + }else{ + return 0.0; + } +} diff --git a/src/json_help.h b/src/json_help.h new file mode 100644 index 00000000..55a236cf --- /dev/null +++ b/src/json_help.h @@ -0,0 +1,26 @@ +#ifndef JSON_HELP_H +#define JSON_HELP_H +/* +Copyright (c) 2020 Roger Light + +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License v1.0 +and Eclipse Distribution License v1.0 which accompany this distribution. + +The Eclipse Public License is available at + http://www.eclipse.org/legal/epl-v10.html +and the Eclipse Distribution License is available at + http://www.eclipse.org/org/documents/edl-v10.php. + +Contributors: + Roger Light - initial implementation and documentation. +*/ +#include +#include + +int json_get_bool(cJSON *json, const char *name, bool *value, bool optional, bool default_value); +int json_get_int(cJSON *json, const char *name, int *value, bool optional, int default_value); +int json_get_string(cJSON *json, const char *name, char **value, bool optional); +double json_get_as_number(const cJSON *json); + +#endif