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


/**
  * @file axis2_mep_client.h
  * @brief axis2 Message Context interface
  */

#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2_error.h>
#include <axis2_op.h>
#include <axis2_om_node.h>
#include <axis2_soap_envelope.h>

#ifdef __cplusplus
extern "C"
{
#endif

/** @defgroup axis2_mep_client Message Context 
 * @ingroup axis2_core_context
 * @{
 */
    
typedef struct axis2_mep_client_ops axis2_mep_client_ops_t;
typedef struct axis2_mep_client axis2_mep_client_t; 

    
/** 
 * @brief Message Context ops struct
 * Encapsulator struct for ops of axis2_mep_client
 */  
struct axis2_mep_client_ops
{
    axis2_char_t* (AXIS2_CALL *get_soap_action)(struct axis2_mep_client *mep_client, 
        axis2_env_t **env);
    /**
     * prepare the message context for invocation, here the properties kept in the
     * MEPClient copied to the axis2_msg_ctx_t *
     */
    axis2_status_t (AXIS2_CALL *prepare_invocation)(struct axis2_mep_client *mep_client, 
        axis2_env_t **env, 
        axis2_op_t *op, 
        axis2_msg_ctx_t *msg_ctx);
    /**
     * This class prepare the SOAP Envelope using the payload
     *
     * @param toSend
     * @return
     * @
     */
    axis2_msg_ctx_t* (AXIS2_CALL *prepare_soap_envelope)(struct axis2_mep_client *mep_client, 
        axis2_env_t **env, 
        axis2_om_node_t *to_send);
    /**
     * try to infer the transport looking at the URL, the URL can be http://
     * tcp:// mail:// local://. The method will look for the trnasport name as the
     * protocol part of the transport.
     *
     * @param epr
     * @return
     * @
     */
    axis2_transport_out_desc_t* (AXIS2_CALL *infer_transport)(struct axis2_mep_client *mep_client, axis2_env_t **env, 
                axis2_endpoint_ref_t *epr);
    /**
     * create write SOAPEvelope(in terms of version) based on the values set.
     *
     * @return
     * @
     */
    axis2_soap_envelope_t* (AXIS2_CALL *create_default_soap_envelope)(struct axis2_mep_client *mep_client, 
        axis2_env_t **env);
    /**
     * Engage a given Module to the current invocation. But to call this method the
     * Module *MUST* be enable (picked up by the deployment and known to Axis2) .
     * To be detected put the moduels to the AXIS2_REPOSITORY/modules directory
     *
     * @param name
     * @
     */
    axis2_status_t (AXIS2_CALL *engage_module)(struct axis2_mep_client *mep_client, axis2_env_t **env, axis2_qname_t *qname);
    /**
     * @param string
     */
    axis2_status_t (AXIS2_CALL *set_soap_version_uri)(struct axis2_mep_client *mep_client, axis2_env_t **env, axis2_char_t *soap_version_uri);
    /**
     * @param string
     */
    axis2_status_t (AXIS2_CALL *set_soap_action)(struct axis2_mep_client *mep_client, axis2_env_t **env, axis2_char_t *soap_action);
    /**
     * @param string
     */
    axis2_status_t (AXIS2_CALL *set_wsa_action)(struct axis2_mep_client *mep_client, axis2_env_t **env, axis2_char_t *wsa_action);
    axis2_svc_ctx_t* (AXIS2_CALL *get_svc_ctx)(struct axis2_mep_client *mep_client, axis2_env_t **env);
    axis2_status_t (AXIS2_CALL *free)(struct axis2_mep_client *mep_client, 
                                       axis2_env_t **env);
};

/** 
 * @brief Message Context struct
  *	Axis2 Message Context
 */
struct axis2_mep_client
{
    axis2_mep_client_ops_t *ops;    
};

AXIS2_DECLARE(axis2_mep_client_t*) axis2_mep_client_create(axis2_env_t **env, 
    axis2_svc_ctx_t *svc_ctx, 
    axis2_char_t *mep);

axis2_msg_ctx_t* AXIS2_CALL axis2_two_way_send(axis2_env_t **env, axis2_msg_ctx_t *msg_ctx);
    
/************************** Start of function macros **************************/

#define AXIS2_MEP_CLIENT_GET_SOAP_ACTION(mep_client, env) ((mep_client)->ops->get_soap_action(mep_client, env))
#define AXIS2_MEP_CLIENT_PREPARE_INVOCATION(mep_client, env, op, msg_ctx) ((mep_client)->ops->prepare_invocation(mep_client, env, op, msg_ctx))
#define AXIS2_MEP_CLIENT_PREPARE_SOAP_ENVELOPE(mep_client, env, to_send) ((mep_client)->ops->prepare_soap_envelope(mep_client, env, to_send))
#define AXIS2_MEP_CLIENT_INFER_TRANSPORT(mep_client, env, epr) ((mep_client)->ops->infer_transport(mep_client, env, epr))
#define AXIS2_MEP_CLIENT_CREATE_DEFAULT_SOAP_ENVELOPE(mep_client, env) ((mep_client)->ops->create_default_soap_envelope(mep_client, env))
#define AXIS2_MEP_CLIENT_ENGAGE_MODULE(mep_client, env, qname) ((mep_client)->ops->engage_module(mep_client, env, qname))
#define AXIS2_MEP_CLIENT_SET_SOAP_VERSION_URI(mep_client, env, soap_version_uri) ((mep_client)->ops->set_soap_version_uri(mep_client, env, soap_version_uri))
#define AXIS2_MEP_CLIENT_SET_SOAP_ACTION(mep_client, env, soap_action) ((mep_client)->ops->set_soap_action(mep_client, env, soap_action))
#define AXIS2_MEP_CLIENT_SET_WSA_ACTION(mep_client, env, wsa_action) ((mep_client)->ops->set_wsa_action(mep_client, env, wsa_action))
#define AXIS2_MEP_CLIENT_GET_SVC_CTX(mep_client, env) ((mep_client)->ops->get_svc_ctx(mep_client, env))
#define AXIS2_MEP_CLIENT_FREE(mep_client, env) ((mep_client)->ops->free (mep_client, env))

/************************** End of function macros ****************************/    

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

#endif                          /* AXIS2_MEP_CLIENT_H */
