2019-08-23 17:11:24 +08:00
|
|
|
|
#ifndef HGL_PLUG_IN_MANAGE_INCLUDE
|
|
|
|
|
#define HGL_PLUG_IN_MANAGE_INCLUDE
|
|
|
|
|
|
|
|
|
|
#include<hgl/plugin/ExternalPlugIn.h>
|
2023-07-14 23:21:03 +08:00
|
|
|
|
#include<hgl/type/ObjectManage.h>
|
2019-08-26 21:19:13 +08:00
|
|
|
|
#include<hgl/type/StringList.h>
|
2019-08-23 17:11:24 +08:00
|
|
|
|
namespace hgl
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* 插件管理
|
|
|
|
|
*/
|
2023-07-14 23:21:03 +08:00
|
|
|
|
class PlugInManage:public ObjectManage<OSString,PlugIn>
|
2019-08-23 17:11:24 +08:00
|
|
|
|
{
|
2019-08-27 20:26:44 +08:00
|
|
|
|
OSString name; ///<插件类目名称(必须符合代码名称规则)
|
2019-08-26 21:19:13 +08:00
|
|
|
|
|
2019-08-27 20:26:44 +08:00
|
|
|
|
OSStringList findpath; ///<插件查找目录
|
2019-08-23 17:11:24 +08:00
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
2022-03-31 21:59:14 +08:00
|
|
|
|
PlugInManage(const OSString &n);
|
|
|
|
|
virtual ~PlugInManage()=default;
|
2019-08-26 21:19:13 +08:00
|
|
|
|
|
|
|
|
|
bool RegistryPlugin(PlugIn *); ///<注册一个内置插件
|
2019-08-27 20:26:44 +08:00
|
|
|
|
uint UnregistryPlugin(const OSString &); ///<释放一个内置插件
|
2019-08-26 21:19:13 +08:00
|
|
|
|
|
|
|
|
|
bool AddFindPath (const OSString &path); ///<添加一个插件查找目录
|
|
|
|
|
|
2019-08-27 20:26:44 +08:00
|
|
|
|
PlugIn *LoadPlugin (const OSString &,const OSString &); ///<加载一个外部插件,明确指定全路径文件名
|
|
|
|
|
PlugIn *LoadPlugin (const OSString &); ///<加载一个外部插件,自行查找
|
|
|
|
|
bool UnloadPlugin(const OSString &); ///<释放一个外部插件
|
2023-07-14 23:21:03 +08:00
|
|
|
|
};//class PlugInManage:public ObjectManage<UTF16String,PlugIn>
|
2019-08-23 17:11:24 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 插件注册模板
|
|
|
|
|
*/
|
2019-08-26 21:19:13 +08:00
|
|
|
|
template<typename T> class RegistryPlugInProxy
|
2019-08-23 17:11:24 +08:00
|
|
|
|
{
|
2019-08-23 17:54:42 +08:00
|
|
|
|
T *plugin;
|
2019-08-23 17:11:24 +08:00
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
RegistryPlugInProxy()
|
|
|
|
|
{
|
2019-08-26 21:19:13 +08:00
|
|
|
|
plugin=new T;
|
2019-08-23 17:11:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-08-23 17:54:42 +08:00
|
|
|
|
virtual ~RegistryPlugInProxy()
|
|
|
|
|
{
|
|
|
|
|
delete plugin;
|
|
|
|
|
}
|
2019-08-23 17:11:24 +08:00
|
|
|
|
|
2019-08-23 17:54:42 +08:00
|
|
|
|
T *get(){return plugin;}
|
2019-08-23 17:11:24 +08:00
|
|
|
|
};//template<typename T> class RegistryPlugInProxy
|
|
|
|
|
|
|
|
|
|
/*
|
2019-08-26 21:19:13 +08:00
|
|
|
|
如Log插件中的Console,File插件,是直接在代码中的,属于内部插件。
|
|
|
|
|
但Log输出至MySQL的插件,是以独立.dll/.so/dylib形式存在的,属于外部插件。
|
2019-08-23 17:11:24 +08:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef __MAKE_PLUGIN__ //内部插件
|
2019-08-23 17:54:42 +08:00
|
|
|
|
#define REGISTRY_PLUG_IN(name,classname) static RegistryPlugInProxy<name,classname> plugin_proxy_##classname; \
|
|
|
|
|
extern "C" void registry_plugin_##classname;
|
2019-08-23 17:11:24 +08:00
|
|
|
|
#else //外部插件
|
2019-08-23 17:54:42 +08:00
|
|
|
|
#define REGISTRY_PLUG_IN(name,classname) static RegistryPlugInProxy<name,classname> plugin_proxy_##classname \
|
2019-08-23 17:11:24 +08:00
|
|
|
|
extern "C" void registry_plugin_##name(void)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
#endif//__MAKE_PLUGIN__
|
|
|
|
|
}//namespace hgl
|
|
|
|
|
#endif//HGL_PLUG_IN_MANAGE_INCLUDE
|