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_element_h_
  9. #define dom_internal_core_element_h_
  10.  
  11. #include <stdbool.h>
  12.  
  13. #include <dom/core/element.h>
  14.  
  15. #include "core/node.h"
  16.  
  17. struct dom_document;
  18. struct dom_element;
  19. struct dom_namednodemap;
  20. struct dom_node;
  21. struct dom_attr;
  22. struct dom_attr_list;
  23. struct dom_type_info;
  24. struct dom_hash_table;
  25.  
  26. /**
  27.  * DOM element node
  28.  */
  29. struct dom_element {
  30.         struct dom_node_internal base;          /**< Base node */
  31.  
  32.         struct dom_attr_list *attributes;       /**< Element attributes */
  33.  
  34.         dom_string *id_ns;      /**< The id attribute's namespace */
  35.  
  36.         dom_string *id_name;    /**< The id attribute's name */
  37.  
  38.         struct dom_type_info *schema_type_info; /**< Type information */
  39.  
  40.         lwc_string **classes;
  41.         uint32_t n_classes;
  42. };
  43.  
  44. dom_exception _dom_element_create(struct dom_document *doc,
  45.                 dom_string *name, dom_string *namespace,
  46.                 dom_string *prefix, struct dom_element **result);
  47.  
  48. dom_exception _dom_element_initialise(struct dom_document *doc,
  49.                 struct dom_element *el, dom_string *name,
  50.                 dom_string *namespace, dom_string *prefix);
  51.  
  52. void _dom_element_finalise(struct dom_element *ele);
  53.  
  54. void _dom_element_destroy(struct dom_element *element);
  55.  
  56.  
  57. /* The virtual functions of dom_element */
  58. dom_exception _dom_element_get_tag_name(struct dom_element *element,
  59.                 dom_string **name);
  60. dom_exception _dom_element_get_attribute(struct dom_element *element,
  61.                 dom_string *name, dom_string **value);
  62. dom_exception _dom_element_set_attribute(struct dom_element *element,
  63.                 dom_string *name, dom_string *value);
  64. dom_exception _dom_element_remove_attribute(struct dom_element *element,
  65.                 dom_string *name);
  66. dom_exception _dom_element_get_attribute_node(struct dom_element *element,
  67.                 dom_string *name, struct dom_attr **result);
  68. dom_exception _dom_element_set_attribute_node(struct dom_element *element,
  69.                 struct dom_attr *attr, struct dom_attr **result);
  70. dom_exception _dom_element_remove_attribute_node(struct dom_element *element,
  71.                 struct dom_attr *attr, struct dom_attr **result);
  72. dom_exception _dom_element_get_elements_by_tag_name(
  73.                 struct dom_element *element, dom_string *name,
  74.                 struct dom_nodelist **result);
  75.  
  76. dom_exception _dom_element_get_attribute_ns(struct dom_element *element,
  77.                 dom_string *namespace, dom_string *localname,
  78.                 dom_string **value);
  79. dom_exception _dom_element_set_attribute_ns(struct dom_element *element,
  80.                 dom_string *namespace, dom_string *qname,
  81.                 dom_string *value);
  82. dom_exception _dom_element_remove_attribute_ns(struct dom_element *element,
  83.                 dom_string *namespace, dom_string *localname);
  84. dom_exception _dom_element_get_attribute_node_ns(struct dom_element *element,
  85.                 dom_string *namespace, dom_string *localname,
  86.                 struct dom_attr **result);
  87. dom_exception _dom_element_set_attribute_node_ns(struct dom_element *element,
  88.                 struct dom_attr *attr, struct dom_attr **result);
  89. dom_exception _dom_element_get_elements_by_tag_name_ns(
  90.                 struct dom_element *element, dom_string *namespace,
  91.                 dom_string *localname, struct dom_nodelist **result);
  92. dom_exception _dom_element_has_attribute(struct dom_element *element,
  93.                 dom_string *name, bool *result);
  94. dom_exception _dom_element_has_attribute_ns(struct dom_element *element,
  95.                 dom_string *namespace, dom_string *localname,
  96.                 bool *result);
  97. dom_exception _dom_element_get_schema_type_info(struct dom_element *element,
  98.                 struct dom_type_info **result);
  99. dom_exception _dom_element_set_id_attribute(struct dom_element *element,
  100.                 dom_string *name, bool is_id);
  101. dom_exception _dom_element_set_id_attribute_ns(struct dom_element *element,
  102.                 dom_string *namespace, dom_string *localname,
  103.                 bool is_id);
  104. dom_exception _dom_element_set_id_attribute_node(struct dom_element *element,
  105.                 struct dom_attr *id_attr, bool is_id);
  106. dom_exception _dom_element_get_classes(struct dom_element *element,
  107.                 lwc_string ***classes, uint32_t *n_classes);
  108. dom_exception _dom_element_has_class(struct dom_element *element,
  109.                 lwc_string *name, bool *match);
  110.  
  111. #define DOM_ELEMENT_VTABLE \
  112.         _dom_element_get_tag_name, \
  113.         _dom_element_get_attribute, \
  114.         _dom_element_set_attribute, \
  115.         _dom_element_remove_attribute, \
  116.         _dom_element_get_attribute_node, \
  117.         _dom_element_set_attribute_node, \
  118.         _dom_element_remove_attribute_node, \
  119.         _dom_element_get_elements_by_tag_name, \
  120.         _dom_element_get_attribute_ns, \
  121.         _dom_element_set_attribute_ns, \
  122.         _dom_element_remove_attribute_ns, \
  123.         _dom_element_get_attribute_node_ns, \
  124.         _dom_element_set_attribute_node_ns, \
  125.         _dom_element_get_elements_by_tag_name_ns, \
  126.         _dom_element_has_attribute, \
  127.         _dom_element_has_attribute_ns, \
  128.         _dom_element_get_schema_type_info, \
  129.         _dom_element_set_id_attribute, \
  130.         _dom_element_set_id_attribute_ns, \
  131.         _dom_element_set_id_attribute_node, \
  132.         _dom_element_get_classes, \
  133.         _dom_element_has_class
  134.  
  135. /* Overloading dom_node functions */
  136. dom_exception _dom_element_get_attributes(dom_node_internal *node,
  137.                 struct dom_namednodemap **result);
  138. dom_exception _dom_element_has_attributes(dom_node_internal *node,
  139.                 bool *result);
  140. dom_exception _dom_element_normalize(dom_node_internal *node);
  141. dom_exception _dom_element_lookup_prefix(dom_node_internal *node,
  142.                 dom_string *namespace, dom_string **result);
  143. dom_exception _dom_element_is_default_namespace(dom_node_internal *node,
  144.                 dom_string *namespace, bool *result);
  145. dom_exception _dom_element_lookup_namespace(dom_node_internal *node,
  146.                 dom_string *prefix, dom_string **result);
  147. #define DOM_NODE_VTABLE_ELEMENT \
  148.         _dom_node_try_destroy, \
  149.         _dom_node_get_node_name, \
  150.         _dom_node_get_node_value, \
  151.         _dom_node_set_node_value, \
  152.         _dom_node_get_node_type, \
  153.         _dom_node_get_parent_node, \
  154.         _dom_node_get_child_nodes, \
  155.         _dom_node_get_first_child, \
  156.         _dom_node_get_last_child, \
  157.         _dom_node_get_previous_sibling, \
  158.         _dom_node_get_next_sibling, \
  159.         _dom_element_get_attributes, /*overload*/\
  160.         _dom_node_get_owner_document, \
  161.         _dom_node_insert_before, \
  162.         _dom_node_replace_child, \
  163.         _dom_node_remove_child, \
  164.         _dom_node_append_child, \
  165.         _dom_node_has_child_nodes, \
  166.         _dom_node_clone_node, \
  167.         _dom_node_normalize, \
  168.         _dom_node_is_supported, \
  169.         _dom_node_get_namespace, \
  170.         _dom_node_get_prefix, \
  171.         _dom_node_set_prefix, \
  172.         _dom_node_get_local_name, \
  173.         _dom_element_has_attributes, /*overload*/\
  174.         _dom_node_get_base, \
  175.         _dom_node_compare_document_position, \
  176.         _dom_node_get_text_content, \
  177.         _dom_node_set_text_content, \
  178.         _dom_node_is_same, \
  179.         _dom_element_lookup_prefix, /*overload*/\
  180.         _dom_element_is_default_namespace, /*overload*/\
  181.         _dom_element_lookup_namespace, /*overload*/\
  182.         _dom_node_is_equal, \
  183.         _dom_node_get_feature, \
  184.         _dom_node_set_user_data, \
  185.         _dom_node_get_user_data
  186.  
  187. /**
  188.  * The internal used vtable for element
  189.  */
  190. struct dom_element_protected_vtable {
  191.         struct dom_node_protect_vtable base;
  192.  
  193.         dom_exception (*dom_element_parse_attribute)(dom_element *ele,
  194.                         dom_string *name, dom_string *value,
  195.                         dom_string **parsed);
  196.                         /**< Called by dom_attr_set_value, and used to check
  197.                          *   whether the new attribute value is valid and
  198.                          *   return a valid on if it is not
  199.                          */
  200. };
  201.  
  202. typedef struct dom_element_protected_vtable dom_element_protected_vtable;
  203.  
  204. /* Parse the attribute's value */
  205. static inline dom_exception dom_element_parse_attribute(dom_element *ele,
  206.                 dom_string *name, dom_string *value,
  207.                 dom_string **parsed)
  208. {
  209.         struct dom_node_internal *node = (struct dom_node_internal *) ele;
  210.         return ((dom_element_protected_vtable *) node->vtable)->
  211.                         dom_element_parse_attribute(ele, name, value, parsed);
  212. }
  213. #define dom_element_parse_attribute(e, n, v, p) dom_element_parse_attribute( \
  214.                 (dom_element *) (e), (dom_string *) (n), \
  215.                 (dom_string *) (v), (dom_string **) (p))
  216.  
  217.  
  218. /* The protected virtual function */
  219. dom_exception _dom_element_parse_attribute(dom_element *ele,
  220.                 dom_string *name, dom_string *value,
  221.                 dom_string **parsed);
  222. void __dom_element_destroy(dom_node_internal *node);
  223. dom_exception _dom_element_copy(dom_node_internal *old,
  224.                 dom_node_internal **copy);
  225.  
  226. #define DOM_ELEMENT_PROTECT_VTABLE \
  227.         _dom_element_parse_attribute
  228.  
  229. #define DOM_NODE_PROTECT_VTABLE_ELEMENT \
  230.         __dom_element_destroy, \
  231.         _dom_element_copy
  232.  
  233. /* Helper functions*/
  234. dom_exception _dom_element_get_id(struct dom_element *ele, dom_string **id);
  235.  
  236. extern struct dom_element_vtable _dom_element_vtable;
  237.  
  238. #endif
  239.