From da9d177514fe438edd8262226cdc770df6c9eb82 Mon Sep 17 00:00:00 2001 From: Scott Murray Date: Fri, 30 Aug 2019 11:40:23 -0400 Subject: Initial check in Initial check in of contents of the original repository: git://github.com/AGLExport/agl-service-navigation as of commit 1f1ffc92fcc882aa5e885badbc91a3384f5d77b1. Bug-AGL: SPEC-2787 Signed-off-by: Scott Murray Change-Id: I02d008ee73cdfd88f1e7587ee57101187b9c4d6d (cherry picked from commit f14ecdd52975ae365af5ed32648bf55dddacb8d9) --- src/analyze_request.cpp | 296 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 296 insertions(+) create mode 100644 src/analyze_request.cpp (limited to 'src/analyze_request.cpp') diff --git a/src/analyze_request.cpp b/src/analyze_request.cpp new file mode 100644 index 0000000..593ed42 --- /dev/null +++ b/src/analyze_request.cpp @@ -0,0 +1,296 @@ +// Copyright 2017 AW SOFTWARE CO.,LTD +// Copyright 2017 AISIN AW CO.,LTD + +#include "genivi/genivi-navicore-constants.h" +#include "analyze_request.h" +#include +#include +#include +#include + + +/** + * @brief Create arguments to pass to Genivi API GetPosition. + * @param[in] req_json_str JSON request from BinderClient + * @param[out] Params An array of key information you want to obtain + * @return Success or failure of processing + */ +bool AnalyzeRequest::CreateParamsGetPosition( const char* req_json_str, std::vector< int32_t >& Params) +{ + struct json_object *req_json = json_tokener_parse(req_json_str); + struct json_object* jValuesToReturn = NULL; + if( json_object_object_get_ex(req_json, "valuesToReturn", &jValuesToReturn) ) + { + if( json_object_is_type(jValuesToReturn, json_type_array) ) + { + for (int i = 0; i < json_object_array_length(jValuesToReturn); ++i) + { + struct json_object* j_elem = json_object_array_get_idx(jValuesToReturn, i); + + // JSON type acquisition + if( json_object_is_type(j_elem, json_type_int ) ) + { + int32_t req_key = json_object_get_int (j_elem); + + // no supported. + if ((NAVICORE_TIMESTAMP == req_key) || (NAVICORE_SPEED == req_key)) + { + continue; + } + Params.push_back(req_key); + } + else + { + fprintf(stdout, "key is not integer type.\n"); + return false; + } + } + } + else + { + fprintf(stdout, "request is not array type.\n"); + return false; + } + } + else + { + fprintf(stdout, "key valuesToReturn not found.\n"); + return false; + } + + return true; +} + + +/** + * @brief Create arguments to pass to Genivi API CreateRoute + * @param[in] req_json_str JSON request from BinderClient + * @param[out] sessionHdl Session handle + * @return Success or failure of processing + */ +bool AnalyzeRequest::CreateParamsCreateRoute( const char* req_json_str, uint32_t& sessionHdl ) +{ + // Get sessionHandle information + return JsonObjectGetSessionHdl(req_json_str, sessionHdl); +} + + +/** + * @brief Create arguments to pass to Genivi API PauseSimulation + * @param[in] req_json_str JSON request from BinderClient + * @param[out] sessionHdl Session handle + * @return Success or failure of processing + */ +bool AnalyzeRequest::CreateParamsPauseSimulation( const char* req_json_str, uint32_t& sessionHdl ) +{ + // Get sessionHandle information + return JsonObjectGetSessionHdl(req_json_str, sessionHdl); +} + + +/** + * @brief Create arguments to pass to Genivi API CreateRoute + * @param[in] req_json_str JSON request from BinderClient + * @param[out] sessionHdl Session handle + * @param[out] simuMode Simulation mode + * @return Success or failure of processing + */ +bool AnalyzeRequest::CreateParamsSetSimulationMode( const char* req_json_str, uint32_t& sessionHdl, bool& simuMode ) +{ + bool ret = false; + struct json_object *sess = NULL; + struct json_object *simu = NULL; + + struct json_object *req_json = json_tokener_parse(req_json_str); + if ((json_object_object_get_ex(req_json, "sessionHandle", &sess)) && + (json_object_object_get_ex(req_json, "simulationMode", &simu))) + { + if (json_object_is_type(sess, json_type_int) && + json_object_is_type(simu, json_type_boolean)) + { + sessionHdl = json_object_get_int(sess); + simuMode = json_object_get_int(simu); + ret = true; + } + else + { + fprintf(stdout, "key is invalid type.\n"); + } + } + else + { + fprintf(stdout, "key sessionHandle or simulationMode not found.\n"); + } + + return ret; +} + + +/** + * @brief Create arguments to pass to Genivi API CancelRouteCalculation + * @param[in] req_json_str JSON request from BinderClient + * @param[out] sessionHdl Session handle + * @param[out] routeHdl Route handle + * @return Success or failure of processing + */ +bool AnalyzeRequest::CreateParamsCancelRouteCalculation( const char* req_json_str, uint32_t& sessionHdl, uint32_t& routeHdl ) +{ + // Get sessionHandle, RouteHandle + return JsonObjectGetSessionHdlRouteHdl(req_json_str, sessionHdl, routeHdl); +} + + +/** + * @brief Create arguments to pass to Genivi API SetWaypoints + * @param[in] req_json_str JSON request from BinderClient + * @param[out] sessionHdl Session handle + * @param[out] routeHdl Route handle + * @param[out] currentPos Whether or not to draw a route from the position of the vehicle + * @param[out] waypointsList Destination coordinates + * @return Success or failure of processing + */ +bool AnalyzeRequest::CreateParamsSetWaypoints( const char* req_json_str, uint32_t& sessionHdl, uint32_t& routeHdl, + bool& currentPos, std::vector& waypointsList ) +{ + bool ret = false; + struct json_object *sess = NULL; + struct json_object *rou = NULL; + struct json_object *current = NULL; + struct json_object *wpl = NULL; + + struct json_object *req_json = json_tokener_parse(req_json_str); + if ((json_object_object_get_ex(req_json, "sessionHandle", &sess)) && + (json_object_object_get_ex(req_json, "route", &rou)) && + (json_object_object_get_ex(req_json, "startFromCurrentPosition", ¤t)) && + (json_object_object_get_ex(req_json, "", &wpl))) + { + if (json_object_is_type(sess, json_type_int) && + json_object_is_type(rou, json_type_int) && + json_object_is_type(current, json_type_boolean) && + json_object_is_type(wpl, json_type_array)) + { + sessionHdl = json_object_get_int(sess); + routeHdl = json_object_get_int(rou); + currentPos = json_object_get_boolean(current); + + // Get latitude, longitude + for (int i = 0; i < json_object_array_length(wpl); ++i) + { + struct json_object *array = json_object_array_get_idx(wpl, i); + struct json_object *lati = NULL; + struct json_object *longi = NULL; + + if (json_object_object_get_ex(array, "latitude", &lati) && + json_object_object_get_ex(array, "longitude", &longi)) { + + double latitude = json_object_get_double(lati); + double longitude = json_object_get_double(longi); + Waypoint destWp(latitude, longitude); + waypointsList.push_back(destWp); + ret = true; + } + else + { + fprintf(stdout, "key latitude or longitude not found.\n"); + } + } + } + else + { + fprintf(stdout, "key is invalid type.\n"); + } + } + else + { + fprintf(stdout, "key valuesToReturn not found.\n"); + } + + return ret; +} + + +/** + * @brief Create arguments to pass to Genivi API CalculateRoute + * @param[in] req_json_str JSON request from BinderClient + * @param[out] sessionHdl Session handle + * @param[out] routeHdl Route handle + * @return Success or failure of processing + */ +bool AnalyzeRequest::CreateParamsCalculateRoute( const char* req_json_str, uint32_t& sessionHdl, uint32_t& routeHdl ) +{ + // Get sessionHandle, RouteHandle + return JsonObjectGetSessionHdlRouteHdl(req_json_str, sessionHdl, routeHdl); +} + + +/** + * @brief Get session handle and route handle information from JSON + * @param[in] req_json_str JSON request from BinderClient + * @param[out] Session handle value + * @return Success or failure of processing + */ + +bool AnalyzeRequest::JsonObjectGetSessionHdl( const char* req_json_str, uint32_t& sessionHdl) +{ + bool ret = false; + struct json_object *sess = NULL; + + struct json_object *req_json = json_tokener_parse(req_json_str); + if (json_object_object_get_ex(req_json, "sessionHandle", &sess)) + { + if (json_object_is_type(sess, json_type_int)) + { + sessionHdl = json_object_get_int(sess); + ret = true; + } + else + { + fprintf(stdout, "key is not integer type.\n"); + } + } + else + { + fprintf(stdout, "key sessionHandle not found.\n"); + } + + return ret; +} + + +/** + * @brief Get session handle and route handle information from JSON + * @param[in] req_json_str JSON request from BinderClient + * @param[out] Session handle value + * @param[out] Route handle value + * @return Success or failure of processing + */ + +bool AnalyzeRequest::JsonObjectGetSessionHdlRouteHdl( const char* req_json_str, uint32_t& sessionHdl, uint32_t& routeHdl) +{ + bool ret = false; + struct json_object *sess = NULL; + struct json_object *rou = NULL; + + struct json_object *req_json = json_tokener_parse(req_json_str); + if ((json_object_object_get_ex(req_json, "sessionHandle", &sess)) && + (json_object_object_get_ex(req_json, "route", &rou))) + { + if (json_object_is_type(sess, json_type_int) && + json_object_is_type(rou, json_type_int)) + { + sessionHdl = json_object_get_int(sess); + routeHdl = json_object_get_int(rou); + ret = true; + } + else + { + fprintf(stdout, "key is not integer type.\n"); + } + } + else + { + fprintf(stdout, "key sessionHandle or route not found.\n"); + } + + return ret; +} -- cgit 1.2.3-korg