diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index f3ebff86c008c53bdaf9f960d5426e475cdbaa87..d8cf287635e09d3650be3ca81fdad18b7b19f911 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -580,28 +580,45 @@ int s_link_manager_fill_net_info(dap_link_t *a_link) json_object *s_net_sync_status(dap_chain_net_t *a_net) { // sanity check dap_return_val_if_pass(!a_net, NULL); -// func work - json_object *l_ret = json_object_new_object(); - size_t - l_count_el = 0, - l_count_el_all = 0, - l_node_link_nodes = 0; + size_t l_count_atoms = 0; + json_object *l_jobj_chains_array = json_object_new_object(); dap_chain_t *l_chain = NULL; - DL_FOREACH(a_net->pub.chains, l_chain){ - l_count_el += l_chain->callback_count_atom(l_chain); - l_count_el_all += l_chain->atom_num_last; - } - double l_percent = l_count_el_all ? (double)(l_count_el * 100) / l_count_el_all : 0; - char *l_percent_str = dap_strdup_printf("%.3f", l_percent); - json_object *l_jobj_percent = json_object_new_string(l_percent_str); - DAP_DELETE(l_percent_str); - json_object *l_jobj_total = json_object_new_uint64(l_count_el_all); - json_object *l_jobj_current = json_object_new_uint64(l_count_el); - json_object_object_add(l_ret, "current", l_jobj_current); - json_object_object_add(l_ret, "total", l_jobj_total); - json_object_object_add(l_ret, "percent", l_jobj_percent); - return l_ret; + DL_FOREACH(a_net->pub.chains, l_chain) { + json_object *l_jobj_chain = json_object_new_object(); + json_object *l_jobj_chain_status = NULL; + json_object *l_jobj_percent = NULL; + if (PVT(a_net)->state == NET_STATE_OFFLINE) { + l_jobj_chain_status = json_object_new_string("not synced"); + l_jobj_percent = json_object_new_string(" - %"); + } else if (PVT(a_net)->state == NET_STATE_ONLINE) { + l_jobj_chain_status = json_object_new_string("synced"); + l_jobj_percent = json_object_new_string(" - %"); + } else { + if (PVT(a_net)->sync_context.cur_chain && PVT(a_net)->sync_context.cur_chain->id.uint64 == l_chain->id.uint64) { + l_jobj_chain_status = json_object_new_string("sync in process"); + double l_percent = l_chain->callback_count_atom(l_chain) ? + (double) (l_chain->callback_count_atom(l_chain) * 100) / l_chain->atom_num_last : 0; + if (l_percent > 100) + l_percent = 100; + char *l_percent_str = dap_strdup_printf("%.3f", l_percent); + l_jobj_percent = json_object_new_string(l_percent_str); + DAP_DELETE(l_percent_str); + } else { + l_jobj_chain_status = json_object_new_string("not synced"); + l_jobj_percent = json_object_new_string(" - %"); + } + } + json_object *l_jobj_current = json_object_new_uint64(l_chain->callback_count_atom(l_chain)); + json_object *l_jobj_total = json_object_new_uint64(l_chain->atom_num_last); + json_object_object_add(l_jobj_chain, "status", l_jobj_chain_status); + json_object_object_add(l_jobj_chain, "current", l_jobj_current); + json_object_object_add(l_jobj_chain, "total", l_jobj_total); + json_object_object_add(l_jobj_chain, "percent", l_jobj_percent); + json_object_object_add(l_jobj_chains_array, l_chain->name, l_jobj_chain); + + } + return l_jobj_chains_array; } struct json_object *dap_chain_net_states_json_collect(dap_chain_net_t *a_net) {