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/src/dap_json_rpc_params.c b/net/server/json_rpc/rpc_core/src/dap_json_rpc_params.c index 3e3f98fe5ef0981df47d4ce4cf3e60a0aea572da..f5c4de2f7aa384bc31f3fced15944aab9bf401a9 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 @@ -136,7 +136,7 @@ dap_json_rpc_params_t * dap_json_rpc_params_create_from_array_list(json_object * 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) + if (a_method == NULL ) return NULL; dap_json_rpc_params_t *params = dap_json_rpc_params_create(); @@ -166,21 +166,40 @@ dap_json_rpc_params_t * dap_json_rpc_params_create_from_subcmd_and_args(json_obj 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; + + 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; + } } } 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 c217f1e6576d9c0768f1d900c437ab5de7770fcf..be4e112cf34f57d77cfb0efd8a4708eacc0d3975 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 @@ -237,6 +237,7 @@ dap_json_rpc_request_t *dap_json_rpc_request_from_json(const char *a_data) *jobj_id = NULL, *jobj_method = NULL, *jobj_params = NULL, + *jobj_subcmd = NULL, *l_arguments_obj = NULL; if (jterr == json_tokener_success) do { @@ -254,15 +255,16 @@ 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)) - request->params = dap_json_rpc_params_create_from_array_list(jobj_params); - 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; + if(!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 + 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);