/* -*- C++ -*- */
/*
 *   Copyright 2003-2004 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.
 *
 */

#if !defined(__HANDLERLOADER_H_OF_AXIS_INCLUDED__)
#define __HANDLERLOADER_H_OF_AXIS_INCLUDED__

#include "../platforms/PlatformAutoSense.hpp"

#include "../common/MessageData.h"
#include <axis/GDefine.hpp>
#include <axis/server/WrapperClassHandler.hpp>
#include "SharedObject.h"
#include "AxisEngineException.h"
#include "../common/AxisConfigException.h"

#include <map>
#include <string>

using namespace std;

#define CREATE_FUNCTION "GetClassInstance"
#define DELETE_FUNCTION "DestroyInstance"

AXIS_CPP_NAMESPACE_START

typedef int (* CREATE_OBJECT) (BasicHandler** inst);
typedef int (* DELETE_OBJECT) (BasicHandler* inst);

AXIS_CPP_NAMESPACE_END


//status codes
/*#define HANDLER_INIT_FAIL    1
#define CREATION_FAILED        2
#define LOADLIBRARY_FAILED    3
#define LIBRARY_PATH_EMPTY    4
#define HANDLER_NOT_LOADED    5
#define HANDLER_BEING_USED    6
#define GET_HANDLER_FAILED    7
#define WRONG_HANDLER_TYPE    8
#define NO_HANDLERS_CONFIGURED    9
*/
/*
 *   @class HandlerLoader
 *   @brief
 *
 *
 *
 *   @author Susantha Kumara (skumara@virtusa.com)
 */
AXIS_CPP_NAMESPACE_START
class HandlerLoader:protected SharedObject
{
    private:
        class HandlerInformation
        {
            public:
                string m_sLib;
                int m_nLoadOptions;
                DLHandler m_Handler;
                CREATE_OBJECT m_Create;
                DELETE_OBJECT m_Delete;
                int m_nObjCount;
            public:
                HandlerInformation ()
                {
                    m_sLib = "";
                    m_nObjCount = 0;
                }
            };

            map <int, HandlerInformation*>m_HandlerInfoList;

    public:
        int createHandler (BasicHandler** pHandler, int nLibId);
        int deleteHandler (BasicHandler* pHandler, int nLibId);
        HandlerLoader ();
        ~HandlerLoader ();
    private:
        int loadLib (HandlerInformation* pHandlerInfo);
        int unloadLib (HandlerInformation* pHandlerInfo);
};
AXIS_CPP_NAMESPACE_END

#endif 
