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

/**
 * @file axis2_dll_desc.h
 * @brief Axis2 dll_desc interface
 */

#include <axis2_defines.h>
#include <axis2_qname.h>
#include <axis2_error.h>
#include <axis2_const.h>
#include <axis2_svc_skeleton.h>
#include <platforms/axis2_platform_auto_sense.h>

#ifdef __cplusplus
extern "C"
{
#endif
    
/**
 * @defgroup axis2_dll_desc DLL Description
 * @ingroup axis2_description
 * @{
 */

    
typedef struct axis2_dll_desc axis2_dll_desc_t;
typedef struct axis2_dll_desc_ops axis2_dll_desc_ops_t;
   
    
typedef int (*CREATE_FUNCT) (void **inst, axis2_env_t **env);

typedef int (*DELETE_FUNCT) (void *inst, axis2_env_t **env);

typedef enum axis2_dll_type
{
    /** service dll */
    AXIS2_SVC_DLL = 0,
    /** handler dll */
    AXIS2_HANDLER_DLL,
    /** message receiver dll */
    AXIS2_MSG_RECV_DLL,
    /** module dll */
    AXIS2_MODULE_DLL,
    /** transport receiver dll */
    AXIS2_TRANSPORT_RECV_DLL,
    /** transport sender dll */
    AXIS2_TRANSPORT_SENDER_DLL
       
}axis2_dll_type_t;

/**
 *   \brief DLL Description ops struct
 */
AXIS2_DECLARE_DATA struct axis2_dll_desc_ops
{ 
    axis2_status_t (AXIS2_CALL *
    free) (axis2_dll_desc_t *dll_desc, 
            axis2_env_t **env);
    
    /**
     * Set path qualified platform specific dll name
     */    
    axis2_status_t (AXIS2_CALL *
    set_name) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env,
                            axis2_char_t *name);
    
    /**
     * Return the path qualified platform specific dll name
     */ 
    axis2_char_t *(AXIS2_CALL *
    get_name) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_type) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env,
                            axis2_dll_type_t type);
    
    axis2_dll_type_t (AXIS2_CALL *
    get_type) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_load_options) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env,
                            int options);
    
    int (AXIS2_CALL *
    get_load_options) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_dl_handler) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env,
                            AXIS2_DLHANDLER dl_handler);
    
    AXIS2_DLHANDLER (AXIS2_CALL *
    get_dl_handler) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_create_funct) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env,
                            CREATE_FUNCT funct);
    
    CREATE_FUNCT (AXIS2_CALL *
    get_create_funct) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_delete_funct) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env,
                            DELETE_FUNCT funct);
    
    DELETE_FUNCT (AXIS2_CALL *
    get_delete_funct) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env);
                            
    axis2_status_t (AXIS2_CALL *
    set_timestamp) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env,
                            AXIS2_TIME_T timestamp);
    
    AXIS2_TIME_T (AXIS2_CALL *
    get_timestamp) (axis2_dll_desc_t *dll_desc,
                            axis2_env_t **env);                            
     /**
     * This function will accept the library name without any platform
     * dependant prefixes or suffixes. It then prefix and suffix
     * platform dependant prefix and suffix macros to the original name
     * and return the platform specific dll name
     *
     * @param class_name
     * @return platform specific dll name
     */
    axis2_char_t *(AXIS2_CALL *
    create_platform_specific_dll_name)(axis2_dll_desc_t *dll_desc,
                                        axis2_env_t **env,
                                        axis2_char_t *class_name);

        
};
	
/** 
* \brief DLL Description struct
*/
AXIS2_DECLARE_DATA struct axis2_dll_desc
{
    /** DLL Description related ops */
    axis2_dll_desc_ops_t *ops;
    
};


/**
 * creates dll_desc struct
 * @param qname qname, can be NULL
 */
AXIS2_DECLARE(axis2_dll_desc_t*) 
axis2_dll_desc_create(axis2_env_t **env);

AXIS2_DECLARE(axis2_status_t)
axis2_dll_desc_free_void_arg (void *dll_desc,
                                    axis2_env_t **env);

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

#define AXIS2_DLL_DESC_FREE(dll_desc, env) \
    ((dll_desc)->ops->free(dll_desc, env))

#define AXIS2_DLL_DESC_GET_NAME(dll_desc, env) \
    ((dll_desc)->ops->get_name(dll_desc, env))
    
#define AXIS2_DLL_DESC_SET_NAME(dll_desc, env, name) \
    ((dll_desc)->ops->set_name(dll_desc, env, name))

#define AXIS2_DLL_DESC_GET_TYPE(dll_desc, env) \
    ((dll_desc)->ops->get_type(dll_desc, env))
    
#define AXIS2_DLL_DESC_SET_TYPE(dll_desc, env, type) \
    ((dll_desc)->ops->set_type(dll_desc, env, type))

#define AXIS2_DLL_DESC_GET_LOAD_OPTIONS(dll_desc, env) \
    ((dll_desc)->ops->get_load_options(dll_desc, env))
    
#define AXIS2_DLL_DESC_SET_LOAD_OPTIONS(dll_desc, env, load_options) \
    ((dll_desc)->ops->set_load_options(dll_desc, env, load_options))
    
#define AXIS2_DLL_DESC_GET_DL_HANDLER(dll_desc, env) \
    ((dll_desc)->ops->get_dl_handler(dll_desc, env))
    
#define AXIS2_DLL_DESC_SET_DL_HANDLER(dll_desc, env, dl_handler) \
    ((dll_desc)->ops->set_dl_handler(dll_desc, env, dl_handler))
    
#define AXIS2_DLL_DESC_GET_CREATE_FUNCT(dll_desc, env) \
    ((dll_desc)->ops->get_create_funct(dll_desc, env))
    
#define AXIS2_DLL_DESC_SET_CREATE_FUNCT(dll_desc, env, funct) \
    ((dll_desc)->ops->set_create_funct(dll_desc, env, funct))
    
#define AXIS2_DLL_DESC_GET_DELETE_FUNCT(dll_desc, env) \
    ((dll_desc)->ops->get_delete_funct((dll_desc, env))
    
#define AXIS2_DLL_DESC_SET_DELETE_FUNCT(dll_desc, env, funct) \
    ((dll_desc)->ops->set_delete_funct(dll_desc, env, funct))

#define AXIS2_DLL_DESC_GET_TIMESTAMP(dll_desc, env) \
    ((dll_desc)->ops->get_timestamp(dll_desc, env))
    
#define AXIS2_DLL_DESC_SET_TIMESTAMP(dll_desc, env, timestamp) \
    ((dll_desc)->ops->set_timestamp(dll_desc, env, timestamp))

#define AXIS2_DLL_DESC_CREATE_PLATFORM_SPECIFIC_DLL_NAME(dll_desc, env, class_name) \
    ((dll_desc)->ops->create_platform_specific_dll_name(dll_desc, env, class_name))

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

#endif    /* AXIS2_DLL_DESC_H */
