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


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

#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2_async_result.h>
#include <axis2_soap_envelope.h>

#ifdef __cplusplus
extern "C"
{
#endif

/** @defgroup axis2_callback Message Context 
 * @ingroup axis2_core_context
 * @{
 */
    
typedef struct axis2_callback_ops axis2_callback_ops_t;
typedef struct axis2_callback axis2_callback_t; 

    
/** 
 * @brief Message Context ops struct
 * Encapsulator struct for ops of axis2_callback
 */  
struct axis2_callback_ops
{
    /**
     * This Method is called by Axis2 once the Async Operation is sucessfully completed and the result returns
     *
     * @param result
     */
    axis2_status_t (AXIS2_CALL *invoke_on_complete)(struct axis2_callback *callback, 
        axis2_env_t **env, 
        axis2_async_result_t *result);
    /**
     * This Method is called by Axis2 once the Async Operation fails and the result returns
     *
     * @param e
     */
    axis2_status_t (AXIS2_CALL *report_error)(struct axis2_callback *callback, 
        axis2_env_t **env, 
        int exception);
    /**
     * This says has the Async Operation is completed or not. this could be useful for poleing 
     * with a special callback written for poleing (checking repeatedly time to time).
     * e.g.
     * <code>
     *      <pre>
     *          while(!callback.isComplete()){
     *             Thread.sleep(1000);
     *          }
     *          do whatever u need to do
     *      </pre>
     * </code>
     *
     * @return
     */
    axis2_bool_t (AXIS2_CALL *get_complete)(struct axis2_callback *callback, 
        axis2_env_t **env);
    /**
     * Method setComplete
     *
     * @param complete
     */
    axis2_status_t (AXIS2_CALL *set_complete)(struct axis2_callback *callback, 
        axis2_env_t **env, 
        axis2_bool_t complete);
    axis2_soap_envelope_t* (AXIS2_CALL *get_envelope)(struct axis2_callback *callback, 
        axis2_env_t **env);
    axis2_status_t (AXIS2_CALL *set_envelope)(struct axis2_callback *callback, 
        axis2_env_t **env, axis2_soap_envelope_t *envelope);
    int (AXIS2_CALL *get_error)(struct axis2_callback *callback, 
        axis2_env_t **env);
    axis2_status_t (AXIS2_CALL *set_error)(struct axis2_callback *callback, 
        axis2_env_t **env, 
        int error);
    axis2_status_t (AXIS2_CALL *free)(struct axis2_callback *callback, 
                                       axis2_env_t **env);
};

/** 
 * @brief Message Context struct
  *	Axis2 Message Context
 */
struct axis2_callback
{
    axis2_callback_ops_t *ops;    
};

AXIS2_DECLARE(axis2_callback_t*) axis2_callback_create(axis2_env_t **env);
    
/************************** Start of function macros **************************/

#define AXIS2_CALLBACK_INVOKE_ON_COMPLETE(callback, env, result) ((callback)->ops->invoke_on_complete(callback, env, result))
#define AXIS2_CALLBACK_REPORT_ERROR(callback, env, error) ((callback)->ops->report_error(callback, env, error))
#define AXIS2_CALLBACK_GET_COMPLETE(callback, env) ((callback)->ops->get_complete(callback, env))
#define AXIS2_CALLBACK_SET_COMPLETE(callback, env, complete) ((callback)->ops->set_complete(callback, env, complete))
#define AXIS2_CALLBACK_GET_ENVELOPE(callback, env) ((callback)->ops->get_envelope(callback, env))
#define AXIS2_CALLBACK_SET_ENVELOPE(callback, env, envelope) ((callback)->ops->set_envelope(callback, env, envelope))
#define AXIS2_CALLBACK_GET_ERROR(callback, env) ((callback)->ops->get_error(callback, env))
#define AXIS2_CALLBACK_SET_ERROR(callback, env, error) ((callback)->ops->set_error(callback, env, error))
#define AXIS2_CALLBACK_FREE(callback, env) ((callback)->ops->free (callback, env))

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

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

#endif                          /* AXIS2_CALLBACK_H */
