PTLib  Version 2.10.10
 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: 26636 $
11  * $Author: rjongbloed $
12  * $Date: 2011-11-03 18:57:12 -0500 (Thu, 03 Nov 2011) $
13  */
14 
15 #ifndef PTLIB_PLUGINMGR_H
16 #define PTLIB_PLUGINMGR_H
17 
18 #include <ptlib/plugin.h>
19 
21  private:
22  int dummy;
23 };
24 
25 template <class C>
26 void PLoadPluginDirectory(C & obj, const PDirectory & directory, const char * suffix = NULL)
27 {
28  PDirectory dir = directory;
29  if (!dir.Open()) {
30  PTRACE(4, "Cannot open plugin directory " << dir);
31  return;
32  }
33  PTRACE(4, "Enumerating plugin directory " << dir);
34  do {
35  PString entry = dir + dir.GetEntryName();
36  PDirectory subdir = entry;
37  if (subdir.Open())
38  PLoadPluginDirectory<C>(obj, entry, suffix);
39  else {
40  PFilePath fn(entry);
41  if (
42  (fn.GetType() *= PDynaLink::GetExtension()) &&
43  (
44  (suffix == NULL) || (fn.GetTitle().Right(strlen(suffix)) *= suffix)
45  )
46  )
47  obj.LoadPlugin(entry);
48  }
49  } while (dir.Next());
50 }
51 
53 //
54 // Manager for plugins
55 //
56 
57 class PPluginManager : public PObject
58 {
59  PCLASSINFO(PPluginManager, PObject);
60 
61  public:
62  // functions to load/unload a dynamic plugin
63  PBoolean LoadPlugin (const PString & fileName);
64  void LoadPluginDirectory (const PDirectory & dir);
65 
66  void OnShutdown();
67 
68  // functions to access the plugins' services
70  PStringArray GetPluginsProviding(const PString & serviceType) const;
71  PPluginServiceDescriptor * GetServiceDescriptor(const PString & serviceName, const PString & serviceType) const;
72  PObject * CreatePluginsDevice(const PString & serviceName, const PString & serviceType, int userData = 0) const;
73  PObject * CreatePluginsDeviceByName(const PString & deviceName, const PString & serviceType, int userData = 0, const PString & serviceName = PString::Empty()) const;
74  PStringArray GetPluginsDeviceNames(const PString & serviceName, const PString & serviceType, int userData = 0) const;
75  PBoolean GetPluginsDeviceCapabilities(const PString & serviceType,const PString & serviceName,const PString & deviceName,void * capabilities) const;
76 
77  // function to register a service (used by the plugins themselves)
78  PBoolean RegisterService (const PString & serviceName, const PString & serviceType, PPluginServiceDescriptor * descriptor);
79 
80  // Add a directory to the list of plugin directories (used by OPAL)
81  static bool AddPluginDirs(const PString & dirs);
82 
83  // Get the list of plugin directories
84  static PStringArray GetPluginDirs();
85 
86  // static functions for accessing global instances of plugin managers
88 
92  };
93 
111  void AddNotifier(
112  const PNotifier & filterFunction,
113  PBoolean existing = false
114  );
115 
116  void RemoveNotifier(
117  const PNotifier & filterFunction
118  );
119 
120  protected:
121  void LoadPluginDirectory (const PDirectory & directory, const PStringList & suffixes);
122  void CallNotifier(PDynaLink & dll, NotificationCode code);
123 
126 
129 
132 };
133 
135 //
136 // Manager for plugin modules
137 //
138 
140 {
141  public:
143 
145 
146  PBoolean LoadPlugin(const PString & fileName)
147  { if (pluginMgr == NULL) return false; else return pluginMgr->LoadPlugin(fileName); }
148 
149  void LoadPluginDirectory(const PDirectory &directory)
150  { if (pluginMgr != NULL) pluginMgr->LoadPluginDirectory(directory); }
151 
152  virtual void OnLoadPlugin(PDynaLink & /*dll*/, INT /*code*/)
153  { }
154 
156  { return pluginDLLs; }
157 
158  virtual void OnStartup()
159  { }
160  virtual void OnShutdown()
161  { }
162 
163  protected:
166 
167  protected:
168  const char * signatureFunctionName;
170 };
171 
172 
173 #define PLUGIN_LOADER_STARTUP_NAME "PluginLoaderStartup"
174 
175 PFACTORY_LOAD(PluginLoaderStartup);
176 
177 
178 #endif // PTLIB_PLUGINMGR_H
179 
180 
181 // End Of File ///////////////////////////////////////////////////////////////
void PLoadPluginDirectory(C &obj, const PDirectory &directory, const char *suffix=NULL)
Definition: pluginmgr.h:26
PPluginServiceDescriptor * GetServiceDescriptor(const PString &serviceName, const PString &serviceType) const
PBoolean Next()
Move to the next file in the directory scan.
Class specialisation for PNotifierTemplate<INT>
Definition: pluginmgr.h:57
static PPluginManager & GetPluginManager()
PObject * CreatePluginsDevice(const PString &serviceName, const PString &serviceType, int userData=0) const
Definition: pluginmgr.h:139
PFilePathString GetTitle() const
Get the title component of the full file specification, eg for the DOS file "C:\SRC\PWLIB\FRED.DAT" this would be "FRED".
virtual PFilePathString GetEntryName() const
Get the name (without the volume or directory path) of the current entry in the directory scan...
This class describes a full description for a file on the particular platform.
Definition: filepath.h:65
Definition: pluginmgr.h:90
PBoolean LoadPlugin(const PString &fileName)
PMutex m_notifiersMutex
Definition: pluginmgr.h:130
PMutex m_pluginsMutex
Definition: pluginmgr.h:124
PObject * CreatePluginsDeviceByName(const PString &deviceName, const PString &serviceType, int userData=0, const PString &serviceName=PString::Empty()) const
This is an array collection class of PString objects.
Definition: pstring.h:2024
PString Right(PINDEX len) const
Extract a portion of the string into a new string.
#define PTRACE(level, args)
Output trace.
Definition: object.h:530
static bool AddPluginDirs(const PString &dirs)
PDictionary< PString, PDynaLink > PluginListType
Definition: pluginmgr.h:142
virtual PBoolean Open(int scanMask=PFileInfo::AllFiles)
Open the directory for scanning its list of files.
virtual PluginListType GetPluginList() const
Definition: pluginmgr.h:155
BOOL PBoolean
Definition: object.h:102
Class to represent a directory in the operating system file system.
Definition: pdirect.h:182
void LoadPluginDirectory(const PDirectory &dir)
PPluginModuleManager(const char *signatureFunctionName, PPluginManager *pluginMgr=NULL)
virtual void OnShutdown()
Definition: pluginmgr.h:160
PPluginManager * pluginMgr
Definition: pluginmgr.h:169
PBoolean GetPluginsDeviceCapabilities(const PString &serviceType, const PString &serviceName, const PString &deviceName, void *capabilities) const
const char * signatureFunctionName
Definition: pluginmgr.h:168
PStringArray GetPluginsProviding(const PString &serviceType) const
PStringArray GetPluginTypes() const
The character string class.
Definition: pstring.h:108
PArray< PPluginService > m_services
Definition: pluginmgr.h:128
void LoadPluginDirectory(const PDirectory &directory)
Definition: pluginmgr.h:149
PluginListType pluginDLLs
Definition: pluginmgr.h:164
Definition: pluginmgr.h:91
void RemoveNotifier(const PNotifier &filterFunction)
static PString Empty()
Return an empty string.
virtual void OnStartup()
Definition: pluginmgr.h:158
void CallNotifier(PDynaLink &dll, NotificationCode code)
Definition: pluginmgr.h:20
This is a list collection class of PString objects.
Definition: pstring.h:2184
PFACTORY_LOAD(PluginLoaderStartup)
PFilePathString GetType() const
Get the file type of the file.
PDECLARE_NOTIFIER(PDynaLink, PPluginModuleManager, OnLoadModule)
PMutex m_servicesMutex
Definition: pluginmgr.h:127
NotificationCode
Definition: pluginmgr.h:89
PArray< PDynaLink > m_plugins
Definition: pluginmgr.h:125
Definition: plugin.h:96
static PStringArray GetPluginDirs()
PBoolean LoadPlugin(const PString &fileName)
Definition: pluginmgr.h:146
Synonym for PTimedMutex.
PList< PNotifier > m_notifiers
Definition: pluginmgr.h:131
void AddNotifier(const PNotifier &filterFunction, PBoolean existing=false)
Add a notifier to the plugin manager.
virtual void OnLoadPlugin(PDynaLink &, INT)
Definition: pluginmgr.h:152
Ultimate parent class for all objects in the class library.
Definition: object.h:1118
PBoolean RegisterService(const PString &serviceName, const PString &serviceType, PPluginServiceDescriptor *descriptor)
PStringArray GetPluginsDeviceNames(const PString &serviceName, const PString &serviceType, int userData=0) const