\r
/**\r
* An abstract implementation of XMLObject.\r
+ * This is the primary concrete base class, and supplies basic namespace,\r
+ * type, and parent handling. Most implementation classes should not\r
+ * directly inherit from this class, but rather from the various mixins\r
+ * that supply the rest of the XMLObject interface, as required.\r
*/\r
class XMLTOOL_API AbstractXMLObject : public virtual XMLObject\r
{\r
public:\r
- virtual ~AbstractXMLObject();\r
+ virtual ~AbstractXMLObject() {\r
+ delete m_typeQname;\r
+ }\r
\r
const QName& getElementQName() const {\r
return m_elementQname;\r
return m_typeQname;\r
}\r
\r
- void setSchemaType(const QName* type) {\r
- delete m_typeQname;\r
- m_typeQname = NULL;\r
- if (type) {\r
- m_typeQname = new QName(*type);\r
- addNamespace(Namespace(type->getNamespaceURI(), type->getPrefix()));\r
- }\r
- }\r
- \r
bool hasParent() const {\r
return m_parent != NULL;\r
}\r
m_parent = parent;\r
}\r
\r
- bool hasChildren() const {\r
- return !m_children.empty();\r
- }\r
-\r
- const std::list<XMLObject*>& getOrderedChildren() const {\r
- return m_children;\r
- }\r
-\r
protected:\r
/**\r
* Constructor\r
* \r
- * @param namespaceURI the namespace the element is in\r
- * @param elementLocalName the local name of the XML element this Object represents\r
- * @param namespacePrefix the namespace prefix to use\r
+ * @param nsURI the namespace of the element\r
+ * @param localName the local name of the XML element this Object represents\r
+ * @param prefix the namespace prefix to use\r
+ * @param schemaType the xsi:type to use\r
*/\r
- AbstractXMLObject(const XMLCh* namespaceURI=NULL, const XMLCh* elementLocalName=NULL, const XMLCh* namespacePrefix=NULL);\r
+ AbstractXMLObject(\r
+ const XMLCh* nsURI=NULL, const XMLCh* localName=NULL, const XMLCh* prefix=NULL, const QName* schemaType=NULL\r
+ );\r
\r
/** Copy constructor. */\r
AbstractXMLObject(const AbstractXMLObject& src);\r
* \r
* @return the value that should be assigned\r
*/\r
- XMLCh* prepareForAssignment(XMLCh* oldValue, const XMLCh* newValue) {\r
- XMLCh* newString = XMLString::replicate(newValue);\r
- XMLString::trim(newString);\r
- if (!XMLString::equals(oldValue,newValue)) {\r
- releaseThisandParentDOM();\r
- XMLString::release(&oldValue);\r
- return newString;\r
- }\r
- XMLString::release(&newString);\r
- return oldValue; \r
- }\r
+ XMLCh* prepareForAssignment(XMLCh* oldValue, const XMLCh* newValue);\r
\r
/**\r
* A helper function for derived classes, for assignment of (singleton) XML objects.\r
* \r
* It is indifferent to whether either the old or the new version of the value is null. \r
- * This method will do a safe compare of the objects and will also invalidate the DOM if appropriate\r
+ * This method will do a safe compare of the objects and will also invalidate the DOM if appropriate.\r
+ * Note that since the new value (even if NULL) is always returned, it may be more efficient\r
+ * to discard the return value and just assign independently if a dynamic cast would be involved.\r
* \r
* @param oldValue - current value\r
* @param newValue - proposed new value\r
- * @return the value to assign \r
+ * @return the new value \r
* \r
* @throws XMLObjectException if the new child already has a parent.\r
*/\r
XMLObject* prepareForAssignment(XMLObject* oldValue, XMLObject* newValue);\r
\r
/**\r
- * Underlying list of child objects.\r
- * Manages the lifetime of the children.\r
- */\r
- std::list<XMLObject*> m_children;\r
-\r
- /**\r
* Set of namespaces associated with the object.\r
*/\r
mutable std::set<Namespace> m_namespaces;\r