Evolving macros, reduce casting in accessors, add const collection access.
[shibboleth/xmltooling.git] / xmltooling / signature / impl / KeyInfoImpl.cpp
index 44dc6ab..b31de4e 100644 (file)
 #include "exceptions.h"\r
 #include "io/AbstractXMLObjectMarshaller.h"\r
 #include "io/AbstractXMLObjectUnmarshaller.h"\r
-#include "signature/impl/KeyInfoImpl.h"\r
+#include "signature/KeyInfo.h"\r
 #include "util/XMLHelper.h"\r
 #include "validation/AbstractValidatingXMLObject.h"\r
 \r
-#include <typeinfo.h>\r
+#include <xercesc/util/XMLUniDefs.hpp>\r
 \r
 using namespace xmltooling;\r
 using namespace std;\r
@@ -41,6 +41,53 @@ using namespace std;
 \r
 namespace xmltooling {\r
     \r
+    class XMLTOOL_DLLLOCAL RSAKeyValueImpl\r
+        : public RSAKeyValue,\r
+            public AbstractDOMCachingXMLObject,\r
+            public AbstractValidatingXMLObject,\r
+            public AbstractXMLObjectMarshaller,\r
+            public AbstractXMLObjectUnmarshaller\r
+    {\r
+    public:\r
+        virtual ~RSAKeyValueImpl() {}\r
+\r
+        RSAKeyValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)\r
+            : AbstractXMLObject(nsURI, localName, prefix, schemaType) {\r
+            init();\r
+        }\r
+            \r
+        RSAKeyValueImpl(const RSAKeyValueImpl& src)\r
+            : AbstractXMLObject(src),\r
+                AbstractDOMCachingXMLObject(src),\r
+                AbstractValidatingXMLObject(src) {\r
+            init();\r
+            setModulus(src.getModulus());\r
+            setExponent(src.getExponent());\r
+        }\r
+        \r
+        void init() {\r
+            m_Modulus=NULL;\r
+            m_Exponent=NULL;\r
+            m_children.push_back(NULL);\r
+            m_children.push_back(NULL);\r
+            m_pos_Modulus=m_children.begin();\r
+            m_pos_Exponent=m_children.begin();\r
+            m_pos_Exponent++;\r
+        }\r
+        \r
+        IMPL_XMLOBJECT_CLONE(RSAKeyValue);\r
+        IMPL_XMLOBJECT_CHILD(Modulus);\r
+        IMPL_XMLOBJECT_CHILD(Exponent);\r
+\r
+    protected:\r
+        void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {\r
+            PROC_XMLOBJECT_CHILD(Modulus,XMLConstants::XMLSIG_NS);\r
+            PROC_XMLOBJECT_CHILD(Exponent,XMLConstants::XMLSIG_NS);\r
+            \r
+            throw UnmarshallingException("Invalid child element: $1",params(1,childXMLObject->getElementQName().toString()));\r
+        }\r
+    };\r
+    \r
     class XMLTOOL_DLLLOCAL KeyInfoImpl\r
         : public KeyInfo,\r
             public AbstractDOMCachingXMLObject,\r
@@ -64,12 +111,26 @@ namespace xmltooling {
                 m_Id(XMLString::replicate(src.m_Id)) {\r
                     \r
             for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {\r
-                getXMLObjects().push_back((*i) ? (*i)->clone() : NULL);\r
+                if (*i) {\r
+                    KeyName* kn=dynamic_cast<KeyName*>(*i);\r
+                    if (kn) {\r
+                        getKeyNames().push_back(kn->cloneKeyName());\r
+                        continue;\r
+                    }\r
+                    MgmtData* md=dynamic_cast<MgmtData*>(*i);\r
+                    if (md) {\r
+                        getMgmtDatas().push_back(md->cloneMgmtData());\r
+                        continue;\r
+                    }\r
+                    getXMLObjects().push_back((*i)->clone());\r
+                }\r
             }\r
         }\r
         \r
         IMPL_XMLOBJECT_CLONE(KeyInfo);\r
         IMPL_XMLOBJECT_ATTRIB(Id);\r
+        IMPL_XMLOBJECT_CHILDREN(KeyName,m_children.end());\r
+        IMPL_XMLOBJECT_CHILDREN(MgmtData,m_children.end());\r
 \r
     protected:\r
         void marshallAttributes(DOMElement* domElement) const {\r
@@ -90,7 +151,15 @@ namespace xmltooling {
         }\r
 \r
         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {\r
-            getXMLObjects().push_back(childXMLObject);\r
+            PROC_XMLOBJECT_CHILDREN(KeyName,XMLConstants::XMLSIG_NS);\r
+            PROC_XMLOBJECT_CHILDREN(MgmtData,XMLConstants::XMLSIG_NS);\r
+            \r
+            // Unknown child.\r
+            const XMLCh* nsURI=childXMLObject->getElementQName().getNamespaceURI();\r
+            if (!XMLString::equals(nsURI,XMLConstants::XMLSIG_NS) && nsURI && *nsURI)\r
+                getXMLObjects().push_back(childXMLObject);\r
+            \r
+            throw UnmarshallingException("Invalid child element: $1",params(1,childXMLObject->getElementQName().toString()));\r
         }\r
 \r
         void processAttribute(const DOMAttr* attribute) {\r
@@ -101,55 +170,10 @@ namespace xmltooling {
         }\r
     };\r
     \r
-    class XMLTOOL_DLLLOCAL KeyNameImpl\r
-        : public KeyName,\r
-            public AbstractDOMCachingXMLObject,\r
-            public AbstractValidatingXMLObject,\r
-            public AbstractXMLObjectMarshaller,\r
-            public AbstractXMLObjectUnmarshaller\r
-    {\r
-    public:\r
-        virtual ~KeyNameImpl() {}\r
-\r
-        KeyNameImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)\r
-            : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Name(NULL) {\r
-        }\r
-            \r
-        KeyNameImpl(const KeyNameImpl& src)\r
-            : AbstractXMLObject(src),\r
-                AbstractDOMCachingXMLObject(src),\r
-                AbstractValidatingXMLObject(src),\r
-                m_Name(XMLString::replicate(src.m_Name)) {\r
-        }\r
-        \r
-        IMPL_XMLOBJECT_CLONE(KeyName);\r
-        IMPL_XMLOBJECT_CONTENT(Name);\r
-    };\r
-\r
-    class XMLTOOL_DLLLOCAL MgmtDataImpl\r
-        : public MgmtData,\r
-            public AbstractDOMCachingXMLObject,\r
-            public AbstractValidatingXMLObject,\r
-            public AbstractXMLObjectMarshaller,\r
-            public AbstractXMLObjectUnmarshaller\r
-    {\r
-    public:\r
-        virtual ~MgmtDataImpl() {}\r
-\r
-        MgmtDataImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)\r
-            : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Data(NULL) {\r
-        }\r
-            \r
-        MgmtDataImpl(const MgmtDataImpl& src)\r
-            : AbstractXMLObject(src),\r
-                AbstractDOMCachingXMLObject(src),\r
-                AbstractValidatingXMLObject(src),\r
-                m_Data(XMLString::replicate(src.m_Data)) {\r
-        }\r
-        \r
-        IMPL_XMLOBJECT_CLONE(MgmtData);\r
-        IMPL_XMLOBJECT_CONTENT(Data);\r
-    };\r
+    DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,KeyName,Name);\r
+    DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,MgmtData,Data);\r
+    DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Modulus,Value);\r
+    DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Exponent,Value);\r
 };\r
 \r
 #if defined (_MSC_VER)\r
