PTLib Version 2.10.2
pluginmgr.h
Go to the documentation of this file.
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 ///////////////////////////////////////////////////////////////
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines