ignore default values in COER

This commit is contained in:
Lev Walkin 2017-08-31 01:31:43 -07:00
parent 71191ba9f0
commit 09bec4606c
1 changed files with 40 additions and 21 deletions

View File

@ -198,20 +198,14 @@ SEQUENCE_decode_oer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
if(elm->flags & ATF_OPEN_TYPE) {
rval = OPEN_TYPE_oer_get(opt_codec_ctx, td, st, elm, ptr, size);
} else {
void *memb_tmpptr; /* Temporary reference. */
void *save_memb_ptr; /* Temporary reference. */
void **memb_ptr2; /* Pointer to a pointer to a memmber */
if(elm->flags & ATF_POINTER) {
/* Member is a pointer to another structure */
memb_ptr2 = (void **)((char *)st + elm->memb_offset);
} else {
memb_tmpptr = (char *)st + elm->memb_offset;
memb_ptr2 = &memb_tmpptr; /* Ensure remains in scope! */
}
memb_ptr2 = element_ptrptr(st, elm, &save_memb_ptr);
rval = elm->type->op->oer_decoder(opt_codec_ctx, elm->type,
elm->oer_constraints, memb_ptr2,
ptr, size);
elm->oer_constraints,
memb_ptr2, ptr, size);
}
switch(rval.code) {
case RC_OK:
@ -415,9 +409,15 @@ SEQUENCE_encode_oer(asn_TYPE_descriptor_t *td,
for(edx = specs->ext_after + 1;
(ssize_t)edx < specs->ext_before - 1; edx++) {
asn_TYPE_member_t *elm = &td->elements[edx];
if(element_ptr(sptr, elm)) {
has_extensions = 1;
break;
void *memb_ptr = element_ptr(sptr, elm);
if(memb_ptr) {
if(elm->default_value
&& elm->default_value(0, &memb_ptr) == 1) {
/* Do not encode default values in extensions */
} else {
has_extensions = 1;
break;
}
}
}
ret = asn_put_few_bits(&preamble, has_extensions, 1);
@ -437,7 +437,12 @@ SEQUENCE_encode_oer(asn_TYPE_descriptor_t *td,
if(IN_EXTENSION_GROUP(specs, edx)) break;
if(elm->optional) {
uint32_t has_component = (element_ptr(sptr, elm) != NULL);
void *memb_ptr = element_ptr(sptr, elm);
uint32_t has_component = memb_ptr != NULL;
if(has_component && elm->default_value
&& elm->default_value(0, &memb_ptr) == 1) {
has_component = 0;
}
ret = asn_put_few_bits(&preamble, has_component, 1);
if(ret < 0) {
ASN__ENCODE_FAILED;
@ -461,7 +466,12 @@ SEQUENCE_encode_oer(asn_TYPE_descriptor_t *td,
if(IN_EXTENSION_GROUP(specs, edx)) break;
memb_ptr = element_ptr(sptr, elm);
if(!memb_ptr) {
if(memb_ptr) {
if(elm->default_value && elm->default_value(0, &memb_ptr) == 1) {
/* Skip default values in encoding */
continue;
}
} else {
if(elm->optional) continue;
/* Mandatory element is missing */
ASN__ENCODE_FAILED;
@ -489,7 +499,7 @@ SEQUENCE_encode_oer(asn_TYPE_descriptor_t *td,
/* Special case allowing us to use exactly one byte for #8.6 */
size_t aoms_length_bits = specs->aoms_count;
size_t aoms_length_bytes = (7 + specs->aoms_count) >> 3;
size_t aoms_length_bytes = (7 + aoms_length_bits) >> 3;
uint8_t unused_bits = 0x07 & (8 - (aoms_length_bits & 0x07));
assert(1 + aoms_length_bytes <= 127);
@ -511,6 +521,10 @@ SEQUENCE_encode_oer(asn_TYPE_descriptor_t *td,
edx++) {
asn_TYPE_member_t *elm = &td->elements[edx];
void *memb_ptr = element_ptr(sptr, elm);
if(memb_ptr && elm->default_value
&& elm->default_value(0, &memb_ptr) == 1) {
memb_ptr = 0; /* Do not encode default value. */
}
ret |= asn_put_few_bits(&extadds, memb_ptr ? 1 : 0, 1);
}
if(ret < 0) ASN__ENCODE_FAILED;
@ -525,12 +539,17 @@ SEQUENCE_encode_oer(asn_TYPE_descriptor_t *td,
void *memb_ptr = element_ptr(sptr, elm);
if(memb_ptr) {
asn_enc_rval_t er = elm->type->op->oer_encoder(
elm->type, elm->oer_constraints, memb_ptr, cb, app_key);
if(er.encoded == -1) {
return er;
if(elm->default_value
&& elm->default_value(0, &memb_ptr) == 1) {
/* Do not encode default value. */
} else {
asn_enc_rval_t er = elm->type->op->oer_encoder(
elm->type, elm->oer_constraints, memb_ptr, cb, app_key);
if(er.encoded == -1) {
return er;
}
computed_size += er.encoded;
}
computed_size += er.encoded;
} else if(!elm->optional) {
ASN__ENCODE_FAILED;
}