My Project
PluginManager.h
1 #pragma once
2 #include "PEtypes.h"
3 #include "AssetEntity.h"
4 #include "AssetManager.h"
5 #include "util/mutex.h"
6 #include <vector>
7 
8 namespace ParaEngine
9 {
10  using namespace std;
11  // forward declarations.
12  class ClassDescriptor;
13  class IParaEngineCore;
14 
16  // plug-in library functions to be explicitly imported to the game engine.
17 
19  typedef const char* (*lpFnLibDescription)();
21  typedef unsigned long (*lpFnLibVersion)();
23  typedef int (*lpFnLibNumberClasses)();
25  typedef ClassDescriptor* (*lpFnLibClassDesc)(int i);
27  typedef void (*lpFnLibInit)();
29  typedef void(*lpFnLibInitParaEngine)(IParaEngineCore* pIParaEngineCore);
31  typedef int (*lpFnLibActivate)(int nType, void* pVoid);
32 
33  typedef void (STDCALL *pfnEnsureInit)(void);
34  typedef void (STDCALL *pfnForceTerm)(void);
35 
39  struct DLLPlugInEntity : public AssetEntity
40  {
41  private:
43  string m_sDllFilePath;
45  vector<ClassDescriptor*> m_listClassDesc;
50  string m_sLibDescription;
56  unsigned long m_nLibVersion;
57 
59  void* m_hDLL;
60 
62  lpFnLibActivate m_pFuncActivate;
63 
64  public:
65  DLLPlugInEntity(const AssetKey& key);
66  virtual ~DLLPlugInEntity();
67  virtual AssetType GetType(){return dllplugin;};
68 
70  unsigned long GetLibVersion() const { return m_nLibVersion; }
71 
75  const char* GetDLLFilePath();
82  ClassDescriptor* GetClassDescriptor(int i);
83 
89  const char* GetLibDescription();
93  int GetNumberOfClasses();
94 
99  void Init(const char* sFilename);
100 
102  void FreeLibrary();
103 
111  int Activate(int nType=0, void* pVoid=NULL);
112  };
113 
117  class CPluginManager : public AssetManager<DLLPlugInEntity>
118  {
119  public:
120  CPluginManager(void);
121  ~CPluginManager(void);
123  static CPluginManager* GetInstance();
124  public:
125 
133  DLLPlugInEntity* LoadDLL(const string& sIdentifier, const string& fileName);
134 
141  DLLPlugInEntity* GetPluginEntity(const string& sFilePath);
142 
152  int ActivateDLL(const string& sDllPath,int nType=0, void* pVoid=NULL);
153 
162  int LoadAllDLLinDirectory(const string& sDirectory);
163 
165  ParaEngine::mutex& GetMutex() {return m_mutex;};
166 
167  private:
169  ParaEngine::mutex m_mutex;
170  };
171 
172 
173 
174 }
int(* lpFnLibNumberClasses)()
"LibNumberClasses": must be implemented in a plug-in.
Definition: PluginLoader.hpp:35
void(* lpFnLibInitParaEngine)(IParaEngineCore *pIParaEngineCore)
"LibInitParaEngine": this is optional in a plug-in
Definition: PluginLoader.hpp:41
AssetType
each asset type has a unique asset type number
Definition: AssetEntity.h:82
different physics engine has different winding order.
Definition: EventBinding.h:32
manage plug-ins
Definition: PluginManager.h:117
ParaEngine::mutex & GetMutex()
get mutex
Definition: PluginManager.h:165
unsigned long GetLibVersion() const
library version.
Definition: PluginManager.h:70
AssetManager manages a set of asset entities of a certain type.
Definition: AssetManager.h:13
unsigned long(* lpFnLibVersion)()
"LibVersion": must be implemented in a plug-in.
Definition: PluginLoader.hpp:33
int(* lpFnLibActivate)(int nType, void *pVoid)
"LibActivate": this is optional in a plug-in
Definition: PluginLoader.hpp:43
void(* lpFnLibInit)()
"LibInit": this is optional in a plug-in
Definition: PluginLoader.hpp:39
std::string AssetKey
the unique key object for asset entity.
Definition: AssetEntity.h:13
a DLL plug-in loaded explicitly at runtime.
Definition: PluginManager.h:39
cross platform mutex
Definition: mutex.h:95
System keeps a list of the DLL&#39;s found on startup.
Definition: PluginAPI.h:61
Base class for managed asset entity in ParaEngine.
Definition: AssetEntity.h:25