Set xsi:type during object construction.
[shibboleth/cpp-xmltooling.git] / xmltooling / signature / impl / KeyInfoImpl.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  * XMLSecSignatureImpl.cpp\r
19  * \r
20  * Signature class for XMLSec-based signature-handling\r
21  */\r
22 \r
23 #include "internal.h"\r
24 #include "AbstractElementProxy.h"\r
25 #include "exceptions.h"\r
26 #include "io/AbstractXMLObjectMarshaller.h"\r
27 #include "io/AbstractXMLObjectUnmarshaller.h"\r
28 #include "signature/impl/KeyInfoImpl.h"\r
29 #include "util/NDC.h"\r
30 #include "util/XMLHelper.h"\r
31 #include "validation/AbstractValidatingXMLObject.h"\r
32 \r
33 #include <log4cpp/Category.hh>\r
34 \r
35 using namespace xmltooling;\r
36 using namespace log4cpp;\r
37 using namespace std;\r
38 \r
39 #if defined (_MSC_VER)\r
40     #pragma warning( push )\r
41     #pragma warning( disable : 4250 4251 )\r
42 #endif\r
43 \r
44 namespace xmltooling {\r
45     \r
46     class XMLTOOL_DLLLOCAL KeyInfoImpl : public KeyInfo, public AbstractDOMCachingXMLObject, public AbstractElementProxy,\r
47         public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller\r
48     {\r
49     public:\r
50         virtual ~KeyInfoImpl() {}\r
51 \r
52         KeyInfoImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)\r
53             : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Id(NULL) {}\r
54             \r
55         KeyInfoImpl(const KeyInfoImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src),\r
56             AbstractElementProxy(src), AbstractValidatingXMLObject(src), m_Id(XMLString::replicate(src.m_Id)) {\r
57             for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {\r
58                 getXMLObjects().push_back((*i) ? (*i)->clone() : NULL);\r
59             }\r
60         }\r
61         \r
62         IMPL_XMLOBJECT_ATTRIB(Id);\r
63         IMPL_XMLOBJECT_CLONE(KeyInfo);\r
64 \r
65     protected:\r
66         void marshallAttributes(DOMElement* domElement) const {\r
67             if(getId()) {\r
68                 domElement->setAttributeNS(NULL, ID_ATTRIB_NAME, getId());\r
69                 domElement->setIdAttributeNS(NULL, ID_ATTRIB_NAME);\r
70             }\r
71         }\r
72 \r
73         void marshallElementContent(DOMElement* domElement) const {\r
74             if(getTextContent()) {\r
75                 domElement->appendChild(domElement->getOwnerDocument()->createTextNode(getTextContent()));\r
76             }\r
77         }\r
78 \r
79         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {\r
80             getXMLObjects().push_back(childXMLObject);\r
81         }\r
82 \r
83         void processAttribute(const DOMAttr* attribute) {\r
84             if (XMLHelper::isNodeNamed(attribute, NULL, ID_ATTRIB_NAME))\r
85                 setId(attribute->getValue());\r
86         }\r
87 \r
88         void processElementContent(const XMLCh* elementContent) {\r
89             setTextContent(elementContent);\r
90         }\r
91     };\r
92     \r
93 };\r
94 \r
95 #if defined (_MSC_VER)\r
96     #pragma warning( pop )\r
97 #endif\r
98 \r
99 KeyInfo* KeyInfoBuilderImpl::buildObject(\r
100     const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType\r
101     ) const\r
102 {\r
103     return new KeyInfoImpl(nsURI,localName,prefix,schemaType);\r
104 }\r