aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2017-08-31 01:31:43 -0700
committerLev Walkin <vlm@lionet.info>2017-08-31 01:31:43 -0700
commit09bec4606cd8fdee89cba5f0577af28ab5fdbd5b (patch)
tree4063719a44fa2bc2653c61e5a3bca0f53c96ac27
parent71191ba9f03602fc79a6d6aa2c37c6026b66f58f (diff)
ignore default values in COER
-rw-r--r--skeletons/constr_SEQUENCE_oer.c61
1 files changed, 40 insertions, 21 deletions
diff --git a/skeletons/constr_SEQUENCE_oer.c b/skeletons/constr_SEQUENCE_oer.c
index 5b2a0bde..0bfbfb62 100644
--- a/skeletons/constr_SEQUENCE_oer.c
+++ b/skeletons/constr_SEQUENCE_oer.c
@@ -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;
}