blob: 241253adb55e2eb2ec91d4641d828a5bed761d43 [file] [log] [blame]
/*
* 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 <axis2_msg.h>
#include <axutil_property.h>
struct axis2_msg
{
/** parent operation */
axis2_op_t *parent;
/** list of phases that represent the flow */
axutil_array_list_t *flow;
/** name of the message */
axis2_char_t *name;
/** XML schema element qname */
axutil_qname_t *element_qname;
/** direction of message */
axis2_char_t *direction;
/** parameter container to hold message parameters */
struct axutil_param_container *param_container;
/** base description struct */
axis2_desc_t *base;
/** reference count of this object*/
int ref;
};
AXIS2_EXTERN axis2_msg_t *AXIS2_CALL
axis2_msg_create(
const axutil_env_t * env)
{
axis2_msg_t *msg = NULL;
AXIS2_ENV_CHECK(env, NULL);
msg = (axis2_msg_t *)AXIS2_MALLOC(env->allocator, sizeof(axis2_msg_t));
if(!msg)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
msg->param_container = NULL;
msg->parent = NULL;
msg->flow = NULL;
msg->name = NULL;
msg->element_qname = NULL;
msg->direction = NULL;
msg->base = NULL;
msg->ref = 1;
msg->param_container = (axutil_param_container_t *)axutil_param_container_create(env);
if(!msg->param_container)
{
axis2_msg_free(msg, env);
return NULL;
}
msg->flow = axutil_array_list_create(env, 0);
if(!msg->flow)
{
axis2_msg_free(msg, env);
return NULL;
}
msg->base = axis2_desc_create(env);
if(!msg->base)
{
axis2_msg_free(msg, env);
return NULL;
}
return msg;
}
AXIS2_EXTERN void AXIS2_CALL
axis2_msg_free(
axis2_msg_t * msg,
const axutil_env_t * env)
{
AXIS2_ENV_CHECK(env, void);
if(--(msg->ref) > 0)
{
return;
}
if(msg->flow)
{
int i = 0, size = 0;
size = axutil_array_list_size(msg->flow, env);
for(i = 0; i < size; i++)
{
axis2_phase_t *phase = NULL;
phase = axutil_array_list_get(msg->flow, env, i);
if(phase)
axis2_phase_free(phase, env);
}
axutil_array_list_free(msg->flow, env);
}
if(msg->name)
{
AXIS2_FREE(env->allocator, msg->name);
}
if(msg->element_qname)
{
axutil_qname_free(msg->element_qname, env);
}
if(msg->direction)
{
AXIS2_FREE(env->allocator, msg->direction);
}
if(msg->param_container)
{
axutil_param_container_free(msg->param_container, env);
}
if(msg->base)
{
axis2_desc_free(msg->base, env);
}
msg->parent = NULL;
if(msg)
{
AXIS2_FREE(env->allocator, msg);
}
return;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_msg_add_param(
axis2_msg_t * msg,
const axutil_env_t * env,
axutil_param_t * param)
{
axis2_char_t *param_name = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FALSE);
AXIS2_PARAM_CHECK(env->error, param, AXIS2_FALSE);
param_name = axutil_param_get_name(param, env);
if(AXIS2_TRUE == axis2_msg_is_param_locked(msg, env, param_name))
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_PARAMETER_LOCKED_CANNOT_OVERRIDE, AXIS2_FAILURE);
return AXIS2_FAILURE;
}
return axutil_param_container_add_param(msg->param_container, env, param);
}
AXIS2_EXTERN axutil_param_t *AXIS2_CALL
axis2_msg_get_param(
const axis2_msg_t * msg,
const axutil_env_t * env,
const axis2_char_t * param_name)
{
AXIS2_PARAM_CHECK(env->error, param_name, NULL);
return axutil_param_container_get_param(msg->param_container, env, param_name);
}
AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
axis2_msg_get_all_params(
const axis2_msg_t * msg,
const axutil_env_t * env)
{
AXIS2_PARAM_CHECK(env->error, msg->param_container, AXIS2_FALSE);
return axutil_param_container_get_params(msg->param_container, env);
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_msg_set_parent(
axis2_msg_t * msg,
const axutil_env_t * env,
axis2_op_t * op)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
msg->parent = op;
if(op)
{
axis2_desc_set_parent(msg->base, env, axis2_op_get_base(op, env));
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axis2_op_t *AXIS2_CALL
axis2_msg_get_parent(
const axis2_msg_t * msg,
const axutil_env_t * env)
{
return msg->parent;
}
AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
axis2_msg_get_flow(
const axis2_msg_t * msg,
const axutil_env_t * env)
{
return msg->flow;
}
AXIS2_EXTERN axis2_bool_t AXIS2_CALL
axis2_msg_is_param_locked(
axis2_msg_t * msg,
const axutil_env_t * env,
const axis2_char_t * param_name)
{
axis2_op_t *parent_l = NULL;
axutil_param_t *param_l = NULL;
axis2_bool_t locked = AXIS2_FALSE;
AXIS2_ENV_CHECK(env, AXIS2_FALSE);
AXIS2_PARAM_CHECK(env->error, param_name, AXIS2_FALSE);
/* checking the locked status in parent */
parent_l = axis2_msg_get_parent(msg, env);
if(parent_l)
{
locked = axis2_op_is_param_locked(parent_l, env, param_name);
}
if(AXIS2_TRUE == locked)
{
return AXIS2_TRUE;
}
else
{
param_l = axis2_msg_get_param(msg, env, param_name);
}
return (param_l && axutil_param_is_locked(param_l, env));
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_msg_set_flow(
axis2_msg_t * msg,
const axutil_env_t * env,
axutil_array_list_t * flow)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
if(msg->flow)
{
axutil_array_list_free(msg->flow, env);
msg->flow = NULL;
}
if(flow)
{
msg->flow = flow;
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
axis2_msg_get_direction(
const axis2_msg_t * msg,
const axutil_env_t * env)
{
return msg->direction;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_msg_set_direction(
axis2_msg_t * msg,
const axutil_env_t * env,
const axis2_char_t * direction)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
if(msg->direction)
{
AXIS2_FREE(env->allocator, msg->direction);
msg->direction = NULL;
}
if(direction)
{
msg->direction = axutil_strdup(env, direction);
if(!(msg->direction))
{
return AXIS2_FAILURE;
}
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN const axutil_qname_t *AXIS2_CALL
axis2_msg_get_element_qname(
const axis2_msg_t * msg,
const axutil_env_t * env)
{
return msg->element_qname;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_msg_set_element_qname(
axis2_msg_t * msg,
const axutil_env_t * env,
const axutil_qname_t * element_qname)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
if(msg->element_qname)
{
axutil_qname_free(msg->element_qname, env);
msg->element_qname = NULL;
}
if(element_qname)
{
msg->element_qname = axutil_qname_clone((axutil_qname_t *)element_qname, env);
if(!(msg->element_qname))
{
return AXIS2_FAILURE;
}
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
axis2_msg_get_name(
const axis2_msg_t * msg,
const axutil_env_t * env)
{
return msg->name;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_msg_set_name(
axis2_msg_t * msg,
const axutil_env_t * env,
const axis2_char_t * name)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
if(msg->name)
{
AXIS2_FREE(env->allocator, msg->name);
msg->name = NULL;
}
if(name)
{
msg->name = axutil_strdup(env, name);
if(!(msg->name))
{
return AXIS2_FAILURE;
}
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axis2_desc_t *AXIS2_CALL
axis2_msg_get_base(
const axis2_msg_t * msg,
const axutil_env_t * env)
{
return msg->base;
}
AXIS2_EXTERN axutil_param_container_t *AXIS2_CALL
axis2_msg_get_param_container(
const axis2_msg_t * msg,
const axutil_env_t * env)
{
return msg->param_container;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_msg_increment_ref(
axis2_msg_t * msg,
const axutil_env_t * env)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
msg->ref++;
return AXIS2_SUCCESS;
}