Additional macros and cleanup for cloning
[shibboleth/cpp-xmltooling.git] / xmltooling / encryption / impl / EncryptionImpl.cpp
index 8e006da..9e766e2 100644 (file)
 #include "signature/KeyInfo.h"
 #include "util/XMLHelper.h"
 
+#include <boost/lambda/bind.hpp>
+#include <boost/lambda/casts.hpp>
+#include <boost/lambda/if.hpp>
+#include <boost/lambda/lambda.hpp>
 #include <xercesc/util/XMLUniDefs.hpp>
 
 using namespace xmlencryption;
@@ -72,6 +76,7 @@ namespace xmlencryption {
             m_pos_OAEPparams=m_pos_KeySize;
             ++m_pos_OAEPparams;
         }
+
     public:
         virtual ~EncryptionMethodImpl() {
             XMLString::release(&m_Algorithm);
@@ -85,14 +90,10 @@ namespace xmlencryption {
         EncryptionMethodImpl(const EncryptionMethodImpl& src)
                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
             init();
-            setAlgorithm(src.getAlgorithm());
-            if (src.getKeySize())
-                setKeySize(src.getKeySize()->cloneKeySize());
-            if (src.getOAEPparams())
-                setOAEPparams(src.getOAEPparams()->cloneOAEPparams());
-            VectorOf(XMLObject) v=getUnknownXMLObjects();
-            for (vector<XMLObject*>::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i)
-                v.push_back((*i)->clone());
+            IMPL_CLONE_ATTRIB(Algorithm);
+            IMPL_CLONE_TYPED_CHILD(KeySize);
+            IMPL_CLONE_TYPED_CHILD(OAEPparams);
+            IMPL_CLONE_XMLOBJECT_CHILDREN(UnknownXMLObject);
         }
         
         IMPL_XMLOBJECT_CLONE(EncryptionMethod);
@@ -141,12 +142,7 @@ namespace xmlencryption {
             
         TransformsImpl(const TransformsImpl& src)
                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
-            VectorOf(xmlsignature::Transform) v=getTransforms();
-            for (vector<xmlsignature::Transform*>::const_iterator i=src.m_Transforms.begin(); i!=src.m_Transforms.end(); i++) {
-                if (*i) {
-                    v.push_back((*i)->cloneTransform());
-                }
-            }
+            IMPL_CLONE_TYPED_FOREIGN_CHILDREN(Transform,xmlsignature);
         }
         
         IMPL_XMLOBJECT_CLONE(Transforms);
@@ -171,6 +167,7 @@ namespace xmlencryption {
             m_children.push_back(nullptr);
             m_pos_Transforms=m_children.begin();
         }
+
     public:
         virtual ~CipherReferenceImpl() {
             XMLString::release(&m_URI);
@@ -184,9 +181,8 @@ namespace xmlencryption {
         CipherReferenceImpl(const CipherReferenceImpl& src)
                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
             init();
-            setURI(src.getURI());
-            if (src.getTransforms())
-                setTransforms(src.getTransforms()->cloneTransforms());
+            IMPL_CLONE_ATTRIB(URI);
+            IMPL_CLONE_TYPED_CHILD(Transforms);
         }
         
         IMPL_XMLOBJECT_CLONE(CipherReference);
@@ -224,6 +220,7 @@ namespace xmlencryption {
             m_pos_CipherReference=m_pos_CipherValue;
             ++m_pos_CipherReference;
         }
+
     public:
         virtual ~CipherDataImpl() {}
 
@@ -235,10 +232,8 @@ namespace xmlencryption {
         CipherDataImpl(const CipherDataImpl& src)
                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
             init();
-            if (src.getCipherValue())
-                setCipherValue(src.getCipherValue()->cloneCipherValue());
-            if (src.getCipherReference())
-                setCipherReference(src.getCipherReference()->cloneCipherReference());
+            IMPL_CLONE_TYPED_CHILD(CipherValue);
+            IMPL_CLONE_TYPED_CHILD(CipherReference);
         }
         
         IMPL_XMLOBJECT_CLONE(CipherData);
@@ -263,6 +258,7 @@ namespace xmlencryption {
         void init() {
             m_Id=m_Target=nullptr;
         }
+
     public:
         virtual ~EncryptionPropertyImpl() {
             XMLString::release(&m_Id);
@@ -280,11 +276,9 @@ namespace xmlencryption {
                     AbstractComplexElement(src),
                     AbstractDOMCachingXMLObject(src) {
             init();
-            setId(src.getId());
-            setTarget(src.getTarget());
-            VectorOf(XMLObject) v=getUnknownXMLObjects();
-            for (vector<XMLObject*>::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i)
-                v.push_back((*i)->clone());
+            IMPL_CLONE_ATTRIB(Id);
+            IMPL_CLONE_ATTRIB(Target);
+            IMPL_CLONE_XMLOBJECT_CHILDREN(UnknownXMLObject);
         }
         
         IMPL_XMLOBJECT_CLONE(EncryptionProperty);
@@ -332,6 +326,7 @@ namespace xmlencryption {
         void init() {
             m_Id=nullptr;
         }
+
     public:
         virtual ~EncryptionPropertiesImpl() {
             XMLString::release(&m_Id);
@@ -345,13 +340,8 @@ namespace xmlencryption {
         EncryptionPropertiesImpl(const EncryptionPropertiesImpl& src)
                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
             init();
-            setId(src.getId());
-            VectorOf(EncryptionProperty) v=getEncryptionPropertys();
-            for (vector<EncryptionProperty*>::const_iterator i=src.m_EncryptionPropertys.begin(); i!=src.m_EncryptionPropertys.end(); i++) {
-                if (*i) {
-                    v.push_back((*i)->cloneEncryptionProperty());
-                }
-            }
+            IMPL_CLONE_ATTRIB(Id);
+            IMPL_CLONE_TYPED_CHILDREN(EncryptionProperty);
         }
         
         IMPL_XMLOBJECT_CLONE(EncryptionProperties);
@@ -391,20 +381,16 @@ namespace xmlencryption {
         }
 
         ReferenceTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-            : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
-            m_URI=nullptr;
+            : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_URI(nullptr) {
         }
             
         ReferenceTypeImpl(const ReferenceTypeImpl& src)
-                : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
-            m_URI=nullptr;
+                : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src), m_URI(nullptr) {
         }
 
         void _clone(const ReferenceTypeImpl& src) {
-            setURI(src.getURI());
-            VectorOf(XMLObject) v=getUnknownXMLObjects();
-            for (vector<XMLObject*>::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i)
-                v.push_back((*i)->clone());
+            IMPL_CLONE_ATTRIB(URI);
+            IMPL_CLONE_XMLOBJECT_CHILDREN(UnknownXMLObject);
         }
         
         IMPL_XMLOBJECT_CLONE_EX(ReferenceType);
@@ -467,21 +453,10 @@ namespace xmlencryption {
             
         ReferenceListImpl(const ReferenceListImpl& src)
                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
-            for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
-                if (*i) {
-                    DataReference* data=dynamic_cast<DataReference*>(*i);
-                    if (data) {
-                        getDataReferences().push_back(data->cloneDataReference());
-                        continue;
-                    }
-
-                    KeyReference* key=dynamic_cast<KeyReference*>(*i);
-                    if (key) {
-                        getKeyReferences().push_back(key->cloneKeyReference());
-                        continue;
-                    }
-                }
-            }
+            IMPL_CLONE_CHILDBAG_BEGIN;
+                IMPL_CLONE_TYPED_CHILD_IN_BAG(DataReference);
+                IMPL_CLONE_TYPED_CHILD_IN_BAG(KeyReference);
+            IMPL_CLONE_CHILDBAG_END;
         }
         
         IMPL_XMLOBJECT_CLONE(ReferenceList);
@@ -520,6 +495,7 @@ namespace xmlencryption {
             m_pos_EncryptionProperties=m_pos_CipherData;
             ++m_pos_EncryptionProperties;
         }
+
     protected:
         EncryptedTypeImpl() {
             init();
@@ -544,18 +520,14 @@ namespace xmlencryption {
         }
 
         void _clone(const EncryptedTypeImpl& src) {
-            setId(src.getId());
-            setType(src.getType());
-            setMimeType(src.getMimeType());
-            setEncoding(src.getEncoding());
-            if (src.getEncryptionMethod())
-                setEncryptionMethod(src.getEncryptionMethod()->cloneEncryptionMethod());
-            if (src.getKeyInfo())
-                setKeyInfo(src.getKeyInfo()->cloneKeyInfo());
-            if (src.getCipherData())
-                setCipherData(src.getCipherData()->cloneCipherData());
-            if (src.getEncryptionProperties())
-                setEncryptionProperties(src.getEncryptionProperties()->cloneEncryptionProperties());
+            IMPL_CLONE_ATTRIB(Id);
+            IMPL_CLONE_ATTRIB(Type);
+            IMPL_CLONE_ATTRIB(MimeType);
+            IMPL_CLONE_ATTRIB(Encoding);
+            IMPL_CLONE_TYPED_CHILD(EncryptionMethod);
+            IMPL_CLONE_TYPED_CHILD(KeyInfo);
+            IMPL_CLONE_TYPED_CHILD(CipherData);
+            IMPL_CLONE_TYPED_CHILD(EncryptionProperties);
         }
         
         IMPL_XMLOBJECT_CLONE_EX(EncryptedType);
@@ -636,15 +608,12 @@ namespace xmlencryption {
         
         void _clone(const EncryptedKeyImpl& src) {
             EncryptedTypeImpl::_clone(src);
-            setRecipient(src.getRecipient());
-            if (src.getReferenceList())
-                setReferenceList(src.getReferenceList()->cloneReferenceList());
-            if (src.getCarriedKeyName())
-                setCarriedKeyName(src.getCarriedKeyName()->cloneCarriedKeyName());
+            IMPL_CLONE_ATTRIB(Recipient);
+            IMPL_CLONE_TYPED_CHILD(ReferenceList);
+            IMPL_CLONE_TYPED_CHILD(CarriedKeyName);
         }
 
         IMPL_XMLOBJECT_CLONE_EX(EncryptedKey);
-
         IMPL_STRING_ATTRIB(Recipient);
         IMPL_TYPED_CHILD(ReferenceList);
         IMPL_TYPED_CHILD(CarriedKeyName);