/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef AXIOM_NODE_H #define AXIOM_NODE_H /** * @defgroup axiom AXIOM project * @{ * @} */ /** * @defgroup axiom_om AXIOM * @ingroup axiom * @{ * @} */ /** * @file axiom_node.h * @brief defines axiom_node struct */ #include #include #ifdef __cplusplus extern "C" { #endif typedef struct axiom_node axiom_node_t; struct axiom_output; struct axiom_document; struct axiom_stax_builder; /** * @defgroup axiom_node node * @ingroup axiom_om * @{ */ /** * @brief AXIOM types */ typedef enum axiom_types_t { /** Invalid node type */ AXIOM_INVALID = 0, /** AXIOM document type */ AXIOM_DOCUMENT, /** AXIOM element type */ AXIOM_ELEMENT, /** AXIOM doctype type */ AXIOM_DOCTYPE, /** AXIOM comment type */ AXIOM_COMMENT, /** AXIOM attribute type */ AXIOM_ATTRIBUTE, /** AXIOM namespace type */ AXIOM_NAMESPACE, /** AXIOM processing instruction type */ AXIOM_PROCESSING_INSTRUCTION, /** AXIOM text type */ AXIOM_TEXT, /** AXIOM data source, represent a serialized XML fragment with a stream */ AXIOM_DATA_SOURCE } axiom_types_t; /** * Creates a node struct. * @param env Environment. MUST NOT be NULL, . * @return a pointer to newly created node struct. NULL on error. */ AXIS2_EXTERN axiom_node_t *AXIS2_CALL axiom_node_create( const axutil_env_t * env); /** * Creates a node struct from a character buffer. * @param env Environment. MUST NOT be NULL, . * @param buffer string. buffer to make the node * @return a pointer to newly created node struct. NULL on error. */ AXIS2_EXTERN axiom_node_t* AXIS2_CALL axiom_node_create_from_buffer( const axutil_env_t * env, axis2_char_t *buffer); /** * Frees an om node and all of its children. Please note that the attached * data_element will also be freed along with the node. If the node is * still attached to a parent, it will be detached first, then freed. * @param om_node node to be freed. * @param env Environment. MUST NOT be NULL, . * @return satus of the op. AXIS2_SUCCESS on success else AXIS2_FAILURE */ AXIS2_EXTERN void AXIS2_CALL axiom_node_free_tree( axiom_node_t * om_node, const axutil_env_t * env); /** * Adds given node as child to parent. child should not have a parent * if child has a parent it will be detached from existing parent * @param om_node parent node. cannot be NULL. * @param env Environment. MUST NOT be NULL, . * @param child child node. * @return satus of the op. AXIS2_SUCCESS on success else AXIS2_FAILURE */ AXIS2_EXTERN axis2_status_t AXIS2_CALL axiom_node_add_child( axiom_node_t * om_node, const axutil_env_t * env, axiom_node_t * child); /** * Detaches given node from the parent and reset the links. Will recreate "namespace defined in * the parent and used in detached node" within detached node itself * @param om_node node to be detached, cannot be NULL. * @param env Environment. MUST NOT be NULL, . * @return a pointer to detached node,returns NULL on error */ AXIS2_EXTERN axiom_node_t *AXIS2_CALL axiom_node_detach( axiom_node_t * om_node, const axutil_env_t * env); /** * Detaches given node from the parent and reset the links. will not adjust the namespace as * in the case of axiom_node_detach. * @param om_node node to be detached, cannot be NULL. * @param env Environment. MUST NOT be NULL, . * @return a pointer to detached node,returns NULL on error */ AXIS2_EXTERN axiom_node_t *AXIS2_CALL axiom_node_detach_without_namespaces( axiom_node_t * om_node, const axutil_env_t * env); /** * Inserts a sibling node after the given node * @param om_node node to whom the sibling to be inserted. , cannot be NULL. * @param env Environment. MUST NOT be NULL, . * @param node_to_insert the node to be inserted. , cannot be NULL. * @return satus of the op. AXIS2_SUCCESS on success else AXIS2_FAILURE */ AXIS2_EXTERN axis2_status_t AXIS2_CALL axiom_node_insert_sibling_after( axiom_node_t * om_node, const axutil_env_t * env, axiom_node_t * node_to_insert); /** * Inserts a sibling node before the given current node * @param om_node node to whom the sibling to be inserted. , cannot be NULL. * @param env Environment. MUST NOT be NULL, . * @param node_to_insert the node to be inserted. , cannot be NULL. * @return satus of the op. AXIS2_SUCCESS on success else AXIS2_FAILURE */ AXIS2_EXTERN axis2_status_t AXIS2_CALL axiom_node_insert_sibling_before( axiom_node_t * om_node, const axutil_env_t * env, axiom_node_t * node_to_insert); /** * Serializes the given node. This op makes the node go * through its children and serialize them in order. * @param om_node node to be serialized. cannot be NULL. * @param env Environment .MUST NOT be NULL. * @param om_output AXIOM output handler to be used in serializing * @return satus of the op. AXIS2_SUCCESS on success else AXIS2_FAILURE */ AXIS2_EXTERN axis2_status_t AXIS2_CALL axiom_node_serialize( axiom_node_t * om_node, const axutil_env_t * env, struct axiom_output *om_output); /** get parent of om_node *@om_node node *@param env environment *@return pointer to parent node of om_node, return NULL if no parent exists or * when an error occured. */ AXIS2_EXTERN axiom_node_t *AXIS2_CALL axiom_node_get_parent( axiom_node_t * om_node, const axutil_env_t * env); /** * get the first child of om_node * @param om_node node * @param env environment must not be null. * @returns pointer to first child node , NULL is returned on error with * error code set in environments error */ AXIS2_EXTERN axiom_node_t *AXIS2_CALL axiom_node_get_first_child( axiom_node_t * om_node, const axutil_env_t * env); /**get the first AXIOM_ELEMENT in om_node * @param om_node node * @param env environment must not be null * @returns pointer to first child om element, NULL is returned on error * with error code set in environments error. */ AXIS2_EXTERN axiom_node_t *AXIS2_CALL axiom_node_get_first_element( axiom_node_t * om_node, const axutil_env_t * env); /** * get the last child * @param om_node node * @param env environment, MUST NOT be NULL * @return pointer to last child of this node , return NULL on error. */ AXIS2_EXTERN axiom_node_t *AXIS2_CALL axiom_node_get_last_child( axiom_node_t * om_node, const axutil_env_t * env); /** * get the previous sibling * @param om_node om_node struct * @param env environment , must node be null * @returns a pointer to previous sibling , NULL if a previous sibling does not exits * (happens when this node is the first child of a node ) */ AXIS2_EXTERN axiom_node_t *AXIS2_CALL axiom_node_get_previous_sibling( axiom_node_t * om_node, const axutil_env_t * env); /** * get the previous sibling of type AXIOM_ELEMENT * @param om_node om_node struct * @param env environment , must node be null * @returns a pointer to previous sibling , NULL if a previous sibling does not exits * (happens when this node is the first element of a node ) */ AXIS2_EXTERN axiom_node_t *AXIS2_CALL axiom_node_get_previous_sibling_element( axiom_node_t * om_node, const axutil_env_t * env); /** * get next sibling * @param om_node om_node struct * @param env environment, MUST NOT be NULL. * @return next sibling of this node. */ AXIS2_EXTERN axiom_node_t *AXIS2_CALL axiom_node_get_next_sibling( axiom_node_t * om_node, const axutil_env_t * env); /** * get next sibling of type AXIOM_ELEMENT * @param om_node om_node struct * @param env environment, MUST NOT be NULL. * @return next sibling of this node. */ AXIS2_EXTERN axiom_node_t *AXIS2_CALL axiom_node_get_next_sibling_element( axiom_node_t * om_node, const axutil_env_t * env); /** * get the node type of this element * Node type can be one of AXIOM_ELEMENT, AXIOM_COMMENT, AXIOM_TEXT * AXIOM_DOCTYPE, AXIOM_PROCESSING_INSTRUCTION * @param om_node node of which node type is required * @param env environment * @return node type */ AXIS2_EXTERN axiom_types_t AXIS2_CALL axiom_node_get_node_type( axiom_node_t * om_node, const axutil_env_t * env); /** * get the struct contained in the node * IF the node is on type AXIOM_ELEMENT , this method returns * a pointer to axiom_element_t struct contained * @param om_node node * @param env environment, MUST NOT be NULL. * @returns pointer to struct contained in the node * returns NULL if no struct is contained */ AXIS2_EXTERN void *AXIS2_CALL axiom_node_get_data_element( axiom_node_t * om_node, const axutil_env_t * env); /** * Indicates whether parser has parsed this information item completely or not * @param om_node om_node struct * @param env environment, MUST NOT be NULL. * @returns AXIS2_TRUE if node is completly build, * AXIS2_FALSE if node is not completed */ AXIS2_EXTERN axis2_bool_t AXIS2_CALL axiom_node_is_complete( axiom_node_t * om_node, const axutil_env_t * env); /** * returns the associated document, * only valid if built using builder and for a node of type * AXIOM_ELEMENT * returns null if no document is available * @param om_node * @param env environment, MUST NOT be NULL. * * @return the OM document of the node */ AXIS2_EXTERN struct axiom_document *AXIS2_CALL axiom_node_get_document( axiom_node_t * om_node, const axutil_env_t * env); /** * * @param om_node pointer to the OM node struct * @param env environment, MUST NOT be NULL * * @return the string representation of the node */ AXIS2_EXTERN axis2_char_t *AXIS2_CALL axiom_node_to_string( axiom_node_t * om_node, const axutil_env_t * env); /** * * @param om_node pointer to the OM node struct * @param env environment, MUST NOT be NULL * @param om_output the serialized output will be placed here * * @return AXIS2_SUCCESS on success else AXIS2_FAILURE */ AXIS2_EXTERN axis2_status_t AXIS2_CALL axiom_node_serialize_sub_tree( axiom_node_t * om_node, const axutil_env_t * env, struct axiom_output *om_output); /** * * @param om_node pointer to the OM node struct * @param env environment, MUST NOT be NULL * * @return the tree as a string */ AXIS2_EXTERN axis2_char_t *AXIS2_CALL axiom_node_sub_tree_to_string( axiom_node_t * om_node, const axutil_env_t * env); /** * Convert the node to string, treating the binary contents, if any, * as non-optimized content. * @param om_node pointer to the OM node struct * @param env environment, MUST NOT be NULL * * @return the none optimized string */ AXIS2_EXTERN axis2_char_t *AXIS2_CALL axiom_node_to_string_non_optimized( axiom_node_t * om_node, const axutil_env_t * env); /** @} */ #ifdef __cplusplus } #endif #endif /* AXIOM_NODE_H */