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/server/json_rpc/rpc_core/CMakeLists.txt b/net/server/json_rpc/rpc_core/CMakeLists.txt index 1fd3cb30946491a2e6358540b6ab298e0d313910..7d3a1f14cd65f0c0729e4e20b91f65a7e4c21482 100644 --- a/net/server/json_rpc/rpc_core/CMakeLists.txt +++ b/net/server/json_rpc/rpc_core/CMakeLists.txt @@ -18,3 +18,12 @@ target_include_directories(${PROJECT_NAME} INTERFACE . include/) target_include_directories(${PROJECT_NAME} PUBLIC include) target_link_libraries(${PROJECT_NAME} dap_core dap_json-c dap_client dap_cli_server) + +if(INSTALL_DAP_SDK) +set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${JSON_RPC_CORE_HEADERS}") +INSTALL(TARGETS ${PROJECT_NAME} + LIBRARY DESTINATION lib/dap/net/server/json_rpc/rpc_core/ + ARCHIVE DESTINATION lib/dap/net/server/json_rpc/rpc_core/ + PUBLIC_HEADER DESTINATION include/dap/net/server/json_rpc/rpc_core/ +) +endif() \ No newline at end of file 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 42a11bfa517cc9da35d7333cc978ce9d26a91bfa..4bc84c85f06c1120fe08e7ef79eda5852e288aba 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 @@ -136,6 +136,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 901a5b09625d9eccec18525df13ecd2de0faba51..9809915e9839fab1ec2c9670170582ba1f0f465e 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" @@ -118,6 +119,83 @@ 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 ) + 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; + } + } + + if (a_args){ + json_object_object_foreach(a_args, key, val){ + const char *l_key_str = NULL; + const char *l_val_str = NULL; + enum json_type l_arg_type = json_object_get_type(val); + if(l_arg_type == json_type_string || + l_arg_type == json_type_null || l_arg_type == json_type_object) { + l_key_str = key; + l_val_str = json_object_get_string(val); + } else if(l_arg_type == json_type_array){ + int length = json_object_array_length(val); + dap_string_append_printf(l_str_tmp, "-%s;", key); + + for (int i = 0; i < length; i++){ + json_object *jobj = json_object_array_get_idx(val, 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%s", json_object_get_string(jobj), i == length - 1 ? ";" : ","); + } + continue; + } + + 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 a17bec4878dba2e5c20cf3252dbc025d50b73273..18eda8317e916117b8384f6c1a3ef764f55071cb 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,9 @@ 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, + *jobj_subcmd = NULL, + *l_arguments_obj = NULL; if (jterr == json_tokener_success) do { if (json_object_object_get_ex(jobj, "id", &jobj_id)) @@ -253,13 +255,21 @@ dap_json_rpc_request_t *dap_json_rpc_request_from_json(const char *a_data) break; } - if (json_object_object_get_ex(jobj, "params", &jobj_params)) + json_object_object_get_ex(jobj, "params", &jobj_params); + json_object_object_get_ex(jobj, "subcommand", &jobj_subcmd); + json_object_object_get_ex(jobj, "arguments", &l_arguments_obj); + + if (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); - break; - } + else + request->params = dap_json_rpc_params_create_from_subcmd_and_args(jobj_subcmd, l_arguments_obj, request->method); + 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