drogon
C++14/17-based HTTP application framework
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
22namespace drogon
23{
24enum class PluginStatus
25{
26 None,
27 Initializing,
28 Initialized
29};
30
35class DROGON_EXPORT PluginBase : public virtual DrObjectBase,
36 public trantor::NonCopyable
37{
38 public:
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:
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
106template <typename T>
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
130template <typename T>
131class 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
The base class for all drogon reflection classes.
Definition DrObject.h:34
The abstract base class for plugins.
Definition Plugin.h:37
virtual void shutdown()=0
virtual void initAndStart(const Json::Value &config)=0
void initialize()
This method must be called by drogon.
Definition Plugin.h:40
Drogon Test is a minimal effort test framework developed because the major C++ test frameworks doesn'...
Definition Attribute.h:23
Definition Plugin.h:108