#include <axis2_wsdl_binding_op.h>

/** 
 * @brief Wsdl Component struct impl
 *	Axis2 Wsdl Component impl  
 */
typedef struct axis2_wsdl_binding_op_impl
{
	axis2_wsdl_binding_op_t binding_op;
	    /**
     * Field name
     */
    axis2_qname_t *qname;


    /**
     * Field in_faults
     */
    axis2_linked_list_t *in_faults;

    /**
     * Field out_faults
     */
    axis2_linked_list_t *out_faults;

    /**
     * Field op
     */
    void *op;

    /**
     * Field input
     */
    axis2_wsdl_binding_msg_ref_t *input;

    /**
     * Field output
     */
    axis2_wsdl_binding_msg_ref_t *output;
        
} axis2_wsdl_binding_op_impl_t;

#define AXIS2_INTF_TO_IMPL(wsdl_binding_op) \
        ((axis2_wsdl_binding_op_impl_t *)(wsdl_binding_op))

/***************************** Function headers *******************************/

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_free (axis2_wsdl_binding_op_t *wsdl_binding_op,
                            axis2_env_t **env);


axis2_wsdl_binding_msg_ref_t * AXIS2_CALL
axis2_wsdl_binding_op_get_input(axis2_wsdl_binding_op_t *binding_op,
                                        axis2_env_t **env);

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_set_input(axis2_wsdl_binding_op_t *binding_op,
                                        axis2_env_t **env,
                                        axis2_wsdl_binding_msg_ref_t *input);

void *AXIS2_CALL
axis2_wsdl_binding_op_get_op(axis2_wsdl_binding_op_t *binding_op,
                                    axis2_env_t **env);

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_set_op(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env,
                                            void *op);

axis2_wsdl_binding_msg_ref_t * AXIS2_CALL
axis2_wsdl_binding_op_get_output(axis2_wsdl_binding_op_t *binding_op,
                                        axis2_env_t **env);

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_set_output(axis2_wsdl_binding_op_t *binding_op,
                                        axis2_env_t **env,
                                        axis2_wsdl_binding_msg_ref_t *output);

axis2_qname_t *AXIS2_CALL
axis2_wsdl_binding_op_get_qname(axis2_wsdl_binding_op_t *binding_op,
                                    axis2_env_t **env);

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_set_qname(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env,
                                            axis2_qname_t *qname);

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_add_in_fault(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env,
                                            axis2_wsdl_binding_fault_t *in_fault);

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_add_out_fault(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env,
                                            axis2_wsdl_binding_fault_t *out_fault);

axis2_linked_list_t * AXIS2_CALL
axis2_wsdl_binding_op_get_in_faults(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env);

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_set_in_faults(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env,
                                            axis2_linked_list_t *in_faults);

axis2_linked_list_t * AXIS2_CALL
axis2_wsdl_binding_op_get_out_faults(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env);

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_set_out_faults(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env,
                                            axis2_linked_list_t *out_faults);

		
/***************************** End of function headers ************************/

