/* c/zx-ecp-enc.c - WARNING: This file was automatically generated. DO NOT EDIT! * $Id$ */ /* Code generation design Copyright (c) 2006 Sampo Kellomaki (sampo@iki.fi), * All Rights Reserved. NO WARRANTY. See file COPYING for terms and conditions * of use. Some aspects of code generation were driven by schema * descriptions that were used as input and may be subject to their own copyright. * Code generation uses a template, whose copyright statement follows. */ /** enc-templ.c - XML encoder template, used in code generation ** Copyright (c) 2006-2007 Symlabs (symlabs@symlabs.com), All Rights Reserved. ** Author: Sampo Kellomaki (sampo@iki.fi) ** This is confidential unpublished proprietary source code of the author. ** NO WARRANTY, not even implied warranties. Contains trade secrets. ** Distribution prohibited unless authorized in writing. ** Licensed under Apache License 2.0, see file COPYING. ** Id: enc-templ.c,v 1.27 2007-10-05 22:24:28 sampo Exp $ ** ** 30.5.2006, created, Sampo Kellomaki (sampo@iki.fi) ** 6.8.2006, factored data structure walking to aux-templ.c --Sampo ** 8.8.2006, reworked namespace handling --Sampo ** 26.8.2006, some CSE --Sampo ** 23.9.2006, added WO logic --Sampo ** 30.9.2007, improvements to WO encoding --Sampo ** ** N.B: wo=wire order (needed for exc-c14n), so=schema order ** N.B2: This template is meant to be processed by pd/xsd2sg.pl. Beware ** of special markers that xsd2sg.pl expects to find and understand. **/ #include #include "errmac.h" #include "zx.h" #include "c/zx-const.h" #include "c/zx-data.h" #include "c/zx-ecp-data.h" #include "c/zx-ns.h" #ifdef EL_NAME #undef EL_NAME #endif #ifdef EL_STRUCT #undef EL_STRUCT #endif #ifdef EL_NS #undef EL_NS #endif #ifdef EL_TAG #undef EL_TAG #endif #define EL_NAME ecp_RelayState #define EL_STRUCT zx_ecp_RelayState_s #define EL_NS ecp #define EL_TAG RelayState #ifndef MAYBE_UNUSED #define MAYBE_UNUSED /* May appear as unused variable, but is needed by some generated code. */ #endif #if 0 #define ENC_LEN_DEBUG(x,tag,len) D("x=%p tag(%s) len=%d",(x),(tag),(len)) #define ENC_LEN_DEBUG_BASE char* enc_base = p #else #define ENC_LEN_DEBUG(x,tag,len) #define ENC_LEN_DEBUG_BASE #endif /* FUNC(zx_LEN_SO_ecp_RelayState) */ /* Compute length of an element (and its subelements). The XML attributes * and elements are processed in schema order. */ /* Called by: */ int zx_LEN_SO_ecp_RelayState(struct zx_ctx* c, struct zx_ecp_RelayState_s* x ) { struct zx_ns_s* pop_seen = 0; struct zx_elem_s* se MAYBE_UNUSED; #if 1 /* NORMALMODE */ /* *** in simple_elem case should output ns prefix from ns node. */ int len = sizeof("")-1; if (c->inc_ns_len) len += zx_len_inc_ns(c, &pop_seen); if (x->actor || x->mustUnderstand) len += zx_len_xmlns_if_not_seen(c, zx_ns_tab+zx_xmlns_ix_e, &pop_seen); len += zx_len_xmlns_if_not_seen(c, zx_ns_tab+zx_xmlns_ix_ecp, &pop_seen); len += zx_attr_so_len(x->actor, sizeof("e:actor")-1); len += zx_attr_so_len(x->mustUnderstand, sizeof("e:mustUnderstand")-1); #else /* root node has no begin tag */ int len = 0; #endif len += zx_len_so_common(c, &x->gg); zx_pop_seen(pop_seen); ENC_LEN_DEBUG(x, "ecp:RelayState", len); return len; } /* FUNC(zx_LEN_WO_ecp_RelayState) */ /* Compute length of an element (and its subelements). The XML attributes * and elements are processed in wire order and no assumptions * are made about namespace prefixes. */ /* Called by: */ int zx_LEN_WO_ecp_RelayState(struct zx_ctx* c, struct zx_ecp_RelayState_s* x ) { struct zx_ns_s* pop_seen = 0; struct zx_elem_s* se MAYBE_UNUSED; #if 1 /* NORMALMODE */ int len = 1 + sizeof("RelayState")-1 + 1 + 2 + sizeof("RelayState")-1 + 1; if (x->gg.g.ns && x->gg.g.ns->prefix_len) len += (x->gg.g.ns->prefix_len + 1) * 2; if (c->inc_ns_len) len += zx_len_inc_ns(c, &pop_seen); if (x->actor) len += zx_len_xmlns_if_not_seen(c, x->actor->g.ns, &pop_seen); if (x->mustUnderstand) len += zx_len_xmlns_if_not_seen(c, x->mustUnderstand->g.ns, &pop_seen); len += zx_len_xmlns_if_not_seen(c, x->gg.g.ns, &pop_seen); len += zx_attr_wo_len(x->actor, sizeof("actor")-1); len += zx_attr_wo_len(x->mustUnderstand, sizeof("mustUnderstand")-1); #else /* root node has no begin tag */ int len = 0; #endif len += zx_len_wo_common(c, &x->gg); zx_pop_seen(pop_seen); ENC_LEN_DEBUG(x, "ecp:RelayState", len); return len; } /* FUNC(zx_ENC_SO_ecp_RelayState) */ /* Render element into string. The XML attributes and elements are * processed in schema order. This is what you generally want for * rendering new data structure to a string. The wo pointers are not used. */ /* Called by: */ char* zx_ENC_SO_ecp_RelayState(struct zx_ctx* c, struct zx_ecp_RelayState_s* x, char* p ) { struct zx_elem_s* se MAYBE_UNUSED; ENC_LEN_DEBUG_BASE; #if 1 /* NORMALMODE */ struct zx_ns_s* pop_seen = 0; /* *** in simple_elem case should output ns prefix from ns node. */ ZX_OUT_TAG(p, "inc_ns) p = zx_enc_inc_ns(c, p, &pop_seen); if (x->actor || x->mustUnderstand) p = zx_enc_xmlns_if_not_seen(c, p, zx_ns_tab+zx_xmlns_ix_e, &pop_seen); p = zx_enc_xmlns_if_not_seen(c, p, zx_ns_tab+zx_xmlns_ix_ecp, &pop_seen); p = zx_attr_so_enc(p, x->actor, " e:actor=\"", sizeof(" e:actor=\"")-1); p = zx_attr_so_enc(p, x->mustUnderstand, " e:mustUnderstand=\"", sizeof(" e:mustUnderstand=\"")-1); p = zx_enc_unknown_attrs(p, x->gg.any_attr); #else /* root node has no begin tag */ #endif p = zx_enc_so_unknown_elems_and_content(c, p, &x->gg); #if 1 /* NORMALMODE */ ZX_OUT_CLOSE_TAG(p, ""); zx_pop_seen(pop_seen); #else /* root node has no end tag either */ #endif ENC_LEN_DEBUG(x, "ecp:RelayState", p-enc_base); return p; } /* FUNC(zx_ENC_WO_ecp_RelayState) */ /* Render element into string. The XML attributes and elements are * processed in wire order by chasing wo pointers. This is what you want for * validating signatures on other people's XML documents. */ /* Called by: */ char* zx_ENC_WO_ecp_RelayState(struct zx_ctx* c, struct zx_ecp_RelayState_s* x, char* p ) { struct zx_elem_s* kid; ENC_LEN_DEBUG_BASE; #if 1 /* NORMALMODE */ struct zx_ns_s* pop_seen = 0; char* q; char* qq; ZX_OUT_CH(p, '<'); q = p; if (x->gg.g.ns && x->gg.g.ns->prefix_len) { ZX_OUT_MEM(p, x->gg.g.ns->prefix, x->gg.g.ns->prefix_len); ZX_OUT_CH(p, ':'); } ZX_OUT_MEM(p, "RelayState", sizeof("RelayState")-1); qq = p; /* *** sort the namespaces */ if (c->inc_ns) zx_add_inc_ns(c, &pop_seen); if (x->actor) zx_add_xmlns_if_not_seen(c, x->actor->g.ns, &pop_seen); if (x->mustUnderstand) zx_add_xmlns_if_not_seen(c, x->mustUnderstand->g.ns, &pop_seen); zx_add_xmlns_if_not_seen(c, x->gg.g.ns, &pop_seen); p = zx_enc_seen(p, pop_seen); p = zx_attr_wo_enc(p, x->actor, "actor=\"", sizeof("actor=\"")-1); p = zx_attr_wo_enc(p, x->mustUnderstand, "mustUnderstand=\"", sizeof("mustUnderstand=\"")-1); p = zx_enc_unknown_attrs(p, x->gg.any_attr); #else /* root node has no begin tag */ #endif for (kid = x->gg.kids; kid; kid = ((struct zx_elem_s*)(kid->g.wo))) p = zx_ENC_WO_any_elem(c, kid, p); #if 1 /* NORMALMODE */ ZX_OUT_CH(p, '<'); ZX_OUT_CH(p, '/'); ZX_OUT_MEM(p, q, qq-q); ZX_OUT_CH(p, '>'); zx_pop_seen(pop_seen); #else /* root node has no end tag either */ #endif ENC_LEN_DEBUG(x, "ecp:RelayState", p-enc_base); return p; } /* FUNC(zx_EASY_ENC_SO_ecp_RelayState) */ /* Called by: */ struct zx_str* zx_EASY_ENC_SO_ecp_RelayState(struct zx_ctx* c, struct zx_ecp_RelayState_s* x ) { int len; char* buf; c->ns_tab = ZX_ALLOC(c, sizeof(zx_ns_tab)); memcpy(c->ns_tab, zx_ns_tab, sizeof(zx_ns_tab)); len = zx_LEN_SO_ecp_RelayState(c, x ); buf = ZX_ALLOC(c, len+1); return zx_easy_enc_common(c, zx_ENC_SO_ecp_RelayState(c, x, buf ), buf, len); } /* FUNC(zx_EASY_ENC_WO_ecp_RelayState) */ /* Called by: */ struct zx_str* zx_EASY_ENC_WO_ecp_RelayState(struct zx_ctx* c, struct zx_ecp_RelayState_s* x ) { int len; char* buf; c->ns_tab = ZX_ALLOC(c, sizeof(zx_ns_tab)); memcpy(c->ns_tab, zx_ns_tab, sizeof(zx_ns_tab)); len = zx_LEN_WO_ecp_RelayState(c, x ); buf = ZX_ALLOC(c, len+1); return zx_easy_enc_common(c, zx_ENC_WO_ecp_RelayState(c, x, buf ), buf, len); } #ifdef EL_NAME #undef EL_NAME #endif #ifdef EL_STRUCT #undef EL_STRUCT #endif #ifdef EL_NS #undef EL_NS #endif #ifdef EL_TAG #undef EL_TAG #endif #define EL_NAME ecp_Request #define EL_STRUCT zx_ecp_Request_s #define EL_NS ecp #define EL_TAG Request #ifndef MAYBE_UNUSED #define MAYBE_UNUSED /* May appear as unused variable, but is needed by some generated code. */ #endif #if 0 #define ENC_LEN_DEBUG(x,tag,len) D("x=%p tag(%s) len=%d",(x),(tag),(len)) #define ENC_LEN_DEBUG_BASE char* enc_base = p #else #define ENC_LEN_DEBUG(x,tag,len) #define ENC_LEN_DEBUG_BASE #endif /* FUNC(zx_LEN_SO_ecp_Request) */ /* Compute length of an element (and its subelements). The XML attributes * and elements are processed in schema order. */ /* Called by: */ int zx_LEN_SO_ecp_Request(struct zx_ctx* c, struct zx_ecp_Request_s* x ) { struct zx_ns_s* pop_seen = 0; struct zx_elem_s* se MAYBE_UNUSED; #if 1 /* NORMALMODE */ /* *** in simple_elem case should output ns prefix from ns node. */ int len = sizeof("")-1; if (c->inc_ns_len) len += zx_len_inc_ns(c, &pop_seen); if (x->actor || x->mustUnderstand) len += zx_len_xmlns_if_not_seen(c, zx_ns_tab+zx_xmlns_ix_e, &pop_seen); len += zx_len_xmlns_if_not_seen(c, zx_ns_tab+zx_xmlns_ix_ecp, &pop_seen); len += zx_attr_so_len(x->IsPassive, sizeof("IsPassive")-1); len += zx_attr_so_len(x->ProviderName, sizeof("ProviderName")-1); len += zx_attr_so_len(x->actor, sizeof("e:actor")-1); len += zx_attr_so_len(x->mustUnderstand, sizeof("e:mustUnderstand")-1); #else /* root node has no begin tag */ int len = 0; #endif { struct zx_sa_Issuer_s* e; for (e = x->Issuer; e; e = (struct zx_sa_Issuer_s*)e->gg.g.n) len += zx_LEN_SO_sa_Issuer(c, e); } { struct zx_sp_IDPList_s* e; for (e = x->IDPList; e; e = (struct zx_sp_IDPList_s*)e->gg.g.n) len += zx_LEN_SO_sp_IDPList(c, e); } len += zx_len_so_common(c, &x->gg); zx_pop_seen(pop_seen); ENC_LEN_DEBUG(x, "ecp:Request", len); return len; } /* FUNC(zx_LEN_WO_ecp_Request) */ /* Compute length of an element (and its subelements). The XML attributes * and elements are processed in wire order and no assumptions * are made about namespace prefixes. */ /* Called by: */ int zx_LEN_WO_ecp_Request(struct zx_ctx* c, struct zx_ecp_Request_s* x ) { struct zx_ns_s* pop_seen = 0; struct zx_elem_s* se MAYBE_UNUSED; #if 1 /* NORMALMODE */ int len = 1 + sizeof("Request")-1 + 1 + 2 + sizeof("Request")-1 + 1; if (x->gg.g.ns && x->gg.g.ns->prefix_len) len += (x->gg.g.ns->prefix_len + 1) * 2; if (c->inc_ns_len) len += zx_len_inc_ns(c, &pop_seen); if (x->actor) len += zx_len_xmlns_if_not_seen(c, x->actor->g.ns, &pop_seen); if (x->mustUnderstand) len += zx_len_xmlns_if_not_seen(c, x->mustUnderstand->g.ns, &pop_seen); len += zx_len_xmlns_if_not_seen(c, x->gg.g.ns, &pop_seen); len += zx_attr_wo_len(x->IsPassive, sizeof("IsPassive")-1); len += zx_attr_wo_len(x->ProviderName, sizeof("ProviderName")-1); len += zx_attr_wo_len(x->actor, sizeof("actor")-1); len += zx_attr_wo_len(x->mustUnderstand, sizeof("mustUnderstand")-1); #else /* root node has no begin tag */ int len = 0; #endif { struct zx_sa_Issuer_s* e; for (e = x->Issuer; e; e = (struct zx_sa_Issuer_s*)e->gg.g.n) len += zx_LEN_WO_sa_Issuer(c, e); } { struct zx_sp_IDPList_s* e; for (e = x->IDPList; e; e = (struct zx_sp_IDPList_s*)e->gg.g.n) len += zx_LEN_WO_sp_IDPList(c, e); } len += zx_len_wo_common(c, &x->gg); zx_pop_seen(pop_seen); ENC_LEN_DEBUG(x, "ecp:Request", len); return len; } /* FUNC(zx_ENC_SO_ecp_Request) */ /* Render element into string. The XML attributes and elements are * processed in schema order. This is what you generally want for * rendering new data structure to a string. The wo pointers are not used. */ /* Called by: */ char* zx_ENC_SO_ecp_Request(struct zx_ctx* c, struct zx_ecp_Request_s* x, char* p ) { struct zx_elem_s* se MAYBE_UNUSED; ENC_LEN_DEBUG_BASE; #if 1 /* NORMALMODE */ struct zx_ns_s* pop_seen = 0; /* *** in simple_elem case should output ns prefix from ns node. */ ZX_OUT_TAG(p, "inc_ns) p = zx_enc_inc_ns(c, p, &pop_seen); if (x->actor || x->mustUnderstand) p = zx_enc_xmlns_if_not_seen(c, p, zx_ns_tab+zx_xmlns_ix_e, &pop_seen); p = zx_enc_xmlns_if_not_seen(c, p, zx_ns_tab+zx_xmlns_ix_ecp, &pop_seen); p = zx_attr_so_enc(p, x->IsPassive, " IsPassive=\"", sizeof(" IsPassive=\"")-1); p = zx_attr_so_enc(p, x->ProviderName, " ProviderName=\"", sizeof(" ProviderName=\"")-1); p = zx_attr_so_enc(p, x->actor, " e:actor=\"", sizeof(" e:actor=\"")-1); p = zx_attr_so_enc(p, x->mustUnderstand, " e:mustUnderstand=\"", sizeof(" e:mustUnderstand=\"")-1); p = zx_enc_unknown_attrs(p, x->gg.any_attr); #else /* root node has no begin tag */ #endif { struct zx_sa_Issuer_s* e; for (e = x->Issuer; e; e = (struct zx_sa_Issuer_s*)e->gg.g.n) p = zx_ENC_SO_sa_Issuer(c, e, p); } { struct zx_sp_IDPList_s* e; for (e = x->IDPList; e; e = (struct zx_sp_IDPList_s*)e->gg.g.n) p = zx_ENC_SO_sp_IDPList(c, e, p); } p = zx_enc_so_unknown_elems_and_content(c, p, &x->gg); #if 1 /* NORMALMODE */ ZX_OUT_CLOSE_TAG(p, ""); zx_pop_seen(pop_seen); #else /* root node has no end tag either */ #endif ENC_LEN_DEBUG(x, "ecp:Request", p-enc_base); return p; } /* FUNC(zx_ENC_WO_ecp_Request) */ /* Render element into string. The XML attributes and elements are * processed in wire order by chasing wo pointers. This is what you want for * validating signatures on other people's XML documents. */ /* Called by: */ char* zx_ENC_WO_ecp_Request(struct zx_ctx* c, struct zx_ecp_Request_s* x, char* p ) { struct zx_elem_s* kid; ENC_LEN_DEBUG_BASE; #if 1 /* NORMALMODE */ struct zx_ns_s* pop_seen = 0; char* q; char* qq; ZX_OUT_CH(p, '<'); q = p; if (x->gg.g.ns && x->gg.g.ns->prefix_len) { ZX_OUT_MEM(p, x->gg.g.ns->prefix, x->gg.g.ns->prefix_len); ZX_OUT_CH(p, ':'); } ZX_OUT_MEM(p, "Request", sizeof("Request")-1); qq = p; /* *** sort the namespaces */ if (c->inc_ns) zx_add_inc_ns(c, &pop_seen); if (x->actor) zx_add_xmlns_if_not_seen(c, x->actor->g.ns, &pop_seen); if (x->mustUnderstand) zx_add_xmlns_if_not_seen(c, x->mustUnderstand->g.ns, &pop_seen); zx_add_xmlns_if_not_seen(c, x->gg.g.ns, &pop_seen); p = zx_enc_seen(p, pop_seen); p = zx_attr_wo_enc(p, x->IsPassive, "IsPassive=\"", sizeof("IsPassive=\"")-1); p = zx_attr_wo_enc(p, x->ProviderName, "ProviderName=\"", sizeof("ProviderName=\"")-1); p = zx_attr_wo_enc(p, x->actor, "actor=\"", sizeof("actor=\"")-1); p = zx_attr_wo_enc(p, x->mustUnderstand, "mustUnderstand=\"", sizeof("mustUnderstand=\"")-1); p = zx_enc_unknown_attrs(p, x->gg.any_attr); #else /* root node has no begin tag */ #endif for (kid = x->gg.kids; kid; kid = ((struct zx_elem_s*)(kid->g.wo))) p = zx_ENC_WO_any_elem(c, kid, p); #if 1 /* NORMALMODE */ ZX_OUT_CH(p, '<'); ZX_OUT_CH(p, '/'); ZX_OUT_MEM(p, q, qq-q); ZX_OUT_CH(p, '>'); zx_pop_seen(pop_seen); #else /* root node has no end tag either */ #endif ENC_LEN_DEBUG(x, "ecp:Request", p-enc_base); return p; } /* FUNC(zx_EASY_ENC_SO_ecp_Request) */ /* Called by: */ struct zx_str* zx_EASY_ENC_SO_ecp_Request(struct zx_ctx* c, struct zx_ecp_Request_s* x ) { int len; char* buf; c->ns_tab = ZX_ALLOC(c, sizeof(zx_ns_tab)); memcpy(c->ns_tab, zx_ns_tab, sizeof(zx_ns_tab)); len = zx_LEN_SO_ecp_Request(c, x ); buf = ZX_ALLOC(c, len+1); return zx_easy_enc_common(c, zx_ENC_SO_ecp_Request(c, x, buf ), buf, len); } /* FUNC(zx_EASY_ENC_WO_ecp_Request) */ /* Called by: */ struct zx_str* zx_EASY_ENC_WO_ecp_Request(struct zx_ctx* c, struct zx_ecp_Request_s* x ) { int len; char* buf; c->ns_tab = ZX_ALLOC(c, sizeof(zx_ns_tab)); memcpy(c->ns_tab, zx_ns_tab, sizeof(zx_ns_tab)); len = zx_LEN_WO_ecp_Request(c, x ); buf = ZX_ALLOC(c, len+1); return zx_easy_enc_common(c, zx_ENC_WO_ecp_Request(c, x, buf ), buf, len); } #ifdef EL_NAME #undef EL_NAME #endif #ifdef EL_STRUCT #undef EL_STRUCT #endif #ifdef EL_NS #undef EL_NS #endif #ifdef EL_TAG #undef EL_TAG #endif #define EL_NAME ecp_Response #define EL_STRUCT zx_ecp_Response_s #define EL_NS ecp #define EL_TAG Response #ifndef MAYBE_UNUSED #define MAYBE_UNUSED /* May appear as unused variable, but is needed by some generated code. */ #endif #if 0 #define ENC_LEN_DEBUG(x,tag,len) D("x=%p tag(%s) len=%d",(x),(tag),(len)) #define ENC_LEN_DEBUG_BASE char* enc_base = p #else #define ENC_LEN_DEBUG(x,tag,len) #define ENC_LEN_DEBUG_BASE #endif /* FUNC(zx_LEN_SO_ecp_Response) */ /* Compute length of an element (and its subelements). The XML attributes * and elements are processed in schema order. */ /* Called by: */ int zx_LEN_SO_ecp_Response(struct zx_ctx* c, struct zx_ecp_Response_s* x ) { struct zx_ns_s* pop_seen = 0; struct zx_elem_s* se MAYBE_UNUSED; #if 1 /* NORMALMODE */ /* *** in simple_elem case should output ns prefix from ns node. */ int len = sizeof("")-1; if (c->inc_ns_len) len += zx_len_inc_ns(c, &pop_seen); if (x->actor || x->mustUnderstand) len += zx_len_xmlns_if_not_seen(c, zx_ns_tab+zx_xmlns_ix_e, &pop_seen); len += zx_len_xmlns_if_not_seen(c, zx_ns_tab+zx_xmlns_ix_ecp, &pop_seen); len += zx_attr_so_len(x->AssertionConsumerServiceURL, sizeof("AssertionConsumerServiceURL")-1); len += zx_attr_so_len(x->actor, sizeof("e:actor")-1); len += zx_attr_so_len(x->mustUnderstand, sizeof("e:mustUnderstand")-1); #else /* root node has no begin tag */ int len = 0; #endif len += zx_len_so_common(c, &x->gg); zx_pop_seen(pop_seen); ENC_LEN_DEBUG(x, "ecp:Response", len); return len; } /* FUNC(zx_LEN_WO_ecp_Response) */ /* Compute length of an element (and its subelements). The XML attributes * and elements are processed in wire order and no assumptions * are made about namespace prefixes. */ /* Called by: */ int zx_LEN_WO_ecp_Response(struct zx_ctx* c, struct zx_ecp_Response_s* x ) { struct zx_ns_s* pop_seen = 0; struct zx_elem_s* se MAYBE_UNUSED; #if 1 /* NORMALMODE */ int len = 1 + sizeof("Response")-1 + 1 + 2 + sizeof("Response")-1 + 1; if (x->gg.g.ns && x->gg.g.ns->prefix_len) len += (x->gg.g.ns->prefix_len + 1) * 2; if (c->inc_ns_len) len += zx_len_inc_ns(c, &pop_seen); if (x->actor) len += zx_len_xmlns_if_not_seen(c, x->actor->g.ns, &pop_seen); if (x->mustUnderstand) len += zx_len_xmlns_if_not_seen(c, x->mustUnderstand->g.ns, &pop_seen); len += zx_len_xmlns_if_not_seen(c, x->gg.g.ns, &pop_seen); len += zx_attr_wo_len(x->AssertionConsumerServiceURL, sizeof("AssertionConsumerServiceURL")-1); len += zx_attr_wo_len(x->actor, sizeof("actor")-1); len += zx_attr_wo_len(x->mustUnderstand, sizeof("mustUnderstand")-1); #else /* root node has no begin tag */ int len = 0; #endif len += zx_len_wo_common(c, &x->gg); zx_pop_seen(pop_seen); ENC_LEN_DEBUG(x, "ecp:Response", len); return len; } /* FUNC(zx_ENC_SO_ecp_Response) */ /* Render element into string. The XML attributes and elements are * processed in schema order. This is what you generally want for * rendering new data structure to a string. The wo pointers are not used. */ /* Called by: */ char* zx_ENC_SO_ecp_Response(struct zx_ctx* c, struct zx_ecp_Response_s* x, char* p ) { struct zx_elem_s* se MAYBE_UNUSED; ENC_LEN_DEBUG_BASE; #if 1 /* NORMALMODE */ struct zx_ns_s* pop_seen = 0; /* *** in simple_elem case should output ns prefix from ns node. */ ZX_OUT_TAG(p, "inc_ns) p = zx_enc_inc_ns(c, p, &pop_seen); if (x->actor || x->mustUnderstand) p = zx_enc_xmlns_if_not_seen(c, p, zx_ns_tab+zx_xmlns_ix_e, &pop_seen); p = zx_enc_xmlns_if_not_seen(c, p, zx_ns_tab+zx_xmlns_ix_ecp, &pop_seen); p = zx_attr_so_enc(p, x->AssertionConsumerServiceURL, " AssertionConsumerServiceURL=\"", sizeof(" AssertionConsumerServiceURL=\"")-1); p = zx_attr_so_enc(p, x->actor, " e:actor=\"", sizeof(" e:actor=\"")-1); p = zx_attr_so_enc(p, x->mustUnderstand, " e:mustUnderstand=\"", sizeof(" e:mustUnderstand=\"")-1); p = zx_enc_unknown_attrs(p, x->gg.any_attr); #else /* root node has no begin tag */ #endif p = zx_enc_so_unknown_elems_and_content(c, p, &x->gg); #if 1 /* NORMALMODE */ ZX_OUT_CLOSE_TAG(p, ""); zx_pop_seen(pop_seen); #else /* root node has no end tag either */ #endif ENC_LEN_DEBUG(x, "ecp:Response", p-enc_base); return p; } /* FUNC(zx_ENC_WO_ecp_Response) */ /* Render element into string. The XML attributes and elements are * processed in wire order by chasing wo pointers. This is what you want for * validating signatures on other people's XML documents. */ /* Called by: */ char* zx_ENC_WO_ecp_Response(struct zx_ctx* c, struct zx_ecp_Response_s* x, char* p ) { struct zx_elem_s* kid; ENC_LEN_DEBUG_BASE; #if 1 /* NORMALMODE */ struct zx_ns_s* pop_seen = 0; char* q; char* qq; ZX_OUT_CH(p, '<'); q = p; if (x->gg.g.ns && x->gg.g.ns->prefix_len) { ZX_OUT_MEM(p, x->gg.g.ns->prefix, x->gg.g.ns->prefix_len); ZX_OUT_CH(p, ':'); } ZX_OUT_MEM(p, "Response", sizeof("Response")-1); qq = p; /* *** sort the namespaces */ if (c->inc_ns) zx_add_inc_ns(c, &pop_seen); if (x->actor) zx_add_xmlns_if_not_seen(c, x->actor->g.ns, &pop_seen); if (x->mustUnderstand) zx_add_xmlns_if_not_seen(c, x->mustUnderstand->g.ns, &pop_seen); zx_add_xmlns_if_not_seen(c, x->gg.g.ns, &pop_seen); p = zx_enc_seen(p, pop_seen); p = zx_attr_wo_enc(p, x->AssertionConsumerServiceURL, "AssertionConsumerServiceURL=\"", sizeof("AssertionConsumerServiceURL=\"")-1); p = zx_attr_wo_enc(p, x->actor, "actor=\"", sizeof("actor=\"")-1); p = zx_attr_wo_enc(p, x->mustUnderstand, "mustUnderstand=\"", sizeof("mustUnderstand=\"")-1); p = zx_enc_unknown_attrs(p, x->gg.any_attr); #else /* root node has no begin tag */ #endif for (kid = x->gg.kids; kid; kid = ((struct zx_elem_s*)(kid->g.wo))) p = zx_ENC_WO_any_elem(c, kid, p); #if 1 /* NORMALMODE */ ZX_OUT_CH(p, '<'); ZX_OUT_CH(p, '/'); ZX_OUT_MEM(p, q, qq-q); ZX_OUT_CH(p, '>'); zx_pop_seen(pop_seen); #else /* root node has no end tag either */ #endif ENC_LEN_DEBUG(x, "ecp:Response", p-enc_base); return p; } /* FUNC(zx_EASY_ENC_SO_ecp_Response) */ /* Called by: */ struct zx_str* zx_EASY_ENC_SO_ecp_Response(struct zx_ctx* c, struct zx_ecp_Response_s* x ) { int len; char* buf; c->ns_tab = ZX_ALLOC(c, sizeof(zx_ns_tab)); memcpy(c->ns_tab, zx_ns_tab, sizeof(zx_ns_tab)); len = zx_LEN_SO_ecp_Response(c, x ); buf = ZX_ALLOC(c, len+1); return zx_easy_enc_common(c, zx_ENC_SO_ecp_Response(c, x, buf ), buf, len); } /* FUNC(zx_EASY_ENC_WO_ecp_Response) */ /* Called by: */ struct zx_str* zx_EASY_ENC_WO_ecp_Response(struct zx_ctx* c, struct zx_ecp_Response_s* x ) { int len; char* buf; c->ns_tab = ZX_ALLOC(c, sizeof(zx_ns_tab)); memcpy(c->ns_tab, zx_ns_tab, sizeof(zx_ns_tab)); len = zx_LEN_WO_ecp_Response(c, x ); buf = ZX_ALLOC(c, len+1); return zx_easy_enc_common(c, zx_ENC_WO_ecp_Response(c, x, buf ), buf, len); } /* EOF -- c/zx-ecp-enc.c */