/*
 * 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 AXIS2_TRANSPORT_RECEIVER_H
#define AXIS2_TRANSPORT_RECEIVER_H

/**
 * @defgroup axis2_transport transport
 * @ingroup axis2
 * @{
 * @}
 */

/** @defgroup axis2_transport_receiver transport receiver
 * @ingroup axis2_transport
 * Description.
 * @{
 */

/**
 * @file axis2_transport_receiver.h
 * @brief Axis2 description transport receiver interface
 */

 #include <axis2_const.h>
 #include <axutil_error.h>
 #include <axis2_defines.h>
 #include <axutil_env.h>
 #include <axutil_allocator.h>
 #include <axis2_endpoint_ref.h>
 #include <axis2_ctx.h>
 #include <axis2_conf_ctx.h>


#ifdef __cplusplus
extern "C"
{
#endif

    struct axis2_conf_ctx;
    struct axis2_transport_in_desc;

    /** Type name for axis2_transport_receiver */
    typedef struct axis2_transport_receiver axis2_transport_receiver_t;

    /** Type name for axis2_transport_receiver_ops */
    typedef struct axis2_transport_receiver_ops axis2_transport_receiver_ops_t;

    /**
     * @brief Description Transport Receiver ops struct
     * Encapsulator struct for ops of axis2_transport_receiver
     */
    struct axis2_transport_receiver_ops
    {

        /**
         * @param transport_receiver pointer to transport receiver
         * @param env pointer to environment struct
         * @param conf_ctx pointer to configuration context
         * @param intrasport_in pointer to transport_in
         */
        axis2_status_t(AXIS2_CALL * init)(
            axis2_transport_receiver_t * transport_receiver,
            const axutil_env_t * env,
            struct axis2_conf_ctx * conf_ctx,
            struct axis2_transport_in_desc * transport_in);

        /**
         * @param transport_receiver
         * @param env pointer to environment struct
         */
        axis2_status_t(AXIS2_CALL * start)(
            axis2_transport_receiver_t * transport_receiver,
            const axutil_env_t * env);

        /**
         * @param tranport_receiver pointer to transport receiver
         * @param env pointer to environment struct
         * @param svc_name pointer to service name
         */
        axis2_endpoint_ref_t *(AXIS2_CALL * get_reply_to_epr)(
            axis2_transport_receiver_t * transport_receiver,
            const axutil_env_t * env,
            const axis2_char_t * svc_name);

		     /**
         * @param tranport_receiver pointer to transport receiver
         * @param env pointer to environment struct
         * @param svc_name pointer to service name
         */
        axis2_endpoint_ref_t *(AXIS2_CALL * get_epr_for_service)(
            axis2_transport_receiver_t * transport_receiver,
            const axutil_env_t * env,
            const axis2_char_t * svc_name);

				     /**
         * @param tranport_receiver pointer to transport receiver
         * @param env pointer to environment struct
         * @param svc_name pointer to service name
         */
         axis2_char_t *(AXIS2_CALL * get_server_ip)(
            axis2_transport_receiver_t * transport_receiver,
            const axutil_env_t * env);

				     /**
         * @param tranport_receiver pointer to transport receiver
         * @param env pointer to environment struct
         * @param svc_name pointer to service name
         */
        void (AXIS2_CALL * set_server_ip)(
            axis2_transport_receiver_t * transport_receiver,
            const axutil_env_t * env,
             axis2_char_t * ip);

        /**
         * @param server pointer to server
         * @param env pointer to environment struct
         */
        struct axis2_conf_ctx *(AXIS2_CALL * get_conf_ctx)(
            axis2_transport_receiver_t * server,
            const axutil_env_t * env);

        /**
         * @param server pointer to server
         * @param env pointer to environment struct
         */
        axis2_bool_t(AXIS2_CALL * is_running)(
            axis2_transport_receiver_t * server,
            const axutil_env_t * env);
        
        void(AXIS2_CALL * set_is_application_client_side)(
            axis2_transport_receiver_t * server,
            const axutil_env_t * env,
            axis2_bool_t is_application_client_side);

        /**
         * @param transport_receiver pointer to transport receiver
         * @param env pointer to environment struct
         */
        axis2_status_t(AXIS2_CALL * stop)(
            axis2_transport_receiver_t * transport_receiver,
            const axutil_env_t * env);

        /**
         * De-allocate memory
         * @param transport_receiver pointer to transport receiver
         * @param env pointer to environment struct
         */
        void(AXIS2_CALL * free)(
            axis2_transport_receiver_t * transport_receiver,
            const axutil_env_t * env);

    };

    /**
     * @brief Transport Receiver  struct
     */
    struct axis2_transport_receiver
    {
        const axis2_transport_receiver_ops_t *ops;
    };

    /** Frees the transport receiver.
     @sa axis2_transport_receiver#free */
    AXIS2_EXTERN void AXIS2_CALL
    axis2_transport_receiver_free(
        axis2_transport_receiver_t * transport_receiver,
        const axutil_env_t * env);

    /** Initialize the transport receiver.
     @sa axis2_transport_receiver#init */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_transport_receiver_init(
        axis2_transport_receiver_t * transport_receiver,
        const axutil_env_t * env,
        struct axis2_conf_ctx *conf_ctx,
        struct axis2_transport_in_desc *transport_in);

    /** Start
     @sa axis2_transport_receiver#start */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_transport_receiver_start(
        axis2_transport_receiver_t * transport_receiver,
        const axutil_env_t * env);

    /** Stop.
     @sa axis2_transport_receiver#stop */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_transport_receiver_stop(
        axis2_transport_receiver_t * transport_receiver,
        const axutil_env_t * env);

    /** Get reply to epr.
     @sa axis2_transport_receiver#get_reply_to_epr */
    AXIS2_EXTERN axis2_endpoint_ref_t *AXIS2_CALL
    axis2_transport_receiver_get_reply_to_epr(
        axis2_transport_receiver_t * transport_receiver,
        const axutil_env_t * env,
        const axis2_char_t * svc_name);

    /** Get conf ctx.
     @sa axis2_transport_receiver#get_conf_ctx */
    AXIS2_EXTERN struct axis2_conf_ctx *AXIS2_CALL
    axis2_transport_receiver_get_conf_ctx(
        axis2_transport_receiver_t * transport_receiver,
        const axutil_env_t * env);

    /** Is running.
     @sa axis2_transport_receiver#is_running */
    AXIS2_EXTERN axis2_bool_t AXIS2_CALL
    axis2_transport_receiver_is_running(
        axis2_transport_receiver_t * transport_receiver,
        const axutil_env_t * env);
    
    AXIS2_EXTERN void AXIS2_CALL
    axis2_transport_receiver_set_is_application_client_side(
        axis2_transport_receiver_t * transport_receiver,
        const axutil_env_t * env,
        axis2_bool_t is_application_client_side);

	AXIS2_EXTERN axis2_endpoint_ref_t* AXIS2_CALL
		axis2_transport_receiver_get_epr_for_service(axis2_transport_receiver_t *transport_receiver,
		const axutil_env_t *env,
		const axis2_char_t *svc_name);

	AXIS2_EXTERN  axis2_char_t* AXIS2_CALL
	axis2_transport_receiver_get_server_ip(
	axis2_transport_receiver_t *transport_receiver,
	const axutil_env_t *env);

	AXIS2_EXTERN void AXIS2_CALL
	axis2_transport_receiver_set_server_ip(
	axis2_transport_receiver_t *transport_receiver,
	const axutil_env_t *env,
	 axis2_char_t *serverip);

    /** @} */

#ifdef __cplusplus
}
#endif
#endif                          /* AXIS2_TRANSPORT_RECEIVER_H */