45b79157b12bfc6bf4828081dd0a3c51ed99cad0
[shibboleth/cpp-opensaml.git] / saml / saml2 / core / impl / Protocols20Impl.cpp
1 /*
2  *  Copyright 2001-2006 Internet2
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /**
18  * Protocols20Impl.cpp
19  * 
20  * Implementation classes for SAML 2.0 Protocols schema
21  */
22
23 #include "internal.h"
24 #include "exceptions.h"
25 #include "saml/encryption/EncryptedKeyResolver.h"
26 #include "saml2/core/Protocols.h"
27
28 #include <xmltooling/AbstractComplexElement.h>
29 #include <xmltooling/AbstractElementProxy.h>
30 #include <xmltooling/AbstractSimpleElement.h>
31 #include <xmltooling/encryption/Decrypter.h>
32 #include <xmltooling/impl/AnyElement.h>
33 #include <xmltooling/io/AbstractXMLObjectMarshaller.h>
34 #include <xmltooling/io/AbstractXMLObjectUnmarshaller.h>
35 #include <xmltooling/util/XMLHelper.h>
36
37 #include <ctime>
38 #include <xercesc/util/XMLUniDefs.hpp>
39
40 using namespace opensaml::saml2p;
41 using namespace opensaml::saml2;
42 using namespace opensaml;
43 using namespace xmlsignature;
44 using namespace xmlencryption;
45 using namespace xmltooling;
46 using namespace std;
47
48 #if defined (_MSC_VER)
49     #pragma warning( push )
50     #pragma warning( disable : 4250 4251 )
51 #endif
52
53 namespace opensaml {
54     namespace saml2p {
55
56         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,Artifact);
57         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,GetComplete);
58         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,NewID);
59         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,RequesterID);
60         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,SessionIndex);
61         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,StatusMessage);
62
63         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,RespondTo);
64
65         //TODO need unit test for this, using objects from another namespace
66         class SAML_DLLLOCAL ExtensionsImpl : public virtual Extensions,
67              public AbstractElementProxy,
68              public AbstractDOMCachingXMLObject,
69              public AbstractXMLObjectMarshaller,
70              public AbstractXMLObjectUnmarshaller
71         {
72         public:
73             virtual ~ExtensionsImpl() {}
74     
75             ExtensionsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
76                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
77             }
78                 
79             ExtensionsImpl(const ExtensionsImpl& src)
80                     : AbstractXMLObject(src), AbstractElementProxy(src), AbstractDOMCachingXMLObject(src) {
81                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
82                     if (*i) {
83                         getXMLObjects().push_back((*i)->clone());
84                     }
85                 }
86             }
87             
88             IMPL_XMLOBJECT_CLONE(Extensions);
89     
90         protected:
91             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
92                 // Unknown child.
93                 const XMLCh* nsURI=root->getNamespaceURI();
94                 if (!XMLString::equals(nsURI,SAMLConstants::SAML20P_NS) && nsURI && *nsURI) {
95                     getXMLObjects().push_back(childXMLObject);
96                     return;
97                 }
98                 
99                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
100             }
101         };
102
103         class SAML_DLLLOCAL StatusCodeImpl : public virtual StatusCode,
104              public AbstractComplexElement,
105              public AbstractDOMCachingXMLObject,
106              public AbstractXMLObjectMarshaller,
107              public AbstractXMLObjectUnmarshaller
108         {
109             void init() {
110                 m_Value=NULL;
111                 m_StatusCode=NULL;
112                 m_children.push_back(NULL);
113                 m_pos_StatusCode=m_children.begin();
114             }
115             public:
116                 virtual ~StatusCodeImpl() {}
117
118                 StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
119                     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
120                 {
121                         init();
122                 }
123
124                 StatusCodeImpl(const StatusCodeImpl& src)
125                         : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
126                     init();
127                     setValue(src.getValue());
128                     if (src.getStatusCode())
129                         setStatusCode(src.getStatusCode()->cloneStatusCode());
130                 }
131
132                 IMPL_XMLOBJECT_CLONE(StatusCode);
133                 IMPL_STRING_ATTRIB(Value);
134                 IMPL_TYPED_CHILD(StatusCode);
135
136             protected:
137                 void marshallAttributes(DOMElement* domElement) const {
138                     MARSHALL_STRING_ATTRIB(Value,VALUE,NULL);
139                 }
140
141                 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
142                     PROC_TYPED_CHILD(StatusCode,SAMLConstants::SAML20P_NS,false);
143                     AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
144                 }
145
146                 void processAttribute(const DOMAttr* attribute) {
147                     PROC_STRING_ATTRIB(Value,VALUE,NULL);
148                     AbstractXMLObjectUnmarshaller::processAttribute(attribute);
149                 }
150         };
151
152         //TODO need unit tests for non-SAML namespace children
153         class SAML_DLLLOCAL StatusDetailImpl : public virtual StatusDetail,
154             public AbstractComplexElement,
155             public AbstractDOMCachingXMLObject,
156             public AbstractXMLObjectMarshaller,
157             public AbstractXMLObjectUnmarshaller
158         {
159             public:
160                 virtual ~StatusDetailImpl() {}
161
162                 StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
163                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
164
165                 StatusDetailImpl(const StatusDetailImpl& src)
166                         : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
167                     VectorOf(XMLObject) v=getDetails();
168                     for (vector<XMLObject*>::const_iterator i=src.m_Details.begin(); i!=src.m_Details.end(); i++) {
169                         if (*i) {
170                             v.push_back((*i)->clone());
171                         }
172                     }
173                 }
174
175                 IMPL_XMLOBJECT_CLONE(StatusDetail);
176                 IMPL_XMLOBJECT_CHILDREN(Detail,m_children.end());
177
178             protected:
179                 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
180                     getDetails().push_back(childXMLObject);
181                     AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
182                 }
183         };
184
185
186         class SAML_DLLLOCAL StatusImpl : public virtual Status,
187              public AbstractComplexElement,
188              public AbstractDOMCachingXMLObject,
189              public AbstractXMLObjectMarshaller,
190              public AbstractXMLObjectUnmarshaller
191         {
192             void init() {
193                 m_StatusCode=NULL;
194                 m_StatusMessage=NULL;
195                 m_StatusDetail=NULL;
196                 m_children.push_back(NULL);
197                 m_children.push_back(NULL);
198                 m_children.push_back(NULL);
199                 m_pos_StatusCode=m_children.begin();
200                 m_pos_StatusMessage=m_pos_StatusCode;
201                 ++m_pos_StatusMessage;
202                 m_pos_StatusDetail=m_pos_StatusMessage;
203                 ++m_pos_StatusDetail;
204             }
205         public:
206             virtual ~StatusImpl() { }
207     
208             StatusImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
209                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
210                 init();
211             }
212                 
213             StatusImpl(const StatusImpl& src)
214                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
215                 init();
216                 if (src.getStatusCode())
217                     setStatusCode(src.getStatusCode()->cloneStatusCode());
218                 if (src.getStatusMessage())
219                     setStatusMessage(src.getStatusMessage()->cloneStatusMessage());
220                 if (src.getStatusDetail())
221                     setStatusDetail(src.getStatusDetail()->cloneStatusDetail());
222             }
223             
224             IMPL_XMLOBJECT_CLONE(Status);
225             IMPL_TYPED_CHILD(StatusCode);
226             IMPL_TYPED_CHILD(StatusMessage);
227             IMPL_TYPED_CHILD(StatusDetail);
228     
229         protected:
230     
231             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
232                 PROC_TYPED_CHILD(StatusCode,SAMLConstants::SAML20P_NS,false);
233                 PROC_TYPED_CHILD(StatusMessage,SAMLConstants::SAML20P_NS,false);
234                 PROC_TYPED_CHILD(StatusDetail,SAMLConstants::SAML20P_NS,false);
235                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
236             }
237     
238         };
239
240
241         class SAML_DLLLOCAL RequestAbstractTypeImpl : public virtual RequestAbstractType,
242             public AbstractComplexElement,
243             public AbstractDOMCachingXMLObject,
244             public AbstractXMLObjectMarshaller,
245             public AbstractXMLObjectUnmarshaller
246         {
247             void init() {
248                 m_ID=NULL;
249                 m_Version=NULL;
250                 m_IssueInstant=NULL;
251                 m_Destination=NULL;
252                 m_Consent=NULL;
253                 m_Issuer=NULL;
254                 m_Signature=NULL;
255                 m_Extensions=NULL;
256                 m_children.push_back(NULL);
257                 m_children.push_back(NULL);
258                 m_children.push_back(NULL);
259                 m_pos_Issuer=m_children.begin();
260                 m_pos_Signature=m_pos_Issuer;
261                 ++m_pos_Signature;
262                 m_pos_Extensions=m_pos_Signature;
263                 ++m_pos_Extensions;
264             }
265         protected:
266             RequestAbstractTypeImpl() {
267                 init();
268             }
269         public:
270             virtual ~RequestAbstractTypeImpl() {
271                 XMLString::release(&m_ID);
272                 XMLString::release(&m_Version);
273                 XMLString::release(&m_Destination);
274                 XMLString::release(&m_Consent);
275                 delete m_IssueInstant;
276             }
277     
278             RequestAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
279                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
280                 init();
281             }
282                 
283             RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src)
284                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
285                 init();
286                 setID(src.getID());
287                 setVersion(src.getVersion());
288                 setIssueInstant(src.getIssueInstant());
289                 setDestination(src.getDestination());
290                 setConsent(src.getConsent());
291                 if (src.getIssuer())
292                     setIssuer(src.getIssuer()->cloneIssuer());
293                 if (src.getSignature())
294                     setSignature(src.getSignature()->cloneSignature());
295                 if (src.getExtensions())
296                     setExtensions(src.getExtensions()->cloneExtensions());
297             }
298             
299             //IMPL_TYPED_CHILD(Signature);
300             // Need customized setter.
301         protected:
302             Signature* m_Signature;
303             list<XMLObject*>::iterator m_pos_Signature;
304         public:
305             Signature* getSignature() const {
306                 return m_Signature;
307             }
308             
309             void setSignature(Signature* sig) {
310                 prepareForAssignment(m_Signature,sig);
311                 *m_pos_Signature=m_Signature=sig;
312                 // Sync content reference back up.
313                 if (m_Signature)
314                     m_Signature->setContentReference(new opensaml::ContentReference(*this));
315             }
316             
317             IMPL_STRING_ATTRIB(Version);
318             IMPL_ID_ATTRIB(ID);
319             IMPL_DATETIME_ATTRIB(IssueInstant,0);
320             IMPL_STRING_ATTRIB(Destination);
321             IMPL_STRING_ATTRIB(Consent);
322             IMPL_TYPED_FOREIGN_CHILD(Issuer,saml2);
323             IMPL_TYPED_CHILD(Extensions);
324     
325         protected:
326             void marshallAttributes(DOMElement* domElement) const {
327                 if (!m_Version)
328                     const_cast<RequestAbstractTypeImpl*>(this)->m_Version=XMLString::transcode("2.0");
329                 MARSHALL_STRING_ATTRIB(Version,VER,NULL);
330                 if (!m_ID)
331                     const_cast<RequestAbstractTypeImpl*>(this)->m_ID=SAMLConfig::getConfig().generateIdentifier();
332                 MARSHALL_ID_ATTRIB(ID,ID,NULL);
333                 if (!m_IssueInstant) {
334                     const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstantEpoch=time(NULL);
335                     const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
336                 }
337                 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
338                 MARSHALL_STRING_ATTRIB(Destination,DESTINATION,NULL);
339                 MARSHALL_STRING_ATTRIB(Consent,CONSENT,NULL);
340             }
341     
342             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
343                 PROC_TYPED_FOREIGN_CHILD(Issuer,saml2,SAMLConstants::SAML20_NS,false);
344                 PROC_TYPED_FOREIGN_CHILD(Signature,xmlsignature,XMLConstants::XMLSIG_NS,false);
345                 PROC_TYPED_CHILD(Extensions,SAMLConstants::SAML20P_NS,false);
346                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
347             }
348     
349             void processAttribute(const DOMAttr* attribute) {
350                 PROC_ID_ATTRIB(ID,ID,NULL);
351                 PROC_STRING_ATTRIB(Version,VER,NULL);
352                 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
353                 PROC_STRING_ATTRIB(Destination,DESTINATION,NULL);
354                 PROC_STRING_ATTRIB(Consent,CONSENT,NULL);
355                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
356             }
357         };
358
359
360         class SAML_DLLLOCAL AssertionIDRequestImpl : public virtual AssertionIDRequest, public RequestAbstractTypeImpl
361         {
362         public:
363             virtual ~AssertionIDRequestImpl() { }
364     
365             AssertionIDRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
366                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
367                 
368             AssertionIDRequestImpl(const AssertionIDRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
369                 VectorOf(AssertionIDRef) v=getAssertionIDRefs();
370                 for (vector<AssertionIDRef*>::const_iterator i=src.m_AssertionIDRefs.begin(); i!=src.m_AssertionIDRefs.end(); i++) {
371                     if (*i) {                               
372                         v.push_back((*i)->cloneAssertionIDRef());
373                     }
374                 }
375
376             }
377             
378             IMPL_XMLOBJECT_CLONE(AssertionIDRequest);
379             RequestAbstractType* cloneRequestAbstractType() const {
380                 return cloneAssertionIDRequest();
381             }
382
383             IMPL_TYPED_FOREIGN_CHILDREN(AssertionIDRef,saml2,m_children.end());
384     
385         protected:
386             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
387                 PROC_TYPED_FOREIGN_CHILDREN(AssertionIDRef,saml2,SAMLConstants::SAML20_NS,false);
388                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
389             }
390         };
391
392         class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery, public RequestAbstractTypeImpl
393         {
394             void init()
395             {
396                 m_Subject = NULL;
397                 m_children.push_back(NULL);
398                 m_pos_Subject = m_pos_Extensions;
399                 ++m_pos_Subject;
400             }
401         protected:
402             SubjectQueryImpl() {
403                 init();
404             }
405         public:
406             virtual ~SubjectQueryImpl() { }
407     
408             SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
409                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
410             { 
411                 init();
412             }
413                 
414             SubjectQueryImpl(const SubjectQueryImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
415                 init();
416                 if (src.getSubject())
417                     setSubject(src.getSubject()->cloneSubject());
418             }
419             
420             IMPL_TYPED_FOREIGN_CHILD(Subject,saml2);
421     
422         protected:
423             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
424                 PROC_TYPED_FOREIGN_CHILD(Subject,saml2,SAMLConstants::SAML20_NS,false);
425                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
426             }
427         };
428
429
430         class SAML_DLLLOCAL RequestedAuthnContextImpl : public virtual RequestedAuthnContext,
431             public AbstractComplexElement,
432             public AbstractDOMCachingXMLObject,
433             public AbstractXMLObjectMarshaller,
434             public AbstractXMLObjectUnmarshaller
435         {
436             void init() {
437                 m_Comparison=NULL;
438             }
439         public:
440             virtual ~RequestedAuthnContextImpl() {
441                 XMLString::release(&m_Comparison);
442             }
443     
444             RequestedAuthnContextImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
445                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
446                 init();
447             }
448                 
449             RequestedAuthnContextImpl(const RequestedAuthnContextImpl& src)
450                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
451                 init();
452                 setComparison(src.getComparison());
453                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
454                     if (*i) {
455                         AuthnContextClassRef* classref=dynamic_cast<AuthnContextClassRef*>(*i);
456                         if (classref) {
457                             getAuthnContextClassRefs().push_back(classref->cloneAuthnContextClassRef());
458                             continue;
459                         }
460
461                         AuthnContextDeclRef* declref=dynamic_cast<AuthnContextDeclRef*>(*i);
462                         if (declref) {
463                             getAuthnContextDeclRefs().push_back(declref->cloneAuthnContextDeclRef());
464                             continue;
465                         }
466                     }
467                 }
468             }
469             
470             IMPL_XMLOBJECT_CLONE(RequestedAuthnContext);
471             IMPL_STRING_ATTRIB(Comparison);
472             IMPL_TYPED_FOREIGN_CHILDREN(AuthnContextClassRef,saml2,m_children.end());
473             IMPL_TYPED_FOREIGN_CHILDREN(AuthnContextDeclRef,saml2,m_children.end());
474     
475         protected:
476             void marshallAttributes(DOMElement* domElement) const {
477                 MARSHALL_STRING_ATTRIB(Comparison,COMPARISON,NULL);
478             }
479     
480             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
481                 PROC_TYPED_FOREIGN_CHILDREN(AuthnContextClassRef,saml2,SAMLConstants::SAML20_NS,false);
482                 PROC_TYPED_FOREIGN_CHILDREN(AuthnContextDeclRef,saml2,SAMLConstants::SAML20_NS,false);
483                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
484             }
485     
486             void processAttribute(const DOMAttr* attribute) {
487                 PROC_STRING_ATTRIB(Comparison,COMPARISON,NULL);
488                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
489             }
490         };
491
492
493         class SAML_DLLLOCAL AuthnQueryImpl : public virtual AuthnQuery, public SubjectQueryImpl
494         {
495             void init() {
496                 m_SessionIndex=NULL;
497                 m_RequestedAuthnContext=NULL;
498                 m_children.push_back(NULL);
499                 m_pos_RequestedAuthnContext = m_pos_Subject;
500                 ++m_pos_RequestedAuthnContext;
501                 
502             }
503         public:
504             virtual ~AuthnQueryImpl() {
505                 XMLString::release(&m_SessionIndex);
506             }
507     
508             AuthnQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
509                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
510             {
511                 init();
512             }
513                 
514             AuthnQueryImpl(const AuthnQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
515                 init();
516                 setSessionIndex(src.getSessionIndex());
517                 if (src.getRequestedAuthnContext())
518                     setRequestedAuthnContext(src.getRequestedAuthnContext()->cloneRequestedAuthnContext());
519             }
520             
521             IMPL_XMLOBJECT_CLONE(AuthnQuery);
522             SubjectQuery* cloneSubjectQuery() const {
523                 return cloneAuthnQuery();
524             }
525             RequestAbstractType* cloneRequestAbstractType() const {
526                 return cloneAuthnQuery();
527             }
528
529             IMPL_STRING_ATTRIB(SessionIndex);
530             IMPL_TYPED_CHILD(RequestedAuthnContext);
531     
532         protected:
533             void marshallAttributes(DOMElement* domElement) const {
534                 MARSHALL_STRING_ATTRIB(SessionIndex,SESSIONINDEX,NULL);
535                 SubjectQueryImpl::marshallAttributes(domElement);
536             }
537     
538             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
539                 PROC_TYPED_CHILD(RequestedAuthnContext,SAMLConstants::SAML20P_NS,false);
540                 SubjectQueryImpl::processChildElement(childXMLObject,root);
541             }
542             void processAttribute(const DOMAttr* attribute) {
543                 PROC_STRING_ATTRIB(SessionIndex,SESSIONINDEX,NULL);
544                 SubjectQueryImpl::processAttribute(attribute);
545             }
546         };
547
548         class SAML_DLLLOCAL AttributeQueryImpl : public virtual AttributeQuery, public SubjectQueryImpl
549         {
550         public:
551             virtual ~AttributeQueryImpl() { }
552     
553             AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
554                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
555                 
556             AttributeQueryImpl(const AttributeQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
557                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
558                     if (*i) {
559                         Attribute* attrib=dynamic_cast<Attribute*>(*i);
560                         if (attrib) {
561                             getAttributes().push_back(attrib->cloneAttribute());
562                             continue;
563                         }
564                     }
565                 }
566
567             }
568             
569             IMPL_XMLOBJECT_CLONE(AttributeQuery);
570             SubjectQuery* cloneSubjectQuery() const {
571                 return cloneAttributeQuery();
572             }
573             RequestAbstractType* cloneRequestAbstractType() const {
574                 return cloneAttributeQuery();
575             }
576
577             IMPL_TYPED_FOREIGN_CHILDREN(Attribute,saml2,m_children.end());
578     
579         protected:
580             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
581                 PROC_TYPED_FOREIGN_CHILDREN(Attribute,saml2,SAMLConstants::SAML20_NS,false);
582                 SubjectQueryImpl::processChildElement(childXMLObject,root);
583             }
584         };
585
586         class SAML_DLLLOCAL AuthzDecisionQueryImpl : public virtual AuthzDecisionQuery, public SubjectQueryImpl
587         {
588             void init() {
589                 m_Resource=NULL;
590                 m_Evidence=NULL;
591                 m_children.push_back(NULL);
592                 m_pos_Evidence=m_pos_Subject;
593                 ++m_pos_Evidence;
594                 
595             }
596         public:
597             virtual ~AuthzDecisionQueryImpl() {
598                 XMLString::release(&m_Resource);
599             }
600     
601             AuthzDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
602                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
603                 init();
604             }
605                 
606             AuthzDecisionQueryImpl(const AuthzDecisionQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
607                 init();
608                 setResource(src.getResource());
609                 if (src.getEvidence())
610                     setEvidence(src.getEvidence()->cloneEvidence());
611                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
612                     if (*i) {
613                         Action* action=dynamic_cast<Action*>(*i);
614                         if (action) {
615                             getActions().push_back(action->cloneAction());
616                             continue;
617                         }
618                     }
619                 }
620             }
621             
622             IMPL_XMLOBJECT_CLONE(AuthzDecisionQuery);
623             SubjectQuery* cloneSubjectQuery() const {
624                 return cloneAuthzDecisionQuery();
625             }
626             RequestAbstractType* cloneRequestAbstractType() const {
627                 return cloneAuthzDecisionQuery();
628             }
629
630             IMPL_STRING_ATTRIB(Resource);
631             IMPL_TYPED_FOREIGN_CHILDREN(Action,saml2,m_pos_Evidence);
632             IMPL_TYPED_FOREIGN_CHILD(Evidence,saml2);
633     
634         protected:
635             void marshallAttributes(DOMElement* domElement) const {
636                 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
637                 SubjectQueryImpl::marshallAttributes(domElement);
638             }
639     
640             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
641                 PROC_TYPED_FOREIGN_CHILD(Evidence,saml2,SAMLConstants::SAML20_NS,false);
642                 PROC_TYPED_FOREIGN_CHILDREN(Action,saml2,SAMLConstants::SAML20_NS,false);
643                 SubjectQueryImpl::processChildElement(childXMLObject,root);
644             }
645             void processAttribute(const DOMAttr* attribute) {
646                 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
647                 SubjectQueryImpl::processAttribute(attribute);
648             }
649         };
650
651         class SAML_DLLLOCAL NameIDPolicyImpl : public virtual NameIDPolicy,
652             public AbstractSimpleElement,
653             public AbstractDOMCachingXMLObject,
654             public AbstractXMLObjectMarshaller,
655             public AbstractXMLObjectUnmarshaller
656         {
657             void init() {
658                 m_Format=NULL;
659                 m_SPNameQualifier=NULL;
660                 m_AllowCreate=XMLConstants::XML_BOOL_NULL;
661             }
662             public:
663                 virtual ~NameIDPolicyImpl()
664                 {
665                     XMLString::release(&m_Format);
666                     XMLString::release(&m_SPNameQualifier);
667                 }
668
669                 NameIDPolicyImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
670                     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
671                 {
672                         init();
673                 }
674
675                 NameIDPolicyImpl(const NameIDPolicyImpl& src)
676                         : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {
677                     init();
678                     setFormat(src.getFormat());
679                     setSPNameQualifier(src.getSPNameQualifier());
680                     AllowCreate(m_AllowCreate);
681                 }
682
683                 IMPL_XMLOBJECT_CLONE(NameIDPolicy);
684                 IMPL_STRING_ATTRIB(Format);
685                 IMPL_STRING_ATTRIB(SPNameQualifier);
686                 IMPL_BOOLEAN_ATTRIB(AllowCreate);
687
688             protected:
689                 void marshallAttributes(DOMElement* domElement) const {
690                     MARSHALL_STRING_ATTRIB(Format,FORMAT,NULL);
691                     MARSHALL_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER,NULL);
692                     MARSHALL_BOOLEAN_ATTRIB(AllowCreate,ALLOWCREATE,NULL);
693                 }
694
695                 void processAttribute(const DOMAttr* attribute) {
696                     PROC_STRING_ATTRIB(Format,FORMAT,NULL);
697                     PROC_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER,NULL);
698                     PROC_BOOLEAN_ATTRIB(AllowCreate,ALLOWCREATE,NULL);
699                     AbstractXMLObjectUnmarshaller::processAttribute(attribute);
700                 }
701         };
702
703         class SAML_DLLLOCAL IDPEntryImpl : public virtual IDPEntry,
704             public AbstractSimpleElement,
705             public AbstractDOMCachingXMLObject,
706             public AbstractXMLObjectMarshaller,
707             public AbstractXMLObjectUnmarshaller
708         {
709             void init() {
710                 m_ProviderID=NULL;
711                 m_Name=NULL;
712                 m_Loc=NULL;
713             }
714             public:
715                 virtual ~IDPEntryImpl()
716                 {
717                     XMLString::release(&m_ProviderID);
718                     XMLString::release(&m_Name);
719                     XMLString::release(&m_Loc);
720                 }
721
722                 IDPEntryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
723                     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
724                 {
725                         init();
726                 }
727
728                 IDPEntryImpl(const IDPEntryImpl& src)
729                         : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {
730                     init();
731                     setProviderID(src.getProviderID());
732                     setName(src.getName());
733                     setLoc(src.getLoc());
734                 }
735
736                 IMPL_XMLOBJECT_CLONE(IDPEntry);
737                 IMPL_STRING_ATTRIB(ProviderID);
738                 IMPL_STRING_ATTRIB(Name);
739                 IMPL_STRING_ATTRIB(Loc);
740
741             protected:
742                 void marshallAttributes(DOMElement* domElement) const {
743                     MARSHALL_STRING_ATTRIB(ProviderID,PROVIDERID,NULL);
744                     MARSHALL_STRING_ATTRIB(Name,NAME,NULL);
745                     MARSHALL_STRING_ATTRIB(Loc,LOC,NULL);
746                 }
747
748                 void processAttribute(const DOMAttr* attribute) {
749                     PROC_STRING_ATTRIB(ProviderID,PROVIDERID,NULL);
750                     PROC_STRING_ATTRIB(Name,NAME,NULL);
751                     PROC_STRING_ATTRIB(Loc,LOC,NULL);
752                     AbstractXMLObjectUnmarshaller::processAttribute(attribute);
753                 }
754         };
755
756         class SAML_DLLLOCAL IDPListImpl : public virtual IDPList,
757             public AbstractComplexElement,
758             public AbstractDOMCachingXMLObject,
759             public AbstractXMLObjectMarshaller,
760             public AbstractXMLObjectUnmarshaller
761         {
762             void init() {
763                 m_GetComplete=NULL;
764                 m_children.push_back(NULL);
765                 m_pos_GetComplete=m_children.begin();
766                 
767             }
768         public:
769             virtual ~IDPListImpl() { }
770     
771             IDPListImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
772                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
773             {
774                 init();
775             }
776                 
777             IDPListImpl(const IDPListImpl& src)
778                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
779                 init();
780                 if (src.getGetComplete())
781                     setGetComplete(src.getGetComplete()->cloneGetComplete());
782                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
783                     if (*i) {
784                         IDPEntry* entry=dynamic_cast<IDPEntry*>(*i);
785                         if (entry) {
786                             getIDPEntrys().push_back(entry->cloneIDPEntry());
787                             continue;
788                         }
789                     }
790                 }
791             }
792             
793             IMPL_XMLOBJECT_CLONE(IDPList);
794             IMPL_TYPED_CHILDREN(IDPEntry,m_pos_GetComplete);
795             IMPL_TYPED_CHILD(GetComplete);
796     
797         protected:
798             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
799                 PROC_TYPED_CHILDREN(IDPEntry,SAMLConstants::SAML20P_NS,false);
800                 PROC_TYPED_CHILD(GetComplete,SAMLConstants::SAML20P_NS,false);
801                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
802             }
803         };
804
805
806         class SAML_DLLLOCAL ScopingImpl : public virtual Scoping,
807             public AbstractComplexElement,
808             public AbstractDOMCachingXMLObject,
809             public AbstractXMLObjectMarshaller,
810             public AbstractXMLObjectUnmarshaller
811         {
812             void init() {
813                 m_ProxyCount=NULL;
814                 m_IDPList=NULL;
815                 m_children.push_back(NULL);
816                 m_pos_IDPList=m_children.begin();
817                 
818             }
819         public:
820             virtual ~ScopingImpl() {
821                 XMLString::release(&m_ProxyCount); 
822             }
823     
824             ScopingImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
825                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
826             {
827                 init();
828             }
829                 
830             ScopingImpl(const ScopingImpl& src)
831                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
832                 init();
833                 setProxyCount(m_ProxyCount);
834                 if (src.getIDPList())
835                     setIDPList(src.getIDPList()->cloneIDPList());
836                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
837                     if (*i) {
838                         RequesterID* reqid =dynamic_cast<RequesterID*>(*i);
839                         if (reqid) {
840                             getRequesterIDs().push_back(reqid->cloneRequesterID());
841                             continue;
842                         }
843                     }
844                 }
845             }
846             
847             IMPL_XMLOBJECT_CLONE(Scoping);
848             IMPL_INTEGER_ATTRIB(ProxyCount);
849             IMPL_TYPED_CHILD(IDPList);
850             IMPL_TYPED_CHILDREN(RequesterID,m_children.end());
851     
852         protected:
853             void marshallAttributes(DOMElement* domElement) const {
854                     MARSHALL_INTEGER_ATTRIB(ProxyCount,PROXYCOUNT,NULL);
855             }
856     
857             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
858                 PROC_TYPED_CHILD(IDPList,SAMLConstants::SAML20P_NS,false);
859                 PROC_TYPED_CHILDREN(RequesterID,SAMLConstants::SAML20P_NS,false);
860                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
861             }
862
863             void processAttribute(const DOMAttr* attribute) {
864                 PROC_INTEGER_ATTRIB(ProxyCount,PROXYCOUNT,NULL);
865                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
866             }
867         };
868
869         class SAML_DLLLOCAL AuthnRequestImpl : public virtual AuthnRequest, public RequestAbstractTypeImpl
870         {
871             void init() {
872                 m_ForceAuthn=XMLConstants::XML_BOOL_NULL;
873                 m_IsPassive=XMLConstants::XML_BOOL_NULL;
874                 m_ProtocolBinding=NULL;
875                 m_AssertionConsumerServiceIndex=NULL;
876                 m_AssertionConsumerServiceURL=NULL;
877                 m_AttributeConsumingServiceIndex=NULL;
878                 m_ProviderName=NULL;
879
880                 m_Subject=NULL;
881                 m_NameIDPolicy=NULL;
882                 m_Conditions=NULL;
883                 m_RequestedAuthnContext=NULL;
884                 m_Scoping=NULL;
885                 m_children.push_back(NULL);
886                 m_children.push_back(NULL);
887                 m_children.push_back(NULL);
888                 m_children.push_back(NULL);
889                 m_children.push_back(NULL);
890                 m_pos_Subject=m_pos_Extensions;
891                 ++m_pos_Subject;
892                 m_pos_NameIDPolicy=m_pos_Subject;
893                 ++m_pos_NameIDPolicy;
894                 m_pos_Conditions=m_pos_NameIDPolicy;
895                 ++m_pos_Conditions;
896                 m_pos_RequestedAuthnContext=m_pos_Conditions;
897                 ++m_pos_RequestedAuthnContext;
898                 m_pos_Scoping=m_pos_RequestedAuthnContext;
899                 ++m_pos_Scoping;
900                 
901             }
902         public:
903             virtual ~AuthnRequestImpl() {
904                 XMLString::release(&m_ProtocolBinding);
905                 XMLString::release(&m_AssertionConsumerServiceURL);
906                 XMLString::release(&m_ProviderName);
907                 XMLString::release(&m_AssertionConsumerServiceIndex);
908                 XMLString::release(&m_AttributeConsumingServiceIndex);
909             }
910     
911             AuthnRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
912                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
913             {
914                 init();
915             }
916                 
917             AuthnRequestImpl(const AuthnRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
918                 init();
919
920                 ForceAuthn(m_ForceAuthn);
921                 IsPassive(m_IsPassive);
922                 setProtocolBinding(src.getProtocolBinding());
923                 setAssertionConsumerServiceIndex(m_AssertionConsumerServiceIndex);
924                 setAssertionConsumerServiceURL(src.getAssertionConsumerServiceURL());
925                 setAttributeConsumingServiceIndex(m_AttributeConsumingServiceIndex);
926                 setProviderName(src.getProviderName());
927
928                 if (src.getSubject())
929                     setSubject(src.getSubject()->cloneSubject());
930                 if (src.getNameIDPolicy())
931                     setNameIDPolicy(src.getNameIDPolicy()->cloneNameIDPolicy());
932                 if (src.getConditions())
933                     setConditions(src.getConditions()->cloneConditions());
934                 if (src.getRequestedAuthnContext())
935                     setRequestedAuthnContext(src.getRequestedAuthnContext()->cloneRequestedAuthnContext());
936                 if (src.getScoping())
937                     setScoping(src.getScoping()->cloneScoping());
938             }
939             
940             IMPL_XMLOBJECT_CLONE(AuthnRequest);
941             RequestAbstractType* cloneRequestAbstractType() const {
942                 return cloneAuthnRequest();
943             }
944
945             IMPL_BOOLEAN_ATTRIB(ForceAuthn);
946             IMPL_BOOLEAN_ATTRIB(IsPassive);
947             IMPL_STRING_ATTRIB(ProtocolBinding);
948             IMPL_INTEGER_ATTRIB(AssertionConsumerServiceIndex);
949             IMPL_STRING_ATTRIB(AssertionConsumerServiceURL);
950             IMPL_INTEGER_ATTRIB(AttributeConsumingServiceIndex);
951             IMPL_STRING_ATTRIB(ProviderName);
952
953             IMPL_TYPED_FOREIGN_CHILD(Subject,saml2);
954             IMPL_TYPED_CHILD(NameIDPolicy);
955             IMPL_TYPED_FOREIGN_CHILD(Conditions,saml2);
956             IMPL_TYPED_CHILD(RequestedAuthnContext);
957             IMPL_TYPED_CHILD(Scoping);
958     
959         protected:
960             void marshallAttributes(DOMElement* domElement) const {
961                 MARSHALL_BOOLEAN_ATTRIB(ForceAuthn,FORCEAUTHN,NULL);
962                 MARSHALL_BOOLEAN_ATTRIB(IsPassive,ISPASSIVE,NULL);
963                 MARSHALL_STRING_ATTRIB(ProtocolBinding,PROTOCOLBINDING,NULL);
964                 MARSHALL_INTEGER_ATTRIB(AssertionConsumerServiceIndex,ASSERTIONCONSUMERSERVICEINDEX,NULL);
965                 MARSHALL_STRING_ATTRIB(AssertionConsumerServiceURL,ASSERTIONCONSUMERSERVICEURL,NULL);
966                 MARSHALL_INTEGER_ATTRIB(AttributeConsumingServiceIndex,ATTRIBUTECONSUMINGSERVICEINDEX,NULL);
967                 MARSHALL_STRING_ATTRIB(ProviderName,PROVIDERNAME,NULL);
968                 RequestAbstractTypeImpl::marshallAttributes(domElement);
969             }
970     
971             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
972                 PROC_TYPED_FOREIGN_CHILD(Subject,saml2,SAMLConstants::SAML20_NS,false);
973                 PROC_TYPED_CHILD(NameIDPolicy,SAMLConstants::SAML20P_NS,false);
974                 PROC_TYPED_FOREIGN_CHILD(Conditions,saml2,SAMLConstants::SAML20_NS,false);
975                 PROC_TYPED_CHILD(RequestedAuthnContext,SAMLConstants::SAML20P_NS,false);
976                 PROC_TYPED_CHILD(Scoping,SAMLConstants::SAML20P_NS,false);
977                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
978             }
979             void processAttribute(const DOMAttr* attribute) {
980                 PROC_BOOLEAN_ATTRIB(ForceAuthn,FORCEAUTHN,NULL);
981                 PROC_BOOLEAN_ATTRIB(IsPassive,ISPASSIVE,NULL);
982                 PROC_STRING_ATTRIB(ProtocolBinding,PROTOCOLBINDING,NULL);
983                 PROC_INTEGER_ATTRIB(AssertionConsumerServiceIndex,ASSERTIONCONSUMERSERVICEINDEX,NULL);
984                 PROC_STRING_ATTRIB(AssertionConsumerServiceURL,ASSERTIONCONSUMERSERVICEURL,NULL);
985                 PROC_INTEGER_ATTRIB(AttributeConsumingServiceIndex,ATTRIBUTECONSUMINGSERVICEINDEX,NULL);
986                 PROC_STRING_ATTRIB(ProviderName,PROVIDERNAME,NULL);
987                 RequestAbstractTypeImpl::processAttribute(attribute);
988             }
989         };
990
991         class SAML_DLLLOCAL StatusResponseTypeImpl : public virtual StatusResponseType,
992             public AbstractComplexElement,
993             public AbstractDOMCachingXMLObject,
994             public AbstractXMLObjectMarshaller,
995             public AbstractXMLObjectUnmarshaller
996         {
997             void init() {
998                 m_ID=NULL;
999                 m_InResponseTo=NULL;
1000                 m_Version=NULL;
1001                 m_IssueInstant=NULL;
1002                 m_Destination=NULL;
1003                 m_Consent=NULL;
1004                 m_Issuer=NULL;
1005                 m_Signature=NULL;
1006                 m_Extensions=NULL;
1007                 m_Status=NULL;
1008                 m_children.push_back(NULL);
1009                 m_children.push_back(NULL);
1010                 m_children.push_back(NULL);
1011                 m_children.push_back(NULL);
1012                 m_pos_Issuer=m_children.begin();
1013                 m_pos_Signature=m_pos_Issuer;
1014                 ++m_pos_Signature;
1015                 m_pos_Extensions=m_pos_Signature;
1016                 ++m_pos_Extensions;
1017                 m_pos_Status=m_pos_Extensions;
1018                 ++m_pos_Status;
1019             }
1020         protected:
1021             StatusResponseTypeImpl() {
1022                 init();
1023             }
1024         public:
1025             virtual ~StatusResponseTypeImpl() {
1026                 XMLString::release(&m_ID);
1027                 XMLString::release(&m_InResponseTo);
1028                 XMLString::release(&m_Version);
1029                 XMLString::release(&m_Destination);
1030                 XMLString::release(&m_Consent);
1031                 delete m_IssueInstant;
1032             }
1033     
1034             StatusResponseTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
1035                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1036             {
1037                 init();
1038             }
1039                 
1040             StatusResponseTypeImpl(const StatusResponseTypeImpl& src)
1041                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
1042                 init();
1043                 setID(src.getID());
1044                 setInResponseTo(src.getInResponseTo());
1045                 setVersion(src.getVersion());
1046                 setIssueInstant(src.getIssueInstant());
1047                 setDestination(src.getDestination());
1048                 setConsent(src.getConsent());
1049                 if (src.getIssuer())
1050                     setIssuer(src.getIssuer()->cloneIssuer());
1051                 if (src.getSignature())
1052                     setSignature(src.getSignature()->cloneSignature());
1053                 if (src.getExtensions())
1054                     setExtensions(src.getExtensions()->cloneExtensions());
1055                 if (src.getStatus())
1056                     setStatus(src.getStatus()->cloneStatus());
1057             }
1058             
1059             //IMPL_TYPED_CHILD(Signature);
1060             // Need customized setter.
1061         protected:
1062             Signature* m_Signature;
1063             list<XMLObject*>::iterator m_pos_Signature;
1064         public:
1065             Signature* getSignature() const {
1066                 return m_Signature;
1067             }
1068             
1069             void setSignature(Signature* sig) {
1070                 prepareForAssignment(m_Signature,sig);
1071                 *m_pos_Signature=m_Signature=sig;
1072                 // Sync content reference back up.
1073                 if (m_Signature)
1074                     m_Signature->setContentReference(new opensaml::ContentReference(*this));
1075             }
1076             
1077             IMPL_STRING_ATTRIB(Version);
1078             IMPL_ID_ATTRIB(ID);
1079             IMPL_STRING_ATTRIB(InResponseTo);
1080             IMPL_DATETIME_ATTRIB(IssueInstant,0);
1081             IMPL_STRING_ATTRIB(Destination);
1082             IMPL_STRING_ATTRIB(Consent);
1083             IMPL_TYPED_FOREIGN_CHILD(Issuer,saml2);
1084             IMPL_TYPED_CHILD(Extensions);
1085             IMPL_TYPED_CHILD(Status);
1086     
1087         protected:
1088             void marshallAttributes(DOMElement* domElement) const {
1089                 if (!m_Version)
1090                     const_cast<StatusResponseTypeImpl*>(this)->m_Version=XMLString::transcode("2.0");
1091                 MARSHALL_STRING_ATTRIB(Version,VER,NULL);
1092                 if (!m_ID)
1093                     const_cast<StatusResponseTypeImpl*>(this)->m_ID=SAMLConfig::getConfig().generateIdentifier();
1094                 MARSHALL_ID_ATTRIB(ID,ID,NULL);
1095                 if (!m_IssueInstant) {
1096                     const_cast<StatusResponseTypeImpl*>(this)->m_IssueInstantEpoch=time(NULL);
1097                     const_cast<StatusResponseTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
1098                 }
1099                 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
1100                 MARSHALL_STRING_ATTRIB(Destination,DESTINATION,NULL);
1101                 MARSHALL_STRING_ATTRIB(Consent,CONSENT,NULL);
1102                 MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
1103             }
1104     
1105             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1106                 PROC_TYPED_FOREIGN_CHILD(Issuer,saml2,SAMLConstants::SAML20_NS,false);
1107                 PROC_TYPED_FOREIGN_CHILD(Signature,xmlsignature,XMLConstants::XMLSIG_NS,false);
1108                 PROC_TYPED_CHILD(Extensions,SAMLConstants::SAML20P_NS,false);
1109                 PROC_TYPED_CHILD(Status,SAMLConstants::SAML20P_NS,false);
1110                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
1111             }
1112     
1113             void processAttribute(const DOMAttr* attribute) {
1114                 PROC_ID_ATTRIB(ID,ID,NULL);
1115                 PROC_STRING_ATTRIB(Version,VER,NULL);
1116                 PROC_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
1117                 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
1118                 PROC_STRING_ATTRIB(Destination,DESTINATION,NULL);
1119                 PROC_STRING_ATTRIB(Consent,CONSENT,NULL);
1120                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
1121             }
1122         };
1123
1124         class SAML_DLLLOCAL ResponseImpl : public virtual Response, public StatusResponseTypeImpl
1125         {
1126         public:
1127             virtual ~ResponseImpl() { }
1128     
1129             ResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
1130                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
1131                 
1132             ResponseImpl(const ResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1133                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
1134                     if (*i) {
1135                         Assertion* assertion=dynamic_cast<Assertion*>(*i);
1136                         if (assertion) {
1137                             getAssertions().push_back(assertion->cloneAssertion());
1138                             continue;
1139                         }
1140                         EncryptedAssertion* encAssertion=dynamic_cast<EncryptedAssertion*>(*i);
1141                         if (encAssertion) {
1142                             getEncryptedAssertions().push_back(encAssertion->cloneEncryptedAssertion());
1143                             continue;
1144                         }
1145                     }
1146                 }
1147
1148             }
1149             
1150             IMPL_XMLOBJECT_CLONE(Response);
1151             StatusResponseType* cloneStatusResponseType() const {
1152                 return cloneResponse();
1153             }
1154
1155             IMPL_TYPED_FOREIGN_CHILDREN(Assertion,saml2,m_children.end());
1156             IMPL_TYPED_FOREIGN_CHILDREN(EncryptedAssertion,saml2,m_children.end());
1157     
1158         protected:
1159             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1160                 PROC_TYPED_FOREIGN_CHILDREN(Assertion,saml2,SAMLConstants::SAML20_NS,false);
1161                 PROC_TYPED_FOREIGN_CHILDREN(EncryptedAssertion,saml2,SAMLConstants::SAML20_NS,false);
1162                 StatusResponseTypeImpl::processChildElement(childXMLObject,root);
1163             }
1164         };
1165
1166         class SAML_DLLLOCAL ArtifactResolveImpl : public virtual ArtifactResolve, public RequestAbstractTypeImpl
1167         {
1168             void init() {
1169                 m_Artifact=NULL;
1170                 m_children.push_back(NULL);
1171                 m_pos_Artifact=m_pos_Extensions;
1172                 ++m_pos_Artifact;
1173             }
1174         public:
1175             virtual ~ArtifactResolveImpl() { }
1176     
1177             ArtifactResolveImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
1178                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1179             { 
1180                 init();
1181             }
1182                 
1183             ArtifactResolveImpl(const ArtifactResolveImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
1184                 init();
1185                 if(src.getArtifact())
1186                     setArtifact(src.getArtifact()->cloneArtifact());
1187             }
1188             
1189             IMPL_XMLOBJECT_CLONE(ArtifactResolve);
1190             RequestAbstractType* cloneRequestAbstractType() const {
1191                 return cloneArtifactResolve();
1192             }
1193
1194             IMPL_TYPED_CHILD(Artifact);
1195     
1196         protected:
1197             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1198                 PROC_TYPED_CHILD(Artifact,SAMLConstants::SAML20P_NS,false);
1199                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
1200             }
1201         };
1202
1203         class SAML_DLLLOCAL ArtifactResponseImpl : public virtual ArtifactResponse, public StatusResponseTypeImpl
1204         {
1205             void init() {
1206                 m_Payload=NULL;
1207                 m_children.push_back(NULL);
1208                 m_pos_Payload=m_pos_Status;
1209                 ++m_pos_Payload;
1210             }
1211         public:
1212             virtual ~ArtifactResponseImpl() { }
1213     
1214             ArtifactResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
1215                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1216             {
1217                 init();
1218             }
1219                 
1220             ArtifactResponseImpl(const ArtifactResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1221                 init();
1222                 if (src.getPayload())
1223                     setPayload(getPayload()->clone());
1224
1225             }
1226             
1227             IMPL_XMLOBJECT_CLONE(ArtifactResponse);
1228             StatusResponseType* cloneStatusResponseType() const {
1229                 return cloneArtifactResponse();
1230             }
1231
1232             IMPL_XMLOBJECT_CHILD(Payload);
1233     
1234         protected:
1235             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1236                 // These are valid elements for the parent StatusResponseType, so don't process these.
1237                 // If not one of these, then it must be the payload.
1238                 if (
1239                     ! XMLHelper::isNodeNamed(root,SAMLConstants::SAML20_NS,saml2::Issuer::LOCAL_NAME) &&
1240                     ! XMLHelper::isNodeNamed(root,XMLConstants::XMLSIG_NS,xmlsignature::Signature::LOCAL_NAME) &&
1241                     ! XMLHelper::isNodeNamed(root,SAMLConstants::SAML20P_NS,saml2p::Extensions::LOCAL_NAME) &&
1242                     ! XMLHelper::isNodeNamed(root,SAMLConstants::SAML20P_NS,saml2p::Status::LOCAL_NAME)
1243                    )
1244                 {
1245                     setPayload(childXMLObject);
1246                     return;
1247                 }
1248
1249                 StatusResponseTypeImpl::processChildElement(childXMLObject,root);
1250             }
1251         };
1252
1253         class SAML_DLLLOCAL NewEncryptedIDImpl : public virtual NewEncryptedID,
1254             public AbstractComplexElement,
1255             public AbstractDOMCachingXMLObject,
1256             public AbstractXMLObjectMarshaller,
1257             public AbstractXMLObjectUnmarshaller
1258         {
1259             void init() {
1260                 m_EncryptedData=NULL;
1261                 m_children.push_back(NULL);
1262                 m_pos_EncryptedData=m_children.begin();
1263             }
1264             
1265         protected:
1266             NewEncryptedIDImpl()
1267             {
1268                 init();
1269             }
1270             
1271         public:
1272             virtual ~NewEncryptedIDImpl() {}
1273     
1274             NewEncryptedIDImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
1275                     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1276             {
1277                 init();
1278             }
1279                 
1280             NewEncryptedIDImpl(const NewEncryptedIDImpl& src)
1281                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
1282                 init();
1283                 if (src.getEncryptedData())
1284                     setEncryptedData(src.getEncryptedData()->cloneEncryptedData());
1285                 VectorOf(xmlencryption::EncryptedKey) v=getEncryptedKeys();
1286                 for (vector<xmlencryption::EncryptedKey*>::const_iterator i=src.m_EncryptedKeys.begin(); i!=src.m_EncryptedKeys.end(); i++) {
1287                     if (*i) {
1288                         v.push_back((*i)->cloneEncryptedKey());
1289                     }
1290                 }
1291             }
1292     
1293             XMLObject* decrypt(KeyResolver* KEKresolver, const XMLCh* recipient) const
1294             {
1295                 if (!m_EncryptedData)
1296                     throw DecryptionException("No encrypted data present.");
1297                 Decrypter decrypter(KEKresolver, new EncryptedKeyResolver(*this, recipient));
1298                 DOMDocumentFragment* frag = decrypter.decryptData(m_EncryptedData);
1299                 if (frag->hasChildNodes() && frag->getFirstChild()==frag->getLastChild()) {
1300                     DOMNode* plaintext=frag->getFirstChild();
1301                     if (plaintext->getNodeType()==DOMNode::ELEMENT_NODE) {
1302                         auto_ptr<XMLObject> ret(XMLObjectBuilder::buildOneFromElement(static_cast<DOMElement*>(plaintext)));
1303                         ret->releaseThisAndChildrenDOM();
1304                         return ret.release();
1305                     }
1306                 }
1307                 frag->release();
1308                 throw DecryptionException("Decryption did not result in a single element.");
1309             }
1310         
1311             IMPL_XMLOBJECT_CLONE(NewEncryptedID);
1312             EncryptedElementType* cloneEncryptedElementType() const {
1313                 return new NewEncryptedIDImpl(*this);
1314             }
1315
1316             IMPL_TYPED_FOREIGN_CHILD(EncryptedData,xmlencryption);
1317             IMPL_TYPED_FOREIGN_CHILDREN(EncryptedKey,xmlencryption,m_children.end());
1318     
1319         protected:
1320             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1321                 PROC_TYPED_FOREIGN_CHILD(EncryptedData,xmlencryption,XMLConstants::XMLENC_NS,false);
1322                 PROC_TYPED_FOREIGN_CHILDREN(EncryptedKey,xmlencryption,XMLConstants::XMLENC_NS,false);
1323                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
1324             }
1325         };
1326
1327         class SAML_DLLLOCAL TerminateImpl : public virtual Terminate,
1328             public AbstractSimpleElement,
1329             public AbstractDOMCachingXMLObject,
1330             public AbstractXMLObjectMarshaller,
1331             public AbstractXMLObjectUnmarshaller
1332         {
1333             public:
1334                 virtual ~TerminateImpl() { }
1335
1336                 TerminateImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
1337                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
1338
1339                 TerminateImpl(const TerminateImpl& src)
1340                     : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {
1341                 }
1342
1343                 IMPL_XMLOBJECT_CLONE(Terminate);
1344
1345             protected:
1346                 // has no attributes or children
1347         };
1348
1349         class SAML_DLLLOCAL ManageNameIDRequestImpl : public virtual ManageNameIDRequest, public RequestAbstractTypeImpl
1350         {
1351             void init() {
1352                 m_NameID=NULL;
1353                 m_EncryptedID=NULL;
1354                 m_NewID=NULL;
1355                 m_NewEncryptedID=NULL;
1356                 m_Terminate=NULL;
1357                 m_children.push_back(NULL);
1358                 m_children.push_back(NULL);
1359                 m_children.push_back(NULL);
1360                 m_children.push_back(NULL);
1361                 m_children.push_back(NULL);
1362                 m_pos_NameID=m_pos_Extensions;
1363                 ++m_pos_NameID;
1364                 m_pos_EncryptedID=m_pos_NameID;
1365                 ++m_pos_EncryptedID;
1366                 m_pos_NewID=m_pos_EncryptedID;
1367                 ++m_pos_NewID;
1368                 m_pos_NewEncryptedID=m_pos_NewID;
1369                 ++m_pos_NewEncryptedID;
1370                 m_pos_Terminate=m_pos_NewEncryptedID;
1371                 ++m_pos_Terminate;
1372                 
1373             }
1374         public:
1375             virtual ~ManageNameIDRequestImpl() { }
1376     
1377             ManageNameIDRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
1378                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1379             {
1380                 init();
1381             }
1382                 
1383             ManageNameIDRequestImpl(const ManageNameIDRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
1384                 init();
1385
1386                 if (src.getNameID())
1387                     setNameID(src.getNameID()->cloneNameID());
1388                 if (src.getEncryptedID())
1389                     setEncryptedID(src.getEncryptedID()->cloneEncryptedID());
1390                 if (src.getNewID())
1391                     setNewID(src.getNewID()->cloneNewID());
1392                 if (src.getNewEncryptedID())
1393                     setNewEncryptedID(src.getNewEncryptedID()->cloneNewEncryptedID());
1394                 if (src.getTerminate())
1395                     setTerminate(src.getTerminate()->cloneTerminate());
1396
1397             }
1398             
1399             IMPL_XMLOBJECT_CLONE(ManageNameIDRequest);
1400             RequestAbstractType* cloneRequestAbstractType() const {
1401                 return cloneManageNameIDRequest();
1402             }
1403
1404             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
1405             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
1406             IMPL_TYPED_CHILD(NewID);
1407             IMPL_TYPED_CHILD(NewEncryptedID);
1408             IMPL_TYPED_CHILD(Terminate);
1409     
1410         protected:
1411             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1412                 PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAMLConstants::SAML20_NS,false);
1413                 PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAMLConstants::SAML20_NS,false);
1414                 PROC_TYPED_CHILD(NewID,SAMLConstants::SAML20P_NS,false);
1415                 PROC_TYPED_CHILD(NewEncryptedID,SAMLConstants::SAML20P_NS,false);
1416                 PROC_TYPED_CHILD(Terminate,SAMLConstants::SAML20P_NS,false);
1417                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
1418             }
1419         };
1420
1421         class SAML_DLLLOCAL ManageNameIDResponseImpl : public virtual ManageNameIDResponse, public StatusResponseTypeImpl
1422         {
1423         public:
1424             virtual ~ManageNameIDResponseImpl() { }
1425
1426             ManageNameIDResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
1427                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
1428             
1429             ManageNameIDResponseImpl(const ManageNameIDResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1430             }
1431
1432             IMPL_XMLOBJECT_CLONE(ManageNameIDResponse);
1433             StatusResponseType* cloneStatusResponseType() const {
1434                 return cloneManageNameIDResponse();
1435             }
1436         };
1437
1438         class SAML_DLLLOCAL LogoutRequestImpl : public virtual LogoutRequest, public RequestAbstractTypeImpl
1439         {
1440             void init() {
1441                 m_Reason=NULL;
1442                 m_NotOnOrAfter=NULL;
1443
1444                 m_BaseID=NULL;
1445                 m_NameID=NULL;
1446                 m_EncryptedID=NULL;
1447                 m_children.push_back(NULL);
1448                 m_children.push_back(NULL);
1449                 m_children.push_back(NULL);
1450                 m_pos_BaseID=m_pos_Extensions;
1451                 ++m_pos_BaseID;
1452                 m_pos_NameID=m_pos_BaseID;
1453                 ++m_pos_NameID;
1454                 m_pos_EncryptedID=m_pos_NameID;
1455                 ++m_pos_EncryptedID;
1456                 
1457             }
1458         public:
1459             virtual ~LogoutRequestImpl() {
1460                 XMLString::release(&m_Reason);
1461                 delete m_NotOnOrAfter;
1462             }
1463     
1464             LogoutRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
1465                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1466             {
1467                 init();
1468             }
1469                 
1470             LogoutRequestImpl(const LogoutRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
1471                 init();
1472
1473                 setReason(src.getReason());
1474                 setNotOnOrAfter(src.getNotOnOrAfter());
1475
1476                 if (src.getBaseID())
1477                     setBaseID(src.getBaseID()->cloneBaseID());
1478                 if (src.getNameID())
1479                     setNameID(src.getNameID()->cloneNameID());
1480                 if (src.getEncryptedID())
1481                     setEncryptedID(src.getEncryptedID()->cloneEncryptedID());
1482
1483                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
1484                     if (*i) {
1485                         SessionIndex* si = dynamic_cast<SessionIndex*>(*i);
1486                         if (si) {
1487                             getSessionIndexs().push_back(si->cloneSessionIndex());
1488                             continue;
1489                         }
1490                     }
1491                 }
1492             }
1493             
1494             IMPL_XMLOBJECT_CLONE(LogoutRequest);
1495             RequestAbstractType* cloneRequestAbstractType() const {
1496                 return cloneLogoutRequest();
1497             }
1498
1499             IMPL_STRING_ATTRIB(Reason);
1500             IMPL_DATETIME_ATTRIB(NotOnOrAfter,SAMLTIME_MAX);
1501             IMPL_TYPED_FOREIGN_CHILD(BaseID,saml2);
1502             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
1503             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
1504             IMPL_TYPED_CHILDREN(SessionIndex,m_children.end());
1505     
1506         protected:
1507             void marshallAttributes(DOMElement* domElement) const {
1508                 MARSHALL_STRING_ATTRIB(Reason,REASON,NULL);
1509                 MARSHALL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,NULL);
1510                 RequestAbstractTypeImpl::marshallAttributes(domElement);
1511             }
1512     
1513             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1514                 PROC_TYPED_FOREIGN_CHILD(BaseID,saml2,SAMLConstants::SAML20_NS,false);
1515                 PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAMLConstants::SAML20_NS,false);
1516                 PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAMLConstants::SAML20_NS,false);
1517                 PROC_TYPED_CHILDREN(SessionIndex,SAMLConstants::SAML20P_NS,false);
1518                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
1519             }
1520             void processAttribute(const DOMAttr* attribute) {
1521                 PROC_STRING_ATTRIB(Reason,REASON,NULL);
1522                 PROC_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,NULL);
1523                 RequestAbstractTypeImpl::processAttribute(attribute);
1524             }
1525         };
1526
1527         class SAML_DLLLOCAL LogoutResponseImpl : public virtual LogoutResponse, public StatusResponseTypeImpl
1528         {
1529         public:
1530             virtual ~LogoutResponseImpl() { }
1531
1532             LogoutResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
1533                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
1534             
1535             LogoutResponseImpl(const LogoutResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1536             }
1537
1538             IMPL_XMLOBJECT_CLONE(LogoutResponse);
1539             StatusResponseType* cloneStatusResponseType() const {
1540                 return cloneLogoutResponse();
1541             }
1542         };
1543
1544
1545         class SAML_DLLLOCAL NameIDMappingRequestImpl : public virtual NameIDMappingRequest, public RequestAbstractTypeImpl
1546         {
1547             void init() {
1548                 m_BaseID=NULL;
1549                 m_NameID=NULL;
1550                 m_EncryptedID=NULL;
1551                 m_NameIDPolicy=NULL;
1552                 m_children.push_back(NULL);
1553                 m_children.push_back(NULL);
1554                 m_children.push_back(NULL);
1555                 m_children.push_back(NULL);
1556                 m_pos_BaseID=m_pos_Extensions;
1557                 ++m_pos_BaseID;
1558                 m_pos_NameID=m_pos_BaseID;
1559                 ++m_pos_NameID;
1560                 m_pos_EncryptedID=m_pos_NameID;
1561                 ++m_pos_EncryptedID;
1562                 m_pos_NameIDPolicy=m_pos_EncryptedID;
1563                 ++m_pos_NameIDPolicy;
1564                 
1565             }
1566         public:
1567             virtual ~NameIDMappingRequestImpl() { }
1568     
1569             NameIDMappingRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
1570                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1571             {
1572                 init();
1573             }
1574                 
1575             NameIDMappingRequestImpl(const NameIDMappingRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
1576                 init();
1577
1578                 if (src.getBaseID())
1579                     setBaseID(src.getBaseID()->cloneBaseID());
1580                 if (src.getNameID())
1581                     setNameID(src.getNameID()->cloneNameID());
1582                 if (src.getEncryptedID())
1583                     setEncryptedID(src.getEncryptedID()->cloneEncryptedID());
1584                 if (src.getNameIDPolicy())
1585                     setNameIDPolicy(src.getNameIDPolicy()->cloneNameIDPolicy());
1586
1587             }
1588             
1589             IMPL_XMLOBJECT_CLONE(NameIDMappingRequest);
1590             RequestAbstractType* cloneRequestAbstractType() const {
1591                 return cloneNameIDMappingRequest();
1592             }
1593
1594             IMPL_TYPED_FOREIGN_CHILD(BaseID,saml2);
1595             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
1596             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
1597             IMPL_TYPED_CHILD(NameIDPolicy);
1598     
1599         protected:
1600             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1601                 PROC_TYPED_FOREIGN_CHILD(BaseID,saml2,SAMLConstants::SAML20_NS,false);
1602                 PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAMLConstants::SAML20_NS,false);
1603                 PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAMLConstants::SAML20_NS,false);
1604                 PROC_TYPED_CHILD(NameIDPolicy,SAMLConstants::SAML20P_NS,false);
1605                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
1606             }
1607         };
1608
1609         class SAML_DLLLOCAL NameIDMappingResponseImpl : public virtual NameIDMappingResponse, public StatusResponseTypeImpl
1610         {
1611             void init() {
1612                 m_NameID=NULL;
1613                 m_EncryptedID=NULL;
1614                 m_children.push_back(NULL);
1615                 m_children.push_back(NULL);
1616                 m_pos_NameID=m_pos_Status;
1617                 ++m_pos_NameID;
1618                 m_pos_EncryptedID=m_pos_NameID;
1619                 ++m_pos_EncryptedID;
1620             }
1621         public:
1622             virtual ~NameIDMappingResponseImpl() { }
1623     
1624             NameIDMappingResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
1625                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1626             {
1627                 init();
1628             }
1629                 
1630             NameIDMappingResponseImpl(const NameIDMappingResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1631                 init();
1632
1633                 if (src.getNameID())
1634                     setNameID(getNameID()->cloneNameID());
1635                 if (src.getEncryptedID())
1636                     setEncryptedID(getEncryptedID()->cloneEncryptedID());
1637
1638             }
1639             
1640             IMPL_XMLOBJECT_CLONE(NameIDMappingResponse);
1641             StatusResponseType* cloneStatusResponseType() const {
1642                 return cloneNameIDMappingResponse();
1643             }
1644
1645             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
1646             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
1647     
1648         protected:
1649             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1650                 PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAMLConstants::SAML20_NS,false);
1651                 PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAMLConstants::SAML20_NS,false);
1652                 StatusResponseTypeImpl::processChildElement(childXMLObject,root);
1653             }
1654         };
1655     };
1656 };
1657
1658 #if defined (_MSC_VER)
1659     #pragma warning( pop )
1660 #endif
1661
1662 // Builder Implementations
1663 IMPL_XMLOBJECTBUILDER(Artifact);
1664 IMPL_XMLOBJECTBUILDER(ArtifactResolve);
1665 IMPL_XMLOBJECTBUILDER(ArtifactResponse);
1666 IMPL_XMLOBJECTBUILDER(AssertionIDRequest);
1667 IMPL_XMLOBJECTBUILDER(AttributeQuery);
1668 IMPL_XMLOBJECTBUILDER(AuthnQuery);
1669 IMPL_XMLOBJECTBUILDER(AuthnRequest);
1670 IMPL_XMLOBJECTBUILDER(AuthzDecisionQuery);
1671 IMPL_XMLOBJECTBUILDER(Extensions);
1672 IMPL_XMLOBJECTBUILDER(GetComplete);
1673 IMPL_XMLOBJECTBUILDER(IDPEntry);
1674 IMPL_XMLOBJECTBUILDER(IDPList);
1675 IMPL_XMLOBJECTBUILDER(LogoutRequest);
1676 IMPL_XMLOBJECTBUILDER(LogoutResponse);
1677 IMPL_XMLOBJECTBUILDER(ManageNameIDRequest);
1678 IMPL_XMLOBJECTBUILDER(ManageNameIDResponse);
1679 IMPL_XMLOBJECTBUILDER(NameIDMappingRequest);
1680 IMPL_XMLOBJECTBUILDER(NameIDMappingResponse);
1681 IMPL_XMLOBJECTBUILDER(NameIDPolicy);
1682 IMPL_XMLOBJECTBUILDER(NewEncryptedID);
1683 IMPL_XMLOBJECTBUILDER(NewID);
1684 IMPL_XMLOBJECTBUILDER(RequestedAuthnContext);
1685 IMPL_XMLOBJECTBUILDER(RequesterID);
1686 IMPL_XMLOBJECTBUILDER(Response);
1687 IMPL_XMLOBJECTBUILDER(Scoping);
1688 IMPL_XMLOBJECTBUILDER(SessionIndex);
1689 IMPL_XMLOBJECTBUILDER(Status);
1690 IMPL_XMLOBJECTBUILDER(StatusCode);
1691 IMPL_XMLOBJECTBUILDER(StatusDetail);
1692 IMPL_XMLOBJECTBUILDER(StatusMessage);
1693 IMPL_XMLOBJECTBUILDER(Terminate);
1694
1695 IMPL_XMLOBJECTBUILDER(RespondTo);
1696
1697 // Unicode literals
1698 const XMLCh Artifact::LOCAL_NAME[] = UNICODE_LITERAL_8(A,r,t,i,f,a,c,t);
1699 const XMLCh ArtifactResolve::LOCAL_NAME[] = UNICODE_LITERAL_15(A,r,t,i,f,a,c,t,R,e,s,o,l,v,e);
1700 const XMLCh ArtifactResolve::TYPE_NAME[] = UNICODE_LITERAL_19(A,r,t,i,f,a,c,t,R,e,s,o,l,v,e,T,y,p,e);
1701 const XMLCh ArtifactResponse::LOCAL_NAME[] = UNICODE_LITERAL_16(A,r,t,i,f,a,c,t,R,e,s,p,o,n,s,e);
1702 const XMLCh ArtifactResponse::TYPE_NAME[] = UNICODE_LITERAL_20(A,r,t,i,f,a,c,t,R,e,s,p,o,n,s,e,T,y,p,e);
1703 const XMLCh AssertionIDRequest::LOCAL_NAME[] = UNICODE_LITERAL_18(A,s,s,e,r,t,i,o,n,I,D,R,e,q,u,e,s,t);
1704 const XMLCh AssertionIDRequest::TYPE_NAME[] = UNICODE_LITERAL_22(A,s,s,e,r,t,i,o,n,I,D,R,e,q,u,e,s,t,T,y,p,e);
1705 const XMLCh AttributeQuery::LOCAL_NAME[] = UNICODE_LITERAL_14(A,t,t,r,i,b,u,t,e,Q,u,e,r,y);
1706 const XMLCh AttributeQuery::TYPE_NAME[] = UNICODE_LITERAL_18(A,t,t,r,i,b,u,t,e,Q,u,e,r,y,T,y,p,e);
1707 const XMLCh AuthnQuery::LOCAL_NAME[] = UNICODE_LITERAL_10(A,u,t,h,n,Q,u,e,r,y);
1708 const XMLCh AuthnQuery::TYPE_NAME[] = UNICODE_LITERAL_14(A,u,t,h,n,Q,u,e,r,y,T,y,p,e);
1709 const XMLCh AuthnQuery::SESSIONINDEX_ATTRIB_NAME[] = UNICODE_LITERAL_12(S,e,s,s,i,o,n,I,n,d,e,x);
1710 const XMLCh AuthnRequest::LOCAL_NAME[] = UNICODE_LITERAL_12(A,u,t,h,n,R,e,q,u,e,s,t);
1711 const XMLCh AuthnRequest::TYPE_NAME[] = UNICODE_LITERAL_16(A,u,t,h,n,R,e,q,u,e,s,t,T,y,p,e);
1712 const XMLCh AuthnRequest::FORCEAUTHN_ATTRIB_NAME[] = UNICODE_LITERAL_10(F,o,r,c,e,A,u,t,h,n);
1713 const XMLCh AuthnRequest::ISPASSIVE_ATTRIB_NAME[] = UNICODE_LITERAL_9(I,s,P,a,s,s,i,v,e);
1714 const XMLCh AuthnRequest::PROTOCOLBINDING_ATTRIB_NAME[] = UNICODE_LITERAL_15(P,r,o,t,o,c,o,l,B,i,n,d,i,n,g);
1715 const XMLCh AuthnRequest::ASSERTIONCONSUMERSERVICEINDEX_ATTRIB_NAME[] = UNICODE_LITERAL_29(A,s,s,e,r,t,i,o,n,C,o,n,s,u,m,e,r,S,e,r,v,i,c,e,I,n,d,e,x);
1716 const XMLCh AuthnRequest::ASSERTIONCONSUMERSERVICEURL_ATTRIB_NAME[] = UNICODE_LITERAL_27(A,s,s,e,r,t,i,o,n,C,o,n,s,u,m,e,r,S,e,r,v,i,c,e,U,R,L);
1717 const XMLCh AuthnRequest::ATTRIBUTECONSUMINGSERVICEINDEX_ATTRIB_NAME[] = UNICODE_LITERAL_30(A,t,t,r,i,b,u,t,e,C,o,n,s,u,m,i,n,g,S,e,r,v,i,c,e,I,n,d,e,x);
1718 const XMLCh AuthnRequest::PROVIDERNAME_ATTRIB_NAME[] = UNICODE_LITERAL_12(P,r,o,v,i,d,e,r,N,a,m,e);
1719 const XMLCh AuthzDecisionQuery::LOCAL_NAME[] = UNICODE_LITERAL_18(A,u,t,h,z,D,e,c,i,s,i,o,n,Q,u,e,r,y);
1720 const XMLCh AuthzDecisionQuery::TYPE_NAME[] = UNICODE_LITERAL_22(A,u,t,h,z,D,e,c,i,s,i,o,n,Q,u,e,r,y,T,y,p,e);
1721 const XMLCh AuthzDecisionQuery::RESOURCE_ATTRIB_NAME[] = UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
1722 const XMLCh Extensions::LOCAL_NAME[] = UNICODE_LITERAL_10(E,x,t,e,n,s,i,o,n,s);
1723 const XMLCh Extensions::TYPE_NAME[] = UNICODE_LITERAL_14(E,x,t,e,n,s,i,o,n,s,T,y,p,e);
1724 const XMLCh GetComplete::LOCAL_NAME[] = UNICODE_LITERAL_11(G,e,t,C,o,m,p,l,e,t,e);
1725 const XMLCh IDPEntry::LOCAL_NAME[] = UNICODE_LITERAL_8(I,D,P,E,n,t,r,y);
1726 const XMLCh IDPEntry::TYPE_NAME[] = UNICODE_LITERAL_12(I,D,P,E,n,t,r,y,T,y,p,e);
1727 const XMLCh IDPEntry::PROVIDERID_ATTRIB_NAME[] = UNICODE_LITERAL_10(P,r,o,v,i,d,e,r,I,D);
1728 const XMLCh IDPEntry::NAME_ATTRIB_NAME[] = UNICODE_LITERAL_4(N,a,m,e);
1729 const XMLCh IDPEntry::LOC_ATTRIB_NAME[] = UNICODE_LITERAL_3(L,o,c);
1730 const XMLCh IDPList::LOCAL_NAME[] = UNICODE_LITERAL_7(I,D,P,L,i,s,t);
1731 const XMLCh IDPList::TYPE_NAME[] = UNICODE_LITERAL_11(I,D,P,L,i,s,t,T,y,p,e);
1732 const XMLCh LogoutRequest::LOCAL_NAME[] = UNICODE_LITERAL_13(L,o,g,o,u,t,R,e,q,u,e,s,t);
1733 const XMLCh LogoutRequest::TYPE_NAME[] = UNICODE_LITERAL_17(L,o,g,o,u,t,R,e,q,u,e,s,t,T,y,p,e);
1734 const XMLCh LogoutRequest::REASON_ATTRIB_NAME[] = UNICODE_LITERAL_6(R,e,a,s,o,n);
1735 const XMLCh LogoutRequest::NOTONORAFTER_ATTRIB_NAME[] = UNICODE_LITERAL_12(N,o,t,O,n,O,r,A,f,t,e,r);
1736 const XMLCh LogoutResponse::LOCAL_NAME[] = UNICODE_LITERAL_14(L,o,g,o,u,t,R,e,s,p,o,n,s,e);
1737 const XMLCh ManageNameIDRequest::LOCAL_NAME[] = UNICODE_LITERAL_19(M,a,n,a,g,e,N,a,m,e,I,D,R,e,q,u,e,s,t);
1738 const XMLCh ManageNameIDRequest::TYPE_NAME[] = UNICODE_LITERAL_23(M,a,n,a,g,e,N,a,m,e,I,D,R,e,q,u,e,s,t,T,y,p,e);
1739 const XMLCh ManageNameIDResponse::LOCAL_NAME[] = UNICODE_LITERAL_20(M,a,n,a,g,e,N,a,m,e,I,D,R,e,s,p,o,n,s,e);
1740 const XMLCh NameIDMappingRequest::LOCAL_NAME[] = UNICODE_LITERAL_20(N,a,m,e,I,D,M,a,p,p,i,n,g,R,e,q,u,e,s,t);
1741 const XMLCh NameIDMappingRequest::TYPE_NAME[] = UNICODE_LITERAL_24(N,a,m,e,I,D,M,a,p,p,i,n,g,R,e,q,u,e,s,t,T,y,p,e);
1742 const XMLCh NameIDMappingResponse::LOCAL_NAME[] = UNICODE_LITERAL_21(N,a,m,e,I,D,M,a,p,p,i,n,g,R,e,s,p,o,n,s,e);
1743 const XMLCh NameIDMappingResponse::TYPE_NAME[] = UNICODE_LITERAL_25(N,a,m,e,I,D,M,a,p,p,i,n,g,R,e,s,p,o,n,s,e,T,y,p,e);
1744 const XMLCh NameIDPolicy::LOCAL_NAME[] = UNICODE_LITERAL_12(N,a,m,e,I,D,P,o,l,i,c,y);
1745 const XMLCh NameIDPolicy::TYPE_NAME[] = UNICODE_LITERAL_16(N,a,m,e,I,D,P,o,l,i,c,y,T,y,p,e);
1746 const XMLCh NameIDPolicy::FORMAT_ATTRIB_NAME[] = UNICODE_LITERAL_6(F,o,r,m,a,t);
1747 const XMLCh NameIDPolicy::SPNAMEQUALIFIER_ATTRIB_NAME[] = UNICODE_LITERAL_15(S,P,N,a,m,e,Q,u,a,l,i,f,i,e,r);
1748 const XMLCh NameIDPolicy::ALLOWCREATE_ATTRIB_NAME[] = UNICODE_LITERAL_11(A,l,l,o,w,C,r,e,a,t,e);
1749 const XMLCh NewEncryptedID::LOCAL_NAME[] = UNICODE_LITERAL_14(N,e,w,E,n,c,r,y,p,t,e,d,I,D);
1750 const XMLCh NewID::LOCAL_NAME[] = UNICODE_LITERAL_5(N,e,w,I,D);
1751 const XMLCh RequesterID::LOCAL_NAME[] = UNICODE_LITERAL_11(R,e,q,u,e,s,t,e,r,I,D);
1752 const XMLCh RequestedAuthnContext::LOCAL_NAME[] = UNICODE_LITERAL_21(R,e,q,u,e,s,t,e,d,A,u,t,h,n,C,o,n,t,e,x,t);
1753 const XMLCh RequestedAuthnContext::TYPE_NAME[] = UNICODE_LITERAL_25(R,e,q,u,e,s,t,e,d,A,u,t,h,n,C,o,n,t,e,x,t,T,y,p,e);
1754 const XMLCh RequestedAuthnContext::COMPARISON_ATTRIB_NAME[] = UNICODE_LITERAL_10(C,o,m,p,a,r,i,s,o,n);
1755 const XMLCh RequestedAuthnContext::COMPARISON_EXACT[] = UNICODE_LITERAL_5(e,x,a,c,t);
1756 const XMLCh RequestedAuthnContext::COMPARISON_MINIMUM[] = UNICODE_LITERAL_7(m,i,n,i,m,u,m);
1757 const XMLCh RequestedAuthnContext::COMPARISON_MAXIMUM[] = UNICODE_LITERAL_7(m,a,x,i,m,u,m);
1758 const XMLCh RequestedAuthnContext::COMPARISON_BETTER[] = UNICODE_LITERAL_6(b,e,t,t,e,r);
1759 const XMLCh RequestAbstractType::LOCAL_NAME[] = {chNull};
1760 const XMLCh RequestAbstractType::TYPE_NAME[] = UNICODE_LITERAL_19(R,e,q,u,e,s,t,A,b,s,t,r,a,c,t,T,y,p,e);
1761 const XMLCh RequestAbstractType::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
1762 const XMLCh RequestAbstractType::VER_ATTRIB_NAME[] = UNICODE_LITERAL_7(V,e,r,s,i,o,n);
1763 const XMLCh RequestAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
1764 const XMLCh RequestAbstractType::DESTINATION_ATTRIB_NAME[] = UNICODE_LITERAL_11(D,e,s,t,i,n,a,t,i,o,n);
1765 const XMLCh RequestAbstractType::CONSENT_ATTRIB_NAME[] = UNICODE_LITERAL_7(C,o,n,s,e,n,t);
1766 const XMLCh RespondTo::LOCAL_NAME[] = UNICODE_LITERAL_9(R,e,s,p,o,n,d,T,o);
1767 const XMLCh Response::LOCAL_NAME[] = UNICODE_LITERAL_8(R,e,s,p,o,n,s,e);
1768 const XMLCh Response::TYPE_NAME[] = UNICODE_LITERAL_12(R,e,s,p,o,n,s,e,T,y,p,e);
1769 const XMLCh Scoping::LOCAL_NAME[] = UNICODE_LITERAL_7(S,c,o,p,i,n,g);
1770 const XMLCh Scoping::TYPE_NAME[] = UNICODE_LITERAL_11(S,c,o,p,i,n,g,T,y,p,e);
1771 const XMLCh Scoping::PROXYCOUNT_ATTRIB_NAME[] = UNICODE_LITERAL_10(P,r,o,x,y,C,o,u,n,t);
1772 const XMLCh SessionIndex::LOCAL_NAME[] = UNICODE_LITERAL_12(S,e,s,s,i,o,n,I,n,d,e,x);
1773 const XMLCh Status::LOCAL_NAME[] = UNICODE_LITERAL_6(S,t,a,t,u,s);
1774 const XMLCh Status::TYPE_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,T,y,p,e);
1775 const XMLCh StatusCode::LOCAL_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,C,o,d,e);
1776 const XMLCh StatusCode::TYPE_NAME[] = UNICODE_LITERAL_14(S,t,a,t,u,s,C,o,d,e,T,y,p,e);
1777 const XMLCh StatusCode::VALUE_ATTRIB_NAME[] = UNICODE_LITERAL_5(V,a,l,u,e);
1778 const XMLCh StatusDetail::LOCAL_NAME[] = UNICODE_LITERAL_12(S,t,a,t,u,s,D,e,t,a,i,l);
1779 const XMLCh StatusDetail::TYPE_NAME[] = UNICODE_LITERAL_16(S,t,a,t,u,s,D,e,t,a,i,l,T,y,p,e);
1780 const XMLCh StatusMessage::LOCAL_NAME[] = UNICODE_LITERAL_13(S,t,a,t,u,s,M,e,s,s,a,g,e);
1781 const XMLCh StatusResponseType::LOCAL_NAME[] = {chNull};
1782 const XMLCh StatusResponseType::TYPE_NAME[] = UNICODE_LITERAL_18(S,t,a,t,u,s,R,e,s,p,o,n,s,e,T,y,p,e);
1783 const XMLCh StatusResponseType::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
1784 const XMLCh StatusResponseType::INRESPONSETO_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,n,R,e,s,p,o,n,s,e,T,o);
1785 const XMLCh StatusResponseType::VER_ATTRIB_NAME[] = UNICODE_LITERAL_7(V,e,r,s,i,o,n);
1786 const XMLCh StatusResponseType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
1787 const XMLCh StatusResponseType::DESTINATION_ATTRIB_NAME[] = UNICODE_LITERAL_11(D,e,s,t,i,n,a,t,i,o,n);
1788 const XMLCh StatusResponseType::CONSENT_ATTRIB_NAME[] = UNICODE_LITERAL_7(C,o,n,s,e,n,t);
1789 const XMLCh SubjectQuery::LOCAL_NAME[] = UNICODE_LITERAL_12(S,u,b,j,e,c,t,Q,u,e,r,y);
1790 const XMLCh SubjectQuery::TYPE_NAME[] = UNICODE_LITERAL_24(S,u,b,j,e,c,t,Q,u,e,r,y,A,b,s,t,r,a,c,t,T,y,p,e);
1791 const XMLCh Terminate::LOCAL_NAME[] = UNICODE_LITERAL_9(T,e,r,m,i,n,a,t,e);
1792 const XMLCh Terminate::TYPE_NAME[] = UNICODE_LITERAL_13(T,e,r,m,i,n,a,t,e,T,y,p,e);
1793
1794 // Unicode literals: LogoutRequest element, Reason attribute
1795 const XMLCh LogoutRequest::REASON_USER[] = // urn:oasis:names:tc:SAML:2.0:logout:user
1796 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1797   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1798   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1799   chLatin_l, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chColon,
1800   chLatin_u, chLatin_s, chLatin_e, chLatin_r, chNull
1801 };
1802
1803 const XMLCh LogoutRequest::REASON_ADMIN[] = // urn:oasis:names:tc:SAML:2.0:logout:admin
1804 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1805   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1806   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1807   chLatin_l, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chColon,
1808   chLatin_a, chLatin_d, chLatin_m, chLatin_i, chLatin_n, chNull
1809 };
1810
1811
1812 const XMLCh LogoutRequest::REASON_GLOBAL_TIMEOUT[] = // urn:oasis:names:tc:SAML:2.0:logout:global-timeout
1813 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1814   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1815   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1816   chLatin_l, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chColon,
1817   chLatin_g, chLatin_l, chLatin_o, chLatin_b, chLatin_a, chLatin_l, 
1818     chDash, chLatin_t, chLatin_i, chLatin_m, chLatin_e, chLatin_o, chLatin_u, chLatin_t, chNull
1819 };
1820
1821
1822 const XMLCh LogoutRequest::REASON_SP_TIMEOUT[] = // urn:oasis:names:tc:SAML:2.0:logout:sp-timeout
1823 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1824   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1825   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1826   chLatin_l, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chColon,
1827   chLatin_s, chLatin_p, chDash, chLatin_t, chLatin_i, chLatin_m, chLatin_e, chLatin_o, chLatin_u, chLatin_t, chNull
1828 };
1829
1830
1831 // Unicode literals, StatusCode Value
1832 const XMLCh StatusCode::SUCCESS[] = //  urn:oasis:names:tc:SAML:2.0:status:Success 
1833 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1834   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1835   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1836   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1837   chLatin_S, chLatin_u, chLatin_c, chLatin_c, chLatin_e, chLatin_s, chLatin_s, chNull
1838 };
1839
1840 const XMLCh StatusCode::REQUESTER[] = //  urn:oasis:names:tc:SAML:2.0:status:Requester 
1841 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1842   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1843   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1844   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1845   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, chLatin_e, chLatin_r, chNull
1846 };
1847
1848 const XMLCh StatusCode::RESPONDER[] = //  urn:oasis:names:tc:SAML:2.0:status:Responder 
1849 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1850   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1851   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1852   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1853   chLatin_R, chLatin_e, chLatin_s, chLatin_p, chLatin_o, chLatin_n, chLatin_d, chLatin_e, chLatin_r, chNull
1854 };
1855
1856 const XMLCh StatusCode::VERSION_MISMATCH[] = //  urn:oasis:names:tc:SAML:2.0:status:VersionMismatch 
1857 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1858   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1859   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1860   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1861   chLatin_V, chLatin_e, chLatin_r, chLatin_s, chLatin_i, chLatin_o, chLatin_n,
1862     chLatin_M, chLatin_i, chLatin_s, chLatin_m, chLatin_a, chLatin_t, chLatin_c, chLatin_h, chNull
1863 };
1864
1865 const XMLCh StatusCode::AUTHN_FAILED[] = //  urn:oasis:names:tc:SAML:2.0:status:AuthnFailed 
1866 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1867   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1868   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1869   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1870   chLatin_A, chLatin_u, chLatin_t, chLatin_h, chLatin_n,
1871     chLatin_F, chLatin_a, chLatin_i, chLatin_l, chLatin_e, chLatin_d, chNull
1872 };
1873
1874 const XMLCh StatusCode::INVALID_ATTR_NAME_OR_VALUE[] = //  urn:oasis:names:tc:SAML:2.0:status:InvalidAttrNameOrValue 
1875 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1876   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1877   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1878   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1879   chLatin_I, chLatin_n, chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d, 
1880     chLatin_A, chLatin_t, chLatin_t, chLatin_r, chLatin_N, chLatin_a, chLatin_m, chLatin_e, 
1881     chLatin_O, chLatin_r, chLatin_V, chLatin_a, chLatin_l, chLatin_u, chLatin_e, chNull
1882 };
1883
1884 const XMLCh StatusCode::INVALID_NAMEID_POLICY[] = //  urn:oasis:names:tc:SAML:2.0:status:InvalidNameIDPolicy 
1885 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1886   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1887   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1888   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1889   chLatin_I, chLatin_n, chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d, 
1890    chLatin_N, chLatin_a, chLatin_m, chLatin_e, chLatin_I, chLatin_D, 
1891    chLatin_P, chLatin_o, chLatin_l, chLatin_i, chLatin_c, chLatin_y, chNull
1892 };
1893
1894 const XMLCh StatusCode::NO_AUTHN_CONTEXT[] = //  urn:oasis:names:tc:SAML:2.0:status:NoAuthnContext 
1895 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1896   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1897   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1898   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1899   chLatin_N, chLatin_o, chLatin_A, chLatin_u, chLatin_t, chLatin_h, chLatin_n, 
1900   chLatin_C, chLatin_o, chLatin_n, chLatin_t, chLatin_e, chLatin_x, chLatin_t, chNull
1901 };
1902
1903 const XMLCh StatusCode::NO_AVAILABLE_IDP[] = //  urn:oasis:names:tc:SAML:2.0:status:NoAvailableIDP 
1904 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1905   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1906   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1907   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1908   chLatin_N, chLatin_o, chLatin_A, chLatin_v, chLatin_a, chLatin_i, chLatin_l, chLatin_a, chLatin_b, chLatin_l, chLatin_e, 
1909    chLatin_I, chLatin_D, chLatin_P, chNull
1910 };
1911
1912 const XMLCh StatusCode::NO_PASSIVE[] = //  urn:oasis:names:tc:SAML:2.0:status:NoPassive 
1913 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1914   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1915   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1916   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1917   chLatin_N, chLatin_o, chLatin_P, chLatin_a, chLatin_s, chLatin_s, chLatin_i, chLatin_v, chLatin_e, chNull
1918 };
1919
1920 const XMLCh StatusCode::NO_SUPPORTED_IDP[] = //  urn:oasis:names:tc:SAML:2.0:status:NoSupportedIDP 
1921 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1922   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1923   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1924   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1925   chLatin_N, chLatin_o, chLatin_S, chLatin_u, chLatin_p, chLatin_p, chLatin_o, chLatin_r, chLatin_t, chLatin_e, chLatin_d,
1926       chLatin_I, chLatin_D, chLatin_P, chNull
1927 };
1928
1929 const XMLCh StatusCode::PARTIAL_LOGOUT[] = //  urn:oasis:names:tc:SAML:2.0:status:PartialLogout 
1930 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1931   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1932   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1933   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1934   chLatin_P, chLatin_a, chLatin_r, chLatin_t, chLatin_i, chLatin_a, chLatin_l, 
1935     chLatin_L, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chNull
1936 };
1937
1938 const XMLCh StatusCode::PROXY_COUNT_EXCEEDED[] = //  urn:oasis:names:tc:SAML:2.0:status:ProxyCountExceeded 
1939 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1940   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1941   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1942   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1943   chLatin_P, chLatin_r, chLatin_o, chLatin_x, chLatin_y, chLatin_C, chLatin_o, chLatin_u, chLatin_n, chLatin_t, 
1944     chLatin_E, chLatin_x, chLatin_c, chLatin_e, chLatin_e, chLatin_d, chLatin_e, chLatin_d, chNull
1945 };
1946
1947 const XMLCh StatusCode::REQUEST_DENIED[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestDenied 
1948 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1949   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1950   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1951   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1952   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1953     chLatin_D, chLatin_e, chLatin_n, chLatin_i, chLatin_e, chLatin_d, chNull
1954 };
1955
1956 const XMLCh StatusCode::REQUEST_UNSUPPORTED[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestUnsupported 
1957 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1958   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1959   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1960   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1961   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1962     chLatin_U, chLatin_n, chLatin_s, chLatin_u, chLatin_p, chLatin_p, chLatin_o, chLatin_r, chLatin_t, chLatin_e, chLatin_d, chNull
1963 };
1964
1965 const XMLCh StatusCode::REQUEST_VERSION_DEPRECATED[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestVersionDeprecated 
1966 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1967   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1968   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1969   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1970   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1971     chLatin_V, chLatin_e, chLatin_r, chLatin_s, chLatin_i, chLatin_o, chLatin_n, 
1972     chLatin_D, chLatin_e, chLatin_p, chLatin_r, chLatin_e, chLatin_c, chLatin_a, chLatin_t, chLatin_e, chLatin_d, chNull
1973 };
1974
1975 const XMLCh StatusCode::REQUEST_VERSION_TOO_HIGH[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestVersionTooHigh 
1976 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1977   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1978   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1979   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1980   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1981   chLatin_V, chLatin_e, chLatin_r, chLatin_s, chLatin_i, chLatin_o, chLatin_n, 
1982   chLatin_T, chLatin_o, chLatin_o, chLatin_H, chLatin_i, chLatin_g, chLatin_h, chNull
1983 };
1984
1985 const XMLCh StatusCode::REQUEST_VERSION_TOO_LOW[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestVersionTooLow 
1986 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1987   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1988   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1989   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1990   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1991     chLatin_V, chLatin_e, chLatin_r, chLatin_s, chLatin_i, chLatin_o, chLatin_n, 
1992     chLatin_T, chLatin_o, chLatin_o, chLatin_L, chLatin_o, chLatin_w, chNull
1993 };
1994
1995 const XMLCh StatusCode::RESOURCE_NOT_RECOGNIZED[] = //  urn:oasis:names:tc:SAML:2.0:status:ResourceNotRecognized 
1996 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1997   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1998   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1999   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
2000   chLatin_R, chLatin_e, chLatin_s, chLatin_o, chLatin_u, chLatin_r, chLatin_c, chLatin_e, 
2001     chLatin_N, chLatin_o, chLatin_t, 
2002     chLatin_R, chLatin_e, chLatin_c, chLatin_o, chLatin_g, chLatin_n, chLatin_i, chLatin_z, chLatin_e, chLatin_d, chNull
2003 };
2004
2005 const XMLCh StatusCode::TOO_MANY_RESPONSES[] = //  urn:oasis:names:tc:SAML:2.0:status:TooManyResponses 
2006 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
2007   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
2008   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
2009   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
2010   chLatin_T, chLatin_o, chLatin_o, chLatin_M, chLatin_a, chLatin_n, chLatin_y, 
2011     chLatin_R, chLatin_e, chLatin_s, chLatin_p, chLatin_o, chLatin_n, chLatin_s, chLatin_e, chLatin_s, chNull
2012 };
2013
2014 const XMLCh StatusCode::UNKNOWN_ATTR_PROFILE[] = //  urn:oasis:names:tc:SAML:2.0:status:UnknownAttrProfile 
2015 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
2016   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
2017   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
2018   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
2019   chLatin_U, chLatin_n, chLatin_k, chLatin_n, chLatin_o, chLatin_w, chLatin_n, 
2020     chLatin_A, chLatin_t, chLatin_t, chLatin_r, 
2021     chLatin_P, chLatin_r, chLatin_o, chLatin_f, chLatin_i, chLatin_l, chLatin_e, chNull
2022 };
2023
2024 const XMLCh StatusCode::UNKNOWN_PRINCIPAL[] = //  urn:oasis:names:tc:SAML:2.0:status:UnknownPrincipal 
2025 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
2026   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
2027   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
2028   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
2029   chLatin_U, chLatin_n, chLatin_k, chLatin_n, chLatin_o, chLatin_w, chLatin_n, 
2030     chLatin_P, chLatin_r, chLatin_i, chLatin_n, chLatin_c, chLatin_i, chLatin_p, chLatin_a, chLatin_l, chNull
2031 };
2032
2033 const XMLCh StatusCode::UNSUPPORTED_BINDING[] = //  urn:oasis:names:tc:SAML:2.0:status:UnsupportedBinding 
2034 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
2035   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
2036   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
2037   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
2038   chLatin_U, chLatin_n, chLatin_s, chLatin_u, chLatin_p, chLatin_p, chLatin_o, chLatin_r, chLatin_t, chLatin_e, chLatin_d, 
2039     chLatin_B, chLatin_i, chLatin_n, chLatin_d, chLatin_i, chLatin_n, chLatin_g, chNull
2040 };
2041