Plasma Engine  2.0
Loading...
Searching...
No Matches
Plugin.h
1#pragma once
2
4
5#include <Foundation/Communication/Event.h>
6#include <Foundation/Strings/String.h>
7#include <Foundation/Strings/StringBuilder.h>
8
28
31{
32 using StorageType = plUInt8;
33
34 enum Enum
35 {
36 LoadCopy = PL_BIT(0),
37 PluginIsOptional = PL_BIT(1),
38 CustomDependency = PL_BIT(2),
39
40 Default = 0,
41 };
42
43 struct Bits
44 {
45 StorageType LoadCopy : 1;
46 StorageType PluginIsOptional : 1;
47 };
48};
49
50using plPluginInitCallback = void (*)();
51
66class PL_FOUNDATION_DLL plPlugin
67{
68public:
70 static const plCopyOnBroadcastEvent<const plPluginEvent&>& Events(); // [tested]
71
78 static void InitializeStaticallyLinkedPlugins(); // [tested]
79
81 static void BeginPluginChanges();
82
84 static void EndPluginChanges();
85
87 static bool ExistsPluginFile(plStringView sPluginFile);
88
95 static plResult LoadPlugin(plStringView sPluginFile, plBitflags<plPluginLoadFlags> flags = plPluginLoadFlags::Default); // [tested]
96
100 static void UnloadAllPlugins(); // [tested]
101
107 static void SetMaxParallelInstances(plUInt32 uiMaxParallelInstances);
108
110 struct PL_FOUNDATION_DLL Init
111 {
112 Init(plPluginInitCallback onLoadOrUnloadCB, bool bOnLoad);
113 Init(const char* szAddPluginDependency);
114 };
115
117 struct PL_FOUNDATION_DLL PluginInfo
118 {
119 plString m_sName;
120 plHybridArray<plString, 2> m_sDependencies;
122 };
123
125 static void GetAllPluginInfos(plDynamicArray<PluginInfo>& ref_infos);
126
128 static void GetPluginPaths(plStringView sPluginName, plStringBuilder& ref_sOriginalFile, plStringBuilder& ref_sCopiedFile, plUInt8 uiFileCopyNumber);
129
131 static bool PlatformNeedsPluginCopy();
132
133private:
134 plPlugin() = delete;
135};
136
143#define PL_PLUGIN_DEPENDENCY(PluginName) \
144 plPlugin::Init PL_PP_CONCAT(PL_PP_CONCAT(plugin_dep_, PluginName), PL_SOURCE_LINE)(PL_PP_STRINGIFY(PluginName))
145
153#define PL_PLUGIN_ON_LOADED() \
154 static void plugin_OnLoaded(); \
155 plPlugin::Init plugin_OnLoadedInit(plugin_OnLoaded, true); \
156 static void plugin_OnLoaded()
157
166#define PL_PLUGIN_ON_UNLOADED() \
167 static void plugin_OnUnloaded(); \
168 plPlugin::Init plugin_OnUnloadedInit(plugin_OnUnloaded, false); \
169 static void plugin_OnUnloaded()
Definition DynamicArray.h:81
Definition Event.h:177
A hybrid array uses in-place storage to handle the first few elements without any allocation....
Definition HybridArray.h:12
plPlugin manages all dynamically loadable plugins.
Definition Plugin.h:67
plStringBuilder is a class that is meant for creating and modifying strings.
Definition StringBuilder.h:35
plStringView represent a read-only sub-string of a larger string, as it can store a dedicated string ...
Definition StringView.h:34
The plBitflags class allows you to work with type-safe bitflags.
Definition Bitflags.h:82
Definition Plugin.h:111
Contains basic information about a loaded plugin.
Definition Plugin.h:118
The data that is broadcast whenever a plugin is (un-) loaded.
Definition Plugin.h:11
plStringView m_sPluginBinary
The file name of the affected plugin.
Definition Plugin.h:26
Type m_EventType
Which type of event this is.
Definition Plugin.h:25
Type
Definition Plugin.h:13
@ AfterStartupShutdown
Used by the ResourceManager to unload now unreferenced resources after the startup system shutdown is...
Definition Plugin.h:19
@ AfterLoading
Sent after a new plugin has been loaded and initialized.
Definition Plugin.h:16
@ StartupShutdown
Used by the startup system for automatic shutdown.
Definition Plugin.h:18
@ AfterLoadingBeforeInit
Sent immediately after a new plugin has been loaded, even before it is initialized (which might trigg...
Definition Plugin.h:15
@ BeforeLoading
Sent shortly before a new plugin is loaded.
Definition Plugin.h:14
@ AfterUnloading
Sent after a plugin has been unloaded.
Definition Plugin.h:20
@ BeforePluginChanges
Sent (once) before any (group) plugin changes (load/unload) are done.
Definition Plugin.h:21
@ BeforeUnloading
Sent before a plugin is going to be unloaded.
Definition Plugin.h:17
@ AfterPluginChanges
Sent (once) after all (group) plugin changes (unload/load) are finished.
Definition Plugin.h:22
Definition Plugin.h:44
Flags for loading a plugin.
Definition Plugin.h:31
Enum
Definition Plugin.h:35
@ LoadCopy
Don't load a DLL directly, but create a copy of the file and load that instead. This allows to contin...
Definition Plugin.h:36
@ PluginIsOptional
When an optional plugin can't be loaded (missing file usually), no error is logged....
Definition Plugin.h:37
@ CustomDependency
The plugin is an injected dependency (usually for the editor), and thus might get treated differently...
Definition Plugin.h:38
Default enum for returning failure or success, instead of using a bool.
Definition Types.h:54