Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
MEC - Multi-access Edge Computing
MEC TTCN-3 Test Suite
Commits
002520df
Commit
002520df
authored
Jun 08, 2020
by
Yann Garcia
Browse files
Add missing codec part for MEC-011
parent
9a114685
Changes
2
Hide whitespace changes
Inline
Side-by-side
ccsrc/Protocols/Json/json_codec.cc
View file @
002520df
...
...
@@ -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
&
app
C
ontext
=
msg
.
appContext
();
app
C
ontext
.
encode
(
UEAppInterfaceAPI__TypesAndValues
::
AppContext_descr_
,
encoding_buffer
,
TTCN_EncDec
::
CT_JSON
);
const
UEAppInterfaceAPI__TypesAndValues
::
AppContext
&
app
_c
ontext
=
msg
.
appContext
();
app
_c
ontext
.
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,
p
roblemDetails in different modules
}
else
if
(
it
->
second
.
find
(
"
\"
problemDetails
\"
"
)
!=
std
::
string
::
npos
)
{
// TODO To be refined,
P
roblemDetails in different modules
// UEidentityAPI__TypesAndValues::ProblemDetails problem_details;
...
...
ttcn/LibMec/AppEna/ttcn/AppEnablementAPI_TypesAndValues.ttcn
View file @
002520df
...
...
@@ -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
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment