PTLib  Version 2.14.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
pluginmgr.h
Go to the documentation of this file.
1 /*
2  * pluginmgr.h
3  *
4  * Plugin Manager Class Declarations
5  *
6  * Portable Windows Library
7  *
8  * Contributor(s): Snark at GnomeMeeting
9  *
10  * $Revision: 31682 $
11  * $Author: rjongbloed $
12  * $Date: 2014-04-05 11:14:56 +1100 (Sat, 05 Apr 2014) $
13  */
14 
15 #ifndef PTLIB_PLUGINMGR_H
16 #define PTLIB_PLUGINMGR_H
17 
18 #include <ptlib/plugin.h>
19 
20 
22 //
23 // Manager for plugins
24 //
25 
26 class PPluginManager : public PObject
27 {
28  PCLASSINFO(PPluginManager, PObject);
29  public:
30  // static functions for accessing global instances of plugin managers
32 
33  // Add a directory to the list of plugin directories (used by OPAL)
34  void AddDirectory(const PDirectory & dir);
35 
36  /* Set the list of plugin directories using ':' or ';' (depending on
37  platform) separated string. */
38  void SetDirectories(const PString & dirs);
39 
40  /* Set the list of plugin directories. */
41  void SetDirectories(const PStringArray & dirs);
42 
43  // Load the plugins in the directories.
44  void LoadDirectories();
45  void LoadDirectory(const PDirectory & dir);
46 
47  // functions to load/unload a dynamic plugin
48  PBoolean LoadPlugin(const PString & fileName);
49 
50  void OnShutdown();
51 
52  // functions to access the plugins' services
55  const PString & serviceName,
56  const PString & serviceType
57  ) const;
58 
60  PPluginManager * pluginMgr,
61  const PString & serviceType,
62  bool friendlyNames
63  ) { return (pluginMgr != NULL ? pluginMgr : &GetPluginManager())->GetPluginsProviding(serviceType, friendlyNames); }
64 
66  const PString & serviceType,
67  bool friendlyNames
68  ) const;
69 
70  template <class T> static T * CreatePluginAs(
71  PPluginManager * pluginMgr,
72  const PString & serviceName,
73  const PString & serviceType,
74  P_INT_PTR userData = 0
75  ) { return dynamic_cast<T *>((pluginMgr != NULL ? pluginMgr : &GetPluginManager())->CreatePlugin(serviceName, serviceType, userData)); }
76 
78  const PString & serviceName,
79  const PString & serviceType,
80  P_INT_PTR userData = 0
81  ) const;
82 
84  PPluginManager * pluginMgr,
85  const PString & serviceName,
86  const PString & serviceType,
87  P_INT_PTR userData = 0,
88  const char * const * prioritisedDrivers = NULL
89  ) { return (pluginMgr != NULL ? pluginMgr : &GetPluginManager())->GetPluginDeviceNames(serviceName, serviceType, userData, prioritisedDrivers); }
90 
92  const PString & serviceName,
93  const PString & serviceType,
94  P_INT_PTR userData = 0,
95  const char * const * prioritisedDrivers = NULL
96  ) const;
97 
99  const PString & serviceType,
100  const PString & serviceName,
101  const PString & deviceName,
102  void * capabilities
103  ) const;
104 
105  // function to register a service (used by the plugins themselves)
106  bool RegisterService(const char * name);
107 
108 
112  };
113 
131  void AddNotifier(
132  const PNotifier & filterFunction,
133  PBoolean existing = false
134  );
135 
136  void RemoveNotifier(
137  const PNotifier & filterFunction
138  );
139 
140  // For backward compatibility
141  P_DEPRECATED PObject * CreatePluginsDevice(const PString & serviceName, const PString & serviceType, int userData = 0) const { return CreatePlugin(serviceName, serviceType, userData); }
142  P_DEPRECATED PObject * CreatePluginsDeviceByName(const PString & deviceName, const PString & serviceType, int userData = 0, const PString & serviceName = PString::Empty()) const { return CreatePlugin(serviceName.IsEmpty() ? deviceName : serviceName, serviceType, userData); }
143 
144  protected:
145  PPluginManager();
146 
147  void CallNotifier(PDynaLink & dll, NotificationCode code);
148 
151 
154 
155  typedef std::multimap<PCaselessString, const PPluginServiceDescriptor *> ServiceMap;
158 
161 };
162 
164 //
165 // Manager for plugin modules
166 //
167 
169 {
170  public:
172 
174 
175  virtual void OnLoadPlugin(PDynaLink & /*dll*/, P_INT_PTR /*code*/)
176  { }
177 
179  { return pluginDLLs; }
180 
181  virtual void OnStartup()
182  { }
183  virtual void OnShutdown()
184  { }
185 
186  protected:
189 
190  protected:
191  const char * signatureFunctionName;
193 };
194 
195 
196 #define PLUGIN_LOADER_STARTUP_NAME "PluginLoaderStartup"
197 
198 PFACTORY_LOAD(PluginLoaderStartup);
199 
200 
201 #endif // PTLIB_PLUGINMGR_H
202 
203 
204 // End Of File ///////////////////////////////////////////////////////////////