axis2_wsdl_binding_op_t * AXIS2_CALL 
axis2_wsdl_binding_op_create (axis2_env_t **env)
{
    axis2_wsdl_binding_op_impl_t *binding_op_impl = NULL;
    
    AXIS2_ENV_CHECK(env, NULL);
    
	binding_op_impl = (axis2_wsdl_binding_op_impl_t *) 
        AXIS2_MALLOC ((*env)->allocator, sizeof(axis2_wsdl_binding_op_impl_t));
    
	if(NULL == binding_op_impl)
	{
		AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;
	}
    
    binding_op_impl->qname = NULL;
    binding_op_impl->op = NULL;
    binding_op_impl->input = NULL;
    binding_op_impl->output = NULL;
    binding_op_impl->in_faults = NULL;
    binding_op_impl->out_faults = NULL;
    binding_op_impl->binding_op.extensible_component = NULL;
    binding_op_impl->binding_op.ops = NULL;
	
    binding_op_impl->in_faults = axis2_linked_list_create (env);
    
	if(NULL == binding_op_impl->in_faults)
	{
		axis2_wsdl_binding_op_free(&(binding_op_impl->binding_op),
            env);
		AXIS2_ERROR_SET ((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;        
	}
    
    binding_op_impl->out_faults = axis2_linked_list_create (env);
    
	if(NULL == binding_op_impl->out_faults)
	{
        axis2_wsdl_binding_op_free(&(binding_op_impl->binding_op),
            env);
		AXIS2_ERROR_SET ((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);	
        return NULL;
	}
    
    binding_op_impl->binding_op.extensible_component = 
        axis2_wsdl_extensible_component_create(env);
    
	if(NULL == binding_op_impl->binding_op.extensible_component)
	{
        axis2_wsdl_binding_op_free(&(binding_op_impl->binding_op),
            env);
		AXIS2_ERROR_SET ((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;        
	}
    
	binding_op_impl->binding_op.ops = (axis2_wsdl_binding_op_ops_t *)
		AXIS2_MALLOC ((*env)->allocator, sizeof(axis2_wsdl_binding_op_ops_t));
    
	if(NULL == binding_op_impl->binding_op.ops)
	{
        axis2_wsdl_binding_op_free(&(binding_op_impl->binding_op),
            env);
		AXIS2_ERROR_SET ((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;        
	}
    
	binding_op_impl->binding_op.ops->free = axis2_wsdl_binding_op_free;
    
	binding_op_impl->binding_op.ops->get_input =
        axis2_wsdl_binding_op_get_input;
    
    binding_op_impl->binding_op.ops->set_input =
        axis2_wsdl_binding_op_set_input;
    
    binding_op_impl->binding_op.ops->get_op =
        axis2_wsdl_binding_op_get_op;
    
    binding_op_impl->binding_op.ops->set_op =
        axis2_wsdl_binding_op_set_op;
    
    binding_op_impl->binding_op.ops->get_output =
        axis2_wsdl_binding_op_get_output;
    
    binding_op_impl->binding_op.ops->set_output =
        axis2_wsdl_binding_op_set_output;
    
    binding_op_impl->binding_op.ops->get_qname =
        axis2_wsdl_binding_op_get_qname;
    
    binding_op_impl->binding_op.ops->set_qname =
        axis2_wsdl_binding_op_set_qname;
        
    binding_op_impl->binding_op.ops->add_in_fault =
        axis2_wsdl_binding_op_add_in_fault;
    
    binding_op_impl->binding_op.ops->add_out_fault =
        axis2_wsdl_binding_op_add_out_fault;

    binding_op_impl->binding_op.ops->get_in_faults =
        axis2_wsdl_binding_op_get_in_faults; 
        
    binding_op_impl->binding_op.ops->set_in_faults =
        axis2_wsdl_binding_op_set_in_faults; 

    binding_op_impl->binding_op.ops->get_out_faults =
        axis2_wsdl_binding_op_get_out_faults; 
        
    binding_op_impl->binding_op.ops->set_out_faults =
        axis2_wsdl_binding_op_set_out_faults; 
    
	return &(binding_op_impl->binding_op);
}

/******************************************************************************/

axis2_status_t AXIS2_CALL 
axis2_wsdl_binding_op_free (axis2_wsdl_binding_op_t *binding_op, 
                            axis2_env_t **env)
{
    axis2_wsdl_binding_op_impl_t *binding_op_impl = NULL;
    
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    
    binding_op_impl = AXIS2_INTF_TO_IMPL(binding_op);
    
	if(NULL != binding_op->ops)
    {
        AXIS2_FREE((*env)->allocator, binding_op->ops);
        binding_op->ops = NULL;
    }
    
    if(NULL != binding_op_impl->in_faults)
    {
        void *val = NULL;
        int i = 0;
        for (i = 0; i < AXIS2_LINKED_LIST_SIZE(binding_op_impl->in_faults, env); i++)
        {
            axis2_wsdl_binding_fault_t *binding_fault = NULL;
            binding_fault = AXIS2_LINKED_LIST_GET(binding_op_impl->in_faults, env, i);
            
            binding_fault = (axis2_wsdl_binding_fault_t *) val;
            if (binding_fault)
               AXIS2_WSDL_BINDING_FAULT_FREE (binding_fault, env);
            
            val = NULL;
            binding_fault = NULL;
               
        }
        AXIS2_LINKED_LIST_FREE(binding_op_impl->in_faults, env);
        binding_op_impl->in_faults = NULL;
    }
    
    if(NULL != binding_op_impl->out_faults)
    {
        void *val = NULL;
        int i = 0;
        for (i = 0; i < AXIS2_LINKED_LIST_SIZE(binding_op_impl->out_faults, env); i++)
        {
            axis2_wsdl_binding_fault_t *binding_fault = NULL;
            binding_fault = AXIS2_LINKED_LIST_GET(binding_op_impl->out_faults, env, i);
            
            binding_fault = (axis2_wsdl_binding_fault_t *) val;
            if (binding_fault)
               AXIS2_WSDL_BINDING_FAULT_FREE (binding_fault, env);
            
            val = NULL;
            binding_fault = NULL;
               
        }
        AXIS2_LINKED_LIST_FREE(binding_op_impl->out_faults, env);
        binding_op_impl->out_faults = NULL;
    }
    
    if(NULL != binding_op->extensible_component)
    {
        AXIS2_WSDL_EXTENSIBLE_COMPONENT_FREE(binding_op->
            extensible_component, env);
        binding_op->extensible_component = NULL;
    }
    
    if(binding_op_impl)
        AXIS2_FREE((*env)->allocator, binding_op_impl);
    binding_op_impl = NULL;
    
	return AXIS2_SUCCESS;
}

axis2_wsdl_binding_msg_ref_t * AXIS2_CALL
axis2_wsdl_binding_op_get_input(axis2_wsdl_binding_op_t *binding_op,
                                        axis2_env_t **env)
{
    AXIS2_ENV_CHECK(env, NULL);
    return AXIS2_INTF_TO_IMPL(binding_op)->input;
}

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_set_input(axis2_wsdl_binding_op_t *binding_op,
                                        axis2_env_t **env,
                                        axis2_wsdl_binding_msg_ref_t *input) 
{
    axis2_wsdl_binding_op_impl_t *binding_op_impl = NULL;
    
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, input, AXIS2_FAILURE);
    
    binding_op_impl = AXIS2_INTF_TO_IMPL(binding_op);
    if(binding_op_impl->input)
    {
        AXIS2_WSDL_BINDING_MSG_REF_FREE(binding_op_impl->input, env);
        binding_op_impl->input = NULL;
    }
    binding_op_impl->input = input;
    return AXIS2_SUCCESS;
}

void *AXIS2_CALL
axis2_wsdl_binding_op_get_op(axis2_wsdl_binding_op_t *binding_op,
                                    axis2_env_t **env) 
{
    AXIS2_ENV_CHECK(env, NULL);
    return AXIS2_INTF_TO_IMPL(binding_op)->op;
}

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_set_op(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env,
                                            void *op) 
{
    axis2_wsdl_binding_op_impl_t *binding_op_impl = NULL;
    
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, op, AXIS2_FAILURE);
    
    binding_op_impl = AXIS2_INTF_TO_IMPL(binding_op);
    
    if(NULL != binding_op_impl->op)
    {
        axis2_wsdl_op_free_void_arg(op, env);
        binding_op_impl->op = NULL;
    }
    binding_op_impl->op = op;
    return AXIS2_SUCCESS;
}

axis2_wsdl_binding_msg_ref_t * AXIS2_CALL
axis2_wsdl_binding_op_get_output(axis2_wsdl_binding_op_t *binding_op,
                                        axis2_env_t **env)
{
    AXIS2_ENV_CHECK(env, NULL);
    return AXIS2_INTF_TO_IMPL(binding_op)->output;
}

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_set_output(axis2_wsdl_binding_op_t *binding_op,
                                        axis2_env_t **env,
                                        axis2_wsdl_binding_msg_ref_t *output) 
{
    axis2_wsdl_binding_op_impl_t *binding_op_impl = NULL;
    
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, output, AXIS2_FAILURE);
    
    binding_op_impl = AXIS2_INTF_TO_IMPL(binding_op);
    if(binding_op_impl->output)
    {
        AXIS2_WSDL_BINDING_MSG_REF_FREE(binding_op_impl->output, env);
        binding_op_impl->output = NULL;
    }
    binding_op_impl->output = output;
    return AXIS2_SUCCESS;
}

axis2_qname_t *AXIS2_CALL
axis2_wsdl_binding_op_get_qname(axis2_wsdl_binding_op_t *binding_op,
                                    axis2_env_t **env) 
{
    AXIS2_ENV_CHECK(env, NULL);
    return AXIS2_INTF_TO_IMPL(binding_op)->qname;
}

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_set_qname(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env,
                                            axis2_qname_t *qname) 
{
    axis2_wsdl_binding_op_impl_t *binding_op_impl = NULL;
    
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, qname, AXIS2_FAILURE);
    
    binding_op_impl = AXIS2_INTF_TO_IMPL(binding_op);
    
    if(binding_op_impl->qname)
    {
        AXIS2_QNAME_FREE(binding_op_impl->qname, env);
        binding_op_impl->qname = NULL;
    }
    binding_op_impl->qname = qname;
    return AXIS2_SUCCESS;
}

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_add_in_fault(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env,
                                            axis2_wsdl_binding_fault_t *in_fault) 
{
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, in_fault, AXIS2_FAILURE);
    
    return AXIS2_LINKED_LIST_ADD(AXIS2_INTF_TO_IMPL(binding_op)->in_faults,
        env, in_fault);
}

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_add_out_fault(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env,
                                            axis2_wsdl_binding_fault_t *out_fault) 
{
    axis2_wsdl_binding_op_impl_t *binding_op_impl = NULL;
    
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, out_fault, AXIS2_FAILURE);
    
    binding_op_impl = AXIS2_INTF_TO_IMPL(binding_op);
    
    return AXIS2_LINKED_LIST_ADD(binding_op_impl->out_faults,
        env, out_fault);
}

axis2_linked_list_t * AXIS2_CALL
axis2_wsdl_binding_op_get_in_faults(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env) 
{
    AXIS2_ENV_CHECK(env, NULL);
    return AXIS2_INTF_TO_IMPL(binding_op)->in_faults;
}

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_set_in_faults(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env,
                                            axis2_linked_list_t *in_faults) 
{
    axis2_wsdl_binding_op_impl_t *binding_op_impl = NULL;
    
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, in_faults, AXIS2_FAILURE);
    
    binding_op_impl = AXIS2_INTF_TO_IMPL(binding_op);
    
    if(NULL != binding_op_impl->out_faults)
    {
        void *val = NULL;
        int i = 0;
        for (i = 0; i < AXIS2_LINKED_LIST_SIZE(binding_op_impl->out_faults, env); i++)
        {
            axis2_wsdl_binding_fault_t *binding_fault = NULL;
            binding_fault = AXIS2_LINKED_LIST_GET(binding_op_impl->out_faults, env, i);
            
            binding_fault = (axis2_wsdl_binding_fault_t *) val;
            if (binding_fault)
               AXIS2_WSDL_BINDING_FAULT_FREE (binding_fault, env);
            
            val = NULL;
            binding_fault = NULL;
               
        }
        AXIS2_LINKED_LIST_FREE(binding_op_impl->out_faults, env);
        binding_op_impl->out_faults = NULL;
    }
    binding_op_impl->in_faults = in_faults;
    return AXIS2_SUCCESS;
}

