Refactored simple content and child-handling into mixin classes.
[shibboleth/cpp-xmltooling.git] / xmltooling / AbstractAttributeExtensibleXMLObject.cpp
1 /*\r
2  *  Copyright 2001-2006 Internet2\r
3  * \r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 /**\r
18  * AbstractAttributeExtensibleXMLObject.cpp\r
19  * \r
20  * Extension of AbstractDOMCachingXMLObject that implements an AttributeExtensibleXMLObject. \r
21  */\r
22 \r
23 #include "internal.h"\r
24 #include "AbstractAttributeExtensibleXMLObject.h"\r
25 \r
26 #include <algorithm>\r
27 #include <functional>\r
28 \r
29 using namespace xmltooling;\r
30 using namespace std;\r
31 \r
32 AbstractAttributeExtensibleXMLObject::~AbstractAttributeExtensibleXMLObject()\r
33 {\r
34     for (map<QName,XMLCh*>::iterator i=m_attributeMap.begin(); i!=m_attributeMap.end(); i++)\r
35         XMLString::release(&(i->second));\r
36 }\r
37 \r
38 AbstractAttributeExtensibleXMLObject::AbstractAttributeExtensibleXMLObject(const AbstractAttributeExtensibleXMLObject& src)\r
39     : AbstractXMLObject(src)\r
40 {\r
41     for (map<QName,XMLCh*>::const_iterator i=src.m_attributeMap.begin(); i!=src.m_attributeMap.end(); i++) {\r
42         m_attributeMap[i->first] = XMLString::replicate(i->second);\r
43     }\r
44 }\r
45 \r
46 void AbstractAttributeExtensibleXMLObject::setAttribute(QName& qualifiedName, const XMLCh* value)\r
47 {\r
48     map<QName,XMLCh*>::iterator i=m_attributeMap.find(qualifiedName);\r
49     if (i!=m_attributeMap.end()) {\r
50         releaseThisandParentDOM();\r
51         XMLString::release(&(i->second));\r
52         if (value) {\r
53             i->second=XMLString::replicate(value);\r
54         }\r
55         else {\r
56             m_attributeMap.erase(i);\r
57         }\r
58     }\r
59     else if (value) {\r
60         releaseThisandParentDOM();\r
61         m_attributeMap[qualifiedName]=XMLString::replicate(value);\r
62     }\r
63 }\r