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/UTCTime.c | |
parent | e4d6ab83d7937337f1c19acfb4353fd0d43180dd (diff) |
XER support
Diffstat (limited to 'skeletons/UTCTime.c')
-rw-r--r-- | skeletons/UTCTime.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index 029a43e4..22e5498f 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.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 <UTCTime.h> #include <GeneralizedTime.h> #include <time.h> @@ -18,11 +19,13 @@ static ber_tlv_tag_t asn1_DEF_UTCTime_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_UTCTime = { "UTCTime", + OCTET_STRING_free, + UTCTime_print, UTCTime_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - UTCTime_print, - OCTET_STRING_free, + 0, /* Not implemented yet */ + UTCTime_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_UTCTime_tags, sizeof(asn1_DEF_UTCTime_tags) @@ -58,6 +61,36 @@ UTCTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } +asn_enc_rval_t +UTCTime_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_UT2time((UTCTime_t *)sptr, &tm, 1) == -1 + && errno != EPERM) + _ASN_ENCODE_FAILED; + + ret = snprintf(buf, sizeof(buf), "%02d%02d%02d%02d%02d%02dZ", + tm.tm_year % 100, 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 UTCTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { |