Commit 28ba9db6 authored by Lev Walkin's avatar Lev Walkin

retain DEFAULT encoding in XER output (std)

parent 3b6cba57
...@@ -536,7 +536,7 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, ...@@ -536,7 +536,7 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td,
if(elm->flags & ATF_POINTER) { if(elm->flags & ATF_POINTER) {
memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); memb_ptr2 = (void **)((char *)sptr + elm->memb_offset);
if(!*memb_ptr2) { if(!*memb_ptr2) {
ASN_DEBUG("Element %s %d not present", ASN_DEBUG("Element %s %zu not present",
elm->name, edx); elm->name, edx);
if(elm->optional) if(elm->optional)
continue; continue;
...@@ -874,15 +874,16 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ...@@ -874,15 +874,16 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
} }
asn_enc_rval_t asn_enc_rval_t
SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel,
int ilevel, enum xer_encoder_flags_e flags, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb,
asn_app_consume_bytes_f *cb, void *app_key) { void *app_key) {
asn_enc_rval_t er; asn_enc_rval_t er;
int xcan = (flags & XER_F_CANONICAL); int xcan = (flags & XER_F_CANONICAL);
asn_TYPE_descriptor_t *tmp_def_val_td = 0;
void *tmp_def_val = 0;
size_t edx; size_t edx;
if(!sptr) if(!sptr) ASN__ENCODE_FAILED;
ASN__ENCODE_FAILED;
er.encoded = 0; er.encoded = 0;
...@@ -896,26 +897,35 @@ SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, ...@@ -896,26 +897,35 @@ SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
if(elm->flags & ATF_POINTER) { if(elm->flags & ATF_POINTER) {
memb_ptr = *(void **)((char *)sptr + elm->memb_offset); memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
if(!memb_ptr) { if(!memb_ptr) {
if(elm->optional) assert(tmp_def_val == 0);
if(elm->default_value) {
if(elm->default_value(1, &tmp_def_val)) {
ASN__ENCODE_FAILED;
} else {
memb_ptr = tmp_def_val;
tmp_def_val_td = elm->type;
}
} else if(elm->optional) {
continue; continue;
} else {
/* Mandatory element is missing */ /* Mandatory element is missing */
ASN__ENCODE_FAILED; ASN__ENCODE_FAILED;
} }
}
} else { } else {
memb_ptr = (void *)((char *)sptr + elm->memb_offset); memb_ptr = (void *)((char *)sptr + elm->memb_offset);
} }
/*
* X.693 (0112) #9.5.
* TODO: Default values' encodings shall always be present.
*/
if(!xcan) ASN__TEXT_INDENT(1, ilevel); if(!xcan) ASN__TEXT_INDENT(1, ilevel);
ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); ASN__CALLBACK3("<", 1, mname, mlen, ">", 1);
/* Print the member itself */ /* Print the member itself */
tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, ilevel + 1,
ilevel + 1, flags, cb, app_key); flags, cb, app_key);
if(tmp_def_val) {
ASN_STRUCT_FREE(*tmp_def_val_td, tmp_def_val);
tmp_def_val = 0;
}
if(tmper.encoded == -1) return tmper; if(tmper.encoded == -1) return tmper;
ASN__CALLBACK3("</", 2, mname, mlen, ">", 1); ASN__CALLBACK3("</", 2, mname, mlen, ">", 1);
...@@ -926,6 +936,7 @@ SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, ...@@ -926,6 +936,7 @@ SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
ASN__ENCODED_OK(er); ASN__ENCODED_OK(er);
cb_failed: cb_failed:
if(tmp_def_val) ASN_STRUCT_FREE(*tmp_def_val_td, tmp_def_val);
ASN__ENCODE_FAILED; ASN__ENCODE_FAILED;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment