drogon
C++14/17-based HTTP application framework
Toggle main menu visibility
Loading...
Searching...
No Matches
Plugin.h
Go to the documentation of this file.
1
13
14
#pragma once
15
16
#include <
drogon/DrObject.h
>
17
#include <json/json.h>
18
#include <memory>
19
#include <trantor/utils/Logger.h>
20
#include <trantor/utils/NonCopyable.h>
21
22
namespace
drogon
23
{
24
enum class
PluginStatus
25
{
26
None,
27
Initializing,
28
Initialized
29
};
30
35
class
DROGON_EXPORT PluginBase :
public
virtual
DrObjectBase
,
36
public
trantor::NonCopyable
37
{
38
public
:
40
void
initialize
()
41
{
42
if
(status_ == PluginStatus::None)
43
{
44
status_ = PluginStatus::Initializing;
45
for
(
auto
dependency : dependencies_)
46
{
47
dependency->initialize();
48
}
49
initAndStart
(config_);
50
status_ = PluginStatus::Initialized;
51
if
(initializedCallback_)
52
initializedCallback_(
this
);
53
}
54
else
if
(status_ == PluginStatus::Initialized)
55
{
56
// Do nothing;
57
}
58
else
59
{
60
LOG_FATAL <<
"There are a circular dependency within plugins."
;
61
abort();
62
}
63
}
64
67
virtual
void
initAndStart
(
const
Json::Value &config) = 0;
68
71
virtual
void
shutdown
() = 0;
72
73
virtual
~PluginBase()
74
{
75
}
76
77
protected
:
78
PluginBase
()
79
{
80
}
81
82
private
:
83
PluginStatus status_{PluginStatus::None};
84
friend
class
PluginsManager;
85
86
void
setConfig(
const
Json::Value &config)
87
{
88
config_ = config;
89
}
90
91
void
addDependency(PluginBase *dp)
92
{
93
dependencies_.push_back(dp);
94
}
95
96
void
setInitializedCallback(
const
std::function<
void
(PluginBase *)> &cb)
97
{
98
initializedCallback_ = cb;
99
}
100
101
Json::Value config_;
102
std::vector<PluginBase *> dependencies_;
103
std::function<void(PluginBase *)> initializedCallback_;
104
};
105
106
template
<
typename
T>
107
struct
IsPlugin
108
{
109
using
TYPE = std::remove_cv_t<typename std::remove_reference_t<T>>;
110
111
static
int
test(
void
*)
112
{
113
return
0;
114
}
115
116
static
char
test(
PluginBase
*)
117
{
118
return
0;
119
}
120
121
static
constexpr
bool
value =
122
(
sizeof
(test((TYPE *)
nullptr
)) ==
sizeof
(char));
123
};
124
130
template
<
typename
T>
131
class
Plugin :
public
PluginBase,
public
DrObject<T>
132
{
133
public
:
134
virtual
~Plugin()
135
{
136
}
137
138
protected
:
139
Plugin()
140
{
141
}
142
};
143
144
}
// namespace drogon
DrObject.h
drogon::DrObjectBase
The base class for all drogon reflection classes.
Definition
DrObject.h:34
drogon::PluginBase
The abstract base class for plugins.
Definition
Plugin.h:37
drogon::PluginBase::shutdown
virtual void shutdown()=0
drogon::PluginBase::initAndStart
virtual void initAndStart(const Json::Value &config)=0
drogon::PluginBase::initialize
void initialize()
This method must be called by drogon.
Definition
Plugin.h:40
drogon
Drogon Test is a minimal effort test framework developed because the major C++ test frameworks doesn'...
Definition
Attribute.h:23
drogon::IsPlugin
Definition
Plugin.h:108
lib
inc
drogon
plugins
Plugin.h
Generated by
1.17.0