blob: a839949de09b60b81152f2ebbb887ddc6acc0182 [file] [log] [blame]
vlmfa67ddc2004-06-03 03:38:44 +00001/*-
2 * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
3 * Redistribution and modifications are permitted subject to BSD license.
4 */
5#include <constr_SEQUENCE_OF.h>
6#include <asn_SEQUENCE_OF.h>
7
8/*
9 * The DER encoder of the SEQUENCE OF type.
10 */
11der_enc_rval_t
12SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr,
13 int tag_mode, ber_tlv_tag_t tag,
14 asn_app_consume_bytes_f *cb, void *app_key) {
15 asn1_SET_OF_specifics_t *specs = sd->specifics;
16 asn1_SET_OF_element_t *elm = specs->element;
17 A_SEQUENCE_OF(void) *list = ptr;
18 size_t computed_size = 0;
19 ssize_t encoding_size = 0;
20 der_enc_rval_t erval;
21 int edx;
22
23 ASN_DEBUG("Estimating size of SEQUENCE OF %s", sd->name);
24
25 /*
26 * Gather the length of the underlying members sequence.
27 */
28 for(edx = 0; edx < list->count; edx++) {
29 void *memb_ptr = list->array[edx];
30 erval = elm->type->der_encoder(elm->type, memb_ptr,
31 0, elm->tag,
32 0, 0);
33 if(erval.encoded == -1)
34 return erval;
35 computed_size += erval.encoded;
36 }
37
38 /*
39 * Encode the TLV for the sequence itself.
40 */
41 encoding_size = der_write_tags(sd, computed_size, tag_mode, tag,
42 cb, app_key);
43 if(encoding_size == -1) {
44 erval.encoded = -1;
45 erval.failed_type = sd;
46 erval.structure_ptr = ptr;
47 return erval;
48 }
49
50 computed_size += encoding_size;
51 if(!cb) {
52 erval.encoded = computed_size;
53 return erval;
54 }
55
56 ASN_DEBUG("Encoding members of SEQUENCE OF %s", sd->name);
57
58 /*
59 * Encode all members.
60 */
61 for(edx = 0; edx < list->count; edx++) {
62 void *memb_ptr = list->array[edx];
63 erval = elm->type->der_encoder(elm->type, memb_ptr,
64 0, elm->tag,
65 cb, app_key);
66 if(erval.encoded == -1)
67 return erval;
68 encoding_size += erval.encoded;
69 }
70
vlmb42843a2004-06-05 08:17:50 +000071 if(computed_size != (size_t)encoding_size) {
vlmfa67ddc2004-06-03 03:38:44 +000072 /*
73 * Encoded size is not equal to the computed size.
74 */
75 erval.encoded = -1;
76 erval.failed_type = sd;
77 erval.structure_ptr = ptr;
78 } else {
79 erval.encoded = computed_size;
80 }
81
82 return erval;
83}
84