Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * This file is part of libdom.
  3.  * Licensed under the MIT License,
  4.  *                http://www.opensource.org/licenses/mit-license.php
  5.  * Copyright 2007 John-Mark Bell <jmb@netsurf-browser.org>
  6.  */
  7.  
  8. #ifndef dom_internal_core_document_h_
  9. #define dom_internal_core_document_h_
  10.  
  11. #include <inttypes.h>
  12. #include <stddef.h>
  13.  
  14. #include <dom/core/node.h>
  15. #include <dom/core/attr.h>
  16. #include <dom/core/cdatasection.h>
  17. #include <dom/core/comment.h>
  18. #include <dom/core/document.h>
  19. #include <dom/core/document_type.h>
  20. #include <dom/core/doc_fragment.h>
  21. #include <dom/core/element.h>
  22. #include <dom/core/entity_ref.h>
  23. #include <dom/core/pi.h>
  24. #include <dom/core/text.h>
  25. #include <dom/core/implementation.h>
  26.  
  27. #include "core/string.h"
  28. #include "core/node.h"
  29. #include "core/nodelist.h"
  30.  
  31. #include "utils/hashtable.h"
  32. #include "utils/list.h"
  33.  
  34. #include "events/document_event.h"
  35.  
  36. struct dom_doc_nl;
  37.  
  38. /**
  39.  * DOM document
  40.  * This should be protected, because later the HTMLDocument will inherit from
  41.  * this.
  42.  */
  43. struct dom_document {
  44.         dom_node_internal base;         /**< Base node */
  45.  
  46.         struct dom_doc_nl *nodelists;   /**< List of active nodelists */
  47.  
  48.         dom_string *uri;                /**< The uri of this document */
  49.  
  50.         struct list_entry pending_nodes;
  51.                         /**< The deletion pending list */
  52.  
  53.         dom_string *id_name;            /**< The ID attribute's name */
  54.  
  55.         dom_string *class_string;       /**< The string "class". */
  56.  
  57.         dom_document_event_internal dei;
  58.                         /**< The DocumentEvent interface */
  59.         dom_document_quirks_mode quirks;
  60.                                 /**< Document is in quirks mode */
  61.         dom_string *_memo_empty;        /**< The string ''. */
  62.  
  63.         /* Memoised event strings */
  64.         dom_string *_memo_domnodeinserted; /**< DOMNodeInserted */
  65.         dom_string *_memo_domnoderemoved;  /**< DOMNodeRemoved */
  66.         dom_string *_memo_domnodeinsertedintodocument; /**< DOMNodeInsertedIntoDocument */
  67.         dom_string *_memo_domnoderemovedfromdocument;  /**< DOMNodeRemovedFromDocument */
  68.         dom_string *_memo_domattrmodified; /**< DOMAttrModified */
  69.         dom_string *_memo_domcharacterdatamodified; /**< DOMCharacterDataModified */
  70.         dom_string *_memo_domsubtreemodified; /**< DOMSubtreeModified */
  71. };
  72.  
  73. /* Create a DOM document */
  74. dom_exception _dom_document_create(dom_events_default_action_fetcher daf,
  75.                                    void *daf_ctx,
  76.                                    dom_document **doc);
  77.  
  78. /* Initialise the document */
  79. dom_exception _dom_document_initialise(dom_document *doc,
  80.                 dom_events_default_action_fetcher daf,
  81.                                    void *daf_ctx);
  82.  
  83. /* Finalise the document */
  84. bool _dom_document_finalise(dom_document *doc);
  85.  
  86. /* Begin the virtual functions */
  87. dom_exception _dom_document_get_doctype(dom_document *doc,
  88.                 dom_document_type **result);
  89. dom_exception _dom_document_get_implementation(dom_document *doc,
  90.                 dom_implementation **result);
  91. dom_exception _dom_document_get_document_element(dom_document *doc,
  92.                 dom_element **result);
  93. dom_exception _dom_document_create_element(dom_document *doc,
  94.                 dom_string *tag_name, dom_element **result);
  95. dom_exception _dom_document_create_document_fragment(dom_document *doc,
  96.                 dom_document_fragment **result);
  97. dom_exception _dom_document_create_text_node(dom_document *doc,
  98.                 dom_string *data, dom_text **result);
  99. dom_exception _dom_document_create_comment(dom_document *doc,
  100.                 dom_string *data, dom_comment **result);
  101. dom_exception _dom_document_create_cdata_section(dom_document *doc,
  102.                 dom_string *data, dom_cdata_section **result);
  103. dom_exception _dom_document_create_processing_instruction(
  104.                 dom_document *doc, dom_string *target,
  105.                 dom_string *data,
  106.                 dom_processing_instruction **result);
  107. dom_exception _dom_document_create_attribute(dom_document *doc,
  108.                 dom_string *name, dom_attr **result);
  109. dom_exception _dom_document_create_entity_reference(dom_document *doc,
  110.                 dom_string *name,
  111.                 dom_entity_reference **result);
  112. dom_exception _dom_document_get_elements_by_tag_name(dom_document *doc,
  113.                 dom_string *tagname, dom_nodelist **result);
  114. dom_exception _dom_document_import_node(dom_document *doc,
  115.                 dom_node *node, bool deep, dom_node **result);
  116. dom_exception _dom_document_create_element_ns(dom_document *doc,
  117.                 dom_string *namespace, dom_string *qname,
  118.                 dom_element **result);
  119. dom_exception _dom_document_create_attribute_ns(dom_document *doc,
  120.                 dom_string *namespace, dom_string *qname,
  121.                 dom_attr **result);
  122. dom_exception _dom_document_get_elements_by_tag_name_ns(
  123.                 dom_document *doc, dom_string *namespace,
  124.                 dom_string *localname, dom_nodelist **result);
  125. dom_exception _dom_document_get_element_by_id(dom_document *doc,
  126.                 dom_string *id, dom_element **result);
  127. dom_exception _dom_document_get_input_encoding(dom_document *doc,
  128.                 dom_string **result);
  129. dom_exception _dom_document_get_xml_encoding(dom_document *doc,
  130.                 dom_string **result);
  131. dom_exception _dom_document_get_xml_standalone(dom_document *doc,
  132.                 bool *result);
  133. dom_exception _dom_document_set_xml_standalone(dom_document *doc,
  134.                 bool standalone);
  135. dom_exception _dom_document_get_xml_version(dom_document *doc,
  136.                 dom_string **result);
  137. dom_exception _dom_document_set_xml_version(dom_document *doc,
  138.                 dom_string *version);
  139. dom_exception _dom_document_get_strict_error_checking(
  140.                 dom_document *doc, bool *result);
  141. dom_exception _dom_document_set_strict_error_checking(
  142.                 dom_document *doc, bool strict);
  143. dom_exception _dom_document_get_uri(dom_document *doc,
  144.                 dom_string **result);
  145. dom_exception _dom_document_set_uri(dom_document *doc,
  146.                 dom_string *uri);
  147. dom_exception _dom_document_adopt_node(dom_document *doc,
  148.                 dom_node *node, dom_node **result);
  149. dom_exception _dom_document_get_dom_config(dom_document *doc,
  150.                 struct dom_configuration **result);
  151. dom_exception _dom_document_normalize(dom_document *doc);
  152. dom_exception _dom_document_rename_node(dom_document *doc,
  153.                 dom_node *node,
  154.                 dom_string *namespace, dom_string *qname,
  155.                 dom_node **result);
  156. dom_exception _dom_document_get_quirks_mode(dom_document *doc,
  157.                 dom_document_quirks_mode *result);
  158. dom_exception _dom_document_set_quirks_mode(dom_document *doc,
  159.                 dom_document_quirks_mode result);
  160.  
  161.  
  162. dom_exception _dom_document_get_text_content(dom_node_internal *node,
  163.                                              dom_string **result);
  164. dom_exception _dom_document_set_text_content(dom_node_internal *node,
  165.                                              dom_string *content);
  166.  
  167. #define DOM_DOCUMENT_VTABLE \
  168.         _dom_document_get_doctype, \
  169.         _dom_document_get_implementation, \
  170.         _dom_document_get_document_element, \
  171.         _dom_document_create_element, \
  172.         _dom_document_create_document_fragment, \
  173.         _dom_document_create_text_node, \
  174.         _dom_document_create_comment, \
  175.         _dom_document_create_cdata_section, \
  176.         _dom_document_create_processing_instruction, \
  177.         _dom_document_create_attribute, \
  178.         _dom_document_create_entity_reference, \
  179.         _dom_document_get_elements_by_tag_name, \
  180.         _dom_document_import_node, \
  181.         _dom_document_create_element_ns, \
  182.         _dom_document_create_attribute_ns, \
  183.         _dom_document_get_elements_by_tag_name_ns, \
  184.         _dom_document_get_element_by_id, \
  185.         _dom_document_get_input_encoding, \
  186.         _dom_document_get_xml_encoding, \
  187.         _dom_document_get_xml_standalone, \
  188.         _dom_document_set_xml_standalone, \
  189.         _dom_document_get_xml_version, \
  190.         _dom_document_set_xml_version, \
  191.         _dom_document_get_strict_error_checking, \
  192.         _dom_document_set_strict_error_checking, \
  193.         _dom_document_get_uri, \
  194.         _dom_document_set_uri, \
  195.         _dom_document_adopt_node, \
  196.         _dom_document_get_dom_config, \
  197.         _dom_document_normalize, \
  198.         _dom_document_rename_node, \
  199.         _dom_document_get_quirks_mode, \
  200.         _dom_document_set_quirks_mode
  201.  
  202. /* End of vtable */
  203.  
  204. #define DOM_NODE_VTABLE_DOCUMENT \
  205.         _dom_node_try_destroy, \
  206.         _dom_node_get_node_name, \
  207.         _dom_node_get_node_value, \
  208.         _dom_node_set_node_value, \
  209.         _dom_node_get_node_type, \
  210.         _dom_node_get_parent_node, \
  211.         _dom_node_get_child_nodes, \
  212.         _dom_node_get_first_child, \
  213.         _dom_node_get_last_child, \
  214.         _dom_node_get_previous_sibling, \
  215.         _dom_node_get_next_sibling, \
  216.         _dom_node_get_attributes, \
  217.         _dom_node_get_owner_document, \
  218.         _dom_node_insert_before, \
  219.         _dom_node_replace_child, \
  220.         _dom_node_remove_child, \
  221.         _dom_node_append_child, \
  222.         _dom_node_has_child_nodes, \
  223.         _dom_node_clone_node, \
  224.         _dom_node_normalize, \
  225.         _dom_node_is_supported, \
  226.         _dom_node_get_namespace, \
  227.         _dom_node_get_prefix, \
  228.         _dom_node_set_prefix, \
  229.         _dom_node_get_local_name, \
  230.         _dom_node_has_attributes, \
  231.         _dom_node_get_base, \
  232.         _dom_node_compare_document_position, \
  233.         _dom_document_get_text_content, \
  234.         _dom_document_set_text_content, \
  235.         _dom_node_is_same, \
  236.         _dom_node_lookup_prefix, \
  237.         _dom_node_is_default_namespace, \
  238.         _dom_node_lookup_namespace, \
  239.         _dom_node_is_equal, \
  240.         _dom_node_get_feature, \
  241.         _dom_node_set_user_data, \
  242.         _dom_node_get_user_data
  243.  
  244. /** \todo Unused! */
  245. /**
  246.  * The internal used vtable for document
  247.  */
  248. struct dom_document_protected_vtable {
  249.         struct dom_node_protect_vtable base;
  250.         dom_exception (*dom_document_get_base)(dom_document *doc,
  251.                         dom_string **base_uri);
  252.                         /* Get the document's base uri */
  253. };
  254.  
  255. typedef struct dom_document_protected_vtable dom_document_protected_vtable;
  256.  
  257. /* Get the document's base URI */
  258. static inline dom_exception dom_document_get_base(dom_document *doc,
  259.                 dom_string **base_uri)
  260. {
  261.         dom_node_internal *node = (dom_node_internal *) doc;
  262.         return ((dom_document_protected_vtable *) node->vtable)->
  263.                         dom_document_get_base(doc, base_uri);
  264. }
  265. #define dom_document_get_base(d, b) dom_document_get_base( \
  266.                 (dom_document *) (d), (dom_string **) (b))
  267.  
  268. /* Following comes the protected vtable  */
  269. void _dom_document_destroy(dom_node_internal *node);
  270. dom_exception _dom_document_copy(dom_node_internal *old,
  271.                 dom_node_internal **copy);
  272.  
  273. #define DOM_DOCUMENT_PROTECT_VTABLE \
  274.         _dom_document_destroy, \
  275.         _dom_document_copy
  276.  
  277.  
  278. /*---------------------------- Helper functions ---------------------------*/
  279.  
  280. /* Try to destroy the document:
  281.  * When the refcnt is zero and the pending list is empty, we can destroy this
  282.  * document. */
  283. void _dom_document_try_destroy(dom_document *doc);
  284.  
  285. /* Get a nodelist, creating one if necessary */
  286. dom_exception _dom_document_get_nodelist(dom_document *doc,
  287.                 nodelist_type type, dom_node_internal *root,
  288.                 dom_string *tagname, dom_string *namespace,
  289.                 dom_string *localname, dom_nodelist **list);
  290. /* Remove a nodelist */
  291. void _dom_document_remove_nodelist(dom_document *doc, dom_nodelist *list);
  292.  
  293. /* Find element with certain ID in the subtree rooted at root */
  294. dom_exception _dom_find_element_by_id(dom_node_internal *root,
  295.                 dom_string *id, dom_element **result);
  296.  
  297. /* Set the ID attribute name of this document */
  298. void _dom_document_set_id_name(dom_document *doc, dom_string *name);
  299.  
  300. #define _dom_document_get_id_name(d) (d->id_name)
  301.  
  302. #endif
  303.