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: 21788 $
00011  * $Author: rjongbloed $
00012  * $Date: 2008-12-11 23:42:13 -0600 (Thu, 11 Dec 2008) $
00013  */
00014 
00015 #ifndef PTLIB_PLUGINMGR_H
00016 #define PTLIB_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 //  Manager for plugins
00057 //
00058 
00059 class PPluginManager : public PObject
00060 {
00061   PCLASSINFO(PPluginManager, PObject);
00062 
00063   public:
00064     // functions to load/unload a dynamic plugin 
00065     PBoolean LoadPlugin (const PString & fileName);
00066     void LoadPluginDirectory (const PDirectory & dir);
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 
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 //  Manager for plugin modules
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 & /*dll*/, INT /*code*/)
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 
00167 #endif // PTLIB_PLUGINMGR_H
00168 
00169 
00170 // End Of File ///////////////////////////////////////////////////////////////

Generated on Thu May 27 01:36:48 2010 for PTLib by  doxygen 1.4.7