axis2_linked_list_t * AXIS2_CALL
axis2_wsdl_binding_op_get_out_faults(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env) 
{
    AXIS2_ENV_CHECK(env, NULL);
    return AXIS2_INTF_TO_IMPL(binding_op)->out_faults;
}

axis2_status_t AXIS2_CALL
axis2_wsdl_binding_op_set_out_faults(axis2_wsdl_binding_op_t *binding_op,
                                            axis2_env_t **env,
                                            axis2_linked_list_t *out_faults) 
{
    axis2_wsdl_binding_op_impl_t *binding_op_impl = NULL;
    
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, out_faults, AXIS2_FAILURE);
    
    binding_op_impl = AXIS2_INTF_TO_IMPL(binding_op);
    
    if(NULL != binding_op_impl->out_faults)
    {
        void *val = NULL;
        int i = 0;
        for (i = 0; i < AXIS2_LINKED_LIST_SIZE(binding_op_impl->out_faults, env); i++)
        {
            axis2_wsdl_binding_fault_t *binding_fault = NULL;
            binding_fault = AXIS2_LINKED_LIST_GET(binding_op_impl->out_faults, env, i);
            
            binding_fault = (axis2_wsdl_binding_fault_t *) val;
            if (binding_fault)
               AXIS2_WSDL_BINDING_FAULT_FREE (binding_fault, env);
            
            val = NULL;
            binding_fault = NULL;
               
        }
        AXIS2_LINKED_LIST_FREE(binding_op_impl->out_faults, env);
        binding_op_impl->out_faults = NULL;
    }
    
    binding_op_impl->out_faults = out_faults;
    return AXIS2_SUCCESS;
}
