00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef _PLUGINMGR_H
00016 #define _PLUGINMGR_H
00017
00018 #define DEFAULT_PLUGINDIR "/usr/lib/pwlib"
00019
00020 #include <ptlib/plugin.h>
00021
00022 class PPluginSuffix {
00023 private:
00024 int dummy;
00025 };
00026
00027 template <class C>
00028 void PLoadPluginDirectory(C & obj, const PDirectory & directory, const char * suffix = NULL)
00029 {
00030 PDirectory dir = directory;
00031 if (!dir.Open()) {
00032 PTRACE(4, "Cannot open plugin directory " << dir);
00033 return;
00034 }
00035 PTRACE(4, "Enumerating plugin directory " << dir);
00036 do {
00037 PString entry = dir + dir.GetEntryName();
00038 PDirectory subdir = entry;
00039 if (subdir.Open())
00040 PLoadPluginDirectory<C>(obj, entry, suffix);
00041 else {
00042 PFilePath fn(entry);
00043 if (
00044 (fn.GetType() *= PDynaLink::GetExtension()) &&
00045 (
00046 (suffix == NULL) || (fn.GetTitle().Right(strlen(suffix)) *= suffix)
00047 )
00048 )
00049 obj.LoadPlugin(entry);
00050 }
00051 } while (dir.Next());
00052 }
00053
00055
00056
00057
00058
00059 class PPluginManager : public PObject
00060 {
00061 PCLASSINFO(PPluginManager, PObject);
00062
00063 public:
00064
00065 PBoolean LoadPlugin (const PString & fileName);
00066 void LoadPluginDirectory (const PDirectory & dir);
00067
00068
00069 PStringArray GetPluginTypes() const;
00070 PStringArray GetPluginsProviding(const PString & serviceType) const;
00071 PPluginServiceDescriptor * GetServiceDescriptor(const PString & serviceName, const PString & serviceType) const;
00072 PObject * CreatePluginsDevice(const PString & serviceName, const PString & serviceType, int userData = 0) const;
00073 PObject * CreatePluginsDeviceByName(const PString & deviceName, const PString & serviceType, int userData = 0, const PString & serviceName = PString::Empty()) const;
00074 PStringArray GetPluginsDeviceNames(const PString & serviceName, const PString & serviceType, int userData = 0) const;
00075 PBoolean GetPluginsDeviceCapabilities(const PString & serviceType,const PString & serviceName,const PString & deviceName,void * capabilities) const;
00076
00077
00078 PBoolean RegisterService (const PString & serviceName, const PString & serviceType, PPluginServiceDescriptor * descriptor);
00079
00080
00081 static void AddPluginDirs(PString dirs);
00082
00083
00084 static PStringArray GetPluginDirs();
00085
00086
00087 static PPluginManager & GetPluginManager();
00088
00106 void AddNotifier(
00107 const PNotifier & filterFunction,
00108 PBoolean existing = PFalse
00109 );
00110
00111 void RemoveNotifier(
00112 const PNotifier & filterFunction
00113 );
00114
00115 static PString additionalPluginDirs;
00116 protected:
00117 void LoadPluginDirectory (const PDirectory & directory, const PStringList & suffixes);
00118 void CallNotifier(PDynaLink & dll, INT code);
00119
00120 PMutex pluginsMutex;
00121 PArray<PDynaLink> plugins;
00122
00123 PMutex servicesMutex;
00124 PArray<PPluginService> services;
00125
00126 PMutex notifiersMutex;
00127 PList<PNotifier> notifiers;
00128 };
00129
00131
00132
00133
00134
00135 class PPluginModuleManager : public PObject
00136 {
00137 public:
00138 typedef PDictionary<PString, PDynaLink> PluginListType;
00139
00140 PPluginModuleManager(const char * _signatureFunctionName, PPluginManager * pluginMgr = NULL);
00141
00142 PBoolean LoadPlugin(const PString & fileName)
00143 { if (pluginMgr == NULL) return PFalse; else return pluginMgr->LoadPlugin(fileName); }
00144
00145 void LoadPluginDirectory(const PDirectory &directory)
00146 { if (pluginMgr != NULL) pluginMgr->LoadPluginDirectory(directory); }
00147
00148 virtual void OnLoadPlugin(PDynaLink & , INT )
00149 { }
00150
00151 virtual PluginListType GetPluginList() const
00152 { return pluginDLLs; }
00153
00154 virtual void OnShutdown()
00155 { }
00156
00157 protected:
00158 PluginListType pluginDLLs;
00159 PDECLARE_NOTIFIER(PDynaLink, PPluginModuleManager, OnLoadModule);
00160
00161 protected:
00162 const char * signatureFunctionName;
00163 PPluginManager * pluginMgr;
00164 };
00165
00166 #endif // ifndef _PLUGINMGR_H