summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorZdenek Prikryl <zdeny@dhcp-lab-218.englab.brq.redhat.com>2009-02-04 16:33:18 +0100
committerZdenek Prikryl <zdeny@dhcp-lab-218.englab.brq.redhat.com>2009-02-04 16:33:18 +0100
commit0e020f2559e1a1dc8c9780fd03a21f7dcbbe17bd (patch)
tree999b9e0cab0488709a0f41cc951de0af59d1b392 /lib
parent30273114d0523344d7e469be699f6699eb876701 (diff)
downloadabrt-0e020f2559e1a1dc8c9780fd03a21f7dcbbe17bd.tar.gz
abrt-0e020f2559e1a1dc8c9780fd03a21f7dcbbe17bd.tar.xz
abrt-0e020f2559e1a1dc8c9780fd03a21f7dcbbe17bd.zip
Improvement the inner architecture according MW's needs
Diffstat (limited to 'lib')
-rw-r--r--lib/MiddleWare/PluginManager.cpp194
-rw-r--r--lib/MiddleWare/PluginManager.h21
2 files changed, 69 insertions, 146 deletions
diff --git a/lib/MiddleWare/PluginManager.cpp b/lib/MiddleWare/PluginManager.cpp
index 4e4c56da..0d1f238f 100644
--- a/lib/MiddleWare/PluginManager.cpp
+++ b/lib/MiddleWare/PluginManager.cpp
@@ -24,6 +24,7 @@
#include <dirent.h>
#include <stdio.h>
#include <sys/types.h>
+#include "Settings.h"
CPluginManager::CPluginManager(const std::string& pPlugisConfDir,
const std::string& pPlugisLibDir) :
@@ -32,14 +33,7 @@ CPluginManager::CPluginManager(const std::string& pPlugisConfDir,
{}
CPluginManager::~CPluginManager()
-{
- map_crash_catcher_plugins_t::iterator it_p;
- while ((it_p = m_mapCrashCatcherPlugins.begin()) != m_mapCrashCatcherPlugins.end())
- {
- std::string pluginName = it_p->first;
- UnLoadPlugin(pluginName);
- }
-}
+{}
void CPluginManager::LoadPlugins()
{
@@ -64,44 +58,38 @@ void CPluginManager::LoadPlugins()
}
}
+void CPluginManager::UnLoadPlugins()
+{
+ map_crash_catcher_plugins_t::iterator it_p;
+ while ((it_p = m_mapCrashCatcherPlugins.begin()) != m_mapCrashCatcherPlugins.end())
+ {
+ std::string pluginName = it_p->first;
+ UnLoadPlugin(pluginName);
+ }
+}
+
void CPluginManager::LoadPlugin(const std::string& pName)
{
if (m_mapCrashCatcherPlugins.find(pName) == m_mapCrashCatcherPlugins.end())
{
CCrashCatcherPlugin* crashCatcherPlugin = NULL;
- CPlugin* plugin = NULL;
try
{
std::string libPath = m_sPlugisLibDir + "/lib" + pName + "." + PLUGINS_LIB_EXTENSIONS;
crashCatcherPlugin = new CCrashCatcherPlugin(libPath);
- if (crashCatcherPlugin->GetMagicNumber() != PLUGINS_MAGIC_NUMBER)
+ if (crashCatcherPlugin->GetMagicNumber() != PLUGINS_MAGIC_NUMBER ||
+ (crashCatcherPlugin->GetType() < LANGUAGE && crashCatcherPlugin->GetType() > DATABASE))
{
throw std::string("non-compatible plugin");
}
- crashCatcherPlugin->LoadSettings(m_sPlugisConfDir + "/" + pName + "." + PLUGINS_CONF_EXTENSION);
- std::cerr << "Loaded Plugin " << pName << " (" << crashCatcherPlugin->GetVersion() << ") " << "succesfully loaded." << std::endl;
- std::cerr << " Description: " << crashCatcherPlugin->GetDescription() << std::endl;
- std::cerr << " Email: " << crashCatcherPlugin->GetEmail() << std::endl;
- std::cerr << " WWW: " << crashCatcherPlugin->GetWWW() << std::endl;
+ std::cerr << "Plugin " << pName << " (" << crashCatcherPlugin->GetVersion() << ") " << "succesfully loaded." << std::endl;
m_mapCrashCatcherPlugins[pName] = crashCatcherPlugin;
-
- if (crashCatcherPlugin->IsEnabled())
- {
- plugin = crashCatcherPlugin->PluginNew();
- plugin->Init(crashCatcherPlugin->GetSettings());
- RegisterPlugin(plugin, pName, crashCatcherPlugin->GetType());
- }
-
}
catch (std::string sError)
{
- if (plugin != NULL)
- {
- delete plugin;
- }
if (crashCatcherPlugin != NULL)
{
- delete plugin;
+ delete crashCatcherPlugin;
}
std::cerr << "Failed to load plugin " << pName << " (" << sError << ")." << std::endl;
}
@@ -112,7 +100,7 @@ void CPluginManager::UnLoadPlugin(const std::string& pName)
{
if (m_mapCrashCatcherPlugins.find(pName) != m_mapCrashCatcherPlugins.end())
{
- UnRegisterPlugin(pName, m_mapCrashCatcherPlugins[pName]->GetType());
+ UnRegisterPlugin(pName);
delete m_mapCrashCatcherPlugins[pName];
m_mapCrashCatcherPlugins.erase(pName);
std::cerr << "Plugin " << pName << " sucessfully unloaded." << std::endl;
@@ -120,135 +108,79 @@ void CPluginManager::UnLoadPlugin(const std::string& pName)
}
-void CPluginManager::RegisterPlugin(CPlugin* pPlugin,
- const std::string pName,
- const plugin_type_t& pPluginType)
+void CPluginManager::RegisterPlugin(const std::string& pName)
{
- switch (pPluginType)
- {
- case LANGUAGE:
- {
- m_mapLanguages[pName] = (CLanguage*)pPlugin;
- std::cerr << "Registred Language plugin " << pName << std::endl;
- }
- break;
- case REPORTER:
- {
- m_mapReporters[pName] = (CReporter*)pPlugin;
- std::cerr << "Registred Reporter plugin " << pName << std::endl;
- }
- break;
- case APPLICATION:
- {
- m_mapApplications[pName] = (CApplication*)pPlugin;
- std::cerr << "Registred Application plugin " << pName << std::endl;
- }
- break;
- case DATABASE:
- {
- m_mapDatabases[pName] = (CDatabase*)pPlugin;
- std::cerr << "Registred Database plugin " << pName << std::endl;
- }
- break;
- default:
- {
- std::cerr << "Trying to register unknown type of plugin." << std::endl;
- }
- break;
- }
+ if (m_mapCrashCatcherPlugins.find(pName) != m_mapCrashCatcherPlugins.end())
+ {
+ if (m_mapPlugins.find(pName) == m_mapPlugins.end())
+ {
+ map_settings_t settings;
+ std::string path = m_sPlugisConfDir + "/" + pName + "." + PLUGINS_CONF_EXTENSION;
+ load_settings(path, settings);
+ CPlugin* plugin = m_mapCrashCatcherPlugins[pName]->PluginNew();
+ plugin->Init();
+ plugin->SetSettings(settings);
+ m_mapPlugins[pName] = plugin;
+ std::cerr << "Registred plugin " << pName << "("
+ << plugin_type_str_t[m_mapCrashCatcherPlugins[pName]->GetType()]
+ << ")" << std::endl;
+ }
+ }
}
-void CPluginManager::UnRegisterPlugin(const std::string pName, const plugin_type_t& pPluginType)
+void CPluginManager::UnRegisterPlugin(const std::string& pName)
{
- switch (pPluginType)
- {
- case LANGUAGE:
- {
- if (m_mapLanguages.find(pName) != m_mapLanguages.end())
- {
- m_mapLanguages[pName]->DeInit();
- delete m_mapLanguages[pName];
- m_mapLanguages.erase(pName);
- std::cerr << "UnRegistred Language plugin " << pName << std::endl;
- }
- }
- break;
- case REPORTER:
- {
- if (m_mapReporters.find(pName) != m_mapReporters.end())
- {
- m_mapReporters[pName]->DeInit();
- delete m_mapReporters[pName];
- m_mapReporters.erase(pName);
- std::cerr << "UnRegistred Reporter plugin " << pName << std::endl;
- }
- }
- break;
- case APPLICATION:
- {
- if (m_mapApplications.find(pName) != m_mapApplications.end())
- {
- m_mapApplications[pName]->DeInit();
- delete m_mapApplications[pName];
- m_mapApplications.erase(pName);
- std::cerr << "UnRegistred Application plugin " << pName << std::endl;
- }
- }
- break;
- case DATABASE:
- {
- if (m_mapDatabases.find(pName) != m_mapDatabases.end())
- {
- m_mapDatabases[pName]->DeInit();
- delete m_mapDatabases[pName];
- m_mapDatabases.erase(pName);
- std::cerr << "UnRegistred Database plugin " << pName << std::endl;
- }
- }
- break;
- default:
- std::cerr << "Trying to unregister unknown type of plugin." << std::endl;
- break;
- }
+ if (m_mapCrashCatcherPlugins.find(pName) != m_mapCrashCatcherPlugins.end())
+ {
+ if (m_mapPlugins.find(pName) != m_mapPlugins.end())
+ {
+ m_mapPlugins[pName]->DeInit();
+ delete m_mapPlugins[pName];
+ m_mapPlugins.erase(pName);
+ std::cerr << "UnRegistred plugin " << pName << "("
+ << plugin_type_str_t[m_mapCrashCatcherPlugins[pName]->GetType()]
+ << ")" << std::endl;
+ }
+ }
}
CLanguage* CPluginManager::GetLanguage(const std::string& pName)
{
- if (m_mapLanguages.find(pName) != m_mapLanguages.end())
+ if (m_mapPlugins.find(pName) == m_mapPlugins.end())
{
- return m_mapLanguages[pName];
+ throw std::string("CPluginManager::GetLanguage():"
+ "Language plugin: '"+pName+"' is not loaded.");
}
-
- return NULL;
+ return (CLanguage*) m_mapPlugins[pName];
}
CReporter* CPluginManager::GetReporter(const std::string& pName)
{
- if (m_mapReporters.find(pName) != m_mapReporters.end())
+ if (m_mapPlugins.find(pName) == m_mapPlugins.end())
{
- return m_mapReporters[pName];
+ throw std::string("CPluginManager::GetReporter():"
+ "Reporter plugin: '"+pName+"' is not loaded.");
}
-
- return NULL;
+ return (CReporter*) m_mapPlugins[pName];
}
CApplication* CPluginManager::GetApplication(const std::string& pName)
{
- if (m_mapApplications.find(pName) != m_mapApplications.end())
+ if (m_mapPlugins.find(pName) != m_mapPlugins.end())
{
- return m_mapApplications[pName];
+ throw std::string("CPluginManager::GetApplication():"
+ "Application plugin: '"+pName+"' is not loaded.");
}
-
- return NULL;
+ return (CApplication*) m_mapPlugins[pName];
}
CDatabase* CPluginManager::GetDatabase(const std::string& pName)
{
- if (m_mapDatabases.find(pName) != m_mapDatabases.end())
+ if (m_mapPlugins.find(pName) != m_mapPlugins.end())
{
- return m_mapDatabases[pName];
+ throw std::string("CPluginManager::GetDatabase():"
+ "Database plugin: '"+pName+"' is not loaded.");
}
-
- return NULL;
+ return (CDatabase*) m_mapPlugins[pName];
}
diff --git a/lib/MiddleWare/PluginManager.h b/lib/MiddleWare/PluginManager.h
index 56799833..c064c0c2 100644
--- a/lib/MiddleWare/PluginManager.h
+++ b/lib/MiddleWare/PluginManager.h
@@ -36,28 +36,15 @@ class CPluginManager
{
private:
typedef std::map<std::string, CCrashCatcherPlugin*> map_crash_catcher_plugins_t;
- typedef std::map<std::string, CLanguage*> map_languages_t;
- typedef std::map<std::string, CReporter*> map_reporters_t;
- typedef std::map<std::string, CApplication*> map_applications_t;
- typedef std::map<std::string, CDatabase*> map_databases_t;
+ typedef std::map<std::string, CPlugin*> map_plugins_t;
map_crash_catcher_plugins_t m_mapCrashCatcherPlugins;
- map_languages_t m_mapLanguages;
- map_reporters_t m_mapReporters;
- map_applications_t m_mapApplications;
- map_databases_t m_mapDatabases;
+ map_plugins_t m_mapPlugins;
std::string m_sPlugisConfDir;
std::string m_sPlugisLibDir;
- void RegisterPlugin(CPlugin* pPlugin,
- const std::string pName,
- const plugin_type_t& pPluginType);
-
- void UnRegisterPlugin(const std::string pName,
- const plugin_type_t& pPluginType);
-
public:
CPluginManager(const std::string& pPlugisConfDir,
const std::string& pPlugisLibDir);
@@ -65,8 +52,12 @@ class CPluginManager
~CPluginManager();
void LoadPlugins();
+ void UnLoadPlugins();
+
void LoadPlugin(const std::string& pName);
void UnLoadPlugin(const std::string& pName);
+ void RegisterPlugin(const std::string& pName);
+ void UnRegisterPlugin(const std::string& pName);
CLanguage* GetLanguage(const std::string& pName);
CReporter* GetReporter(const std::string& pName);