00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
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
00055
00056
00057 class PPluginManager : public PObject
00058 {
00059 PCLASSINFO(PPluginManager, PObject);
00060
00061 public:
00062
00063 PBoolean LoadPlugin (const PString & fileName);
00064 void LoadPluginDirectory (const PDirectory & dir);
00065
00066 void OnShutdown();
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 bool AddPluginDirs(const PString & dirs);
00082
00083
00084 static PStringArray GetPluginDirs();
00085
00086
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 protected:
00121 void LoadPluginDirectory (const PDirectory & directory, const PStringList & suffixes);
00122 void CallNotifier(PDynaLink & dll, NotificationCode code);
00123
00124 PMutex m_pluginsMutex;
00125 PArray<PDynaLink> m_plugins;
00126
00127 PMutex m_servicesMutex;
00128 PArray<PPluginService> m_services;
00129
00130 PMutex m_notifiersMutex;
00131 PList<PNotifier> m_notifiers;
00132 };
00133
00135
00136
00137
00138
00139 class PPluginModuleManager : public PObject
00140 {
00141 public:
00142 typedef PDictionary<PString, PDynaLink> PluginListType;
00143
00144 PPluginModuleManager(const char * signatureFunctionName, PPluginManager * pluginMgr = NULL);
00145
00146 PBoolean LoadPlugin(const PString & fileName)
00147 { if (pluginMgr == NULL) return false; else return pluginMgr->LoadPlugin(fileName); }
00148
00149 void LoadPluginDirectory(const PDirectory &directory)
00150 { if (pluginMgr != NULL) pluginMgr->LoadPluginDirectory(directory); }
00151
00152 virtual void OnLoadPlugin(PDynaLink & , INT )
00153 { }
00154
00155 virtual PluginListType GetPluginList() const
00156 { return pluginDLLs; }
00157
00158 virtual void OnStartup()
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 #define PLUGIN_LOADER_STARTUP_NAME "PluginLoaderStartup"
00174
00175 PFACTORY_LOAD(PluginLoaderStartup);
00176
00177
00178 #endif // PTLIB_PLUGINMGR_H
00179
00180
00181