/* * This file is part of libdom. * Licensed under the MIT License, * http://www.opensource.org/licenses/mit-license.php * Copyright 2007 John-Mark Bell */ #ifndef dom_core_attr_h_ #define dom_core_attr_h_ #include #include #include struct dom_element; struct dom_type_info; struct dom_node; struct dom_attr; typedef struct dom_attr dom_attr; /** * The attribute type */ typedef enum { DOM_ATTR_UNSET = 0, DOM_ATTR_STRING, DOM_ATTR_BOOL, DOM_ATTR_SHORT, DOM_ATTR_INTEGER } dom_attr_type; /* DOM Attr vtable */ typedef struct dom_attr_vtable { struct dom_node_vtable base; dom_exception (*dom_attr_get_name)(struct dom_attr *attr, dom_string **result); dom_exception (*dom_attr_get_specified)(struct dom_attr *attr, bool *result); dom_exception (*dom_attr_get_value)(struct dom_attr *attr, dom_string **result); dom_exception (*dom_attr_set_value)(struct dom_attr *attr, dom_string *value); dom_exception (*dom_attr_get_owner_element)(struct dom_attr *attr, struct dom_element **result); dom_exception (*dom_attr_get_schema_type_info)(struct dom_attr *attr, struct dom_type_info **result); dom_exception (*dom_attr_is_id)(struct dom_attr *attr, bool *result); } dom_attr_vtable; static inline dom_exception dom_attr_get_name(struct dom_attr *attr, dom_string **result) { return ((dom_attr_vtable *) ((dom_node *) attr)->vtable)-> dom_attr_get_name(attr, result); } #define dom_attr_get_name(a, r) dom_attr_get_name((struct dom_attr *) (a), (r)) static inline dom_exception dom_attr_get_specified(struct dom_attr *attr, bool *result) { return ((dom_attr_vtable *) ((dom_node *) attr)->vtable)-> dom_attr_get_specified(attr, result); } #define dom_attr_get_specified(a, r) dom_attr_get_specified( \ (struct dom_attr *) (a), (bool *) (r)) static inline dom_exception dom_attr_get_value(struct dom_attr *attr, dom_string **result) { return ((dom_attr_vtable *) ((dom_node *) attr)->vtable)-> dom_attr_get_value(attr, result); } #define dom_attr_get_value(a, r) dom_attr_get_value((struct dom_attr *) (a), (r)) static inline dom_exception dom_attr_set_value(struct dom_attr *attr, dom_string *value) { return ((dom_attr_vtable *) ((dom_node *) attr)->vtable)-> dom_attr_set_value(attr, value); } #define dom_attr_set_value(a, v) dom_attr_set_value((struct dom_attr *) (a), (v)) static inline dom_exception dom_attr_get_owner_element(struct dom_attr *attr, struct dom_element **result) { return ((dom_attr_vtable *) ((dom_node *) attr)->vtable)-> dom_attr_get_owner_element(attr, result); } #define dom_attr_get_owner_element(a, r) dom_attr_get_owner_element(\ (struct dom_attr *) (a), (struct dom_element **) (r)) static inline dom_exception dom_attr_get_schema_type_info( struct dom_attr *attr, struct dom_type_info **result) { return ((dom_attr_vtable *) ((dom_node *) attr)->vtable)-> dom_attr_get_schema_type_info(attr, result); } #define dom_attr_get_schema_type_info(a, r) dom_attr_get_schema_type_info( \ (struct dom_attr *) (a), (struct dom_type_info **) (r)) static inline dom_exception dom_attr_is_id(struct dom_attr *attr, bool *result) { return ((dom_attr_vtable *) ((dom_node *) attr)->vtable)-> dom_attr_is_id(attr, result); } #define dom_attr_is_id(a, r) dom_attr_is_id((struct dom_attr *) (a), \ (bool *) (r)) /*-----------------------------------------------------------------------*/ /** * Following are our implementation specific APIs. * * These APIs are defined for the purpose that there are some attributes in * HTML and other DOM module whose type is not DOMString, but uint32_t or * boolean, for those types of attributes, clients should call one of the * following APIs to set it. * * When an Attr node is created, its type is unset and it can be turned into * any of the four types. Once the type is fixed by calling any of the four * APIs: * dom_attr_set_value * dom_attr_set_integer * dom_attr_set_short * dom_attr_set_bool * it can't be modified in future. * * For integer/short/bool type of attributes, we provide no string * repensentation of them, so when you call dom_attr_get_value on these * three type of attribute nodes, you will always get a empty dom_string. * If you want to do something with Attr node, you must know its type * firstly by calling dom_attr_get_type before you decide to call other * dom_attr_get_* functions. */ dom_attr_type dom_attr_get_type(dom_attr *a); dom_exception dom_attr_get_integer(dom_attr *a, uint32_t *value); dom_exception dom_attr_set_integer(dom_attr *a, uint32_t value); dom_exception dom_attr_get_short(dom_attr *a, unsigned short *value); dom_exception dom_attr_set_short(dom_attr *a, unsigned short value); dom_exception dom_attr_get_bool(dom_attr *a, bool *value); dom_exception dom_attr_set_bool(dom_attr *a, bool value); /* Make a attribute node readonly */ void dom_attr_mark_readonly(dom_attr *a); #endif