| /* |
| * 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. |
| */ |
| |
| #include <libxml/xmlwriter.h> |
| #include <axutil_utils.h> |
| #include <axutil_utils_defines.h> |
| #include <axutil_env.h> |
| #include <axiom_xml_writer.h> |
| #include <axutil_string.h> |
| #include <string.h> |
| #include <axutil_stack.h> |
| #include <axutil_hash.h> |
| #include <axutil_array_list.h> |
| |
| /*******************************************************************************/ |
| |
| #define ENCODING "ISO-8859-1" |
| |
| #define AXIS2_XMLNS_NAMESPACE_URI "http://www.w3.org/XML/1998/namespace" |
| #define AXIS2_XMLNS_PREFIX "xml" |
| |
| typedef struct uri_prefix_element |
| { |
| axis2_char_t *prefix; |
| |
| axis2_char_t *uri; |
| |
| axis2_char_t *real_prefix; |
| |
| axis2_char_t *key; |
| |
| } |
| uri_prefix_element_t; |
| |
| typedef struct axis2_libxml2_writer_wrapper_impl |
| { |
| axiom_xml_writer_t writer; |
| |
| xmlTextWriterPtr xml_writer; |
| |
| xmlBufferPtr buffer; |
| |
| xmlDocPtr doc; |
| |
| int writer_type; |
| |
| axis2_char_t *encoding; |
| |
| int is_prefix_defaulting; |
| |
| int compression; |
| |
| axutil_stack_t *stack; |
| |
| axis2_bool_t in_empty_element; |
| |
| axis2_bool_t in_start_element; |
| |
| axutil_hash_t *uri_prefix_map; |
| |
| uri_prefix_element_t *default_lang_namespace; |
| |
| } axis2_libxml2_writer_wrapper_impl_t; |
| |
| |
| #define AXIS2_INTF_TO_IMPL(p) ((axis2_libxml2_writer_wrapper_impl_t*)p) |
| |
| void AXIS2_CALL |
| axis2_libxml2_writer_wrapper_free(axiom_xml_writer_t *writer, |
| const axutil_env_t *env); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_start_element(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_end_start_element(axiom_xml_writer_t *writer, |
| const axutil_env_t *env); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_start_element_with_namespace(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *namespace_uri); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_start_element_with_namespace_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *namespace_uri, |
| axis2_char_t *prefix); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_empty_element(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_empty_element_with_namespace(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *namespace_uri); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_empty_element_with_namespace_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *namespace_uri, |
| axis2_char_t *prefix); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_end_element(axiom_xml_writer_t *writer, |
| const axutil_env_t *env); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_end_document(axiom_xml_writer_t *writer, |
| const axutil_env_t *env); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_attribute(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *value); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_attribute_with_namespace(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *value, |
| axis2_char_t *namespace_uri); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_attribute_with_namespace_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *value, |
| axis2_char_t *namespace_uri, |
| axis2_char_t *prefix); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_namespace(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *prefix, |
| axis2_char_t *namespace_uri); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_default_namespace(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *namespace_uri); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_comment(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *value); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_processing_instruction(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *target); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_processing_instruction_data(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *target, |
| axis2_char_t *data); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_cdata(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *data); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_dtd(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *dtd); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_entity_ref(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *name); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_start_document(axiom_xml_writer_t *writer, |
| const axutil_env_t *env); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_start_document_with_version(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *version); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_start_document_with_version_encoding(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *encoding, |
| axis2_char_t *version); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_characters(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *text); |
| |
| axis2_char_t *AXIS2_CALL |
| axis2_libxml2_writer_wrapper_get_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *uri); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_set_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *prefix, |
| axis2_char_t *uri); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_set_default_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *uri); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_encoded(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *text, |
| int in_attr); |
| |
| void* AXIS2_CALL |
| axis2_libxml2_writer_wrapper_get_xml(axiom_xml_writer_t *writer, |
| const axutil_env_t *env); |
| |
| unsigned int AXIS2_CALL |
| axis2_libxml2_writer_wrapper_get_xml_size(axiom_xml_writer_t *writer, |
| const axutil_env_t *env); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_flush(axiom_xml_writer_t *writer, |
| const axutil_env_t *env); |
| |
| int AXIS2_CALL |
| axis2_libxml2_writer_wrapper_get_type(axiom_xml_writer_t *writer, |
| const axutil_env_t *env); |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_raw(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *content); |
| |
| static axis2_status_t |
| axis2_libxml2_writer_wrapper_push(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| const axis2_char_t *uri, |
| const axis2_char_t *prefix); |
| |
| static axis2_bool_t |
| axis2_libxml2_writer_wrapper_is_namespace_declared(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *key); |
| |
| static void |
| uri_prefix_element_free(uri_prefix_element_t *up_element, |
| const axutil_env_t *env); |
| |
| static uri_prefix_element_t * |
| uri_prefix_element_create(const axutil_env_t *env, |
| const axis2_char_t *uri, |
| const axis2_char_t *prefix, |
| const axis2_char_t *real_prefix, |
| const axis2_char_t *key); |
| |
| static void |
| create_key_from_uri_prefix(const axutil_env_t *env, |
| const axis2_char_t *uri, |
| const axis2_char_t *prefix, |
| axis2_char_t *array); |
| |
| static axis2_char_t* |
| axis2_libxml2_writer_wrapper_find_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *uri); |
| |
| static uri_prefix_element_t* |
| axis2_libxml2_writer_wrapper_find_prefix_in_context(axutil_array_list_t *context, |
| const axutil_env_t *env, |
| axis2_char_t *uri); |
| |
| static const axiom_xml_writer_ops_t axiom_xml_writer_ops_var = { |
| axis2_libxml2_writer_wrapper_free, |
| axis2_libxml2_writer_wrapper_write_start_element, |
| axis2_libxml2_writer_wrapper_end_start_element, |
| axis2_libxml2_writer_wrapper_write_start_element_with_namespace, |
| axis2_libxml2_writer_wrapper_write_start_element_with_namespace_prefix, |
| axis2_libxml2_writer_wrapper_write_empty_element, |
| axis2_libxml2_writer_wrapper_write_empty_element_with_namespace, |
| axis2_libxml2_writer_wrapper_write_empty_element_with_namespace_prefix, |
| axis2_libxml2_writer_wrapper_write_end_element, |
| axis2_libxml2_writer_wrapper_write_end_document, |
| axis2_libxml2_writer_wrapper_write_attribute, |
| axis2_libxml2_writer_wrapper_write_attribute_with_namespace, |
| axis2_libxml2_writer_wrapper_write_attribute_with_namespace_prefix, |
| axis2_libxml2_writer_wrapper_write_namespace, |
| axis2_libxml2_writer_wrapper_write_default_namespace, |
| axis2_libxml2_writer_wrapper_write_comment, |
| axis2_libxml2_writer_wrapper_write_processing_instruction, |
| axis2_libxml2_writer_wrapper_write_processing_instruction_data, |
| axis2_libxml2_writer_wrapper_write_cdata, |
| axis2_libxml2_writer_wrapper_write_dtd, |
| axis2_libxml2_writer_wrapper_write_entity_ref, |
| axis2_libxml2_writer_wrapper_write_start_document, |
| axis2_libxml2_writer_wrapper_write_start_document_with_version, |
| axis2_libxml2_writer_wrapper_write_start_document_with_version_encoding, |
| axis2_libxml2_writer_wrapper_write_characters, |
| axis2_libxml2_writer_wrapper_get_prefix, |
| axis2_libxml2_writer_wrapper_set_prefix, |
| axis2_libxml2_writer_wrapper_set_default_prefix, |
| axis2_libxml2_writer_wrapper_write_encoded, |
| axis2_libxml2_writer_wrapper_get_xml, |
| axis2_libxml2_writer_wrapper_get_xml_size, |
| axis2_libxml2_writer_wrapper_get_type, |
| axis2_libxml2_writer_wrapper_write_raw, |
| axis2_libxml2_writer_wrapper_flush |
| }; |
| |
| AXIS2_EXTERN axiom_xml_writer_t *AXIS2_CALL |
| axiom_xml_writer_create(const axutil_env_t *env, |
| axis2_char_t *filename, |
| axis2_char_t *encoding, |
| int is_prefix_default, |
| int compression) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| AXIS2_ENV_CHECK(env, NULL); |
| writer_impl = (axis2_libxml2_writer_wrapper_impl_t *)AXIS2_MALLOC(env->allocator, |
| sizeof(axis2_libxml2_writer_wrapper_impl_t)); |
| if (!writer_impl) |
| { |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); |
| return NULL; |
| } |
| writer_impl->xml_writer = xmlNewTextWriterFilename(filename, compression); |
| |
| if (!(writer_impl->xml_writer)) |
| { |
| AXIS2_FREE(env->allocator, writer_impl); |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_CREATING_XML_STREAM_WRITER, AXIS2_FAILURE); |
| return NULL; |
| } |
| writer_impl->buffer = NULL; |
| writer_impl->encoding = NULL; |
| writer_impl->compression = 0; |
| writer_impl->in_empty_element = AXIS2_FALSE; |
| writer_impl->in_start_element = AXIS2_FALSE; |
| writer_impl->stack = NULL; |
| writer_impl->uri_prefix_map = NULL; |
| writer_impl->default_lang_namespace = NULL; |
| |
| writer_impl->writer_type = AXIS2_XML_PARSER_TYPE_FILE; |
| writer_impl->compression = compression; |
| |
| if (encoding) |
| { |
| writer_impl->encoding = axutil_strdup(env, encoding); |
| } |
| else |
| { |
| writer_impl->encoding = axutil_strdup(env, ENCODING); |
| } |
| |
| writer_impl->uri_prefix_map = axutil_hash_make(env); |
| if (!(writer_impl->uri_prefix_map)) |
| { |
| axis2_libxml2_writer_wrapper_free(&(writer_impl->writer), env); |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); |
| return NULL; |
| } |
| writer_impl->writer.ops = &axiom_xml_writer_ops_var; |
| return &(writer_impl->writer); |
| } |
| |
| AXIS2_EXTERN axiom_xml_writer_t *AXIS2_CALL |
| axiom_xml_writer_create_for_memory(const axutil_env_t *env, |
| axis2_char_t *encoding, |
| int is_prefix_default, |
| int compression, |
| int type) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| AXIS2_ENV_CHECK(env, NULL); |
| writer_impl = (axis2_libxml2_writer_wrapper_impl_t *)AXIS2_MALLOC(env->allocator, |
| sizeof(axis2_libxml2_writer_wrapper_impl_t)); |
| if (!writer_impl) |
| { |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); |
| return NULL; |
| } |
| |
| writer_impl->encoding = NULL; |
| writer_impl->buffer = NULL; |
| writer_impl->doc = NULL; |
| writer_impl->in_empty_element = AXIS2_FALSE; |
| writer_impl->in_start_element = AXIS2_FALSE; |
| writer_impl->stack = NULL; |
| writer_impl->uri_prefix_map = NULL; |
| writer_impl->default_lang_namespace = NULL; |
| writer_impl->compression = compression; |
| |
| if (AXIS2_XML_PARSER_TYPE_BUFFER == type) |
| { |
| writer_impl->writer_type = AXIS2_XML_PARSER_TYPE_BUFFER; |
| writer_impl->buffer = xmlBufferCreate(); |
| if (!(writer_impl->buffer)) |
| { |
| axis2_libxml2_writer_wrapper_free(&(writer_impl->writer), env); |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); |
| return NULL; |
| } |
| |
| writer_impl->xml_writer = xmlNewTextWriterMemory(writer_impl->buffer, 0); |
| } |
| else if (AXIS2_XML_PARSER_TYPE_DOC == type) |
| { |
| writer_impl->writer_type = AXIS2_XML_PARSER_TYPE_DOC; |
| writer_impl->xml_writer = xmlNewTextWriterDoc(&writer_impl->doc, 0); |
| } |
| else |
| { |
| axis2_libxml2_writer_wrapper_free(&(writer_impl->writer), env); |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_XML_PARSER_INVALID_MEM_TYPE, AXIS2_FAILURE); |
| return NULL; |
| } |
| |
| if (!(writer_impl->xml_writer)) |
| { |
| axis2_libxml2_writer_wrapper_free(&(writer_impl->writer), env); |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_CREATING_XML_STREAM_WRITER , AXIS2_FAILURE); |
| return NULL; |
| } |
| |
| if (encoding) |
| { |
| writer_impl->encoding = axutil_strdup(env, encoding); |
| } |
| else |
| { |
| writer_impl->encoding = axutil_strdup(env, ENCODING); |
| } |
| |
| writer_impl->uri_prefix_map = axutil_hash_make(env); |
| if (!(writer_impl->uri_prefix_map)) |
| { |
| axis2_libxml2_writer_wrapper_free(&(writer_impl->writer), env); |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); |
| return NULL; |
| } |
| writer_impl->stack = axutil_stack_create(env); |
| if (!(writer_impl->stack)) |
| { |
| axis2_libxml2_writer_wrapper_free(&(writer_impl->writer), env); |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); |
| return NULL; |
| } |
| |
| writer_impl->writer.ops = &axiom_xml_writer_ops_var; |
| |
| return &(writer_impl->writer); |
| } |
| |
| void AXIS2_CALL |
| axis2_libxml2_writer_wrapper_free(axiom_xml_writer_t *writer, |
| const axutil_env_t *env) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| if(writer_impl->xml_writer) |
| { |
| xmlFreeTextWriter(writer_impl->xml_writer); |
| writer_impl->xml_writer = NULL; |
| } |
| if (writer_impl->buffer) |
| { |
| xmlBufferFree(writer_impl->buffer); |
| writer_impl->buffer = NULL; |
| } |
| if (writer_impl->encoding) |
| { |
| AXIS2_FREE(env->allocator, writer_impl->encoding); |
| writer_impl->encoding = NULL; |
| } |
| if (writer_impl->uri_prefix_map) |
| { |
| axutil_hash_free(writer_impl->uri_prefix_map, env); |
| writer_impl->uri_prefix_map = NULL; |
| } |
| if (writer_impl->stack) |
| { |
| axutil_stack_free(writer_impl->stack, env); |
| writer_impl->stack = NULL; |
| } |
| if (writer_impl->default_lang_namespace) |
| { |
| uri_prefix_element_free(writer_impl->default_lang_namespace, env); |
| writer_impl->default_lang_namespace = NULL; |
| } |
| |
| AXIS2_FREE(env->allocator, writer_impl); |
| writer_impl = NULL; |
| return; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_start_element(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname) |
| { |
| int status = 0; |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, localname, AXIS2_FAILURE); |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| writer_impl->in_start_element = AXIS2_TRUE; |
| |
| status = xmlTextWriterStartElement(writer_impl->xml_writer, (xmlChar *)localname); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_WRITING_START_ELEMENT, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_end_start_element(axiom_xml_writer_t *writer, |
| const axutil_env_t *env) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| /* nothing to do , |
| it is automatically taken care by the libxml2 writer */ |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_start_element_with_namespace(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *namespace_uri) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, localname, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, namespace_uri, AXIS2_FAILURE); |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| status = xmlTextWriterStartElementNS(writer_impl->xml_writer, |
| NULL, BAD_CAST localname, NULL); |
| |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_START_ELEMENT_WITH_NAMESPACE, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_start_element_with_namespace_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *namespace_uri, |
| axis2_char_t *prefix) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, localname, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, namespace_uri, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, prefix, AXIS2_FAILURE); |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| writer_impl->in_start_element = AXIS2_TRUE; |
| |
| status = xmlTextWriterStartElementNS(writer_impl->xml_writer, |
| BAD_CAST prefix, |
| BAD_CAST localname, |
| BAD_CAST NULL); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_START_ELEMENT_WITH_NAMESPACE_PREFIX, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_empty_element(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname) |
| { |
| int status = 0; |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, localname, AXIS2_FAILURE); |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| status = xmlTextWriterStartElement(writer_impl->xml_writer, (xmlChar *)localname); |
| |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_WRITING_EMPTY_ELEMENT, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| status = xmlTextWriterEndElement(writer_impl->xml_writer); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_WRITING_EMPTY_ELEMENT, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_empty_element_with_namespace(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *namespace_uri) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, localname, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, namespace_uri, AXIS2_FAILURE); |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| status = xmlTextWriterStartElementNS(writer_impl->xml_writer, |
| NULL, BAD_CAST localname, BAD_CAST namespace_uri); |
| |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_EMPTY_ELEMENT_WITH_NAMESPACE, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| status = xmlTextWriterEndElement(writer_impl->xml_writer); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_EMPTY_ELEMENT_WITH_NAMESPACE, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_empty_element_with_namespace_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *namespace_uri, |
| axis2_char_t *prefix) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, localname, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, namespace_uri, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, prefix, AXIS2_FAILURE); |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| status = xmlTextWriterStartElementNS(writer_impl->xml_writer, |
| BAD_CAST prefix, |
| BAD_CAST localname, |
| BAD_CAST NULL); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_START_ELEMENT_WITH_NAMESPACE_PREFIX, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| status = xmlTextWriterEndElement(writer_impl->xml_writer); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_EMPTY_ELEMENT_WITH_NAMESPACE_PREFIX, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_end_element(axiom_xml_writer_t *writer, |
| const axutil_env_t *env) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| writer_impl->in_start_element = AXIS2_FALSE; |
| /* write an empty element in case the element is empty, |
| status = xmlTextWriterFullEndElement(writer_impl->xml_writer); |
| Above call write it like <a></a>. |
| Call below will write it like <a/> */ |
| status = xmlTextWriterEndElement(writer_impl->xml_writer); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_WRITING_END_ELEMENT, |
| AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_end_document(axiom_xml_writer_t *writer, |
| const axutil_env_t *env) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| status = xmlTextWriterEndDocument(writer_impl->xml_writer); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_WRITING_END_DOCUMENT, |
| AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_attribute(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *value) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, localname, AXIS2_FAILURE); |
| if (!value) |
| { |
| value = ""; |
| } |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| status = xmlTextWriterWriteAttribute(writer_impl->xml_writer, |
| BAD_CAST localname, BAD_CAST value); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_WRITING_ATTRIBUTE, |
| AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_attribute_with_namespace(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *value, |
| axis2_char_t *namespace_uri) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, localname, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, namespace_uri, AXIS2_FAILURE); |
| |
| if (!value) |
| { |
| value = ""; |
| } |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| status = xmlTextWriterWriteAttributeNS(writer_impl->xml_writer, |
| NULL, BAD_CAST localname, BAD_CAST NULL, |
| BAD_CAST value); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_ATTRIBUTE_WITH_NAMESPACE, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_attribute_with_namespace_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *localname, |
| axis2_char_t *value, |
| axis2_char_t *namespace_uri, |
| axis2_char_t *prefix) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, localname, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, namespace_uri, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, prefix, AXIS2_FAILURE); |
| |
| if (!value) |
| { |
| value = ""; |
| } |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| status = xmlTextWriterWriteAttributeNS(writer_impl->xml_writer, |
| BAD_CAST prefix , BAD_CAST localname, |
| BAD_CAST NULL , BAD_CAST value); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_ATTRIBUTE_WITH_NAMESPACE_PREFIX, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| /** need to work on this */ |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_namespace(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *prefix, |
| axis2_char_t *namespace_uri) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| char *xmlnsprefix = NULL; |
| |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, namespace_uri, AXIS2_FAILURE); |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| if (prefix && (axutil_strcmp(prefix, "") != 0)) |
| { |
| xmlnsprefix = (axis2_char_t*)AXIS2_MALLOC(env->allocator, |
| (sizeof(char) * (axutil_strlen(prefix) + 7))); |
| sprintf(xmlnsprefix, "xmlns:%s", prefix); |
| } |
| else |
| { |
| xmlnsprefix = axutil_strdup(env, "xmlns"); |
| } |
| |
| status = xmlTextWriterWriteAttribute(writer_impl->xml_writer, |
| BAD_CAST xmlnsprefix, BAD_CAST namespace_uri); |
| AXIS2_FREE(env->allocator, xmlnsprefix); |
| xmlnsprefix = NULL; |
| |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_ATTRIBUTE_WITH_NAMESPACE_PREFIX, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| |
| AXIS2_FREE(env->allocator, xmlnsprefix); |
| xmlnsprefix = NULL; |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_default_namespace(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *namespace_uri) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| axis2_char_t *xmlns = NULL; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, namespace_uri, AXIS2_FAILURE) |
| |
| xmlns = AXIS2_MALLOC(env->allocator, |
| sizeof(axis2_char_t) * (strlen("xmlns") + 1)); |
| sprintf(xmlns, "xmlns"); |
| status = xmlTextWriterWriteAttribute(writer_impl->xml_writer, |
| (const xmlChar *)xmlns , BAD_CAST namespace_uri); |
| |
| if (xmlns) |
| { |
| AXIS2_FREE(env->allocator, xmlns); |
| xmlns = NULL; |
| } |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_WRITING_DEFAULT_NAMESPACE, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_comment(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *value) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, value, AXIS2_FAILURE); |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| status = xmlTextWriterWriteComment(writer_impl->xml_writer, BAD_CAST value); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_COMMENT, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_processing_instruction(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *target) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, target, AXIS2_FAILURE); |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| status = xmlTextWriterStartPI(writer_impl->xml_writer, BAD_CAST target); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_PROCESSING_INSTRUCTION, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_processing_instruction_data(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *target, |
| axis2_char_t *data) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, target, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, data, AXIS2_FAILURE); |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| status = xmlTextWriterWritePI(writer_impl->xml_writer, |
| BAD_CAST target, |
| BAD_CAST data); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_PROCESSING_INSTRUCTION, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_cdata(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *data) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, data, AXIS2_FAILURE); |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| status = xmlTextWriterWriteCDATA(writer_impl->xml_writer, BAD_CAST data); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_WRITING_CDATA, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_dtd(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *dtd) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, dtd, AXIS2_FAILURE); |
| |
| status = xmlTextWriterStartDTD(writer_impl->xml_writer, |
| BAD_CAST dtd, NULL, NULL); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_WRITING_DTD, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_entity_ref(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *name) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, name, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_start_document(axiom_xml_writer_t *writer, |
| const axutil_env_t *env) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *wrapper_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| wrapper_impl = AXIS2_INTF_TO_IMPL(writer); |
| status = xmlTextWriterStartDocument(wrapper_impl->xml_writer, |
| NULL, NULL, NULL); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_START_DOCUMENT, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_start_document_with_version(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *version) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *wrapper_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, version, AXIS2_FAILURE); |
| |
| wrapper_impl = AXIS2_INTF_TO_IMPL(writer); |
| status = xmlTextWriterStartDocument(wrapper_impl->xml_writer, |
| version , NULL, NULL); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_START_DOCUMENT, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_start_document_with_version_encoding(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *version, |
| axis2_char_t *encoding) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *wrapper_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| wrapper_impl = AXIS2_INTF_TO_IMPL(writer); |
| status = xmlTextWriterStartDocument(wrapper_impl->xml_writer, |
| version , encoding , NULL); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_START_DOCUMENT, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_characters(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *text) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, text, AXIS2_FAILURE); |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| status = xmlTextWriterWriteString(writer_impl->xml_writer, |
| BAD_CAST text); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_START_DOCUMENT, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_char_t* AXIS2_CALL |
| axis2_libxml2_writer_wrapper_get_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *uri) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| AXIS2_PARAM_CHECK(env->error, uri, NULL); |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| if (!uri || axutil_strcmp(uri, "") == 0) |
| { |
| return NULL; |
| } |
| return axis2_libxml2_writer_wrapper_find_prefix(writer, env, uri); |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_set_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *prefix, |
| axis2_char_t *uri) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| |
| axis2_bool_t is_declared = AXIS2_FALSE; |
| axis2_char_t key[1024]; |
| |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, prefix, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, uri, AXIS2_FAILURE); |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| if (axutil_strcmp(uri, "") == 0) |
| { |
| return AXIS2_FAILURE; |
| } |
| |
| create_key_from_uri_prefix(env, uri, prefix, key); |
| |
| is_declared = axis2_libxml2_writer_wrapper_is_namespace_declared(writer, env, key); |
| if (!is_declared) |
| { |
| return axis2_libxml2_writer_wrapper_push(writer, env, uri, prefix); |
| } |
| return AXIS2_FAILURE; |
| } |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_set_default_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *uri) |
| { |
| axis2_bool_t is_declared = AXIS2_FALSE; |
| |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, uri, AXIS2_FAILURE); |
| if (axutil_strcmp(uri, "") == 0) |
| { |
| return AXIS2_FAILURE; |
| } |
| is_declared = axis2_libxml2_writer_wrapper_is_namespace_declared(writer, env, uri); |
| if (!is_declared) |
| { |
| return axis2_libxml2_writer_wrapper_push(writer, env, uri, NULL); |
| } |
| return AXIS2_FAILURE; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_encoded(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *text, |
| int in_attr) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, text, AXIS2_FAILURE); |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| return AXIS2_FAILURE; |
| } |
| |
| void* AXIS2_CALL |
| axis2_libxml2_writer_wrapper_get_xml(axiom_xml_writer_t *writer, |
| const axutil_env_t *env) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| if (writer_impl->writer_type == AXIS2_XML_PARSER_TYPE_BUFFER) |
| { |
| int output_bytes = 0; |
| output_bytes = xmlTextWriterFlush(writer_impl->xml_writer); |
| return writer_impl->buffer->content; |
| } |
| else if (writer_impl->writer_type == AXIS2_XML_PARSER_TYPE_DOC) |
| { |
| return (void*)writer_impl->doc; |
| } |
| else if (writer_impl->writer_type == AXIS2_XML_PARSER_TYPE_FILE) |
| { |
| return NULL; |
| } |
| |
| return NULL; |
| } |
| |
| unsigned int AXIS2_CALL |
| axis2_libxml2_writer_wrapper_get_xml_size(axiom_xml_writer_t *writer, |
| const axutil_env_t *env) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| if (writer_impl->writer_type == AXIS2_XML_PARSER_TYPE_BUFFER) |
| { |
| return writer_impl->buffer->use; |
| } |
| else |
| { |
| return 0; |
| } |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_flush(axiom_xml_writer_t *writer, |
| const axutil_env_t *env) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| if (writer_impl->xml_writer) |
| { |
| int ret = 0; |
| ret = xmlTextWriterFlush(writer_impl->xml_writer); |
| if (ret > -1) |
| return AXIS2_SUCCESS; |
| } |
| |
| return AXIS2_FAILURE; |
| } |
| |
| int AXIS2_CALL |
| axis2_libxml2_writer_wrapper_get_type(axiom_xml_writer_t *writer, |
| const axutil_env_t *env) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| return writer_impl->writer_type; |
| } |
| |
| static axis2_status_t |
| axis2_libxml2_writer_wrapper_push(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| const axis2_char_t *uri, |
| const axis2_char_t *prefix) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| axutil_array_list_t *current_list = NULL; |
| axis2_char_t key[1024]; |
| const axis2_char_t *temp_prefix = NULL; |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| if (!prefix || axutil_strcmp(prefix, "") == 0) |
| { |
| temp_prefix = "default"; |
| } |
| else |
| { |
| temp_prefix = prefix; |
| } |
| |
| if (writer_impl->stack) |
| { |
| current_list = (axutil_array_list_t *) |
| axutil_stack_get(writer_impl->stack, env); |
| |
| if (current_list) |
| { |
| uri_prefix_element_t *ele = NULL; |
| create_key_from_uri_prefix(env, uri, prefix, key); |
| |
| ele = uri_prefix_element_create(env, uri , temp_prefix, prefix, key); |
| if (ele) |
| { |
| axutil_array_list_add(current_list, env, ele); |
| axutil_hash_set(writer_impl->uri_prefix_map, ele->key, |
| AXIS2_HASH_KEY_STRING, ele->prefix); |
| } |
| } |
| } |
| return AXIS2_SUCCESS; |
| } |
| |
| static axis2_bool_t |
| axis2_libxml2_writer_wrapper_is_namespace_declared(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *key) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| AXIS2_ENV_CHECK(env, AXIS2_FALSE); |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| if (writer_impl->uri_prefix_map && NULL != key) |
| { |
| void *ret = NULL; |
| ret = axutil_hash_get(writer_impl->uri_prefix_map, key, |
| AXIS2_HASH_KEY_STRING); |
| if (ret) |
| { |
| return AXIS2_TRUE; |
| } |
| } |
| return AXIS2_FALSE; |
| } |
| |
| static void |
| uri_prefix_element_free(uri_prefix_element_t *up_element, |
| const axutil_env_t *env) |
| { |
| if (up_element) |
| { |
| if (up_element->uri) |
| { |
| AXIS2_FREE(env->allocator, up_element->uri); |
| up_element->uri = NULL; |
| } |
| if (up_element->prefix) |
| { |
| AXIS2_FREE(env->allocator, up_element->prefix); |
| up_element->prefix = NULL; |
| } |
| if (up_element->key) |
| { |
| AXIS2_FREE(env->allocator, up_element->key); |
| up_element->key = NULL; |
| } |
| if (up_element->real_prefix) |
| { |
| AXIS2_FREE(env->allocator, up_element->real_prefix); |
| up_element->real_prefix = NULL; |
| } |
| AXIS2_FREE(env->allocator, up_element); |
| up_element = NULL; |
| } |
| return; |
| } |
| |
| static uri_prefix_element_t * |
| uri_prefix_element_create(const axutil_env_t *env, |
| const axis2_char_t *uri, |
| const axis2_char_t *prefix, |
| const axis2_char_t *real_prefix, |
| const axis2_char_t *key) |
| { |
| uri_prefix_element_t *up_element = NULL; |
| up_element = (uri_prefix_element_t *)AXIS2_MALLOC(env->allocator, |
| sizeof(uri_prefix_element_t)); |
| |
| if (!uri) |
| { |
| return NULL; |
| } |
| |
| if (!up_element) |
| { |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); |
| return NULL; |
| } |
| up_element->key = NULL; |
| up_element->prefix = NULL; |
| up_element->uri = NULL; |
| up_element->real_prefix = NULL; |
| |
| up_element->uri = axutil_strdup(env, uri); |
| if (!up_element->uri) |
| { |
| uri_prefix_element_free(up_element, env); |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); |
| return NULL; |
| } |
| up_element->prefix = axutil_strdup(env, prefix); |
| if (prefix && !up_element->prefix) |
| { |
| uri_prefix_element_free(up_element, env); |
| AXIS2_ERROR_SET(env->error , AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); |
| return NULL; |
| } |
| up_element->key = axutil_strdup(env, key); |
| if (key && !up_element->key) |
| { |
| uri_prefix_element_free(up_element, env); |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); |
| return NULL; |
| } |
| up_element->real_prefix = axutil_strdup(env, real_prefix); |
| |
| return up_element; |
| } |
| |
| static void |
| create_key_from_uri_prefix(const axutil_env_t *env, |
| const axis2_char_t *uri, |
| const axis2_char_t *prefix, |
| axis2_char_t *array) |
| { |
| if (!prefix) |
| { |
| prefix = ""; |
| } |
| sprintf(array, "%s%s%s", uri, "|", prefix); |
| } |
| |
| static axis2_char_t* |
| axis2_libxml2_writer_wrapper_find_prefix(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *uri) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int size = 0; |
| int i = 0; |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| |
| if (!writer_impl->stack) |
| { |
| return NULL; |
| } |
| size = axutil_stack_size(writer_impl->stack, env); |
| if (size <= 0) |
| { |
| return NULL; |
| } |
| |
| for (i = size - 1 ; i < 0; i --) |
| { |
| axutil_array_list_t *context = NULL; |
| void *value = NULL; |
| value = axutil_stack_get_at(writer_impl->stack, env, i); |
| if (value) |
| { |
| uri_prefix_element_t *up_ele = NULL; |
| context = (axutil_array_list_t *)value; |
| up_ele = |
| axis2_libxml2_writer_wrapper_find_prefix_in_context(context, |
| env, uri); |
| if (up_ele) |
| { |
| return up_ele->real_prefix; |
| } |
| } |
| } |
| return NULL; |
| } |
| |
| static uri_prefix_element_t* |
| axis2_libxml2_writer_wrapper_find_prefix_in_context(axutil_array_list_t *context, |
| const axutil_env_t *env, |
| axis2_char_t *uri) |
| { |
| int size = 0; |
| int i = 0; |
| if (!context) |
| { |
| return NULL; |
| } |
| size = axutil_array_list_size(context, env); |
| for (i = 0; i < size; i++) |
| { |
| uri_prefix_element_t *ele = NULL; |
| void *value = NULL; |
| value = axutil_array_list_get(context, env, i); |
| if (value) |
| { |
| ele = (uri_prefix_element_t*)value; |
| if (ele->uri && axutil_strcmp(uri, ele->uri)) |
| { |
| return ele; |
| } |
| } |
| } |
| return NULL; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| axis2_libxml2_writer_wrapper_write_raw(axiom_xml_writer_t *writer, |
| const axutil_env_t *env, |
| axis2_char_t *content) |
| { |
| axis2_libxml2_writer_wrapper_impl_t *writer_impl = NULL; |
| int status = 0; |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| AXIS2_PARAM_CHECK(env->error, content, AXIS2_FAILURE); |
| |
| writer_impl = AXIS2_INTF_TO_IMPL(writer); |
| status = xmlTextWriterWriteRaw(writer_impl->xml_writer, BAD_CAST content); |
| if (status < 0) |
| { |
| AXIS2_ERROR_SET(env->error, |
| AXIS2_ERROR_WRITING_DATA_SOURCE, AXIS2_FAILURE); |
| return AXIS2_FAILURE; |
| } |
| return AXIS2_SUCCESS; |
| } |
| |