ezEngine  Milestone 7
Plugin.h
Go to the documentation of this file.
1 #pragma once
2 
4 
6 #include <Foundation/Strings/String.h>
7 #include <Foundation/Strings/StringBuilder.h>
8 #include <Foundation/Communication/Event.h>
9 
16 class EZ_FOUNDATION_DLL ezPlugin : public ezEnumerable<ezPlugin>
17 {
19 
20 public:
22  typedef void(*OnPluginLoadedFunction)(bool bReloading); // [tested]
23 
25  typedef void(*OnPluginUnloadedFunction)(bool bReloading); // [tested]
26 
28  static void BeginPluginChanges();
29 
31  static void EndPluginChanges();
32 
43  ezPlugin(bool bIsReloadable, OnPluginLoadedFunction OnLoadPlugin = nullptr, OnPluginUnloadedFunction OnUnloadPlugin = nullptr,
44  const char* szPluginDependency1 = nullptr, const char* szPluginDependency2 = nullptr, const char* szPluginDependency3 = nullptr, const char* szPluginDependency4 = nullptr, const char* szPluginDependency5 = nullptr);
45 
47  const char* GetPluginName() const { return m_sLoadedFromFile.GetData(); } // [tested]
48 
50  bool IsReloadable() const { return m_bIsReloadable; } // [tested]
51 
59  static ezResult LoadPlugin(const char* szPluginFile); // [tested]
60 
69  static ezResult UnloadPlugin(const char* szPluginFile); // [tested]
70 
80  static ezResult ReloadPlugins(bool bForceReload = false); // [tested]
81 
84  static ezPlugin* FindPluginByName(const char* szPluginName); // [tested]
85 
87  struct PluginEvent
88  {
89  enum Type
90  {
98  };
99 
102  const char* m_szPluginFile;
103  };
104 
107 
109  const char* GetPluginDependency(ezUInt8 uiDependency) const { return (uiDependency < 5) ? m_szPluginDependencies[uiDependency] : nullptr; }
110 
116  static void SetMaxParallelInstances(ezUInt32 uiMaxParallelInstances);
117 
118 private:
119  static void GetPluginPaths(const char* szPluginName, ezStringBuilder& sOldPath, ezStringBuilder& sNewPath, ezUInt8 uiFileNumber);
120 
121  const char* m_szPluginDependencies[5];
122  ezString m_sLoadedFromFile;
123 
124  OnPluginLoadedFunction m_OnLoadPlugin;
125  OnPluginUnloadedFunction m_OnUnloadPlugin;
126 
127  static ezResult UnloadPluginInternal(const char* szPlugin, bool bReloading);
128  static ezResult LoadPluginInternal(const char* szPlugin, bool bLoadCopy, bool bReloading);
129  static void SortPluginReloadOrder(ezHybridArray<ezString, 16>& PluginsToReload);
130 
131  void Initialize(bool bReloading);
132  void Uninitialize(bool bReloading);
133 
134  bool m_bInitialized;
135  bool m_bIsReloadable;
136 
137  static ezUInt32 m_uiMaxParallelInstances;
138  static ezInt32 s_iPluginChangeRecursionCounter;
139 };
140 
141 
153 #define EZ_DYNAMIC_PLUGIN_DECLARATION(LINKAGE, Plugin) \
154  \
155 LINKAGE void ezPluginHelper_##Plugin(); \
156  \
157 class ezDynamicPluginHelper_##Plugin \
158 { \
159 public: \
160  ezDynamicPluginHelper_##Plugin() \
161  { \
162  ezPluginHelper_##Plugin(); \
163  } \
164 }; \
165  \
166 static ezDynamicPluginHelper_##Plugin ezPluginHelperVar \
167 
168 
169 #define EZ_DYNAMIC_PLUGIN_IMPLEMENTATION(Plugin) \
170  void ezPluginHelper_##Plugin() { }
171