00001 #ifndef hpp_HTMLAllocators_hpp
00002 #define hpp_HTMLAllocators_hpp
00003
00004
00005 #include "Elements.hpp"
00006
00007 #include "../Tree/NTree.hpp"
00008
00009 #include "../HTMLParser/DOM.hpp"
00010
00011 namespace HTML
00012 {
00013 namespace Elements
00014 {
00021 namespace Allocators
00022 {
00024 class BaseAllocator
00025 {
00026 protected:
00028 BaseAllocator() {}
00029
00030 public:
00032 virtual HTML::Attributes::Attribute * getAttribute(HTML::GenericAttribute::AttributeID type, uint32 startPos = 0, uint32 endPos = 0, uint32 startCont = 0, uint32 endCont = 0) const volatile = 0;
00034 virtual HTML::Elements::Element * getElement(HTML::GenericElement::ElementID type, uint32 startPos) const volatile = 0;
00036 virtual DOM::DocumentType * getDocumentType(const DOM::DOMString & input) const volatile = 0;
00038 virtual DOM::DocumentType * getDocumentType(const DOM::DOMString & qualifiedName, const DOM::DOMString & publicId, const DOM::DOMString & systemId) const volatile = 0;
00040 virtual DOMTree::Node * getElementNode(HTML::Elements::Element * element, DOMTree::Node * root, Tree::DeleterObject<const DOM::Node *> &) const volatile = 0;
00042 virtual DOMTree::Node * getTextNode(const Strings::FastString & text, DOMTree::Node * root, Tree::DeleterObject<const DOM::Node *> &) const volatile = 0;
00044 virtual DOMTree::Node * getCommentNode(const Strings::FastString & text, DOMTree::Node * root, Tree::DeleterObject<const DOM::Node *> &) const volatile = 0;
00046 virtual DOMTree::Node * getTextNode(const DOM::DOMString & text, DOMTree::Node * root, Tree::DeleterObject<const DOM::Node *> &) const volatile = 0;
00048 virtual DOMTree::Node * getCommentNode(const DOM::DOMString & text, DOMTree::Node * root, Tree::DeleterObject<const DOM::Node *> &) const volatile = 0;
00050 virtual DOMTree::Node * getAttrNode(HTML::Attributes::Attribute * attrib, const DOM::DOMString & value, DOMTree::Node * root, Tree::DeleterObject<const DOM::Node *> &) const volatile = 0;
00052 virtual DOMTree::Node * getDocumentNode(const DOM::DOMString & namespaceURI, const DOM::DOMString & qualifiedName, const DOM::DocumentType * docType, DOMTree::Node * ref, const DOM::Element * htmlElement, Tree::DeleterObject<const DOM::Node *> &) const volatile = 0;
00054 virtual void returnNode(const DOM::Node *) const volatile = 0;
00056 virtual void returnAttribute(const HTML::Attributes::Attribute * attribute) const volatile = 0;
00058 virtual void returnElement(const HTML::Elements::Element * element) const volatile = 0;
00060 virtual void returnDocumentType(const DOM::DocumentType * docType) const volatile = 0;
00061 };
00062
00064 class SimpleHeap : public BaseAllocator
00065 {
00066 public:
00068 SimpleHeap() {}
00069
00070 public:
00072 virtual HTML::Attributes::Attribute * getAttribute(HTML::GenericAttribute::AttributeID type, uint32 startPos = 0, uint32 endPos = 0, uint32 startCont = 0, uint32 endCont = 0) const volatile
00073 {
00074 return new HTML::Attributes::Attribute(type, startPos, endPos, startCont, endCont);
00075 }
00077 virtual HTML::Elements::Element * getElement(HTML::GenericElement::ElementID type, uint32 startPos) const volatile
00078 {
00079 return new HTML::Elements::Element(type, startPos);
00080 }
00082 virtual DOM::DocumentType * getDocumentType(const DOM::DOMString & input) const volatile
00083 {
00084 return new DOM::DocumentType(input);
00085 }
00087 virtual DOM::DocumentType * getDocumentType(const DOM::DOMString & qualifiedName, const DOM::DOMString & publicId, const DOM::DOMString & systemId) const volatile
00088 {
00089 return new DOM::DocumentType(qualifiedName, publicId, systemId);
00090 }
00091
00093 virtual DOMTree::Node * getElementNode(HTML::Elements::Element * element, DOMTree::Node * root, Tree::DeleterObject<const DOM::Node *> & deleter) const volatile
00094 {
00095 DOM::Element * newElement = new DOM::Element(element);
00096 if (newElement == 0) return 0;
00097 DOMTree::Node * node = new DOMTree::Node(newElement, root, deleter);
00098 if (node) newElement->setTreeNode(node);
00099 else delete newElement;
00100 return node;
00101 }
00103 virtual DOMTree::Node * getTextNode(const Strings::FastString & text, DOMTree::Node * root, Tree::DeleterObject<const DOM::Node *> & deleter) const volatile
00104 {
00105 DOM::Text * newText = new DOM::Text(text);
00106 if (newText == 0) return 0;
00107 DOMTree::Node * node = new DOMTree::Node(newText, root, deleter);
00108 if (node) newText->setTreeNode(node);
00109 else delete newText;
00110 return node;
00111 }
00113 virtual DOMTree::Node * getCommentNode(const Strings::FastString & text, DOMTree::Node * root, Tree::DeleterObject<const DOM::Node *> & deleter) const volatile
00114 {
00115 DOM::Comment * newComment = new DOM::Comment(text);
00116 if (newComment == 0) return 0;
00117 DOMTree::Node * node = new DOMTree::Node(newComment, root, deleter);
00118 if (node) newComment->setTreeNode(node);
00119 else delete newComment;
00120 return node;
00121 }
00123 virtual DOMTree::Node * getTextNode(const DOM::DOMString & text, DOMTree::Node * root, Tree::DeleterObject<const DOM::Node *> & deleter) const volatile
00124 {
00125 DOM::Text * newText = new DOM::Text(text);
00126 if (newText == 0) return 0;
00127 DOMTree::Node * node = new DOMTree::Node(newText, root, deleter);
00128 if (node) newText->setTreeNode(node);
00129 else delete newText;
00130 return node;
00131 }
00133 virtual DOMTree::Node * getCommentNode(const DOM::DOMString & text, DOMTree::Node * root, Tree::DeleterObject<const DOM::Node *> & deleter) const volatile
00134 {
00135 DOM::Comment * newComment = new DOM::Comment(text);
00136 if (newComment == 0) return 0;
00137 DOMTree::Node * node = new DOMTree::Node(newComment, root, deleter);
00138 if (node) newComment->setTreeNode(node);
00139 else delete newComment;
00140 return node;
00141 }
00143 virtual DOMTree::Node * getAttrNode(HTML::Attributes::Attribute * attrib, const DOM::DOMString & value, DOMTree::Node * root, Tree::DeleterObject<const DOM::Node *> & deleter) const volatile
00144 {
00145 DOM::Attr * newAttr = new DOM::Attr(attrib, value);
00146 if (newAttr == 0) return 0;
00147 DOMTree::Node * node = new DOMTree::Node(newAttr, root, deleter);
00148 if (node) newAttr->setTreeNode(node);
00149 else delete newAttr;
00150 return node;
00151 }
00153 virtual DOMTree::Node * getDocumentNode(const DOM::DOMString & namespaceURI, const DOM::DOMString & qualifiedName, const DOM::DocumentType * docType, DOMTree::Node * ref, const DOM::Element * htmlElement, Tree::DeleterObject<const DOM::Node *> & deleter) const volatile
00154 {
00155 DOM::Document * newDocument = new DOM::Document(namespaceURI, qualifiedName, docType, this, ref, htmlElement);
00156 if (newDocument == 0) return 0;
00157 if (ref)
00158 {
00159
00160 DOM::Node * node = const_cast<DOM::Node*>(ref->getData());
00161 if (node) node->returnToAllocator(this);
00162 ref->getData() = newDocument;
00163 }
00164 else
00165 {
00166 ref = new DOMTree::Node(newDocument, 0, deleter);
00167 if (ref) newDocument->setTreeNode(ref);
00168 else delete newDocument;
00169 }
00170
00171 return ref;
00172 }
00174 virtual void returnNode(const DOM::Node * node) const volatile throw()
00175 {
00176 delete const_cast<DOM::Node *>(node);
00177 }
00179 virtual void returnAttribute(const HTML::Attributes::Attribute * attribute) const volatile throw()
00180 {
00181 delete const_cast<HTML::Attributes::Attribute*>(attribute);
00182 }
00184 virtual void returnElement(const HTML::Elements::Element * element) const volatile throw()
00185 {
00186 delete const_cast<HTML::Elements::Element *>(element);
00187 }
00189 virtual void returnDocumentType(const DOM::DocumentType * docType) const volatile throw()
00190 {
00191 delete const_cast<DOM::DocumentType *>(docType);
00192 }
00193
00194 };
00195
00196
00197 }
00198 }
00199 }
00200
00201 #endif