Added built-in ID attribute support to base classes.
[shibboleth/cpp-xmltooling.git] / xmltooling / AbstractAttributeExtensibleXMLObject.cpp
index 781b722..7b7fd32 100644 (file)
@@ -29,6 +29,8 @@
 using namespace xmltooling;\r
 using namespace std;\r
 \r
+set<QName> AttributeExtensibleXMLObject::m_idAttributeSet;\r
+\r
 AbstractAttributeExtensibleXMLObject::~AbstractAttributeExtensibleXMLObject()\r
 {\r
     for (map<QName,XMLCh*>::iterator i=m_attributeMap.begin(); i!=m_attributeMap.end(); i++)\r
@@ -38,12 +40,16 @@ AbstractAttributeExtensibleXMLObject::~AbstractAttributeExtensibleXMLObject()
 AbstractAttributeExtensibleXMLObject::AbstractAttributeExtensibleXMLObject(const AbstractAttributeExtensibleXMLObject& src)\r
     : AbstractXMLObject(src)\r
 {\r
+    m_idAttribute = m_attributeMap.end();\r
     for (map<QName,XMLCh*>::const_iterator i=src.m_attributeMap.begin(); i!=src.m_attributeMap.end(); i++) {\r
         m_attributeMap[i->first] = XMLString::replicate(i->second);\r
     }\r
+    if (src.m_idAttribute != src.m_attributeMap.end()) {\r
+        m_idAttribute = m_attributeMap.find(src.m_idAttribute->first);\r
+    }\r
 }\r
 \r
-void AbstractAttributeExtensibleXMLObject::setAttribute(QName& qualifiedName, const XMLCh* value)\r
+void AbstractAttributeExtensibleXMLObject::setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID)\r
 {\r
     map<QName,XMLCh*>::iterator i=m_attributeMap.find(qualifiedName);\r
     if (i!=m_attributeMap.end()) {\r
@@ -53,11 +59,20 @@ void AbstractAttributeExtensibleXMLObject::setAttribute(QName& qualifiedName, co
             i->second=XMLString::replicate(value);\r
         }\r
         else {\r
+            if (m_idAttribute==i)\r
+                m_idAttribute=m_attributeMap.end();\r
             m_attributeMap.erase(i);\r
         }\r
+        \r
+        if (ID) {\r
+            m_idAttribute=i;\r
+        }\r
     }\r
     else if (value) {\r
         releaseThisandParentDOM();\r
         m_attributeMap[qualifiedName]=XMLString::replicate(value);\r
+        if (ID) {\r
+            m_idAttribute = m_attributeMap.find(qualifiedName);\r
+        } \r
     }\r
 }\r