2 * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>.
4 * Redistribution and modifications are permitted subject to BSD license.
6 #include <asn_internal.h>
7 #include <OBJECT_IDENTIFIER.h>
9 static enum xer_pbd_rval
10 OBJECT_IDENTIFIER__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr,
11 const void *chunk_buf, size_t chunk_size) {
12 OBJECT_IDENTIFIER_t *st = (OBJECT_IDENTIFIER_t *)sptr;
13 const char *chunk_end = (const char *)chunk_buf + chunk_size;
15 asn_oid_arc_t s_arcs[10];
16 asn_oid_arc_t *arcs = s_arcs;
22 num_arcs = OBJECT_IDENTIFIER_parse_arcs(
23 (const char *)chunk_buf, chunk_size, arcs,
24 sizeof(s_arcs) / sizeof(s_arcs[0]), &endptr);
26 /* Expecting more than zero arcs */
27 return XPBD_BROKEN_ENCODING;
28 } else if(num_arcs == 0) {
29 return XPBD_NOT_BODY_IGNORE;
32 assert(endptr == chunk_end);
34 if((size_t)num_arcs > sizeof(s_arcs)/sizeof(s_arcs[0])) {
35 arcs = (asn_oid_arc_t *)MALLOC(num_arcs * sizeof(asn_oid_arc_t));
36 if(!arcs) return XPBD_SYSTEM_FAILURE;
37 ret = OBJECT_IDENTIFIER_parse_arcs((const char *)chunk_buf, chunk_size,
38 arcs, num_arcs, &endptr);
40 return XPBD_SYSTEM_FAILURE; /* assert?.. */
44 * Convert arcs into BER representation.
46 ret = OBJECT_IDENTIFIER_set_arcs(st, arcs, num_arcs);
47 if(arcs != s_arcs) FREEMEM(arcs);
49 return ret ? XPBD_SYSTEM_FAILURE : XPBD_BODY_CONSUMED;
53 OBJECT_IDENTIFIER_decode_xer(const asn_codec_ctx_t *opt_codec_ctx,
54 const asn_TYPE_descriptor_t *td, void **sptr,
55 const char *opt_mname, const void *buf_ptr,
57 return xer_decode_primitive(opt_codec_ctx, td,
58 sptr, sizeof(OBJECT_IDENTIFIER_t), opt_mname,
59 buf_ptr, size, OBJECT_IDENTIFIER__xer_body_decode);
63 OBJECT_IDENTIFIER_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr,
64 int ilevel, enum xer_encoder_flags_e flags,
65 asn_app_consume_bytes_f *cb, void *app_key) {
66 const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr;
67 asn_enc_rval_t er = {0,0,0};
76 er.encoded = OBJECT_IDENTIFIER__dump_body(st, cb, app_key);
77 if(er.encoded < 0) ASN__ENCODE_FAILED;