00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 #ifndef _PLUGINMGR_H
00095 #define _PLUGINMGR_H
00096
00097 #define DEFAULT_PLUGINDIR "/usr/lib/pwlib"
00098
00099 #include <ptlib/plugin.h>
00100
00101 class PPluginSuffix {
00102 private:
00103 int dummy;
00104 };
00105
00106 template <class C>
00107 void PLoadPluginDirectory(C & obj, const PDirectory & directory, const char * suffix = NULL)
00108 {
00109 PDirectory dir = directory;
00110 if (!dir.Open()) {
00111 PTRACE(4, "Cannot open plugin directory " << dir);
00112 return;
00113 }
00114 PTRACE(4, "Enumerating plugin directory " << dir);
00115 do {
00116 PString entry = dir + dir.GetEntryName();
00117 PDirectory subdir = entry;
00118 if (subdir.Open())
00119 PLoadPluginDirectory<C>(obj, entry, suffix);
00120 else {
00121 PFilePath fn(entry);
00122 if (
00123 (fn.GetType() *= PDynaLink::GetExtension()) &&
00124 (
00125 (suffix == NULL) || (fn.GetTitle().Right(strlen(suffix)) *= suffix)
00126 )
00127 )
00128 obj.LoadPlugin(entry);
00129 }
00130 } while (dir.Next());
00131 }
00132
00134
00135
00136
00137
00138 class PPluginManager : public PObject
00139 {
00140 PCLASSINFO(PPluginManager, PObject);
00141
00142 public:
00143
00144 BOOL LoadPlugin (const PString & fileName);
00145 void LoadPluginDirectory (const PDirectory & dir);
00146
00147
00148 PStringList GetPluginTypes() const;
00149 PStringList GetPluginsProviding(const PString & serviceType) const;
00150 PPluginServiceDescriptor * GetServiceDescriptor(const PString & serviceName, const PString & serviceType) const;
00151 PObject * CreatePluginsDevice(const PString & serviceName, const PString & serviceType, int userData = 0) const;
00152 PObject * CreatePluginsDeviceByName(const PString & deviceName, const PString & serviceType, int userData = 0, const PString & serviceName = PString::Empty()) const;
00153 PStringList GetPluginsDeviceNames(const PString & serviceName, const PString & serviceType, int userData = 0) const;
00154
00155
00156 BOOL RegisterService (const PString & serviceName, const PString & serviceType, PPluginServiceDescriptor * descriptor);
00157
00158
00159 static PStringArray GetPluginDirs();
00160
00161
00162 static PPluginManager & GetPluginManager();
00163
00181 void AddNotifier(
00182 const PNotifier & filterFunction,
00183 BOOL existing = FALSE
00184 );
00185
00186 void RemoveNotifier(
00187 const PNotifier & filterFunction
00188 );
00189
00190 protected:
00191 void LoadPluginDirectory (const PDirectory & directory, const PStringList & suffixes);
00192 void CallNotifier(PDynaLink & dll, INT code);
00193
00194 PMutex pluginListMutex;
00195 PList<PDynaLink> pluginList;
00196
00197 PMutex serviceListMutex;
00198 PList<PPluginService> serviceList;
00199
00200 PMutex notifierMutex;
00201 PList<PNotifier> notifierList;
00202 };
00203
00205
00206
00207
00208
00209 class PPluginModuleManager : public PObject
00210 {
00211 public:
00212 typedef PDictionary<PString, PDynaLink> PluginListType;
00213
00214 PPluginModuleManager(const char * _signatureFunctionName, PPluginManager * pluginMgr = NULL);
00215
00216 BOOL LoadPlugin(const PString & fileName)
00217 { if (pluginMgr == NULL) return FALSE; else return pluginMgr->LoadPlugin(fileName); }
00218
00219 void LoadPluginDirectory(const PDirectory &directory)
00220 { if (pluginMgr != NULL) pluginMgr->LoadPluginDirectory(directory); }
00221
00222 virtual void OnLoadPlugin(PDynaLink & , INT )
00223 { }
00224
00225 virtual PluginListType GetPluginList() const
00226 { return pluginList; }
00227
00228 virtual void OnShutdown()
00229 { }
00230
00231 protected:
00232 PluginListType pluginList;
00233 PDECLARE_NOTIFIER(PDynaLink, PPluginModuleManager, OnLoadModule);
00234
00235 protected:
00236 const char * signatureFunctionName;
00237 PPluginManager * pluginMgr;
00238 };
00239
00240 #endif // ifndef _PLUGINMGR_H