PTLib  Version 2.18.8
 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 
11 #ifndef PTLIB_PLUGINMGR_H
12 #define PTLIB_PLUGINMGR_H
13 
14 #include <ptlib/plugin.h>
15 #include <ptlib_config.h>
16 
17 #if P_PLUGINMGR
18 
19 #define P_PTLIB_PLUGIN_DIR_ENV_VAR "PTLIBPLUGINDIR"
20 #define P_PWLIB_PLUGIN_DIR_ENV_VAR "PWLIBPLUGINDIR"
21 
22 
24 //
25 // Manager for plugins
26 //
27 
28 class PPluginManager : public PObject
29 {
30  PCLASSINFO(PPluginManager, PObject);
31  public:
33  static PPluginManager & GetPluginManager();
34 
36  void AddDirectory(const PDirectory & dir);
37 
40  void SetDirectories(const PString & dirs);
41 
43  void SetDirectories(const PStringArray & dirs);
44 
46  const PList<PDirectory> & GetDirectories() const { return m_directories; }
47 
49  void LoadDirectories();
50 
52  void LoadDirectory(const PDirectory & dir);
53 
54  // functions to load/unload a dynamic plugin
55  PBoolean LoadPlugin(const PString & fileName);
56 
57  void OnShutdown();
58 
59  // functions to access the plugins' services
60  PStringArray GetServiceTypes() const;
61  const PPluginServiceDescriptor * GetServiceDescriptor(
62  const PString & serviceName,
63  const PString & serviceType
64  ) const;
65 
66  static PStringArray GetPluginsProviding(
67  PPluginManager * pluginMgr,
68  const PString & serviceType,
69  bool friendlyNames
70  ) { return (pluginMgr != NULL ? pluginMgr : &GetPluginManager())->GetPluginsProviding(serviceType, friendlyNames); }
71 
72  PStringArray GetPluginsProviding(
73  const PString & serviceType,
74  bool friendlyNames
75  ) const;
76 
77  template <class T> static T * CreatePluginAs(
78  PPluginManager * pluginMgr,
79  const PString & serviceName,
80  const PString & serviceType,
81  P_INT_PTR userData = 0
82  ) { return dynamic_cast<T *>((pluginMgr != NULL ? pluginMgr : &GetPluginManager())->CreatePlugin(serviceName, serviceType, userData)); }
83 
84  PObject * CreatePlugin(
85  const PString & serviceName,
86  const PString & serviceType,
87  P_INT_PTR userData = 0
88  ) const;
89 
90  static PStringArray GetPluginDeviceNames(
91  PPluginManager * pluginMgr,
92  const PString & serviceName,
93  const PString & serviceType,
94  P_INT_PTR userData = 0,
95  const char * const * prioritisedDrivers = NULL
96  ) { return (pluginMgr != NULL ? pluginMgr : &GetPluginManager())->GetPluginDeviceNames(serviceName, serviceType, userData, prioritisedDrivers); }
97 
98  PStringArray GetPluginDeviceNames(
99  const PString & serviceName,
100  const PString & serviceType,
101  P_INT_PTR userData = 0,
102  const char * const * prioritisedDrivers = NULL
103  ) const;
104 
105  PBoolean GetPluginsDeviceCapabilities(
106  const PString & serviceType,
107  const PString & serviceName,
108  const PString & deviceName,
109  void * capabilities
110  ) const;
111 
112  // function to register a service (used by the plugins themselves)
113  bool RegisterService(const char * name);
114 
115 
116  enum NotificationCode {
117  LoadingPlugIn,
118  UnloadingPlugIn
119  };
120 
138  void AddNotifier(
139  const PNotifier & filterFunction,
140  PBoolean existing = false
141  );
142 
143  void RemoveNotifier(
144  const PNotifier & filterFunction
145  );
146 
147  // For backward compatibility
148  P_DEPRECATED PObject * CreatePluginsDevice(const PString & serviceName, const PString & serviceType, int userData = 0) const { return CreatePlugin(serviceName, serviceType, userData); }
149  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); }
150 
151  protected:
152  PPluginManager();
153 
154  void CallNotifier(PDynaLink & dll, NotificationCode code);
155 
156  PList<PDirectory> m_directories;
157  PStringList m_suffixes;
158 
159  PDECLARE_MUTEX( m_pluginsMutex);
160  PArray<PDynaLink> m_plugins;
161 
162  typedef std::multimap<PCaselessString, const PPluginServiceDescriptor *> ServiceMap;
163  ServiceMap m_services;
164  PDECLARE_MUTEX(m_servicesMutex);
165 
166  PDECLARE_MUTEX( m_notifiersMutex);
167  PList<PNotifier> m_notifiers;
168 };
169 
171 //
172 // Manager for plugin modules
173 //
174 
175 class PPluginModuleManager : public PObject
176 {
177  public:
178  typedef PDictionary<PString, PDynaLink> PluginListType;
179 
180  PPluginModuleManager(const char * signatureFunctionName, PPluginManager * pluginMgr = NULL);
181 
182  virtual void OnLoadPlugin(PDynaLink & /*dll*/, P_INT_PTR /*code*/)
183  { }
184 
185  virtual PluginListType GetPluginList() const
186  { return pluginDLLs; }
187 
188  virtual void OnStartup()
189  { }
190  virtual void OnShutdown()
191  { }
192 
193  protected:
194  PluginListType pluginDLLs;
195  PDECLARE_NOTIFIER(PDynaLink, PPluginModuleManager, OnLoadModule);
196 
197  protected:
198  const char * signatureFunctionName;
199  PPluginManager * pluginMgr;
200 };
201 
202 
203 #define PLUGIN_LOADER_STARTUP_NAME "PluginLoaderStartup"
204 
205 PFACTORY_LOAD(PluginLoaderStartup);
206 
207 
208 #endif // P_PLUGINMGR
209 
210 #endif // PTLIB_PLUGINMGR_H
211 
212 
213 // End Of File ///////////////////////////////////////////////////////////////
#define PCLASSINFO(cls, par)
Declare all the standard PTLib class information.
Definition: object.h:2164
Class specialisation for PNotifierTemplate&lt;P_INT_PTR&gt;
This template class maps the PAbstractDictionary to a specific key and data types.
Definition: dict.h:978
This is an array collection class of PString objects.
Definition: pstring.h:2365
This template class maps the PAbstractList to a specific object type.
Definition: lists.h:322
virtual PBoolean IsEmpty() const
Determine if the string is empty.
#define PDECLARE_MUTEX(...)
Definition: mutex.h:200
Class to represent a directory in the operating system file system.
Definition: pdirect.h:173
#define PFACTORY_LOAD(ConcreteType)
Definition: pfactory.h:557
bool PBoolean
Definition: object.h:174
intptr_t P_INT_PTR
Definition: object.h:2646
The character string class.
Definition: pstring.h:108
This is a list collection class of PString objects.
Definition: pstring.h:2562
static const PString & Empty()
Return an empty string.
Definition: plugin.h:40
This template class maps the PArrayObjects to a specific object type.
Definition: array.h:925
#define P_DEPRECATED
Definition: object.h:141
#define PDECLARE_NOTIFIER(notifierType, notifiee, func)
Declare PNotifier derived class with P_INT_PTR parameter. Uses PDECLARE_NOTIFIER_EXT macro...
Definition: notifier.h:202
Ultimate parent class for all objects in the class library.
Definition: object.h:2204