diff options
author | Lev Walkin <vlm@lionet.info> | 2004-09-22 16:06:28 +0000 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2004-09-22 16:06:28 +0000 |
commit | a9cc46e3f3c30ddd3f2a8f712c9f0acdc793fda7 (patch) | |
tree | 3ca369d58e29a24dc08ec01d4a3e4cac2020fe26 /skeletons/constr_SET_OF.c | |
parent | e4d6ab83d7937337f1c19acfb4353fd0d43180dd (diff) |
XER support
Diffstat (limited to 'skeletons/constr_SET_OF.c')
-rw-r--r-- | skeletons/constr_SET_OF.c | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index d8dadf50..0a8ee281 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include <asn_internal.h> #include <constr_SET_OF.h> #include <asn_SET_OF.h> @@ -304,7 +305,7 @@ static int _el_buf_cmp(const void *ap, const void *bp) { /* * The DER encoder of the SET OF type. */ -der_enc_rval_t +asn_enc_rval_t SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -316,7 +317,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, ssize_t encoding_size = 0; struct _el_buffer *encoded_els; size_t max_encoded_len = 1; - der_enc_rval_t erval; + asn_enc_rval_t erval; int ret; int edx; @@ -444,6 +445,53 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, return erval; } +asn_enc_rval_t +SET_OF_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + asn1_SET_OF_specifics_t *specs=(asn1_SET_OF_specifics_t *)td->specifics; + asn1_TYPE_member_t *element = td->elements; + A_SET_OF(void) *list; + const char *mname = specs->as_XMLValueList + ? 0 : ((*element->name) ? element->name : element->type->name); + size_t mlen = mname ? strlen(mname) : 0; + int xcan = (flags & XER_F_CANONICAL); + int i; + + if(!sptr) _ASN_ENCODE_FAILED; + + er.encoded = 0; + + (void *)list = sptr; + for(i = 0; i < list->count; i++) { + asn_enc_rval_t tmper; + + void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + if(mname) { + if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel); + _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); + } + + tmper = element->type->xer_encoder(element->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + + if(mname) { + _ASN_CALLBACK3("</", 2, mname, mlen, ">", 1); + er.encoded += 5; + } + + er.encoded += (2 * mlen) + tmper.encoded; + } + + if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); + + return er; +} + int SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { |