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

#include <axis2_class_loader.h>

axis2_status_t
axis2_class_loader_load_lib(const axis2_env_t *env,
        axis2_dll_desc_t *dll_desc);

axis2_status_t
axis2_class_loader_unload_lib(const axis2_env_t *env,
        axis2_dll_desc_t *dll_desc);


AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_class_loader_init(const axis2_env_t *env)
{
    AXIS2_PLATFORM_LOADLIBINIT();
    return AXIS2_SUCCESS;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_class_loader_delete_dll(const axis2_env_t *env,
        axis2_dll_desc_t *dll_desc)
{
    if (!dll_desc)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_DLL_CREATE_FAILED,
                AXIS2_FAILURE);
        return AXIS2_FAILURE;
    }
    axis2_class_loader_unload_lib(env, dll_desc);
    AXIS2_PLATFORM_LOADLIBEXIT()
    return AXIS2_SUCCESS;
}

AXIS2_EXTERN void * AXIS2_CALL
axis2_class_loader_create_dll(const axis2_env_t *env,
        axis2_param_t *impl_info_param)
{
    void *svc_skeli = NULL; /* axis2_svc_skeleton */
    void *msg_recv = NULL; /* axis2_msg_recv */
    void *handler = NULL; /* axis2_handler */
    void *module = NULL; /* axis2_module */
    void *transport_recv = NULL; /* axis2_transport_receiver */
    void *transport_sender = NULL; /* axis2_transport_sender */
    void *obj = NULL;
    CREATE_FUNCT create_funct = NULL;
    DELETE_FUNCT delete_funct = NULL;
    AXIS2_DLHANDLER dl_handler = NULL;
    axis2_dll_desc_t *dll_desc = NULL;
    axis2_status_t status = AXIS2_FAILURE;
    axis2_dll_type_t dll_type = AXIS2_SVC_DLL;
    axis2_error_codes_t error_code = AXIS2_ERROR_NONE;

    dll_desc = AXIS2_PARAM_GET_VALUE(impl_info_param, env);
    if (!dll_desc)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_DLL_CREATE_FAILED,
                AXIS2_FAILURE);
        return NULL;
    }
    dl_handler = AXIS2_DLL_DESC_GET_DL_HANDLER(dll_desc, env);
    if (NULL == dl_handler)
    {
        status = axis2_class_loader_load_lib(env, dll_desc);
        if (AXIS2_SUCCESS != status)
        {
            AXIS2_ERROR_SET(env->error, AXIS2_ERROR_DLL_CREATE_FAILED,
                    AXIS2_FAILURE);
            return NULL;
        }
        dl_handler = AXIS2_DLL_DESC_GET_DL_HANDLER(dll_desc, env);
        if (!dl_handler)
        {
            return NULL;
        }

        create_funct = (CREATE_FUNCT) AXIS2_PLATFORM_GETPROCADDR(dl_handler,
                AXIS2_CREATE_FUNCTION);
        if (!create_funct)
        {
            return NULL;
        }
        status = AXIS2_DLL_DESC_SET_CREATE_FUNCT(dll_desc, env, create_funct);
        if (AXIS2_FAILURE == status)
        {
            axis2_class_loader_unload_lib(env, dll_desc);
            AXIS2_ERROR_SET(env->error, AXIS2_ERROR_DLL_CREATE_FAILED,
                    AXIS2_FAILURE);
            return NULL;
        }

        delete_funct = (DELETE_FUNCT) AXIS2_PLATFORM_GETPROCADDR(dl_handler,
                AXIS2_DELETE_FUNCTION);
        if (!delete_funct)
        {
            return NULL;
        }
        status = AXIS2_DLL_DESC_SET_DELETE_FUNCT(dll_desc, env, delete_funct);
        if (AXIS2_FAILURE == status)
        {
            axis2_class_loader_unload_lib(env, dll_desc);
            AXIS2_ERROR_SET(env->error, AXIS2_ERROR_DLL_CREATE_FAILED,
                    AXIS2_FAILURE);
            return NULL;
        }
    }
    create_funct = AXIS2_DLL_DESC_GET_CREATE_FUNCT(dll_desc, env);
    if (!create_funct)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_STATE_DLL_DESC,
                AXIS2_FAILURE);
        return NULL;
    }
    dll_type = AXIS2_DLL_DESC_GET_TYPE(dll_desc, env);
    /* TODO Following blocks differ only by error message. Try to
     * reduce them into one block
     */
    error_code = AXIS2_DLL_DESC_GET_ERROR_CODE(dll_desc, env) ;
    if (AXIS2_SVC_DLL == dll_type)
    {
        create_funct(&svc_skeli, env);
        if (NULL == svc_skeli)
        {
            axis2_class_loader_unload_lib(env, dll_desc);
            AXIS2_ERROR_SET(env->error,
                    AXIS2_ERROR_SVC_SKELETON_CREATION_FAILED, AXIS2_FAILURE);
            return NULL;
        }
        return svc_skeli;
    }
    if (AXIS2_HANDLER_DLL == dll_type)
    {
        create_funct(&handler, env);
        if (NULL == handler)
        {
            axis2_class_loader_unload_lib(env, dll_desc);
            AXIS2_ERROR_SET(env->error,
                    AXIS2_ERROR_HANDLER_CREATION_FAILED, AXIS2_FAILURE);
            return NULL;
        }
        return handler;
    }
    if (AXIS2_MODULE_DLL == dll_type)
    {
        create_funct(&module, env);
        if (NULL == module)
        {
            axis2_class_loader_unload_lib(env, dll_desc);
            AXIS2_ERROR_SET(env->error,
                    AXIS2_ERROR_MODULE_CREATION_FAILED, AXIS2_FAILURE);
            return NULL;
        }
        return module;
    }
    if (AXIS2_MSG_RECV_DLL == dll_type)
    {
        create_funct(&msg_recv, env);
        if (NULL == msg_recv)
        {
            axis2_class_loader_unload_lib(env, dll_desc);
            AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "message receiver is NULL");
            AXIS2_ERROR_SET(env->error,
                    AXIS2_ERROR_MSG_RECV_CREATION_FAILED, AXIS2_FAILURE);
            return NULL;
        }
        else
        {
            AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "message receiver loaded successfully");
        }
        return msg_recv;
    }
    if (AXIS2_TRANSPORT_RECV_DLL == dll_type)
    {
        create_funct(&transport_recv, env);
        if (NULL == transport_recv)
        {
            axis2_class_loader_unload_lib(env, dll_desc);
            AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "transport receiver is NULL");
            AXIS2_ERROR_SET(env->error,
                    AXIS2_ERROR_TRANSPORT_RECV_CREATION_FAILED, AXIS2_FAILURE);
            return NULL;
        }
        else
        {
            AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "transport receiver loaded successfully");
        }
        return transport_recv;
    }
    if (AXIS2_TRANSPORT_SENDER_DLL == dll_type)
    {
        create_funct(&transport_sender, env);
        if (NULL == transport_sender)
        {
            axis2_class_loader_unload_lib(env, dll_desc);
            AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "transport sender is NULL");
            AXIS2_ERROR_SET(env->error,
                    AXIS2_ERROR_TRANSPORT_SENDER_CREATION_FAILED, AXIS2_FAILURE);
            return NULL;
        }
        else
        {
            AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "transport sender loaded successfully");
        }
        return transport_sender;
    }
    else
    {
        create_funct(&obj, env);
        if (NULL == obj)
        {
            axis2_class_loader_unload_lib(env, dll_desc);
            AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "Object create function returned NULL");
            AXIS2_ERROR_SET(env->error, error_code, AXIS2_FAILURE);
            return NULL;
        }
        else
        {
            AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "Object loaded successfully");
        }
        return obj;
    }

    return NULL;
}

axis2_status_t
axis2_class_loader_load_lib(const axis2_env_t *env,
        axis2_dll_desc_t *dll_desc)
{
    axis2_char_t *dll_name = NULL;
    AXIS2_DLHANDLER dl_handler = NULL;
    axis2_status_t status = AXIS2_FAILURE;

    dll_name = AXIS2_DLL_DESC_GET_NAME(dll_desc, env);
    dl_handler = AXIS2_PLATFORM_LOADLIB(dll_name);
    if (NULL == dl_handler)
    {
        /*
        axis2_char_t *errormsg = NULL;

        errormsg =  (axis2_char_t *) dlerror ();
        printf("errormsg:%s\n", errormsg);
        */
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_DLL_LOADING_FAILED,
                AXIS2_FAILURE);
        return AXIS2_FAILURE;
    }
    status = AXIS2_DLL_DESC_SET_DL_HANDLER(dll_desc, env, dl_handler);

    if (AXIS2_SUCCESS != status)
    {
        AXIS2_PLATFORM_UNLOADLIB(dl_handler);
        dl_handler = NULL;
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_DLL_LOADING_FAILED,
                AXIS2_FAILURE);
        return status;
    }

    return AXIS2_SUCCESS;
}

axis2_status_t
axis2_class_loader_unload_lib(const axis2_env_t *env,
        axis2_dll_desc_t *dll_desc)
{
    AXIS2_DLHANDLER dl_handler = AXIS2_DLL_DESC_GET_DL_HANDLER(dll_desc, env);
    if (dl_handler)
    {
        AXIS2_PLATFORM_UNLOADLIB(dl_handler);
    }

    return AXIS2_SUCCESS;
}
