aboutsummaryrefslogtreecommitdiffstats
path: root/skeletons/GeneralizedTime.c
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2004-09-22 16:06:28 +0000
committerLev Walkin <vlm@lionet.info>2004-09-22 16:06:28 +0000
commita9cc46e3f3c30ddd3f2a8f712c9f0acdc793fda7 (patch)
tree3ca369d58e29a24dc08ec01d4a3e4cac2020fe26 /skeletons/GeneralizedTime.c
parente4d6ab83d7937337f1c19acfb4353fd0d43180dd (diff)
XER support
Diffstat (limited to 'skeletons/GeneralizedTime.c')
-rw-r--r--skeletons/GeneralizedTime.c41
1 files changed, 37 insertions, 4 deletions
diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c
index 88806f91..8f8fff21 100644
--- a/skeletons/GeneralizedTime.c
+++ b/skeletons/GeneralizedTime.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 <GeneralizedTime.h>
#include <time.h>
#include <errno.h>
@@ -113,11 +114,13 @@ static ber_tlv_tag_t asn1_DEF_GeneralizedTime_tags[] = {
};
asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = {
"GeneralizedTime",
+ OCTET_STRING_free,
+ GeneralizedTime_print,
GeneralizedTime_constraint, /* Check validity of time */
OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */
GeneralizedTime_encode_der, /* Implemented in terms of OCTET STRING */
- GeneralizedTime_print,
- OCTET_STRING_free,
+ 0, /* Not implemented yet */
+ GeneralizedTime_encode_xer,
0, /* Use generic outmost tag fetcher */
asn1_DEF_GeneralizedTime_tags,
sizeof(asn1_DEF_GeneralizedTime_tags)
@@ -153,12 +156,12 @@ GeneralizedTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
return 0;
}
-der_enc_rval_t
+asn_enc_rval_t
GeneralizedTime_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) {
GeneralizedTime_t *st = (GeneralizedTime_t *)ptr;
- der_enc_rval_t erval;
+ asn_enc_rval_t erval;
/* If not canonical DER, re-encode into canonical DER. */
if(st->size && st->buf[st->size-1] != 'Z') {
@@ -194,6 +197,36 @@ GeneralizedTime_encode_der(asn1_TYPE_descriptor_t *td, void *ptr,
return erval;
}
+asn_enc_rval_t
+GeneralizedTime_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) {
+ OCTET_STRING_t st;
+
+ if(flags & XER_F_CANONICAL) {
+ char buf[32];
+ struct tm tm;
+ ssize_t ret;
+
+ errno = EPERM;
+ if(asn_GT2time((GeneralizedTime_t *)sptr, &tm, 1) == -1
+ && errno != EPERM)
+ _ASN_ENCODE_FAILED;
+
+ ret = snprintf(buf, sizeof(buf), "%04d%02d%02d%02d%02d%02dZ",
+ tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
+ tm.tm_hour, tm.tm_min, tm.tm_sec);
+ assert(ret > 0 && ret < (int)sizeof(buf));
+
+ st.buf = (uint8_t *)buf;
+ st.size = ret;
+ sptr = &st;
+ }
+
+ return OCTET_STRING_encode_xer_ascii(td, sptr, ilevel, flags,
+ cb, app_key);
+}
+
int
GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
asn_app_consume_bytes_f *cb, void *app_key) {