Elm  1.0
ELM is a library providing generic data structures, OS-independent interface, plugins and XML.
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Plugin.h
1 /*
2  * Plugin class interface
3  *
4  * This file is part of OTAWA
5  * Copyright (c) 2005-12, IRIT UPS.
6  *
7  * OTAWA is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * OTAWA is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with OTAWA; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 #ifndef ELM_SYS_PLUGIN_H
22 #define ELM_SYS_PLUGIN_H
23 
24 #include <elm/types.h>
25 #include <elm/string.h>
26 #include <elm/genstruct/Vector.h>
27 #include <elm/genstruct/Table.h>
28 #include <elm/util/Version.h>
29 #include <elm/sys/Path.h>
30 
31 namespace elm { namespace sys {
32 
33 #define ELM_PLUGIN_ID_PREFIX "@@ELM-PLUGIN-ID@@:"
34 #define ELM_PLUGIN_CONCAT_AUX(x, y) x ## y
35 #define ELM_PLUGIN_CONCAT(x, y) ELM_PLUGIN_CONCAT_AUX(x, y)
36 #define ELM_PLUGIN_ID(hook, info) const char ELM_PLUGIN_CONCAT(__plugin_id_, __LINE__)[] = ELM_PLUGIN_ID_PREFIX hook ":" info;
37 #define ELM_PLUGIN(plugin, hook) extern "C" { \
38  static ELM_PLUGIN_ID(#hook, #plugin); \
39  elm::sys::Plugin *ELM_PLUGIN_CONCAT(hook, _fun)(void) { return static_cast<elm::sys::Plugin *>(&plugin); } }
40 
41 // Plugin class
42 class Plugin {
43 public:
44  static const t::uint32 MAGIC = 0xCAFEBABE;
46 
47  class make {
48  friend class Plugin;
49  public:
50  inline make(string name, const Version& plugger_version)
51  : _name(name), _plugger_version(plugger_version) { }
52  inline make& description(cstring d) { _description = d; return *this; }
53  inline make& license(cstring l) { _license = l; return *this; }
54  inline make& version(const Version& v) { _plugin_version = v; return *this; }
55  inline make& alias(string a) { aliases.add(a); return *this; }
56  inline make& hook(cstring h) { _hook = h; return *this; }
57  private:
58  string _name;
59  cstring _description, _license, _hook;
60  Version _plugin_version, _plugger_version;
62  };
63 
64 private:
65  friend class Plugger;
66  static genstruct::Vector<Plugin *> static_plugins;
67  static genstruct::Vector<Plugin *> unused_plugins;
68  CString _hook;
69  string _name;
70  Version per_vers;
71  void *_handle;
72  int state;
74  t::uint32 magic;
75  Path _path;
76 
77  void plug(void *handle);
78  static void step(void);
79  static Plugin *get(cstring hook, const string& name);
80  void setPath(const Path& path) { _path = path; }
81 
82 protected:
86  virtual void startup(void);
87  virtual void cleanup(void);
88 
89 public:
90  Plugin(string name, const Version& plugger_version, CString hook = "", const aliases_t& aliases = aliases_t::EMPTY);
91  Plugin(const make& maker);
92  virtual ~Plugin(void);
93  inline string name(void) const { return _name; }
94  inline CString description(void) const;
95  inline CString licence(void) const;
96  inline const Version& pluginVersion(void) const;
97  inline const Version& pluggerVersion(void) const;
98  inline CString hook(void) const;
99  inline const aliases_t& aliases(void) const;
100  bool matches(const string& name) const;
101  void unplug(void);
102  inline const Path& path(void) const { return _path; }
103 };
104 
105 // Inlines
106 inline CString Plugin::description(void) const {
107  return _description;
108 }
109 
110 inline CString Plugin::licence(void) const {
111  return _licence;
112 }
113 
114 inline const Version& Plugin::pluginVersion(void) const {
115  return _plugin_version;
116 }
117 
118 inline const Version& Plugin::pluggerVersion(void) const {
119  return per_vers;
120 }
121 
122 inline CString Plugin::hook(void) const {
123  return _hook;
124 }
125 
126 inline const Plugin::aliases_t& Plugin::aliases(void) const {
127  return _aliases;
128 }
129 
130 } } // elm::sys
131 
132 #endif // ELM_SYS_PLUGIN_H
void unplug(void)
Definition: system_Plugin.cpp:345
Definition: CString.h:17
make(string name, const Version &plugger_version)
Definition: Plugin.h:50
make & license(cstring l)
Definition: Plugin.h:53
virtual void cleanup(void)
Definition: system_Plugin.cpp:380
CString description(void) const
Definition: Plugin.h:106
Definition: Path.h:31
const Path & path(void) const
Definition: Plugin.h:102
CString hook(void) const
Definition: Plugin.h:122
static const t::uint32 MAGIC
Definition: Plugin.h:44
const aliases_t & aliases(void) const
Definition: Plugin.h:126
const Version & pluggerVersion(void) const
Definition: Plugin.h:118
Definition: Table.h:81
CString licence(void) const
Definition: Plugin.h:110
make & version(const Version &v)
Definition: Plugin.h:54
Definition: Table.h:33
bool matches(const string &name) const
Definition: system_Plugin.cpp:464
make & alias(string a)
Definition: Plugin.h:55
CString _description
Definition: Plugin.h:83
virtual void startup(void)
Definition: system_Plugin.cpp:372
genstruct::Table< string > aliases_t
Definition: Plugin.h:45
CString _licence
Definition: Plugin.h:84
string name(void) const
Definition: Plugin.h:93
Version _plugin_version
Definition: Plugin.h:85
const Version & pluginVersion(void) const
Definition: Plugin.h:114
Definition: Plugger.h:34
Definition: Vector.h:35
static Table< T > EMPTY
Definition: Table.h:35
Definition: Plugin.h:42
make & hook(cstring h)
Definition: Plugin.h:56
Definition: Version.h:30
Definition: Plugin.h:47
Plugin(string name, const Version &plugger_version, CString hook="", const aliases_t &aliases=aliases_t::EMPTY)
Definition: system_Plugin.cpp:257
virtual ~Plugin(void)
Definition: system_Plugin.cpp:304
uint32_t uint32
Definition: int.h:35
make & description(cstring d)
Definition: Plugin.h:52