/*
* 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.
*/

#ifndef AXIS2_OP_CTX_H
#define AXIS2_OP_CTX_H

/**
 * @defgroup axis2_op_ctx operation context 
 * @ingroup axis2_context
 * operation context represents a running "instance" of an operation.
 * operation context allows messages to be grouped into operations as in 
 * WSDL 2.0 specification. operations are essentially arbitrary message exchange 
 * patterns (MEP). So as messages are being exchanged, operation context remembers 
 * the state of message exchange pattern specifics.
 * The implementation of operation context supports MEPs which have one input 
 * message and/or one output message. In order to support other MEPs one must 
 * extend this struct.
 * @{
 */

/**
 * @file axis2_op_ctx.h
 */

#include <axis2_defines.h>
#include <axis2_hash.h>
#include <axis2_env.h>
#include <axis2_msg_ctx.h>
#include <axis2_op.h>

#ifdef __cplusplus
extern "C"
{
#endif

    /** Type name for struct axis2_op_ctx_ops */
    typedef struct axis2_op_ctx_ops axis2_op_ctx_ops_t;
    /** Type name for struct axis2_op_ctx */
    typedef struct axis2_op_ctx axis2_op_ctx_t;
        
    struct axis2_svc_ctx;

    /**
     * operation context ops struct.
     * Encapsulator struct for ops of axis2_op_ctx.
     */
    struct axis2_op_ctx_ops
    {
       /**
        * Gets base which is of context type.
        * @param op_ctx pointer to operation context
        * @param env pointer to environment struct
        * @return pointer to base context
        */
        axis2_ctx_t *(AXIS2_CALL *
                get_base)(
                    const axis2_op_ctx_t *op_ctx,
                    const axis2_env_t *env);

       /**
        * Frees operation context.
        * @param op_ctx pointer to operation context
        * @param env pointer to environment struct
        * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
        */
        axis2_status_t (AXIS2_CALL *
                free)(
                    struct axis2_op_ctx *op_ctx,
                    const axis2_env_t *env);

        /**
         * Initializes operation context. This method traverses through all the 
         * message contexts stored within it and initialize them all.
         * @param op_ctx pointer to operation context
         * @param env pointer to environment struct
         * @param conf pointer to conf configuration
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                init)(
                    struct axis2_op_ctx *op_ctx,
                    const axis2_env_t *env,
                    struct axis2_conf *conf);

        /**
         * Gets operation the operation context is related to.
         * @param op_ctx pointer to operation context
         * @param env pointer to environment struct
         * @return pointer to operation
         */
        struct axis2_op *(AXIS2_CALL *
                get_op)(
                    const axis2_op_ctx_t *op_ctx,
                    const axis2_env_t *env);

        /**
         * Gets parent which is of service context type. 
         * @param op_ctx pointer to operation context
         * @param env pointer to environment struct
         * @return pointer to service context within which this operation 
         * context lives
         */
        struct axis2_svc_ctx *(AXIS2_CALL *
                get_parent)(
                    const axis2_op_ctx_t *op_ctx,
                    const axis2_env_t *env);

        /**
         * Adds a message context. 
         * @param op_ctx pointer to operation context
         * @param env pointer to environment struct
         * @param msg_ctx pointer to message context struct, message context 
         * does not assume the ownership of the struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                add_msg_ctx)(
                    struct axis2_op_ctx *op_ctx,
                    const axis2_env_t *env,
                    axis2_msg_ctx_t *msg_ctx);

        /**
         * Gets message context with the given message ID.
         * @param op_ctx pointer to operation context
         * @param env pointer to environment struct
         * @param message_id message ID string
         * @return pointer to message context with given ID
         */
        axis2_msg_ctx_t *(AXIS2_CALL *
                get_msg_ctx)(
                    const axis2_op_ctx_t *op_ctx,
                    const axis2_env_t *env,
                    const axis2_char_t *message_id);

        /**
         * Gets the bool value indicating if the MEP is complete.
         * MEP is considered complete when all the messages that
         * are associated with the MEP has arrived.
         * @param op_ctx pointer to operation context
         * @param env pointer to environment struct
         * @return AXIS2_TRUE if MEP invocation is complete, else AXIS2_FALSE
         */
        axis2_bool_t (AXIS2_CALL *
                get_is_complete)(
                    const axis2_op_ctx_t *op_ctx,
                    const axis2_env_t *env);

        /**
         * Sets the bool value indicating if the MEP is complete.
         * MEP is considered complete when all the messages that
         * are associated with the MEP has arrived.
         * @param op_ctx pointer to operating context
         * @param env pointer to environment struct
         * @param is_complete AXIS2_TRUE if MEP invocation is complete, else 
         * AXIS2_FALSE
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_complete)(
                    struct axis2_op_ctx *op_ctx,
                    const axis2_env_t *env,
                    axis2_bool_t is_complete);

        /**
         * Cleans up the operation context. Clean up includes removing all 
         * message context references recorded in operation context.
         * @param op_ctx pointer to operation context
         * @param env pointer to environment struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                cleanup)(
                    struct axis2_op_ctx *op_ctx,
                    const axis2_env_t *env);

        /**
         * Sets parent service context.
         * @param op_ctx pointer to operation context
         * @param env pointer to environment struct
         * @param svc_ctx pointer to service context, message context does not
         * assume the ownership of the struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_parent)(
                    struct axis2_op_ctx *op_ctx,
                    const axis2_env_t *env,
                    struct axis2_svc_ctx *svc_ctx);

        /**
         * Gets the message context map.
         * @param op_ctx pointer to operation context
         * @param env pointer to environment struct
         * @return pointer to hash table containing message contexts
         */
        axis2_hash_t *(AXIS2_CALL *
                get_msg_ctx_map)(
                    const axis2_op_ctx_t *op_ctx,
                    const axis2_env_t *env);

    };

    /**
     * operation context struct.
     */
    struct axis2_op_ctx
    {
        /** operations of operation context struct */
        axis2_op_ctx_ops_t *ops;
    };

    /**
     * Creates an operation context struct instance.
     * @param env pointer to environment struct
     * @param op pointer to operation that is related to operation context. 
     * operation context does not assume the ownership of the struct
     * @param svc_ctx pointer to parent service context
     * @return pointer to newly created operation context
     */
    AXIS2_EXTERN axis2_op_ctx_t *AXIS2_CALL
    axis2_op_ctx_create(
       const axis2_env_t *env,
       struct axis2_op *op,
       struct axis2_svc_ctx *svc_ctx);


/** Gets base context struct.
    @sa axis2_op_ctx_ops#get_base */
#define AXIS2_OP_CTX_GET_BASE(op_ctx, env) \
      ((op_ctx)->ops->get_base(op_ctx, env))

/** Frees operation context.
    @sa axis2_op_ctx_ops#free */
#define AXIS2_OP_CTX_FREE(op_ctx, env)\
      ((op_ctx)->ops->free(op_ctx, env))

/** Initializes operation context.
    @sa axis2_op_ctx_ops#init */
#define AXIS2_OP_CTX_INIT(op_ctx, env, conf) \
      ((op_ctx)->ops->init(op_ctx, env, conf))

/** Gets operating related to operation context.
    @sa axis2_op_ctx_ops#get_op */
#define AXIS2_OP_CTX_GET_OP(op_ctx, env)\
      ((op_ctx)->ops->get_op(op_ctx, env))

/** Gets parent which is of type service context.
    @sa axis2_op_ctx_ops#get_parent */
#define AXIS2_OP_CTX_GET_PARENT(op_ctx, env) \
      ((op_ctx)->ops->get_parent(op_ctx, env))

/** Adds message context.
    @sa axis2_op_ctx_ops#add_msg_ctx */
#define AXIS2_OP_CTX_ADD_MSG_CTX(op_ctx, env, msg_ctx) \
      ((op_ctx)->ops->add_msg_ctx(op_ctx, env, msg_ctx))

/** Gets message context with given message ID.
    @sa axis2_op_ctx_ops#get_msg_ctx */
#define AXIS2_OP_CTX_GET_MSG_CTX(op_ctx, env, message_id) \
      ((op_ctx)->ops->get_msg_ctx(op_ctx, env, message_id))

/** Gets bool value indicating the complete status.
    @sa axis2_op_ctx_ops#get_is_complete */
#define AXIS2_OP_CTX_GET_IS_COMPLETE(op_ctx, env) \
      ((op_ctx)->ops->get_is_complete(op_ctx, env))

/** Sets bool value indicating the complete status.
    @sa axis2_op_ctx_ops#set_is_complete */
#define AXIS2_OP_CTX_SET_IS_COMPLETE(op_ctx, env, is_complete) \
      ((op_ctx)->ops->set_complete(op_ctx, env, is_complete))

/** Cleans up operation context.
    @sa axis2_op_ctx_ops#cleanup */
#define AXIS2_OP_CTX_CLEANUP(op_ctx, env) \
      ((op_ctx)->ops->cleanup(op_ctx, env))

/** Sets parent service context.
    @sa axis2_op_ctx_ops#set_parent */
#define AXIS2_OP_CTX_SET_PARENT(op_ctx, env, svc_ctx) \
      ((op_ctx)->ops->set_parent(op_ctx, env, svc_ctx))

/** Gets message context map.
    @sa axis2_op_ctx_ops#get_msg_ctx */
#define AXIS2_OP_CTX_GET_MSG_CTX_MAP(op_ctx, env) \
      ((op_ctx)->ops->get_msg_ctx_map(op_ctx, env))

/** @} */
#ifdef __cplusplus
}
#endif

#endif                          /* AXIS2_OP_CTX_H */
