|
PTLib Version 2.10.2
|
00001 /* 00002 * pluginmgr.h 00003 * 00004 * Plugin Manager Class Declarations 00005 * 00006 * Portable Windows Library 00007 * 00008 * Contributor(s): Snark at GnomeMeeting 00009 * 00010 * $Revision: 26272 $ 00011 * $Author: rjongbloed $ 00012 * $Date: 2011-08-03 19:31:06 -0500 (Wed, 03 Aug 2011) $ 00013 */ 00014 00015 #ifndef PTLIB_PLUGINMGR_H 00016 #define PTLIB_PLUGINMGR_H 00017 00018 #include <ptlib/plugin.h> 00019 00020 class PPluginSuffix { 00021 private: 00022 int dummy; 00023 }; 00024 00025 template <class C> 00026 void PLoadPluginDirectory(C & obj, const PDirectory & directory, const char * suffix = NULL) 00027 { 00028 PDirectory dir = directory; 00029 if (!dir.Open()) { 00030 PTRACE(4, "Cannot open plugin directory " << dir); 00031 return; 00032 } 00033 PTRACE(4, "Enumerating plugin directory " << dir); 00034 do { 00035 PString entry = dir + dir.GetEntryName(); 00036 PDirectory subdir = entry; 00037 if (subdir.Open()) 00038 PLoadPluginDirectory<C>(obj, entry, suffix); 00039 else { 00040 PFilePath fn(entry); 00041 if ( 00042 (fn.GetType() *= PDynaLink::GetExtension()) && 00043 ( 00044 (suffix == NULL) || (fn.GetTitle().Right(strlen(suffix)) *= suffix) 00045 ) 00046 ) 00047 obj.LoadPlugin(entry); 00048 } 00049 } while (dir.Next()); 00050 } 00051 00053 // 00054 // Manager for plugins 00055 // 00056 00057 class PPluginManager : public PObject 00058 { 00059 PCLASSINFO(PPluginManager, PObject); 00060 00061 public: 00062 // functions to load/unload a dynamic plugin 00063 PBoolean LoadPlugin (const PString & fileName); 00064 void LoadPluginDirectory (const PDirectory & dir); 00065 00066 void OnShutdown(); 00067 00068 // functions to access the plugins' services 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 // function to register a service (used by the plugins themselves) 00078 PBoolean RegisterService (const PString & serviceName, const PString & serviceType, PPluginServiceDescriptor * descriptor); 00079 00080 // Add a directory to the list of plugin directories (used by OPAL) 00081 static void AddPluginDirs(PString dirs); 00082 00083 // Get the list of plugin directories 00084 static PStringArray GetPluginDirs(); 00085 00086 // static functions for accessing global instances of plugin managers 00087 static PPluginManager & GetPluginManager(); 00088 00089 enum NotificationCode { 00090 LoadingPlugIn, 00091 UnloadingPlugIn 00092 }; 00093 00111 void AddNotifier( 00112 const PNotifier & filterFunction, 00113 PBoolean existing = false 00114 ); 00115 00116 void RemoveNotifier( 00117 const PNotifier & filterFunction 00118 ); 00119 00120 static PString additionalPluginDirs; 00121 00122 protected: 00123 void LoadPluginDirectory (const PDirectory & directory, const PStringList & suffixes); 00124 void CallNotifier(PDynaLink & dll, NotificationCode code); 00125 00126 PMutex m_pluginsMutex; 00127 PArray<PDynaLink> m_plugins; 00128 00129 PMutex m_servicesMutex; 00130 PArray<PPluginService> m_services; 00131 00132 PMutex m_notifiersMutex; 00133 PList<PNotifier> m_notifiers; 00134 }; 00135 00137 // 00138 // Manager for plugin modules 00139 // 00140 00141 class PPluginModuleManager : public PObject 00142 { 00143 public: 00144 typedef PDictionary<PString, PDynaLink> PluginListType; 00145 00146 PPluginModuleManager(const char * signatureFunctionName, PPluginManager * pluginMgr = NULL); 00147 00148 PBoolean LoadPlugin(const PString & fileName) 00149 { if (pluginMgr == NULL) return false; else return pluginMgr->LoadPlugin(fileName); } 00150 00151 void LoadPluginDirectory(const PDirectory &directory) 00152 { if (pluginMgr != NULL) pluginMgr->LoadPluginDirectory(directory); } 00153 00154 virtual void OnLoadPlugin(PDynaLink & /*dll*/, INT /*code*/) 00155 { } 00156 00157 virtual PluginListType GetPluginList() const 00158 { return pluginDLLs; } 00159 00160 virtual void OnShutdown() 00161 { } 00162 00163 protected: 00164 PluginListType pluginDLLs; 00165 PDECLARE_NOTIFIER(PDynaLink, PPluginModuleManager, OnLoadModule); 00166 00167 protected: 00168 const char * signatureFunctionName; 00169 PPluginManager * pluginMgr; 00170 }; 00171 00172 00173 PFACTORY_LOAD(PluginLoaderStartup); 00174 00175 00176 #endif // PTLIB_PLUGINMGR_H 00177 00178 00179 // End Of File ///////////////////////////////////////////////////////////////