XER support


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@365 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c
index 88806f9..8f8fff2 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 @@
 };
 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 @@
 	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 @@
 	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) {