diff --git a/ccsrc/Protocols/Json/json_codec.cc b/ccsrc/Protocols/Json/json_codec.cc index 0793b414983c426a8ece74269aea3b67b7166499..606668c665217cbc5f32dab430f8f7fa5db8b5ba 100644 --- a/ccsrc/Protocols/Json/json_codec.cc +++ b/ccsrc/Protocols/Json/json_codec.cc @@ -29,13 +29,33 @@ int json_codec::encode (const LibItsHttp__JsonMessageBodyTypes::JsonBody& msg, O cell_change_subscription.encode(RnisAPI__TypesAndValues::CellChangeSubscription_descr_, encoding_buffer, TTCN_EncDec::CT_JSON); data = char2oct(CHARSTRING("{\"CellChangeSubscription\": ")) + OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data()) + char2oct(CHARSTRING("}")); } else if (msg.ischosen(LibItsHttp__JsonMessageBodyTypes::JsonBody::ALT_appContext)) { - const UEAppInterfaceAPI__TypesAndValues::AppContext& appContext = msg.appContext(); - appContext.encode(UEAppInterfaceAPI__TypesAndValues::AppContext_descr_, encoding_buffer, TTCN_EncDec::CT_JSON); + const UEAppInterfaceAPI__TypesAndValues::AppContext& app_context = msg.appContext(); + app_context.encode(UEAppInterfaceAPI__TypesAndValues::AppContext_descr_, encoding_buffer, TTCN_EncDec::CT_JSON); data = char2oct(CHARSTRING("{\"AppContext\": ")) + OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data()) + char2oct(CHARSTRING("}")); + } else if (msg.ischosen(LibItsHttp__JsonMessageBodyTypes::JsonBody::ALT_serviceInfo)) { + const AppEnablementAPI__TypesAndValues::ServiceInfo& service_info = msg.serviceInfo(); + service_info.encode(AppEnablementAPI__TypesAndValues::ServiceInfo_descr_, encoding_buffer, TTCN_EncDec::CT_JSON); + data = char2oct(CHARSTRING("{\"ServiceInfo\": ")) + OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data()) + char2oct(CHARSTRING("}")); + } else if (msg.ischosen(LibItsHttp__JsonMessageBodyTypes::JsonBody::ALT_appTerminationNotificationSubscription)) { + const AppEnablementAPI__TypesAndValues::AppTerminationNotificationSubscription& app = msg.appTerminationNotificationSubscription(); + app.encode(AppEnablementAPI__TypesAndValues::AppTerminationNotificationSubscription_descr_, encoding_buffer, TTCN_EncDec::CT_JSON); + data = char2oct(CHARSTRING("{\"AppTerminationNotificationSubscription\": ")) + OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data()) + char2oct(CHARSTRING("}")); + } else if (msg.ischosen(LibItsHttp__JsonMessageBodyTypes::JsonBody::ALT_dnsRule)) { + const AppEnablementAPI__TypesAndValues::DnsRule& dns_rule = msg.dnsRule(); + dns_rule.encode(AppEnablementAPI__TypesAndValues::DnsRule_descr_, encoding_buffer, TTCN_EncDec::CT_JSON); + data = char2oct(CHARSTRING("{\"DnsRule\": ")) + OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data()) + char2oct(CHARSTRING("}")); + } else if (msg.ischosen(LibItsHttp__JsonMessageBodyTypes::JsonBody::ALT_serAvailabilityNotificationSubscription)) { + const AppEnablementAPI__TypesAndValues::SerAvailabilityNotificationSubscription& ser = msg.serAvailabilityNotificationSubscription(); + ser.encode(AppEnablementAPI__TypesAndValues::SerAvailabilityNotificationSubscription_descr_, encoding_buffer, TTCN_EncDec::CT_JSON); + data = char2oct(CHARSTRING("{\"SerAvailabilityNotificationSubscription\": ")) + OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data()) + char2oct(CHARSTRING("}")); + } else if (msg.ischosen(LibItsHttp__JsonMessageBodyTypes::JsonBody::ALT_trafficRule)) { + const AppEnablementAPI__TypesAndValues::TrafficRule& traffic_rule = msg.trafficRule(); + traffic_rule.encode(AppEnablementAPI__TypesAndValues::TrafficRule_descr_, encoding_buffer, TTCN_EncDec::CT_JSON); + data = char2oct(CHARSTRING("{\"SerAvailabilityNotificationSubscription\": ")) + OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data()) + char2oct(CHARSTRING("}")); } else { loggers::get_instance().error("json_codec::encode: Not supported"); } - + loggers::get_instance().log("<<< json_codec::encode"); return 0; } @@ -48,45 +68,40 @@ int json_codec::decode (const OCTETSTRING& p_data, LibItsHttp__JsonMessageBodyTy params::const_iterator it; if (p_params == nullptr) { loggers::get_instance().warning("json_codec::decode: Failed to access p_params (null pointer)"); - return -1; + return -1; // TODO Use p_data instead of return -1 } else { it = p_params->find("decode_str"); if (it == p_params->cend()) { loggers::get_instance().warning("json_codec::decode: Failed to access p_params item (decode_str)"); - return -1; + return -1; // TODO Use p_data instead of return -1 } } - + + // Remove data structure name (if present) ... + std::string str; + if ((it->second[0] != '[') && (it->second[0] != '{')) { + int idx_begin = it->second.find(":"); + int idx_end = it->second.rfind("}") - 1; // Remove the last '}' + str = it->second.substr(idx_begin + 1, idx_end - idx_begin); + } else { + str = it->second; + } + // ..and create the decoding buffer TTCN_EncDec::set_error_behavior(TTCN_EncDec::ET_ALL, TTCN_EncDec::EB_DEFAULT); TTCN_EncDec::clear_error(); - // Remove data structure name... - int idx_begin = it->second.find(":"); - int idx_end = it->second.rfind("}") - 1; // Remove the last '}' - std::string str = it->second.substr(idx_begin + 1, idx_end - idx_begin); - // ..and create the decoding buffer - loggers::get_instance().log("json_codec::decode: decoding_buffer=%s", str.c_str()); + loggers::get_instance().log("json_codec::decode: decoding_buffer=%c/%s", str[0], str.c_str()); TTCN_Buffer decoding_buffer(OCTETSTRING(str.length(), (const unsigned char*)str.c_str())); if (it->second.find("\"userList\"") != std::string::npos) { // Be careful to the order // TODO To be refined, find("\"userList\"") is not optimal - LocationAPI__TypesAndValues::UserList user_list; - user_list.decode(LocationAPI__TypesAndValues::UserList_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); - msg.userList() = user_list; + LocationAPI__TypesAndValues::UserList user_list; + user_list.decode(LocationAPI__TypesAndValues::UserList_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); + msg.userList() = user_list; } else if (it->second.find("\"accessPointList\"") != std::string::npos) { // Be careful to the order // TODO To be refined, find("\"accessPointList\"") is not optimal LocationAPI__TypesAndValues::AccessPointList access_point_list; access_point_list.decode(LocationAPI__TypesAndValues::AccessPointList_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); msg.accessPointList() = access_point_list; - } else if (it->second.find("\"SubscriptionLinkList\"") != std::string::npos) { // Be careful to the order - // TODO To be refined, find("\"accessPointList\"") is not optimal - RnisAPI__TypesAndValues::SubscriptionLinkList subscription_link_list; - subscription_link_list.decode(RnisAPI__TypesAndValues::SubscriptionLinkList_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); - msg.subscriptionLinkList() = subscription_link_list; - } else if (it->second.find("\"transportInfoList\"") != std::string::npos) { // Be careful to the order - // TODO To be refined, find("\"accessPointList\"") is not optimal - AppEnablementAPI__TypesAndValues::TransportInfoList transport_info_list; - transport_info_list.decode(AppEnablementAPI__TypesAndValues::TransportInfoList_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); - msg.transportInfoList() = transport_info_list; } else if (it->second.find("\"userTrackingSubscription\"") != std::string::npos) { LocationAPI__TypesAndValues::UserTrackingSubscription user_tracking_subscription; user_tracking_subscription.decode(LocationAPI__TypesAndValues::UserTrackingSubscription_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); @@ -95,14 +110,53 @@ int json_codec::decode (const OCTETSTRING& p_data, LibItsHttp__JsonMessageBodyTy LocationAPI__TypesAndValues::UserInfo user_info; user_info.decode(LocationAPI__TypesAndValues::UserInfo_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); msg.userInfo() = user_info; + } else if (it->second.find("\"SubscriptionLinkList\"") != std::string::npos) { // Be careful to the order + // TODO To be refined, find("\"accessPointList\"") is not optimal + RnisAPI__TypesAndValues::SubscriptionLinkList subscription_link_list; + subscription_link_list.decode(RnisAPI__TypesAndValues::SubscriptionLinkList_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); + msg.subscriptionLinkList() = subscription_link_list; } else if (it->second.find("\"ueIdentityTagInfo\"") != std::string::npos) { UEidentityAPI__TypesAndValues::UeIdentityTagInfo ue_identity_tag_info; ue_identity_tag_info.decode(UEidentityAPI__TypesAndValues::UeIdentityTagInfo_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); msg.ueIdentityTagInfo() = ue_identity_tag_info; - } else if (it->second.find("\"trafficRule\"") != std::string::npos) { - AppEnablementAPI__TypesAndValues::TrafficRule traffic_rule; - traffic_rule.decode(AppEnablementAPI__TypesAndValues::TrafficRule_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); - msg.trafficRule() = traffic_rule; + } else if (it->second.find("\"serInstanceId\"") != std::string::npos) { // Be careful to the order + // TODO To be refined, find("\"accessPointList\"") is not optimal + if (it->second[0] == '[') { + AppEnablementAPI__TypesAndValues::ServiceInfoList service_info_list; + service_info_list.decode(AppEnablementAPI__TypesAndValues::ServiceInfoList_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); + msg.serviceInfoList() = service_info_list; + } else { + AppEnablementAPI__TypesAndValues::ServiceInfo service_info; + service_info.decode(AppEnablementAPI__TypesAndValues::ServiceInfo_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); + msg.serviceInfo() = service_info; + } + } else if (it->second.find("\"transportInfoList\"") != std::string::npos) { // Be careful to the order + // TODO To be refined, find("\"accessPointList\"") is not optimal + AppEnablementAPI__TypesAndValues::TransportInfoList transport_info_list; + transport_info_list.decode(AppEnablementAPI__TypesAndValues::TransportInfoList_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); + msg.transportInfoList() = transport_info_list; + } else if (it->second.find("\"trafficRuleId\"") != std::string::npos) { + if (it->second[0] == '[') { + AppEnablementAPI__TypesAndValues::TrafficRuleList traffic_rule_list; + traffic_rule_list.decode(AppEnablementAPI__TypesAndValues::TrafficRuleList_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); + msg.trafficRuleList() = traffic_rule_list; + } else { + AppEnablementAPI__TypesAndValues::TrafficRule traffic_rule; + traffic_rule.decode(AppEnablementAPI__TypesAndValues::TrafficRule_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); + msg.trafficRule() = traffic_rule; + } + } else if ((it->second.find("\"appInstanceId\"") != std::string::npos) && (it->second.find("\"subscriptionType\"") != std::string::npos)) { + AppEnablementAPI__TypesAndValues::AppTerminationNotificationSubscription app_term; + app_term.decode(AppEnablementAPI__TypesAndValues::AppTerminationNotificationSubscription_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); + msg.appTerminationNotificationSubscription() = app_term; + } else if (it->second.find("\"subscriptionType\"") != std::string::npos) { + AppEnablementAPI__TypesAndValues::SerAvailabilityNotificationSubscription ser_av; + ser_av.decode(AppEnablementAPI__TypesAndValues::SerAvailabilityNotificationSubscription_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); + msg.serAvailabilityNotificationSubscription() = ser_av; + } else if (it->second.find("\"ntpServers\"") != std::string::npos) { + AppEnablementAPI__TypesAndValues::TimingCaps timing_caps; + timing_caps.decode(AppEnablementAPI__TypesAndValues::TimingCaps_descr_, decoding_buffer, TTCN_EncDec::CT_JSON); + msg.timingCaps() = timing_caps; } else if (it->second.find("\"CellChangeSubscription\"") != std::string::npos) { // // Replace "type": "1" by type": "EU_IPV4_ADDRESS", "type": "2"... // // TODO Create a method instead of copy/past @@ -267,7 +321,7 @@ int json_codec::decode (const OCTETSTRING& p_data, LibItsHttp__JsonMessageBodyTy TTCN_Buffer decoding_buffer_(OCTETSTRING(str.length(), (const unsigned char*)str.c_str())); bw_info.decode(BwManagementAPI__TypesAndValues::BwInfo_descr_, decoding_buffer_, TTCN_EncDec::CT_JSON); msg.bwInfo() = bw_info; - } else if (it->second.find("\"problemDetails\"") != std::string::npos) { // TODO To be refined, problemDetails in different modules + } else if (it->second.find("\"problemDetails\"") != std::string::npos) { // TODO To be refined, ProblemDetails in different modules // UEidentityAPI__TypesAndValues::ProblemDetails problem_details; diff --git a/ttcn/LibMec/AppEna/ttcn/AppEnablementAPI_TypesAndValues.ttcn b/ttcn/LibMec/AppEna/ttcn/AppEnablementAPI_TypesAndValues.ttcn index 11dd7ae469eb94332c2eff9f0155a80876a47133..a0b56f646718eaaa48ddde6bcb51280b4a6204b9 100644 --- a/ttcn/LibMec/AppEna/ttcn/AppEnablementAPI_TypesAndValues.ttcn +++ b/ttcn/LibMec/AppEna/ttcn/AppEnablementAPI_TypesAndValues.ttcn @@ -218,14 +218,11 @@ module AppEnablementAPI_TypesAndValues { } with { variant (port_) "name as 'port'"; } - type record length(0..infinity) of Address AddressList; /** * @desc Entry point information of the service as one or more pairs of IP address and port. */ - type record Addresses { - AddressList addresses - } + type record length(0..infinity) of Address Addresses; /** * @desc Entry point information of the service in a format defined by an implementation, or in an external specification. @@ -238,14 +235,11 @@ module AppEnablementAPI_TypesAndValues { * @desc Entry point information of the service. */ type JSON.String EndPointInfo_Uri; - type record length(0..infinity) of EndPointInfo_Uri EndPointInfo_UriList; /** * @desc Entry point information of the service as string, formatted according to URI syntax. */ - type record Uris { - EndPointInfo_UriList uris - } + type record length(0..infinity) of EndPointInfo_Uri EndPointInfo_UriList; /** * @desc This type represents a type of link and may be referenced from data structures. @@ -743,8 +737,8 @@ module AppEnablementAPI_TypesAndValues { /** * @desc This type represents information about a transport endpoint. */ - type union TransportInfo_Endpoint { // JSON oneOf ??? - Uris uris, + type union TransportInfo_Endpoint { + EndPointInfo_UriList uris, Addresses addresses, Alternative alternative }