@@ -161,32 +185,16 @@ namespace xmltooling {
 IMPL_XMLOBJECTBUILDER(KeyInfo);\r
 IMPL_XMLOBJECTBUILDER(KeyName);\r
 IMPL_XMLOBJECTBUILDER(MgmtData);\r
-\r
-// Validators\r
-\r
-void KeyInfoSchemaValidator::validate(const XMLObject* xmlObject) const\r
-{\r
-    const KeyInfo* ptr=dynamic_cast<const KeyInfo*>(xmlObject);\r
-    if (!ptr)\r
-        throw ValidationException("KeyInfoSchemaValidator: unsupported object type ($1)",params(1,typeid(xmlObject).name()));\r
-    if (!ptr->hasChildren())\r
-        throw ValidationException("KeyInfo is empty");\r
-}\r
-\r
-void KeyNameSchemaValidator::validate(const XMLObject* xmlObject) const\r
-{\r
-    const KeyName* ptr=dynamic_cast<const KeyName*>(xmlObject);\r
-    if (!ptr)\r
-        throw ValidationException("KeyNameSchemaValidator: unsupported object type ($1)",params(1,typeid(xmlObject).name()));\r
-    if (XMLString::stringLen(ptr->getName())==0)\r
-        throw ValidationException("KeyName is empty");\r
-}\r
-\r
-void MgmtDataSchemaValidator::validate(const XMLObject* xmlObject) const\r
-{\r
-    const MgmtData* ptr=dynamic_cast<const MgmtData*>(xmlObject);\r
-    if (!ptr)\r
-        throw ValidationException("MgmtDataSchemaValidator: unsupported object type ($1)",params(1,typeid(xmlObject).name()));\r
-    if (XMLString::stringLen(ptr->getData())==0)\r
-        throw ValidationException("MgmtData is empty");\r
-}\r
+IMPL_XMLOBJECTBUILDER(Modulus);\r
+IMPL_XMLOBJECTBUILDER(Exponent);\r
+IMPL_XMLOBJECTBUILDER(RSAKeyValue);\r
+\r
+const XMLCh KeyInfo::LOCAL_NAME[] =         UNICODE_LITERAL_7(K,e,y,I,n,f,o);\r
+const XMLCh KeyInfo::TYPE_NAME[] =          UNICODE_LITERAL_11(K,e,y,I,n,f,o,T,y,p,e);\r
+const XMLCh KeyInfo::ID_ATTRIB_NAME[] =     UNICODE_LITERAL_2(I,d);\r
+const XMLCh MgmtData::LOCAL_NAME[] =        UNICODE_LITERAL_8(M,g,m,t,D,a,t,a);\r
+const XMLCh KeyName::LOCAL_NAME[] =         UNICODE_LITERAL_7(K,e,y,N,a,m,e);\r
+const XMLCh Modulus::LOCAL_NAME[] =         UNICODE_LITERAL_7(M,o,d,u,l,u,s);\r
+const XMLCh Exponent::LOCAL_NAME[] =        UNICODE_LITERAL_8(E,x,p,o,n,e,n,t);\r
+const XMLCh RSAKeyValue::LOCAL_NAME[] =     UNICODE_LITERAL_11(R,S,A,K,e,y,V,a,l,u,e);\r
+const XMLCh RSAKeyValue::TYPE_NAME[] =      UNICODE_LITERAL_15(R,S,A,K,e,y,V,a,l,u,e,T,y,p,e);\r