PTLib  Version 2.10.11
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 {
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
69  PStringArray GetPluginTypes() const;
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
87  static PPluginManager & GetPluginManager();
88 
91  UnloadingPlugIn
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 
144  PPluginModuleManager(const char * signatureFunctionName, PPluginManager * pluginMgr = NULL);
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 
155  virtual PluginListType GetPluginList() const
156  { return pluginDLLs; }
157 
158  virtual void OnStartup()
159  { }
160  virtual void OnShutdown()
161  { }
162 
163  protected:
164  PluginListType pluginDLLs;
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 ///////////////////////////////////////////////////////////////
virtual PluginListType GetPluginList() const
Definition: pluginmgr.h:155
#define PDECLARE_NOTIFIER(notifier, notifiee, func)
Declare PNotifier derived class with INT parameter. Uses PDECLARE_NOTIFIER2 macro.
Definition: notifier.h:174
void PLoadPluginDirectory(C &obj, const PDirectory &directory, const char *suffix=NULL)
Definition: pluginmgr.h:26
#define PCLASSINFO(cls, par)
Declare all the standard PTLib class information.
Definition: object.h:1049
PBoolean Next()
Move to the next file in the directory scan.
Class specialisation for PNotifierTemplate<INT>
Definition: pluginmgr.h:57
Definition: pluginmgr.h:139
This class describes a full description for a file on the particular platform.
Definition: filepath.h:65
Definition: pluginmgr.h:90
PMutex m_notifiersMutex
Definition: pluginmgr.h:130
PMutex m_pluginsMutex
Definition: pluginmgr.h:124
PString Right(PINDEX len) const
Extract a portion of the string into a new string.
This is an array collection class of PString objects.
Definition: pstring.h:2024
#define PTRACE(level, args)
Output trace.
Definition: object.h:530
PDictionary< PString, PDynaLink > PluginListType
Definition: pluginmgr.h:142
virtual PBoolean Open(int scanMask=PFileInfo::AllFiles)
Open the directory for scanning its list of files.
BOOL PBoolean
Definition: object.h:102
Class to represent a directory in the operating system file system.
Definition: pdirect.h:182
virtual void OnShutdown()
Definition: pluginmgr.h:160
PPluginManager * pluginMgr
Definition: pluginmgr.h:169
const char * signatureFunctionName
Definition: pluginmgr.h:168
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
static PString Empty()
Return an empty string.
virtual PFilePathString GetEntryName() const
Get the name (without the volume or directory path) of the current entry in the directory scan...
virtual void OnStartup()
Definition: pluginmgr.h:158
Definition: pluginmgr.h:20
This is a list collection class of PString objects.
Definition: pstring.h:2184
PFACTORY_LOAD(PluginLoaderStartup)
PMutex m_servicesMutex
Definition: pluginmgr.h:127
NotificationCode
Definition: pluginmgr.h:89
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".
PArray< PDynaLink > m_plugins
Definition: pluginmgr.h:125
Definition: plugin.h:96
PBoolean LoadPlugin(const PString &fileName)
Definition: pluginmgr.h:146
Synonym for PTimedMutex.
PList< PNotifier > m_notifiers
Definition: pluginmgr.h:131
virtual void OnLoadPlugin(PDynaLink &, INT)
Definition: pluginmgr.h:152
Ultimate parent class for all objects in the class library.
Definition: object.h:1118
PFilePathString GetType() const
Get the file type of the file.