source: nrEngine/src/Plugin.cpp @ 1

Revision 1, 5.4 KB checked in by art, 13 years ago (diff)
RevLine 
[1]1/***************************************************************************
2 *                                                                         *
3 *   (c) Art Tevs, MPI Informatik Saarbruecken                             *
4 *       mailto: <tevs@mpi-sb.mpg.de>                                      *
5 *                                                                         *
6 *   This program is free software; you can redistribute it and/or modify  *
7 *   it under the terms of the GNU General Public License as published by  *
8 *   the Free Software Foundation; either version 2 of the License, or     *
9 *   (at your option) any later version.                                   *
10 *                                                                         *
11 ***************************************************************************/
12
13
14//----------------------------------------------------------------------------------
15// Includes
16//----------------------------------------------------------------------------------
17#include "Plugin.h"
18#include "Engine.h"
19
20namespace nrEngine {
21
22        //----------------------------------------------------------------------------------
23        Plugin::Plugin() : IResource("Plugin"), mPluginHandle(0)
24        {
25                m_plgInitialize = NULL;
26                m_plgError = NULL;
27                m_plgRelease = NULL;
28        }
29
30        //----------------------------------------------------------------------------------
31        Plugin::~Plugin()
32        {
33                unloadRes();
34        }
35
36        //----------------------------------------------------------------------------------
37        void* Plugin::getSymbol(const ::std::string& name) const
38        {
39                PluginHandle hdl =  (PluginHandle)NR_PLUGIN_GETSYM(mPluginHandle, name.c_str());
40                return hdl;
41        }
42
43        //----------------------------------------------------------------------------------
44        Result Plugin::initialize(PropertyList* params)
45        {
46                NR_Log(Log::LOG_ENGINE, Log::LL_DEBUG, "Check if the loaded library is valid plugin");
47
48                // get version information
49                m_plgEngineVersion = (plgEngineVersion)getSymbol("plgEngineVersion");
50                m_plgVersionString = (plgVersionString)getSymbol("plgVersionString");
51
52                if (!m_plgEngineVersion || !m_plgVersionString)
53                {
54                        NR_Log(Log::LOG_ENGINE, Log::LL_ERROR, "Plugin seems not to be written for the nrEngine");
55                        NR_Log(Log::LOG_ENGINE, Log::LL_ERROR, "plgVersionString/plgEngineVersion symbols were not found!!!");
56                        return PLG_SYMBOL_NOT_FOUND;
57                }
58
59                // Log this
60                NR_Log(Log::LOG_ENGINE, "Plugin found: %s written for nrEngine v%s", m_plgVersionString(), convertVersionToString(m_plgEngineVersion()).c_str());
61
62                // check if plugin is working with the current engine version
63                if (m_plgEngineVersion() > nrEngineVersion){
64                        NR_Log(Log::LOG_ENGINE, Log::LL_ERROR, "Plugin has got greater version as the engine, so plugin not loaded");
65                        return PLG_WRONG_VERSION;
66                }
67
68                // log something
69                NR_Log(Log::LOG_PLUGIN, "Initialize plugin %s", getResName().c_str());
70
71#define GET_SYMBOL(var, type)\
72                {\
73                        NR_Log(Log::LOG_ENGINE, Log::LL_DEBUG, "Get plugin symbol %s", #type);\
74                        var = (type)getSymbol(#type);\
75                        if (!var){\
76                                NR_Log(Log::LOG_ENGINE, Log::LL_ERROR, "Plugin symbol %s was not found", #type);\
77                                return PLG_SYMBOL_NOT_FOUND;\
78                        }\
79                }
80
81                // Get plugin symbols
82                GET_SYMBOL(m_plgInitialize, plgInitialize);
83                GET_SYMBOL(m_plgError, plgError);
84                GET_SYMBOL(m_plgRelease, plgRelease);
85#undef GET_SYMBOL
86
87                // call the function and check for return code
88                int result = m_plgInitialize(Engine::instance(), params);
89
90                // check for error
91                if (result != 0){
92                        NR_Log(Log::LOG_ENGINE, Log::LL_ERROR, "Plugin returns error %d (%s). See plugin log for more detail information", result, m_plgError(result));
93                        return PLG_EXTERNAL_ERROR;
94                }
95
96                // now get some extra symbols
97                /*m_plgGetMethods = (plgGetMethods)getSymbol("plgGetMethods");
98                m_plgCall = (plgCall)getSymbol("plgCall");
99
100                if (m_plgGetMethods){
101
102                        // get the list of methods provided by this plugin
103                        m_plgGetMethods(mPlgMethods);
104
105                        NR_Log(Log::LOG_ENGINE, Log::LL_DEBUG, "Plugin provides following symbols: ");
106
107                        // now go through each of this method and print some log info about it
108                        for (uint32 i=0; i < mPlgMethods.size(); i++){
109                                std::string params;                             
110                                for (uint32 j=0; j < mPlgMethods[i].param.size(); j++){
111                                        params += mPlgMethods[i].param[j].name;
112                                        if (j < mPlgMethods[i].param.size() - 1) params += ", ";
113                                }
114                                NR_Log(Log::LOG_ENGINE, Log::LL_DEBUG, "  found  -  %s (%s)", mPlgMethods[i].name.c_str(), params.c_str());
115                        }               
116                }*/
117               
118                // all right!
119                return OK;
120        }
121
122        //----------------------------------------------------------------------------------
123        Result Plugin::unloadRes()
124        {
125                // only unload, if we are loaded
126                if (isResLoaded()){
127
128                        // call the release function of the plugin
129                        m_plgRelease();
130
131                        // set all symbols to NULL
132                        m_plgInitialize = NULL;
133                        m_plgEngineVersion = NULL;
134                        m_plgVersionString = NULL;
135                        m_plgError = NULL;
136                        m_plgRelease = NULL;
137                }
138
139                // OK
140                return OK;
141        }
142
143
144        //----------------------------------------------------------------------------------
145        EmptyPlugin::EmptyPlugin() : Plugin()
146        {
147
148        }
149
150        //----------------------------------------------------------------------------------
151        EmptyPlugin::~EmptyPlugin()
152        {
153
154        }
155
156        //----------------------------------------------------------------------------------
157        Result EmptyPlugin::unloadRes()
158        {
159                return OK;
160        }
161
162        //----------------------------------------------------------------------------------
163        void* EmptyPlugin::getSymbol(const ::std::string& name) const
164        {
165                return NULL;
166        }
167
168};
169
Note: See TracBrowser for help on using the repository browser.