diff --git a/core/include/dap_common.h b/core/include/dap_common.h index 164650a209ba341640698c6b852535f6282159aa..a21aa11a79b6c3af5964813ebb44997be6a57174 100755 --- a/core/include/dap_common.h +++ b/core/include/dap_common.h @@ -61,10 +61,11 @@ #ifndef __cplusplus # include <stdatomic.h> #else -# include <atomic> -# define _Atomic(X) std::atomic< X > +#include <atomic> +#define _Atomic(X) std::atomic< X > #define atomic_bool _Atomic(bool) #define atomic_uint _Atomic(uint) +#define atomic_int _Atomic(int) #endif #ifdef __MACH__ diff --git a/crypto/include/dap_guuid.h b/crypto/include/dap_guuid.h index 44cb53e08baab7b30ceb880366e1ff55d059a871..51d9f1c9c1926bea7abf34ee949e7a46dfe33061 100644 --- a/crypto/include/dap_guuid.h +++ b/crypto/include/dap_guuid.h @@ -45,7 +45,7 @@ static inline dap_guuid_t dap_guuid_new() DAP_STATIC_INLINE dap_guuid_t dap_guuid_compose(uint64_t a_net_id, uint64_t a_service_id) { - return (dap_guuid_t){ .net_id = a_net_id, .srv_id = a_service_id }; + return (dap_guuid_t){{ .net_id = a_net_id, .srv_id = a_service_id }}; } dap_guuid_str_t dap_guuid_to_hex_str_(dap_guuid_t a_guuid); #define dap_guuid_to_hex_str(guid) dap_guuid_to_hex_str_(guid).s diff --git a/net/link_manager/CMakeLists.txt b/net/link_manager/CMakeLists.txt index dea1cd3d086193bf2e7080d2ec366d0eabcb7c40..43690c742af8ff7bb8fd54e6a3f700a78b70af76 100644 --- a/net/link_manager/CMakeLists.txt +++ b/net/link_manager/CMakeLists.txt @@ -23,7 +23,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE .) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/uthash/src) if(INSTALL_DAP_SDK) -set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${DAP_CLIENT_HEADERS}") +set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${DAP_LINK_MANAGER_HEADERS}") INSTALL(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION lib/dap/net/link_manager/ ARCHIVE DESTINATION lib/dap/net/link_manager/ diff --git a/net/server/cli_server/dap_cli_server.c b/net/server/cli_server/dap_cli_server.c index 6f427f282164b292930a2cf8c733d772ff214e9e..612040c655f4fa00fe53a45bb40edd9dfe371da4 100644 --- a/net/server/cli_server/dap_cli_server.c +++ b/net/server/cli_server/dap_cli_server.c @@ -210,6 +210,7 @@ int is_json_clear_method(const char *a_name) { return 0; } + int json_commands(const char * a_name) { static const char* long_cmd[] = { "tx_history", diff --git a/net/server/json_rpc/rpc_core/include/dap_json_rpc_params.h b/net/server/json_rpc/rpc_core/include/dap_json_rpc_params.h index 1bc7872a85ce3139b2164a72199affb4f252c9ae..82d2ad7ff1480d0b402d94252311066f64e292da 100644 --- a/net/server/json_rpc/rpc_core/include/dap_json_rpc_params.h +++ b/net/server/json_rpc/rpc_core/include/dap_json_rpc_params.h @@ -137,6 +137,8 @@ dap_json_rpc_type_param_t dap_json_rpc_params_get_type_param(dap_json_rpc_params */ dap_json_rpc_params_t * dap_json_rpc_params_create_from_array_list(json_object *a_array_list); +dap_json_rpc_params_t * dap_json_rpc_params_create_from_subcmd_and_args(json_object *a_subcmd, json_object *a_args, const char* a_method); + /** * Get a JSON string representation of dap_json_rpc_params_t. * diff --git a/net/server/json_rpc/rpc_core/src/dap_json_rpc_params.c b/net/server/json_rpc/rpc_core/src/dap_json_rpc_params.c index 6ee00f96ec3c579a31563ca3e7393fcb204645d5..3e3f98fe5ef0981df47d4ce4cf3e60a0aea572da 100644 --- a/net/server/json_rpc/rpc_core/src/dap_json_rpc_params.c +++ b/net/server/json_rpc/rpc_core/src/dap_json_rpc_params.c @@ -1,4 +1,5 @@ #include "dap_json_rpc_params.h" +#include "dap_string.h" #define LOG_TAG "dap_json_rpc_params" @@ -133,6 +134,64 @@ dap_json_rpc_params_t * dap_json_rpc_params_create_from_array_list(json_object * return params; } +dap_json_rpc_params_t * dap_json_rpc_params_create_from_subcmd_and_args(json_object *a_subcmd, json_object *a_args, const char* a_method) +{ + if (a_method == NULL || a_args == NULL) + return NULL; + dap_json_rpc_params_t *params = dap_json_rpc_params_create(); + + dap_string_t * l_str_tmp = dap_string_new(""); + // add subcmd to params + dap_string_append_printf(l_str_tmp, "%s;", a_method); + if(a_subcmd){ + enum json_type l_subcmd_type = json_object_get_type(a_subcmd); + if(l_subcmd_type == json_type_array){ + int length = json_object_array_length(a_subcmd); + + for (int i = 0; i < length; i++){ + json_object *jobj = json_object_array_get_idx(a_subcmd, i); + json_type jobj_type = json_object_get_type(jobj); + + if (jobj_type != json_type_string){ + log_it(L_ERROR, "Bad subcommand type"); + dap_string_free(l_str_tmp, true); + return NULL; + } + + dap_string_append_printf(l_str_tmp, "%s;", json_object_get_string(jobj)); + } + } else if (l_subcmd_type == json_type_string) { + dap_string_append_printf(l_str_tmp, "%s;", json_object_get_string( a_subcmd)); + } else { + return log_it(L_CRITICAL, "Subcomand must be array or string type."), dap_string_free(l_str_tmp, true), NULL; + } + } + + json_object_object_foreach(a_args, key, val){ + const char *l_key_str = NULL; + const char *l_val_str = NULL; + enum json_type l_subcmd_type = json_object_get_type(val); + if(l_subcmd_type == json_type_string || + l_subcmd_type == json_type_null || l_subcmd_type == json_type_object) { + l_key_str = key; + l_val_str = json_object_get_string(val); + } + + if(l_key_str){ + dap_string_append_printf(l_str_tmp, "-%s;%s;", l_key_str, l_val_str ? l_val_str : ""); + } else { + return log_it(L_CRITICAL, "Bad argument!"), dap_string_free(l_str_tmp, true), NULL; + } + } + + l_str_tmp->str[strlen(l_str_tmp->str) - 1] = '\0'; + + dap_json_rpc_params_add_data(params, l_str_tmp->str, TYPE_PARAM_STRING); + dap_string_free(l_str_tmp, true); + + return params; +} + char *dap_json_rpc_params_get_string_json(dap_json_rpc_params_t * a_params) { dap_return_val_if_fail(a_params, NULL); diff --git a/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c b/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c index c4fe280dfda139f4cbcb5e9e6df35331a6a1e0d8..c217f1e6576d9c0768f1d900c437ab5de7770fcf 100644 --- a/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c +++ b/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c @@ -236,7 +236,8 @@ dap_json_rpc_request_t *dap_json_rpc_request_from_json(const char *a_data) json_object *jobj = json_tokener_parse_verbose(a_data, &jterr), *jobj_id = NULL, *jobj_method = NULL, - *jobj_params = NULL; + *jobj_params = NULL, + *l_arguments_obj = NULL; if (jterr == json_tokener_success) do { if (json_object_object_get_ex(jobj, "id", &jobj_id)) @@ -255,11 +256,19 @@ dap_json_rpc_request_t *dap_json_rpc_request_from_json(const char *a_data) if (json_object_object_get_ex(jobj, "params", &jobj_params)) request->params = dap_json_rpc_params_create_from_array_list(jobj_params); - else { - log_it(L_ERROR, "Error parse JSON string, Can't find array params for request with id: %" DAP_UINT64_FORMAT_U, request->id); + else if(json_object_object_get_ex(jobj, "arguments", &l_arguments_obj)){ + json_object_object_get_ex(jobj, "subcommand", &jobj_params); + request->params = dap_json_rpc_params_create_from_subcmd_and_args(jobj_params, l_arguments_obj, request->method); + } else { + log_it(L_ERROR, "Error parse JSON string, Can't find array params or subcomand and arguments for request with id: %" DAP_UINT64_FORMAT_U, request->id); break; } json_object_put(jobj); + if (!request->params){ + dap_json_rpc_params_remove_all(request->params); + DAP_DEL_MULTY(request->method, request); + return NULL; + } return request; } while (0); else