+ PROC_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
+ PROC_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
+ }
+ };
+
+ class SAML_DLLLOCAL AttributeImpl : public virtual Attribute,
+ public AbstractComplexElement,
+ public AbstractDOMCachingXMLObject,
+ public AbstractValidatingXMLObject,
+ public AbstractXMLObjectMarshaller,
+ public AbstractXMLObjectUnmarshaller
+ {
+ public:
+ virtual ~AttributeImpl() {
+ XMLString::release(&m_AttributeName);
+ XMLString::release(&m_AttributeNamespace);
+ }
+
+ AttributeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
+ : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
+ init();
+ }
+
+ AttributeImpl(const AttributeImpl& src)
+ : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
+ init();
+ setAttributeName(src.getAttributeName());
+ setAttributeNamespace(src.getAttributeNamespace());
+ VectorOf(XMLObject) v=getAttributeValues();
+ for (vector<XMLObject*>::const_iterator i=src.m_AttributeValues.begin(); i!=src.m_AttributeValues.end(); i++) {
+ if (*i) {
+ v.push_back((*i)->clone());
+ }
+ }
+ }
+
+ void init() {
+ m_AttributeName=m_AttributeNamespace=NULL;
+ }
+
+ IMPL_XMLOBJECT_CLONE(Attribute);
+ AttributeDesignator* cloneAttributeDesignator() const {
+ return cloneAttribute();
+ }
+ IMPL_STRING_ATTRIB(AttributeName);
+ IMPL_STRING_ATTRIB(AttributeNamespace);
+ IMPL_XMLOBJECT_CHILDREN(AttributeValue,m_children.end());
+
+ protected:
+ void marshallAttributes(DOMElement* domElement) const {
+ MARSHALL_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
+ MARSHALL_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
+ }
+
+ void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
+ getAttributeValues().push_back(childXMLObject);
+ }
+
+ void processAttribute(const DOMAttr* attribute) {
+ PROC_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
+ PROC_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
+ }
+ };
+
+ class SAML_DLLLOCAL AttributeValueImpl
+ : public virtual AttributeValue, public AnyElementImpl, public AbstractValidatingXMLObject
+ {
+ public:
+ virtual ~AttributeValueImpl() {}
+
+ AttributeValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
+ : AnyElementImpl(nsURI, localName, prefix, schemaType) {
+ }
+
+ AttributeValueImpl(const AttributeValueImpl& src) : AnyElementImpl(src), AbstractValidatingXMLObject(src) {}
+
+ IMPL_XMLOBJECT_CLONE(AttributeValue);
+ };
+
+ class SAML_DLLLOCAL AttributeStatementImpl : public virtual AttributeStatement, public SubjectStatementImpl
+ {
+ public:
+ virtual ~AttributeStatementImpl() {}
+
+ AttributeStatementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
+ : SubjectStatementImpl(nsURI, localName, prefix, schemaType) {
+ init();
+ }
+
+ AttributeStatementImpl(const AttributeStatementImpl& src) : SubjectStatementImpl(src) {
+ VectorOf(Attribute) v=getAttributes();
+ for (vector<Attribute*>::const_iterator i=src.m_Attributes.begin(); i!=src.m_Attributes.end(); i++) {
+ if (*i) {
+ v.push_back((*i)->cloneAttribute());
+ }
+ }
+ }
+
+ IMPL_XMLOBJECT_CLONE(AttributeStatement);
+ SubjectStatement* cloneSubjectStatement() const {
+ return cloneAttributeStatement();
+ }
+ Statement* cloneStatement() const {
+ return cloneAttributeStatement();
+ }
+ IMPL_TYPED_CHILDREN(Attribute, m_children.end());
+
+ protected:
+ void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
+ PROC_TYPED_CHILDREN(Attribute,SAMLConstants::SAML1_NS,true);
+ SubjectStatementImpl::processChildElement(childXMLObject,root);