2 * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>.
4 * Redistribution and modifications are permitted subject to BSD license.
6 #include <asn_internal.h>
8 #include <constr_CHOICE.h>
11 OPEN_TYPE_xer_get(const asn_codec_ctx_t *opt_codec_ctx,
12 const asn_TYPE_descriptor_t *td, void *sptr,
13 const asn_TYPE_member_t *elm, const void *ptr, size_t size) {
14 size_t consumed_myself = 0;
15 asn_type_selector_result_t selected;
16 void *memb_ptr; /* Pointer to the member */
17 void **memb_ptr2; /* Pointer to that pointer */
23 pxer_chunk_type_e ch_type;
25 if(!(elm->flags & ATF_OPEN_TYPE)) {
29 if(!elm->type_selector) {
30 ASN_DEBUG("Type selector is not defined for Open Type %s->%s->%s",
31 td->name, elm->name, elm->type->name);
35 selected = elm->type_selector(td, sptr);
36 if(!selected.presence_index) {
40 /* Fetch the pointer to this member */
41 assert(elm->flags == ATF_OPEN_TYPE);
42 if(elm->flags & ATF_POINTER) {
43 memb_ptr2 = (void **)((char *)sptr + elm->memb_offset);
45 memb_ptr = (char *)sptr + elm->memb_offset;
46 memb_ptr2 = &memb_ptr;
48 if(*memb_ptr2 != NULL) {
49 /* Make sure we reset the structure first before encoding */
50 if(CHOICE_variant_set_presence(elm->type, *memb_ptr2, 0)
60 ch_size = xer_next_token(&xer_context, ptr, size, &ch_type);
79 * Wrapper value confirmed.
81 switch(xer_check_tag(ptr, ch_size, elm->name)) {
92 + elm->type->elements[selected.presence_index - 1].memb_offset;
94 rv = selected.type_descriptor->op->xer_decoder(
95 opt_codec_ctx, selected.type_descriptor, &inner_value, NULL, ptr, size);
100 if(CHOICE_variant_set_presence(elm->type, *memb_ptr2,
101 selected.presence_index)
109 /* Point to a best position where failure occurred */
110 rv.consumed = consumed_myself;
113 /* Wrt. rv.consumed==0:
114 * In case a genuine RC_WMORE, the whole Open Type decoding
115 * will have to be restarted.
118 if(elm->flags & ATF_POINTER) {
119 ASN_STRUCT_FREE(*selected.type_descriptor, inner_value);
122 ASN_STRUCT_RESET(*selected.type_descriptor,
133 ch_size = xer_next_token(&xer_context, ptr, size, &ch_type);
152 * Wrapper value confirmed.
154 switch(xer_check_tag(ptr, ch_size, elm->name)) {
163 rv.consumed += consumed_myself;