X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltooling%2Fbase.h;h=c377e4dca956aab36b6d80b3d9bf10178aeba868;hb=d9cce3529f5ffb0c14875c008a32ad7a8bfbfad2;hp=9f222a5f8223648102c83d9f7bf1c9d3855d48ee;hpb=f317cde408dda5e51d043ceda0353705a3c8f407;p=shibboleth%2Fcpp-xmltooling.git diff --git a/xmltooling/base.h b/xmltooling/base.h index 9f222a5..c377e4d 100644 --- a/xmltooling/base.h +++ b/xmltooling/base.h @@ -154,9 +154,70 @@ {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chLatin_##w, chLatin_##x, chLatin_##y, chLatin_##z, chNull} +#define UNICODE_LITERAL_27(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chLatin_##w, chLatin_##x, chLatin_##y, chLatin_##z, \ + chLatin_##aa, chNull} +#define UNICODE_LITERAL_28(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,bb) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chLatin_##w, chLatin_##x, chLatin_##y, chLatin_##z, \ + chLatin_##aa, chLatin_##bb, chNull} +#define UNICODE_LITERAL_29(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,bb,cc) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chLatin_##w, chLatin_##x, chLatin_##y, chLatin_##z, \ + chLatin_##aa, chLatin_##bb, chLatin_##cc, chNull} +#define UNICODE_LITERAL_30(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,bb,cc,dd) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chLatin_##w, chLatin_##x, chLatin_##y, chLatin_##z, \ + chLatin_##aa, chLatin_##bb, chLatin_##cc, chLatin_##dd, chNull} +#define UNICODE_LITERAL_31(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,bb,cc,dd,ee) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chLatin_##w, chLatin_##x, chLatin_##y, chLatin_##z, \ + chLatin_##aa, chLatin_##bb, chLatin_##cc, chLatin_##dd, chLatin_##ee, chNull} +#define UNICODE_LITERAL_32(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,bb,cc,dd,ee,ff) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chLatin_##w, chLatin_##x, chLatin_##y, chLatin_##z, \ + chLatin_##aa, chLatin_##bb, chLatin_##cc, chLatin_##dd, chLatin_##ee, chLatin_##ff, chNull} +#define UNICODE_LITERAL_33(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,bb,cc,dd,ee,ff,gg) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chLatin_##w, chLatin_##x, chLatin_##y, chLatin_##z, \ + chLatin_##aa, chLatin_##bb, chLatin_##cc, chLatin_##dd, chLatin_##ee, chLatin_##ff, chLatin_##gg, chNull} +#define UNICODE_LITERAL_34(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,bb,cc,dd,ee,ff,gg,hh) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chLatin_##w, chLatin_##x, chLatin_##y, chLatin_##z, \ + chLatin_##aa, chLatin_##bb, chLatin_##cc, chLatin_##dd, chLatin_##ee, chLatin_##ff, chLatin_##gg, chLatin_##hh, chNull} #endif /* DOXYGEN_SKIP */ /** + * Begins the declaration of an XMLObject specialization for an abstract element/type. + * Basic boilerplate includes a protected constructor, empty virtual destructor, + * and Unicode constants for the default associated element's name and prefix. + * + * @param linkage linkage specifier for the class + * @param cname the name of the class to declare + * @param base the base class to derive from using public virtual inheritance + * @param desc documentation comment for class + */ +#define DECL_XMLOBJECT_ABSTRACT(linkage,cname,base,desc) \ + XMLTOOLING_DOXYGEN(desc) \ + class linkage cname : public virtual base { \ + protected: \ + cname() {} \ + public: \ + virtual ~cname() {} \ + XMLTOOLING_DOXYGEN(Element local name) \ + static const XMLCh LOCAL_NAME[]; \ + } + +/** * Begins the declaration of an XMLObject specialization. * Basic boilerplate includes a protected constructor, empty virtual destructor, * and Unicode constants for the default associated element's name and prefix. @@ -179,47 +240,197 @@ static const XMLCh LOCAL_NAME[] /** + * Begins the declaration of an XMLObject specialization with two base classes. + * Basic boilerplate includes a protected constructor, empty virtual destructor, + * and Unicode constants for the default associated element's name and prefix. + * + * @param linkage linkage specifier for the class + * @param cname the name of the class to declare + * @param base the first base class to derive from using public virtual inheritance + * @param base2 the second base class to derive from using public virtual inheritance + * @param desc documentation comment for class + */ +#define BEGIN_XMLOBJECT2(linkage,cname,base,base2,desc) \ + XMLTOOLING_DOXYGEN(desc) \ + class linkage cname : public virtual base, public virtual base2, public virtual xmltooling::ValidatingXMLObject { \ + protected: \ + cname() {} \ + public: \ + virtual ~cname() {} \ + XMLTOOLING_DOXYGEN(Type-specific clone method.) \ + virtual cname* clone##cname() const=0; \ + XMLTOOLING_DOXYGEN(Element local name) \ + static const XMLCh LOCAL_NAME[] + +/** * Ends the declaration of an XMLObject specialization. */ #define END_XMLOBJECT } /** - * Declares abstract get/set methods for a named XML attribute. + * Declares abstract get/set methods for a typed XML attribute. * * @param proper the proper name of the attribute * @param upcased the upcased name of the attribute + * @param type the attribute's data type */ -#define DECL_XMLOBJECT_ATTRIB(proper,upcased) \ +#define DECL_XMLOBJECT_ATTRIB(proper,upcased,type) \ public: \ XMLTOOLING_DOXYGEN(proper attribute name) \ static const XMLCh upcased##_ATTRIB_NAME[]; \ XMLTOOLING_DOXYGEN(Returns the proper attribute.) \ - virtual const XMLCh* get##proper() const=0; \ + virtual const type* get##proper() const=0; \ XMLTOOLING_DOXYGEN(Sets the proper attribute.) \ - virtual void set##proper(const XMLCh* proper)=0 + virtual void set##proper(const type* proper)=0 /** - * Implements get/set methods and a private member for a named XML attribute. + * Declares abstract get/set methods for a string XML attribute. * * @param proper the proper name of the attribute + * @param upcased the upcased name of the attribute */ -#define IMPL_XMLOBJECT_ATTRIB(proper) \ - private: \ - XMLCh* m_##proper; \ +#define DECL_STRING_ATTRIB(proper,upcased) \ + DECL_XMLOBJECT_ATTRIB(proper,upcased,XMLCh) + +/** + * Declares abstract get/set methods for a string XML attribute. + * + * @param proper the proper name of the attribute + * @param upcased the upcased name of the attribute + */ +#define DECL_DATETIME_ATTRIB(proper,upcased) \ + DECL_XMLOBJECT_ATTRIB(proper,upcased,xmltooling::DateTime); \ + XMLTOOLING_DOXYGEN(Sets the proper attribute.) \ + virtual void set##proper(time_t proper)=0; \ + XMLTOOLING_DOXYGEN(Sets the proper attribute.) \ + virtual void set##proper(const XMLCh* proper)=0 + +/** + * Declares abstract get/set methods for an integer XML attribute. + * + * @param proper the proper name of the attribute + * @param upcased the upcased name of the attribute + */ +#define DECL_INTEGER_ATTRIB(proper,upcased) \ public: \ - const XMLCh* get##proper() const { \ + XMLTOOLING_DOXYGEN(proper attribute name) \ + static const XMLCh upcased##_ATTRIB_NAME[]; \ + XMLTOOLING_DOXYGEN(Returns the proper attribute.) \ + virtual int get##proper() const=0; \ + XMLTOOLING_DOXYGEN(Sets the proper attribute.) \ + virtual void set##proper(int proper)=0 + +/** + * Declares abstract get/set methods for a boolean XML attribute. + * + * @param proper the proper name of the attribute + * @param upcased the upcased name of the attribute + */ +#define DECL_BOOLEAN_ATTRIB(proper,upcased) \ + public: \ + XMLTOOLING_DOXYGEN(proper attribute name) \ + static const XMLCh upcased##_ATTRIB_NAME[]; \ + XMLTOOLING_DOXYGEN(Returns the proper attribute.) \ + virtual bool proper() const=0; \ + XMLTOOLING_DOXYGEN(Sets the proper attribute.) \ + virtual void proper(bool value)=0 + +/** + * Implements get/set methods and a private member for a typed XML attribute. + * + * @param proper the proper name of the attribute + * @param type the attribute's data type + */ +#define IMPL_XMLOBJECT_ATTRIB(proper,type) \ + protected: \ + type* m_##proper; \ + public: \ + const type* get##proper() const { \ return m_##proper; \ } \ - void set##proper(const XMLCh* proper) { \ + void set##proper(const type* proper) { \ m_##proper = prepareForAssignment(m_##proper,proper); \ } /** + * Implements get/set methods and a private member for a string XML attribute. + * + * @param proper the proper name of the attribute + */ +#define IMPL_STRING_ATTRIB(proper) \ + IMPL_XMLOBJECT_ATTRIB(proper,XMLCh) + +/** + * Implements get/set methods and a private member for a DateTime XML attribute. + * + * @param proper the proper name of the attribute + */ +#define IMPL_DATETIME_ATTRIB(proper) \ + IMPL_XMLOBJECT_ATTRIB(proper,xmltooling::DateTime); \ + void set##proper(time_t proper) { \ + m_##proper = prepareForAssignment(m_##proper,proper); \ + } \ + void set##proper(const XMLCh* proper) { \ + m_##proper = prepareForAssignment(m_##proper,proper); \ + } + +/** + * Implements get/set methods and a private member for an integer XML attribute. + * + * @param proper the proper name of the attribute + */ +#define IMPL_INTEGER_ATTRIB(proper) \ + protected: \ + int m_##proper; \ + public: \ + int get##proper() const { \ + return m_##proper; \ + } \ + void set##proper(int proper) { \ + if (m_##proper != proper) { \ + releaseThisandParentDOM(); \ + m_##proper = proper; \ + } \ + } + +/** + * Implements get/set methods and a private member for a boolean XML attribute. + * + * @param proper the proper name of the attribute + */ +#define IMPL_BOOLEAN_ATTRIB(proper) \ + protected: \ + bool m_##proper; \ + public: \ + bool proper() const { \ + return m_##proper; \ + } \ + void proper(bool value) { \ + if (m_##proper != value) { \ + releaseThisandParentDOM(); \ + m_##proper = value; \ + } \ + } + +/** + * Declares abstract get/set methods for a typed XML child object in a foreign namespace. + * + * @param proper the proper name of the child type + * @param ns the C++ namespace for the type + */ +#define DECL_TYPED_FOREIGN_CHILD(proper,ns) \ + public: \ + XMLTOOLING_DOXYGEN(Returns the proper child.) \ + virtual ns::proper* get##proper() const=0; \ + XMLTOOLING_DOXYGEN(Sets the proper child.) \ + virtual void set##proper(ns::proper* child)=0 + +/** * Declares abstract get/set methods for a typed XML child object. * * @param proper the proper name of the child type */ -#define DECL_XMLOBJECT_CHILD(proper) \ +#define DECL_TYPED_CHILD(proper) \ public: \ XMLTOOLING_DOXYGEN(Returns the proper child.) \ virtual proper* get##proper() const=0; \ @@ -227,14 +438,27 @@ virtual void set##proper(proper* child)=0 /** + * Declares abstract get/set methods for a generic XML child object. + * + * @param proper the proper name of the child + */ +#define DECL_XMLOBJECT_CHILD(proper) \ + public: \ + XMLTOOLING_DOXYGEN(Returns the proper child.) \ + virtual xmltooling::XMLObject* get##proper() const=0; \ + XMLTOOLING_DOXYGEN(Sets the proper child.) \ + virtual void set##proper(xmltooling::XMLObject* child)=0 + + +/** * Implements get/set methods and a private list iterator member for a typed XML child object. * * @param proper the proper name of the child type */ -#define IMPL_XMLOBJECT_CHILD(proper) \ - private: \ +#define IMPL_TYPED_CHILD(proper) \ + protected: \ proper* m_##proper; \ - std::list::iterator m_pos_##proper; \ + std::list::iterator m_pos_##proper; \ public: \ proper* get##proper() const { \ return m_##proper; \ @@ -245,11 +469,29 @@ } /** + * Implements get/set methods and a private list iterator member for a generic XML child object. + * + * @param proper the proper name of the child + */ +#define IMPL_XMLOBJECT_CHILD(proper) \ + protected: \ + xmltooling::XMLObject* m_##proper; \ + std::list::iterator m_pos_##proper; \ + public: \ + xmltooling::XMLObject* get##proper() const { \ + return m_##proper; \ + } \ + void set##proper(xmltooling::XMLObject* child) { \ + prepareForAssignment(m_##proper,child); \ + *m_pos_##proper = m_##proper = child; \ + } + +/** * Declares abstract get/set methods for a typed XML child collection. * * @param proper the proper name of the child type */ -#define DECL_XMLOBJECT_CHILDREN(proper) \ +#define DECL_TYPED_CHILDREN(proper) \ public: \ XMLTOOLING_DOXYGEN(Returns modifiable proper collection.) \ virtual VectorOf(proper) get##proper##s()=0; \ @@ -257,13 +499,38 @@ virtual const std::vector& get##proper##s() const=0 /** + * Declares abstract get/set methods for a typed XML child collection in a foreign namespace. + * + * @param proper the proper name of the child type + * @param ns the C++ namespace for the type + */ +#define DECL_TYPED_FOREIGN_CHILDREN(proper,ns) \ + public: \ + XMLTOOLING_DOXYGEN(Returns modifiable proper collection.) \ + virtual VectorOf(ns::proper) get##proper##s()=0; \ + XMLTOOLING_DOXYGEN(Returns reference to immutable proper collection.) \ + virtual const std::vector& get##proper##s() const=0 + +/** + * Declares abstract get/set methods for a generic XML child collection. + * + * @param proper the proper name of the child + */ +#define DECL_XMLOBJECT_CHILDREN(proper) \ + public: \ + XMLTOOLING_DOXYGEN(Returns modifiable proper collection.) \ + virtual VectorOf(xmltooling::XMLObject) get##proper##s()=0; \ + XMLTOOLING_DOXYGEN(Returns reference to immutable proper collection.) \ + virtual const std::vector& get##proper##s() const=0 + +/** * Implements get method and a private vector member for a typed XML child collection. * * @param proper the proper name of the child type * @param fence insertion fence for new objects of the child collection in backing list */ -#define IMPL_XMLOBJECT_CHILDREN(proper,fence) \ - private: \ +#define IMPL_TYPED_CHILDREN(proper,fence) \ + protected: \ std::vector m_##proper##s; \ public: \ VectorOf(proper) get##proper##s() { \ @@ -274,38 +541,106 @@ } /** - * Implements marshalling for an attribute + * Implements get method and a private vector member for a generic XML child collection. + * + * @param proper the proper name of the child + * @param fence insertion fence for new objects of the child collection in backing list + */ +#define IMPL_XMLOBJECT_CHILDREN(proper,fence) \ + protected: \ + std::vector m_##proper##s; \ + public: \ + VectorOf(xmltooling::XMLObject) get##proper##s() { \ + return VectorOf(xmltooling::XMLObject)(this, m_##proper##s, &m_children, fence); \ + } \ + const std::vector& get##proper##s() const { \ + return m_##proper##s; \ + } + +/** + * Implements marshalling for a string attribute * * @param proper the proper name of the attribute * @param ucase the upcased name of the attribute * @param namespaceURI the XML namespace of the attribute */ -#define MARSHALL_XMLOBJECT_ATTRIB(proper,ucase,namespaceURI) \ +#define MARSHALL_STRING_ATTRIB(proper,ucase,namespaceURI) \ if(get##proper()) { \ domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, get##proper()); \ } /** + * Implements marshalling for a DateTime attribute + * + * @param proper the proper name of the attribute + * @param ucase the upcased name of the attribute + * @param namespaceURI the XML namespace of the attribute + */ +#define MARSHALL_DATETIME_ATTRIB(proper,ucase,namespaceURI) \ + if(get##proper()) { \ + domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, get##proper()->getRawData()); \ + } + +/** + * Implements marshalling for an integer attribute + * + * @param proper the proper name of the attribute + * @param ucase the upcased name of the attribute + * @param namespaceURI the XML namespace of the attribute + */ +#define MARSHALL_INTEGER_ATTRIB(proper,ucase,namespaceURI) \ + char buf##proper[64]; \ + sprintf(buf##proper,"%d",get##proper()); \ + auto_ptr_XMLCh wide##proper(buf##proper); \ + domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, wide##proper.get()) + +/** + * Implements marshalling for a boolean attribute + * + * @param proper the proper name of the attribute + * @param ucase the upcased name of the attribute + * @param namespaceURI the XML namespace of the attribute + */ +#define MARSHALL_BOOLEAN_ATTRIB(proper,ucase,namespaceURI) \ + XMLCh flag##proper[2]; \ + flag##proper[0]=m_##proper ? chDigit_1 : chDigit_0; \ + flag##proper[1]=chNull; \ + domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, flag##proper) + +/** + * Implements marshalling for a QName attribute + * + * @param proper the proper name of the attribute + * @param ucase the upcased name of the attribute + * @param namespaceURI the XML namespace of the attribute + */ +#define MARSHALL_QNAME_ATTRIB(proper,ucase,namespaceURI) \ + if(get##proper()) { \ + auto_ptr_XMLCh qstr(get##proper()->toString().c_str()); \ + domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, qstr.get()); \ + } + +/** * Implements marshalling for an ID attribute * * @param proper the proper name of the attribute * @param ucase the upcased name of the attribute * @param namespaceURI the XML namespace of the attribute */ -#define MARSHALL_XMLOBJECT_ID_ATTRIB(proper,ucase,namespaceURI) \ +#define MARSHALL_ID_ATTRIB(proper,ucase,namespaceURI) \ if(get##proper()) { \ domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, get##proper()); \ domElement->setIdAttributeNS(namespaceURI, ucase##_ATTRIB_NAME); \ } /** - * Implements unmarshalling process branch for an attribute + * Implements unmarshalling process branch for a string attribute * * @param proper the proper name of the attribute * @param ucase the upcased name of the attribute * @param namespaceURI the XML namespace of the attribute */ -#define PROC_XMLOBJECT_ATTRIB(proper,ucase,namespaceURI) \ +#define PROC_STRING_ATTRIB(proper,ucase,namespaceURI) \ if (xmltooling::XMLHelper::isNodeNamed(attribute, namespaceURI, ucase##_ATTRIB_NAME)) { \ set##proper(attribute->getValue()); \ return; \ @@ -318,10 +653,65 @@ * @param ucase the upcased name of the attribute * @param namespaceURI the XML namespace of the attribute */ -#define PROC_XMLOBJECT_ID_ATTRIB(proper,ucase,namespaceURI) \ +#define PROC_ID_ATTRIB(proper,ucase,namespaceURI) \ if (xmltooling::XMLHelper::isNodeNamed(attribute, namespaceURI, ucase##_ATTRIB_NAME)) { \ set##proper(attribute->getValue()); \ - static_cast(attribute->getParentNode())->setIdAttributeNode(attribute); \ + attribute->getOwnerElement()->setIdAttributeNode(attribute); \ + return; \ + } + +/** + * Implements unmarshalling process branch for a DateTime attribute + * + * @param proper the proper name of the attribute + * @param ucase the upcased name of the attribute + * @param namespaceURI the XML namespace of the attribute + */ +#define PROC_DATETIME_ATTRIB(proper,ucase,namespaceURI) \ + PROC_STRING_ATTRIB(proper,ucase,namespaceURI) + +/** + * Implements unmarshalling process branch for a DateTime attribute + * + * @param proper the proper name of the attribute + * @param ucase the upcased name of the attribute + * @param namespaceURI the XML namespace of the attribute + */ +#define PROC_QNAME_ATTRIB(proper,ucase,namespaceURI) \ + if (xmltooling::XMLHelper::isNodeNamed(attribute, namespaceURI, ucase##_ATTRIB_NAME)) { \ + set##proper(XMLHelper::getAttributeValueAsQName(attribute)); \ + return; \ + } + +/** + * Implements unmarshalling process branch for an integer attribute + * + * @param proper the proper name of the attribute + * @param ucase the upcased name of the attribute + * @param namespaceURI the XML namespace of the attribute + */ +#define PROC_INTEGER_ATTRIB(proper,ucase,namespaceURI) \ + if (xmltooling::XMLHelper::isNodeNamed(attribute, namespaceURI, ucase##_ATTRIB_NAME)) { \ + set##proper(XMLString::parseInt(attribute->getValue())); \ + return; \ + } + +/** + * Implements unmarshalling process branch for a boolean attribute + * + * @param proper the proper name of the attribute + * @param ucase the upcased name of the attribute + * @param namespaceURI the XML namespace of the attribute + */ +#define PROC_BOOLEAN_ATTRIB(proper,ucase,namespaceURI) \ + if (xmltooling::XMLHelper::isNodeNamed(attribute, namespaceURI, ucase##_ATTRIB_NAME)) { \ + const XMLCh* value=attribute->getValue(); \ + if (value) { \ + if (*value==chLatin_t || *value==chDigit_1) \ + m_##proper=true; \ + else if (*value==chLatin_f || *value==chDigit_0) \ + m_##proper=false; \ + } \ return; \ } @@ -330,9 +720,10 @@ * * @param proper the proper name of the child type * @param namespaceURI the XML namespace of the child element + * @param force bypass use of hint and just cast down to check child */ -#define PROC_XMLOBJECT_CHILDREN(proper,namespaceURI) \ - if (xmltooling::XMLHelper::isNodeNamed(root,namespaceURI,proper::LOCAL_NAME)) { \ +#define PROC_TYPED_CHILDREN(proper,namespaceURI,force) \ + if (force || xmltooling::XMLHelper::isNodeNamed(root,namespaceURI,proper::LOCAL_NAME)) { \ proper* typesafe=dynamic_cast(childXMLObject); \ if (typesafe) { \ get##proper##s().push_back(typesafe); \ @@ -345,9 +736,10 @@ * * @param proper the proper name of the child type * @param namespaceURI the XML namespace of the child element + * @param force bypass use of hint and just cast down to check child */ -#define PROC_XMLOBJECT_CHILD(proper,namespaceURI) \ - if (xmltooling::XMLHelper::isNodeNamed(root,namespaceURI,proper::LOCAL_NAME)) { \ +#define PROC_TYPED_CHILD(proper,namespaceURI,force) \ + if (force || xmltooling::XMLHelper::isNodeNamed(root,namespaceURI,proper::LOCAL_NAME)) { \ proper* typesafe=dynamic_cast(childXMLObject); \ if (typesafe) { \ set##proper(typesafe); \ @@ -371,6 +763,24 @@ } /** + * Declares aliased get/set methods for named integer XML element content. + * + * @param proper the proper name to label the element's content + */ +#define DECL_INTEGER_CONTENT(proper) \ + XMLTOOLING_DOXYGEN(Returns proper.) \ + int get##proper() const { \ + return XMLString::parseInt(getTextContent()); \ + } \ + XMLTOOLING_DOXYGEN(Sets or clears proper.) \ + void set##proper(int proper) { \ + char buf[64]; \ + sprintf(buf,"%d",proper); \ + xmltooling::auto_ptr_XMLCh widebuf(buf); \ + setTextContent(widebuf.get()); \ + } + +/** * Implements marshalling/unmarshalling for element content. */ #define IMPL_XMLOBJECT_CONTENT \ @@ -427,7 +837,7 @@ */ #define DECL_XMLOBJECTIMPL_SIMPLE(linkage,cname) \ class linkage cname##Impl \ - : public cname, \ + : public virtual cname, \ public xmltooling::AbstractSimpleElement, \ public xmltooling::AbstractChildlessElement, \ public xmltooling::AbstractDOMCachingXMLObject, \ @@ -468,6 +878,7 @@ virtual cname* buildObject() const { \ return buildObject(namespaceURI,cname::LOCAL_NAME,namespacePrefix); \ } \ + XMLTOOLING_DOXYGEN(Builder that allows element/type override.) \ virtual cname* buildObject( \ const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL \ ) const @@ -488,7 +899,7 @@ #define DECL_XMLOBJECTBUILDER(linkage,cname,namespaceURI,namespacePrefix) \ BEGIN_XMLOBJECTBUILDER(linkage,cname,namespaceURI,namespacePrefix); \ XMLTOOLING_DOXYGEN(Singleton builder.) \ - static cname* new##cname() { \ + static cname* build##cname() { \ const cname##Builder* b = dynamic_cast( \ XMLObjectBuilder::getBuilder(xmltooling::QName(namespaceURI,cname::LOCAL_NAME)) \ ); \ @@ -568,6 +979,18 @@ throw xmltooling::ValidationException(#cname" must have "#proper1" or "#proper2".") /** + * Validator code that checks for one of a pair of + * required attributes, content, or singletons, but disallows both. + * + * @param cname the name of the XMLObject specialization + * @param proper1 the proper name of the first attribute, content, or singleton member + * @param proper2 the proper name of the second attribute, content, or singleton member + */ +#define XMLOBJECTVALIDATOR_ONLYONEOF(cname,proper1,proper2) \ + if ((!ptr->get##proper1() && !ptr->get##proper2()) || (ptr->get##proper1() && ptr->get##proper2())) \ + throw xmltooling::ValidationException(#cname" must have "#proper1" or "#proper2" but not both.") + +/** * Validator code that checks for one of a set of three * required attributes, content, or singletons. * @@ -581,6 +1004,26 @@ throw xmltooling::ValidationException(#cname" must have "#proper1", "#proper2", or "#proper3".") /** + * Validator code that checks for one of a set of three + * required attributes, content, or singletons but disallows more than one. + * + * @param cname the name of the XMLObject specialization + * @param proper1 the proper name of the first attribute, content, or singleton member + * @param proper2 the proper name of the second attribute, content, or singleton member + * @param proper3 the proper name of the third attribute, content, or singleton member + */ +#define XMLOBJECTVALIDATOR_ONLYONEOF3(cname,proper1,proper2,proper3) \ + int c##proper1##proper2##proper3=0; \ + if (ptr->get##proper1()!=NULL) \ + c##proper1##proper2##proper3++; \ + if (ptr->get##proper2()!=NULL) \ + c##proper1##proper2##proper3++; \ + if (ptr->get##proper3()!=NULL) \ + c##proper1##proper2##proper3++; \ + if (c##proper1##proper2##proper3 != 1) \ + throw xmltooling::ValidationException(#cname" must have only one of "#proper1", "#proper2", or "#proper3".") + +/** * Validator code that checks a co-constraint (if one present, the other must be) * between a pair of attributes, content, or singletons. *