blob: 54cc9a78116e88ef5916bea22088327fc64299a7 [file] [log] [blame]
vlm7e66aa82004-09-02 12:11:47 +00001/*-
2 * Copyright (c) 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
3 * Redistribution and modifications are permitted subject to BSD license.
4 */
vlm39ba4c42004-09-22 16:06:28 +00005#include <asn_internal.h>
vlm7e66aa82004-09-02 12:11:47 +00006#include <ANY.h>
7#include <assert.h>
8#include <errno.h>
9
vlm0f1ab762004-10-12 05:57:23 +000010static asn_OCTET_STRING_specifics_t asn_DEF_ANY_specs = {
11 sizeof(ANY_t),
12 offsetof(ANY_t, _asn_ctx),
13 2 /* Special indicator that this is an ANY type */
14};
vlmef6355b2004-09-29 13:26:15 +000015asn_TYPE_descriptor_t asn_DEF_ANY = {
vlm7e66aa82004-09-02 12:11:47 +000016 "ANY",
vlm9de248e2004-10-20 15:50:55 +000017 "ANY",
vlm39ba4c42004-09-22 16:06:28 +000018 OCTET_STRING_free,
19 OCTET_STRING_print,
vlm7e66aa82004-09-02 12:11:47 +000020 asn_generic_no_constraint,
21 OCTET_STRING_decode_ber,
22 OCTET_STRING_encode_der,
vlm9de248e2004-10-20 15:50:55 +000023 OCTET_STRING_decode_xer_hex,
vlm39ba4c42004-09-22 16:06:28 +000024 ANY_encode_xer,
vlm7e66aa82004-09-02 12:11:47 +000025 0, /* Use generic outmost tag fetcher */
vlm83204112004-09-13 08:26:57 +000026 0, 0, 0, 0,
vlm7e66aa82004-09-02 12:11:47 +000027 0, 0, /* No members */
vlm0f1ab762004-10-12 05:57:23 +000028 &asn_DEF_ANY_specs,
vlm7e66aa82004-09-02 12:11:47 +000029};
vlm83204112004-09-13 08:26:57 +000030
31
vlm39ba4c42004-09-22 16:06:28 +000032asn_enc_rval_t
vlmef6355b2004-09-29 13:26:15 +000033ANY_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
vlm39ba4c42004-09-22 16:06:28 +000034 int ilevel, enum xer_encoder_flags_e flags,
35 asn_app_consume_bytes_f *cb, void *app_key) {
36
vlmef1b4c02004-09-23 22:06:26 +000037 if(flags & XER_F_CANONICAL) {
38 /*
39 * Canonical XER-encoding of ANY type is not supported.
40 */
41 _ASN_ENCODE_FAILED;
42 }
vlm39ba4c42004-09-22 16:06:28 +000043
vlmef1b4c02004-09-23 22:06:26 +000044 /* Dump as binary */
45 return OCTET_STRING_encode_xer(td, sptr, ilevel, flags, cb, app_key);
vlm39ba4c42004-09-22 16:06:28 +000046}
47
vlm83204112004-09-13 08:26:57 +000048struct _callback_arg {
49 uint8_t *buffer;
50 size_t offset;
51 size_t size;
52};
53
54static int ANY__consume_bytes(const void *buffer, size_t size, void *key);
55
56int
vlmef6355b2004-09-29 13:26:15 +000057ANY_fromType(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr) {
vlm83204112004-09-13 08:26:57 +000058 struct _callback_arg arg;
vlm39ba4c42004-09-22 16:06:28 +000059 asn_enc_rval_t erval;
vlm83204112004-09-13 08:26:57 +000060
61 if(!st || !td) {
62 errno = EINVAL;
63 return -1;
64 }
65
66 if(!sptr) {
67 if(st->buf) FREEMEM(st->buf);
68 st->size = 0;
69 return 0;
70 }
71
72 arg.offset = arg.size = 0;
73 arg.buffer = 0;
74
75 erval = der_encode(td, sptr, ANY__consume_bytes, &arg);
76 if(erval.encoded == -1) {
77 if(arg.buffer) FREEMEM(arg.buffer);
78 return -1;
79 }
vlm39ba4c42004-09-22 16:06:28 +000080 assert((size_t)erval.encoded == arg.offset);
vlm83204112004-09-13 08:26:57 +000081
82 if(st->buf) FREEMEM(st->buf);
83 st->buf = arg.buffer;
84 st->size = arg.offset;
85
86 return 0;
87}
88
89ANY_t *
vlmef6355b2004-09-29 13:26:15 +000090ANY_new_fromType(asn_TYPE_descriptor_t *td, void *sptr) {
vlm83204112004-09-13 08:26:57 +000091 ANY_t tmp;
92 ANY_t *st;
93
94 if(!td || !sptr) {
95 errno = EINVAL;
96 return 0;
97 }
98
99 memset(&tmp, 0, sizeof(tmp));
100
101 if(ANY_fromType(&tmp, td, sptr)) return 0;
102
vlm51925952005-01-22 00:11:28 +0000103 st = (ANY_t *)CALLOC(1, sizeof(ANY_t));
vlm83204112004-09-13 08:26:57 +0000104 if(st) {
105 *st = tmp;
106 return st;
107 } else {
108 FREEMEM(tmp.buf);
109 return 0;
110 }
111}
112
113int
vlmef6355b2004-09-29 13:26:15 +0000114ANY_to_type(ANY_t *st, asn_TYPE_descriptor_t *td, void **struct_ptr) {
vlm9de248e2004-10-20 15:50:55 +0000115 asn_dec_rval_t rval;
vlm83204112004-09-13 08:26:57 +0000116 void *newst = 0;
117
118 if(!st || !td || !struct_ptr) {
119 errno = EINVAL;
120 return -1;
121 }
122
123 if(st->buf == 0) {
124 /* Nothing to convert, make it empty. */
125 *struct_ptr = (void *)0;
126 return 0;
127 }
128
vlmef6355b2004-09-29 13:26:15 +0000129 rval = ber_decode(0, td, (void **)&newst, st->buf, st->size);
vlm83204112004-09-13 08:26:57 +0000130 if(rval.code == RC_OK) {
131 *struct_ptr = newst;
132 return 0;
133 } else {
134 /* Remove possibly partially decoded data. */
135 td->free_struct(td, newst, 0);
136 return -1;
137 }
138}
139
140static int ANY__consume_bytes(const void *buffer, size_t size, void *key) {
141 struct _callback_arg *arg = (struct _callback_arg *)key;
142
143 if((arg->offset + size) >= arg->size) {
144 size_t nsize = (arg->size ? arg->size << 2 : 16) + size;
145 void *p = REALLOC(arg->buffer, nsize);
146 if(!p) return -1;
vlm6678cb12004-09-26 13:10:40 +0000147 arg->buffer = (uint8_t *)p;
vlm83204112004-09-13 08:26:57 +0000148 arg->size = nsize;
149 }
150
151 memcpy(arg->buffer + arg->offset, buffer, size);
152 arg->offset += size;
153 assert(arg->offset < arg->size);
154
155 return 0;
156}
157