diff options
author | Inga Stotland <inga.stotland@intel.com> | 2017-12-18 12:35:51 -0800 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2017-12-19 17:51:40 +0100 |
commit | c07b067ff1e1ed13f1adbfac0a842fb76dee53d1 (patch) | |
tree | a553b2a09f3fc285a21bbd4e9f1cc0b77663e099 /mesh | |
parent | 6c91d284591e33fd39fcf8cdd07ad3261433bc2d (diff) | |
download | bluez-c07b067ff1e1ed13f1adbfac0a842fb76dee53d1.tar.gz |
mesh: meshctl: make model parsing more manageable
Extract functionality for finding an existing model from
parse_configuration_models() into new function find_configured_model().
This removes confusing logic from overloaded implementation of
parse_configuration_models().
Diffstat (limited to 'mesh')
-rw-r--r-- | mesh/prov-db.c | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/mesh/prov-db.c b/mesh/prov-db.c index 04803a5c8..8a7b47f6e 100644 --- a/mesh/prov-db.c +++ b/mesh/prov-db.c @@ -371,14 +371,49 @@ static bool parse_bindings(struct mesh_node *node, int ele_idx, return true; } -static bool parse_configuration_models(struct mesh_node *node, int ele_idx, - json_object *jmodels, uint32_t target_id, json_object **jtarget) +static json_object* find_configured_model(struct mesh_node *node, int ele_idx, + json_object *jmodels, uint32_t target_id) { int model_cnt; int i; - if (jtarget) - *jtarget = NULL; + model_cnt = json_object_array_length(jmodels); + + for (i = 0; i < model_cnt; ++i) { + json_object *jmodel; + json_object *jvalue; + char *str; + int len; + uint32_t model_id; + + jmodel = json_object_array_get_idx(jmodels, i); + + json_object_object_get_ex(jmodel, "modelId", &jvalue); + str = (char *)json_object_get_string(jvalue); + + len = strlen(str); + + if (len != 4 && len != 8) + return NULL; + + if (sscanf(str, "%08x", &model_id) != 1) + return NULL; + + if (len == 4) + model_id += 0xffff0000; + + if (model_id == target_id) + return jmodel; + } + + return NULL; +} + +static bool parse_configuration_models(struct mesh_node *node, int ele_idx, + json_object *jmodels) +{ + int model_cnt; + int i; model_cnt = json_object_array_length(jmodels); @@ -405,11 +440,6 @@ static bool parse_configuration_models(struct mesh_node *node, int ele_idx, if (len == 4) model_id += 0xffff0000; - if (jtarget && model_id == target_id) { - *jtarget = jmodel; - return true; - } - json_object_object_get_ex(jmodel, "bind", &jarray); if (jarray && !parse_bindings(node, ele_idx, model_id, jarray)) return false; @@ -468,7 +498,7 @@ static bool parse_configuration_elements(struct mesh_node *node, if (!jmodels) continue; - if(!parse_configuration_models(node, index, jmodels, 0, NULL)) + if(!parse_configuration_models(node, index, jmodels)) return false; } return true; @@ -1011,8 +1041,8 @@ static json_object *get_jmodel_obj(struct mesh_node *node, uint8_t ele_idx, jmodels = json_object_new_array(); json_object_object_add(jelement, "models", jmodels); } else { - parse_configuration_models(node, ele_idx, jmodels, - model_id, &jmodel); + jmodel = find_configured_model(node, ele_idx, jmodels, + model_id); } if (!jmodel) { |