blob: 3a125eeb820eaef4d285f8b4b726699766c1c304 [file] [log] [blame]
/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed 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 <axis2_om_text.h>
#include <axis2_om_output.h>
#include <axis2_string.h>
#include "axis2_om_node_internal.h"
#include <axis2_xml_writer.h>
#include <axis2_om_output.h>
#include <axis2_om_attribute.h>
#include <axis2_om_namespace.h>
/* ops */
axis2_status_t AXIS2_CALL
axis2_om_text_free (axis2_om_text_t * om_text,
axis2_env_t **env);
axis2_status_t AXIS2_CALL
axis2_om_text_serialize (axis2_om_text_t * om_text,
axis2_env_t **env,
axis2_om_output_t * om_output);
axis2_char_t* AXIS2_CALL
axis2_om_text_get_value(axis2_om_text_t *om_text,
axis2_env_t **env);
axis2_status_t AXIS2_CALL
axis2_om_text_set_value(axis2_om_text_t *om_text,
axis2_env_t **env,
const axis2_char_t *value);
/*Following are for MTOM*/
axis2_char_t* AXIS2_CALL
axis2_om_text_get_mime_type(axis2_om_text_t *om_text,
axis2_env_t **env);
axis2_status_t AXIS2_CALL
axis2_om_text_set_mime_type(axis2_om_text_t *om_text,
axis2_env_t **env,
const axis2_char_t *mime_type);
axis2_status_t AXIS2_CALL
axis2_om_text_set_optimize(axis2_om_text_t *om_text,
axis2_env_t **env,
const axis2_bool_t optimize);
axis2_bool_t AXIS2_CALL
axis2_om_text_get_optimize(axis2_om_text_t *om_text,
axis2_env_t **env);
axis2_bool_t AXIS2_CALL
axis2_om_text_get_is_binary(axis2_om_text_t *om_text,
axis2_env_t **env);
axis2_status_t AXIS2_CALL
axis2_om_text_set_is_binary(axis2_om_text_t *om_text,
axis2_env_t **env,
const axis2_bool_t is_binary);
axis2_char_t* AXIS2_CALL
axis2_om_text_get_localname(axis2_om_text_t *om_text,
axis2_env_t **env);
axis2_char_t* AXIS2_CALL
axis2_om_text_get_content_id(axis2_om_text_t *om_text,
axis2_env_t **env);
axis2_status_t AXIS2_CALL
axis2_om_text_set_content_id(axis2_om_text_t *om_text,
axis2_env_t **env,
const axis2_char_t *content_id);
axis2_status_t AXIS2_CALL
axis2_om_text_serialize_start_part(axis2_om_text_t *om_text,
axis2_env_t **env,
axis2_om_output_t *om_output_t);
axis2_status_t AXIS2_CALL
axis2_om_text_serialize_attribute(axis2_om_text_t *om_text,
axis2_env_t **env,
axis2_om_output_t *om_output,
axis2_om_attribute_t *om_attribute);
axis2_status_t AXIS2_CALL
axis2_om_text_serialize_namespace(axis2_om_text_t *om_text,
axis2_env_t **env,
const axis2_om_namespace_t *om_namespace,
axis2_om_output_t *om_output);
axis2_char_t* AXIS2_CALL
axis2_om_text_get_text(axis2_om_text_t *om_text,
axis2_env_t **env);
axis2_data_handler_t *AXIS2_CALL
axis2_om_text_get_data_handler(axis2_om_text_t *om_text,
axis2_env_t **env);
/********************* axis2_om_text_impl_struct ***************/
typedef struct axis2_om_text_impl_t
{
axis2_om_text_t om_text;
/** Text value */
axis2_char_t *value;
/** The following fields are for MTOM */
axis2_char_t *mime_type;
axis2_bool_t optimize;
axis2_char_t *localname;
axis2_bool_t is_binary;
axis2_char_t *content_id;
axis2_om_attribute_t *om_attribute;
axis2_om_namespace_t *ns;
axis2_data_handler_t *data_handler;
}axis2_om_text_impl_t;
/*********************** Macro ***********************************/
#define AXIS2_INTF_TO_IMPL(text) ((axis2_om_text_impl_t*)text)
/*****************************************************************/
AXIS2_DECLARE(axis2_om_text_t*)
axis2_om_text_create (axis2_env_t **env,
axis2_om_node_t * parent,
const axis2_char_t * value,
axis2_om_node_t **node)
{
axis2_om_text_impl_t *om_text = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK((*env)->error, node, NULL);
*node = axis2_om_node_create (env);
if (!(*node))
{
AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
om_text = (axis2_om_text_impl_t *) AXIS2_MALLOC ((*env)->allocator,
sizeof (axis2_om_text_impl_t));
if (!om_text)
{
AXIS2_FREE ((*env)->allocator, *node);
AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
om_text->mime_type = NULL;
om_text->optimize = AXIS2_FALSE;
om_text->localname = "Include";
om_text->is_binary = AXIS2_FALSE;
om_text->content_id = NULL;
om_text->om_attribute = NULL;
om_text->value = NULL;
om_text->ns = NULL;
om_text->data_handler = NULL;
om_text->mime_type = NULL;
om_text->ns = axis2_om_namespace_create(env, "http://www.w3.org/2004/08/xop/include", "xop");
if (value)
om_text->value = (axis2_char_t *) AXIS2_STRDUP(value,env);
axis2_om_node_set_data_element((*node), env, om_text);
axis2_om_node_set_node_type((*node), env, AXIS2_OM_TEXT);
axis2_om_node_set_complete((*node), env, AXIS2_FALSE);
if (parent && AXIS2_OM_NODE_GET_NODE_TYPE(parent, env) == AXIS2_OM_ELEMENT)
{
AXIS2_OM_NODE_ADD_CHILD (parent, env, (*node));
}
/* ops */
om_text->om_text.ops = NULL;
om_text->om_text.ops = (axis2_om_text_ops_t *) AXIS2_MALLOC((*env)->allocator,
sizeof (axis2_om_text_ops_t));
if (!om_text->om_text.ops)
{
AXIS2_FREE ((*env)->allocator, om_text->value);
AXIS2_FREE ((*env)->allocator, om_text);
AXIS2_FREE ((*env)->allocator, *node);
AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
om_text->om_text.ops->free = axis2_om_text_free;
om_text->om_text.ops->serialize = axis2_om_text_serialize;
om_text->om_text.ops->set_value = axis2_om_text_set_value;
om_text->om_text.ops->get_value = axis2_om_text_get_value;
om_text->om_text.ops->get_data_handler = axis2_om_text_get_data_handler;
om_text->om_text.ops->get_content_id = axis2_om_text_get_content_id;
return &(om_text->om_text);
}
AXIS2_DECLARE(axis2_om_text_t*)
axis2_om_text_create_with_data_handler (axis2_env_t **env,
axis2_om_node_t * parent,
axis2_data_handler_t* data_handler,
axis2_om_node_t **node)
{
axis2_om_text_impl_t *om_text_impl = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK((*env)->error, data_handler, NULL);
om_text_impl = (axis2_om_text_impl_t*)axis2_om_text_create(env, parent, NULL, node);
if (!om_text_impl)
return NULL;
om_text_impl->optimize = AXIS2_TRUE;
om_text_impl->is_binary = AXIS2_TRUE;
om_text_impl->data_handler = data_handler;
return &(om_text_impl->om_text);
}
axis2_status_t AXIS2_CALL
axis2_om_text_free (axis2_om_text_t * om_text,
axis2_env_t **env)
{
axis2_om_text_impl_t *text_impl = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
text_impl = AXIS2_INTF_TO_IMPL(om_text);
if(NULL != text_impl->value)
{
AXIS2_FREE ((*env)->allocator, text_impl->value);
text_impl->value = NULL;
}
if (NULL != text_impl->ns)
{
AXIS2_OM_NAMESPACE_FREE(text_impl->ns, env);
text_impl->ns = NULL;
}
if(text_impl->content_id)
{
AXIS2_FREE((*env)->allocator, text_impl->content_id);
text_impl->content_id = NULL;
}
if(NULL != om_text->ops)
{
AXIS2_FREE ((*env)->allocator, om_text->ops);
om_text->ops = NULL;
}
AXIS2_FREE ((*env)->allocator, text_impl);
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_om_text_serialize (axis2_om_text_t *om_text,
axis2_env_t **env,
axis2_om_output_t *om_output)
{
int status = AXIS2_SUCCESS;
axis2_om_text_impl_t *om_text_impl = NULL;
axis2_char_t *attribute_value = NULL;
axis2_char_t *text = NULL;
axis2_xml_writer_t *om_output_xml_writer = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK((*env)->error, om_output, AXIS2_FAILURE);
om_text_impl = AXIS2_INTF_TO_IMPL(om_text);
if(!axis2_om_text_get_is_binary(om_text, env))
{
if (AXIS2_INTF_TO_IMPL(om_text)->value)
status = axis2_om_output_write (om_output, env,
AXIS2_OM_TEXT, 1,
AXIS2_INTF_TO_IMPL(om_text)->value);
}
else
{
om_output_xml_writer = AXIS2_OM_OUTPUT_GET_XML_WRITER(om_output, env);
if(om_text_impl->optimize)
{
if(axis2_om_text_get_content_id(om_text, env) == NULL)
{
axis2_char_t *content_id = AXIS2_OM_OUTPUT_GET_NEXT_CONTENT_ID(om_output, env);
if (content_id)
om_text_impl->content_id = AXIS2_STRDUP(content_id, env);
}
attribute_value = AXIS2_STRDUP("cid:", env);
attribute_value = AXIS2_STRACAT(attribute_value, om_text_impl->content_id, env);
/*send binary as MTOM optimised*/
om_text_impl->om_attribute = axis2_om_attribute_create(env, "href", attribute_value, NULL);
axis2_om_text_serialize_start_part(om_text, env, om_output);
axis2_om_output_write_optimized(om_output, env, om_text);
axis2_om_output_write (om_output, env, AXIS2_OM_ELEMENT, 0);
}
else
{
text = axis2_om_text_get_text(om_text, env);
AXIS2_XML_WRITER_WRITE_CHARACTERS(om_output_xml_writer, env, text);
}
}
return status;
}
axis2_char_t* AXIS2_CALL
axis2_om_text_get_value(axis2_om_text_t *om_text,
axis2_env_t **env)
{
AXIS2_ENV_CHECK(env,NULL);
return AXIS2_INTF_TO_IMPL(om_text)->value;
}
axis2_status_t AXIS2_CALL
axis2_om_text_set_value(axis2_om_text_t *om_text,
axis2_env_t **env,
const axis2_char_t *value)
{
axis2_om_text_impl_t *text_impl = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK((*env)->error , om_text, AXIS2_FAILURE);
text_impl = AXIS2_INTF_TO_IMPL(om_text);
if(NULL != text_impl->value)
{
AXIS2_FREE((*env)->allocator, text_impl->value);
text_impl->value = NULL;
}
text_impl->value = (axis2_char_t*)AXIS2_STRDUP(value, env);
if(!text_impl->value)
{
AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY,
AXIS2_FAILURE);
return AXIS2_FAILURE;
}
return AXIS2_SUCCESS;
}
/*Following has been implemented for the MTOM support*/
axis2_char_t* AXIS2_CALL
axis2_om_text_get_mime_type(axis2_om_text_t *om_text,
axis2_env_t **env)
{
AXIS2_ENV_CHECK(env,NULL);
return AXIS2_INTF_TO_IMPL(om_text)->mime_type;
}
axis2_status_t AXIS2_CALL
axis2_om_text_set_mime_type(axis2_om_text_t *om_text,
axis2_env_t **env,
const axis2_char_t *mime_type)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK((*env)->error , om_text, AXIS2_FAILURE);
if(AXIS2_INTF_TO_IMPL(om_text)->mime_type)
AXIS2_FREE((*env)->allocator, AXIS2_INTF_TO_IMPL(om_text)->mime_type);
AXIS2_INTF_TO_IMPL(om_text)->mime_type = (axis2_char_t*)AXIS2_STRDUP(mime_type,env);
return AXIS2_SUCCESS;
}
axis2_bool_t AXIS2_CALL
axis2_om_text_get_optimize(axis2_om_text_t *om_text,
axis2_env_t **env)
{
AXIS2_ENV_CHECK(env,AXIS2_FAILURE);
return AXIS2_INTF_TO_IMPL(om_text)->optimize;
}
axis2_status_t AXIS2_CALL
axis2_om_text_set_optimize(axis2_om_text_t *om_text,
axis2_env_t **env,
const axis2_bool_t optimize)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK((*env)->error , om_text, AXIS2_FAILURE);
AXIS2_INTF_TO_IMPL(om_text)->optimize = optimize;
return AXIS2_SUCCESS;
}
axis2_bool_t AXIS2_CALL
axis2_om_text_get_is_binary(axis2_om_text_t *om_text,
axis2_env_t **env)
{
AXIS2_ENV_CHECK(env,AXIS2_FAILURE);
return AXIS2_INTF_TO_IMPL(om_text)->is_binary;
}
axis2_status_t AXIS2_CALL
axis2_om_text_set_is_binary(axis2_om_text_t *om_text,
axis2_env_t **env,
const axis2_bool_t is_binary)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK((*env)->error , om_text, AXIS2_FAILURE);
AXIS2_INTF_TO_IMPL(om_text)->is_binary = is_binary;
return AXIS2_SUCCESS;
}
axis2_char_t* AXIS2_CALL
axis2_om_text_get_localname(axis2_om_text_t *om_text,
axis2_env_t **env)
{
AXIS2_ENV_CHECK(env,NULL);
return AXIS2_INTF_TO_IMPL(om_text)->localname;
}
axis2_char_t* AXIS2_CALL
axis2_om_text_get_content_id(axis2_om_text_t *om_text,
axis2_env_t **env)
{
AXIS2_ENV_CHECK(env,NULL);
return AXIS2_INTF_TO_IMPL(om_text)->content_id;
}
axis2_status_t AXIS2_CALL
axis2_om_text_set_content_id(axis2_om_text_t *om_text,
axis2_env_t **env,
const axis2_char_t *content_id)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK((*env)->error , om_text, AXIS2_FAILURE);
if(AXIS2_INTF_TO_IMPL(om_text)->content_id)
AXIS2_FREE((*env)->allocator, AXIS2_INTF_TO_IMPL(om_text)->content_id);
AXIS2_INTF_TO_IMPL(om_text)->content_id = (axis2_char_t*)AXIS2_STRDUP(content_id, env);
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_om_text_serialize_start_part(axis2_om_text_t *om_text,
axis2_env_t **env,
axis2_om_output_t *om_output)
{
axis2_om_text_impl_t *om_text_impl = NULL;
axis2_char_t *namespace_uri = NULL;
axis2_char_t *prefix = NULL;
axis2_char_t *local_name = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
om_text_impl = AXIS2_INTF_TO_IMPL(om_text);
local_name = axis2_om_text_get_localname(om_text, env);
if (om_text_impl->ns != NULL)
{
namespace_uri = AXIS2_OM_NAMESPACE_GET_URI(om_text_impl->ns, env);
if (namespace_uri != NULL)
{
prefix = AXIS2_OM_NAMESPACE_GET_PREFIX(om_text_impl->ns, env);
if(prefix != NULL)
{
axis2_om_output_write (om_output, env, AXIS2_OM_ELEMENT, 3,
local_name, namespace_uri, prefix);
}
else
{
axis2_om_output_write (om_output, env, AXIS2_OM_ELEMENT, 2,
local_name, namespace_uri);
}
}
else
{
axis2_om_output_write (om_output, env, AXIS2_OM_ELEMENT, 1,
local_name);
}
}
else
{
axis2_om_output_write (om_output, env, AXIS2_OM_TEXT, 1,
local_name);
}
if (om_text_impl->om_attribute)
AXIS2_OM_ATTRIBUTE_SERIALIZE(om_text_impl->om_attribute, env, om_output);
if (om_text_impl->ns)
AXIS2_OM_NAMESPACE_SERIALIZE(om_text_impl->ns, env, om_output);
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_om_text_serialize_attribute(axis2_om_text_t *om_text,
axis2_env_t **env,
axis2_om_output_t *om_output,
axis2_om_attribute_t *om_attribute)
{
axis2_xml_writer_t *xml_writer = NULL;
axis2_om_namespace_t *om_namespace = NULL;
axis2_om_text_impl_t *om_text_impl = NULL;
axis2_char_t *namespace_uri = NULL;
axis2_char_t *prefix = NULL;
axis2_char_t *attribute_local_name = NULL;
axis2_char_t *attribute_value = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
xml_writer = axis2_xml_writer_create_for_memory(env, NULL, AXIS2_TRUE, 0,
AXIS2_XML_PARSER_TYPE_BUFFER);
om_namespace = axis2_om_namespace_create(env, "" , "");
om_text_impl = AXIS2_INTF_TO_IMPL(om_text);
namespace_uri = AXIS2_OM_NAMESPACE_GET_URI(om_text_impl->ns, env);
attribute_local_name = AXIS2_OM_ATTRIBUTE_GET_LOCALNAME(om_attribute, env);
if (om_namespace != NULL)
{
prefix = AXIS2_OM_NAMESPACE_GET_PREFIX(om_text_impl->ns, env);
attribute_value = AXIS2_OM_ATTRIBUTE_GET_VALUE(om_attribute, env);
if (prefix != NULL)
{
AXIS2_XML_WRITER_WRITE_ATTRIBUTE(xml_writer, env, attribute_local_name, attribute_value);
} else {
AXIS2_XML_WRITER_WRITE_ATTRIBUTE_WITH_NAMESPACE(xml_writer, env, attribute_local_name, attribute_value, namespace_uri);
}
} else {
AXIS2_XML_WRITER_WRITE_ATTRIBUTE(xml_writer, env, attribute_local_name, attribute_value);
}
AXIS2_OM_NAMESPACE_FREE(om_namespace, env);
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_om_text_serialize_namespace(axis2_om_text_t *om_text,
axis2_env_t **env,
const axis2_om_namespace_t *om_namespace,
axis2_om_output_t *om_output)
{
axis2_xml_writer_t *xml_writer = NULL;
axis2_om_text_impl_t *om_text_impl = NULL;
axis2_char_t *namespace_uri = NULL;
axis2_char_t *namespace_prefix = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
xml_writer = axis2_xml_writer_create_for_memory(env, NULL, AXIS2_TRUE, 0,
AXIS2_XML_PARSER_TYPE_BUFFER);
om_namespace = axis2_om_namespace_create(env, "" , "");
om_text_impl = AXIS2_INTF_TO_IMPL(om_text);
if (om_namespace != NULL)
{
namespace_uri = AXIS2_OM_NAMESPACE_GET_URI(om_text_impl->ns, env);
namespace_prefix = AXIS2_OM_NAMESPACE_GET_PREFIX(om_text_impl->ns, env);
AXIS2_XML_WRITER_WRITE_NAMESPACE(xml_writer, env, namespace_prefix, namespace_uri);
AXIS2_XML_WRITER_SET_PREFIX(xml_writer, env, namespace_prefix, namespace_uri);
}
return AXIS2_SUCCESS;
}
axis2_char_t* AXIS2_CALL
axis2_om_text_get_text(axis2_om_text_t *om_text,
axis2_env_t **env)
{
axis2_om_text_impl_t *om_text_impl = NULL;
AXIS2_ENV_CHECK(env,NULL);
om_text_impl = AXIS2_INTF_TO_IMPL(om_text);
if(om_text_impl->value != NULL)
{
return om_text_impl->value;
}
else
{
}
return om_text_impl->value;
}
axis2_data_handler_t *AXIS2_CALL
axis2_om_text_get_data_handler(axis2_om_text_t *om_text,
axis2_env_t **env)
{
AXIS2_ENV_CHECK(env,NULL);
return AXIS2_INTF_TO_IMPL(om_text)->data_handler;
}