9480cffef689189a59d1630670db630dc001efe4
[shibboleth/cpp-xmltooling.git] / xmltooling / AbstractAttributeExtensibleXMLObject.h
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  * @file AbstractAttributeExtensibleXMLObject.h\r
19  * \r
20  * AbstractXMLObject mixin that implements AttributeExtensibleXMLObject\r
21  */\r
22 \r
23 #ifndef __xmltooling_absattrextxmlobj_h__\r
24 #define __xmltooling_absattrextxmlobj_h__\r
25 \r
26 #include <map>\r
27 #include <xmltooling/AbstractXMLObject.h>\r
28 #include <xmltooling/AttributeExtensibleXMLObject.h>\r
29 \r
30 #if defined (_MSC_VER)\r
31     #pragma warning( push )\r
32     #pragma warning( disable : 4250 4251 )\r
33 #endif\r
34 \r
35 namespace xmltooling {\r
36 \r
37     /**\r
38      * AbstractXMLObject mixin that implements AttributeExtensibleXMLObject.\r
39      * Inherit from this class to add support for attribute wildcarding.\r
40      */\r
41     class XMLTOOL_API AbstractAttributeExtensibleXMLObject\r
42         : public virtual AttributeExtensibleXMLObject, public virtual AbstractXMLObject\r
43     {\r
44     public:\r
45         virtual ~AbstractAttributeExtensibleXMLObject();\r
46         \r
47         const XMLCh* getAttribute(const QName& qualifiedName) const {\r
48             std::map<QName,XMLCh*>::const_iterator i=m_attributeMap.find(qualifiedName);\r
49             return (i==m_attributeMap.end()) ? NULL : i->second;\r
50         }\r
51         \r
52         void setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID=false);\r
53     \r
54         const std::map<QName,XMLCh*>& getExtensionAttributes() const {\r
55             return m_attributeMap;\r
56         }\r
57         \r
58         const XMLCh* getXMLID() const {\r
59             return (m_idAttribute == m_attributeMap.end()) ? NULL : m_idAttribute->second;\r
60         }\r
61     \r
62      protected:\r
63         AbstractAttributeExtensibleXMLObject() {\r
64             m_idAttribute = m_attributeMap.end();\r
65         }\r
66 \r
67         /** Copy constructor. */\r
68         AbstractAttributeExtensibleXMLObject(const AbstractAttributeExtensibleXMLObject& src);\r
69 \r
70         /**\r
71          * Assists in the unmarshalling of extension attributes.\r
72          * \r
73          * @param attribute the DOM attribute node being unmarshalled\r
74          */\r
75         void unmarshallExtensionAttribute(const DOMAttr* attribute);\r
76 \r
77         /**\r
78          * Assists in the marshalling of extension attributes.\r
79          * \r
80          * @param domElement    the DOM element against which to marshall the attributes\r
81          */\r
82         void marshallExtensionAttributes(DOMElement* domElement) const;\r
83     \r
84     private:\r
85         /** Map of arbitrary attributes. */\r
86         std::map<QName,XMLCh*> m_attributeMap;\r
87         \r
88         /** Points to the last attribute designated as an XML ID. */\r
89         std::map<QName,XMLCh*>::const_iterator m_idAttribute;\r
90     };\r
91     \r
92 };\r
93 \r
94 #if defined (_MSC_VER)\r
95     #pragma warning( pop )\r
96 #endif\r
97 \r
98 #endif /* __xmltooling_absattrextxmlobj_h__ */\r