summaryrefslogtreecommitdiff
path: root/src/cppunit/PlugInManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/cppunit/PlugInManager.cpp')
-rw-r--r--src/cppunit/PlugInManager.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/cppunit/PlugInManager.cpp b/src/cppunit/PlugInManager.cpp
new file mode 100644
index 0000000..ad17a65
--- /dev/null
+++ b/src/cppunit/PlugInManager.cpp
@@ -0,0 +1,90 @@
+#include <cppunit/plugin/PlugInManager.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <cppunit/plugin/TestPlugIn.h>
+#include <cppunit/plugin/DynamicLibraryManager.h>
+
+
+namespace CppUnit
+{
+
+
+
+PlugInManager::PlugInManager()
+{
+}
+
+
+PlugInManager::~PlugInManager()
+{
+ for ( PlugIns::iterator it = m_plugIns.begin(); it != m_plugIns.end(); ++it )
+ unload( *it );
+}
+
+
+void
+PlugInManager::load( const std::string &libraryFileName,
+ const Parameters &parameters )
+{
+ PlugInInfo info;
+ info.m_fileName = libraryFileName;
+ info.m_manager = new DynamicLibraryManager( libraryFileName );
+
+ TestPlugInSignature plug = (TestPlugInSignature)info.m_manager->findSymbol(
+ CPPUNIT_STRINGIZE( CPPUNIT_PLUGIN_EXPORTED_NAME ) );
+ info.m_interface = (*plug)();
+
+ m_plugIns.push_back( info );
+
+ info.m_interface->initialize( &TestFactoryRegistry::getRegistry(), parameters );
+}
+
+
+void
+PlugInManager::unload( const std::string &libraryFileName )
+{
+ for ( PlugIns::iterator it = m_plugIns.begin(); it != m_plugIns.end(); ++it )
+ {
+ if ( it->m_fileName == libraryFileName )
+ {
+ unload( *it );
+ m_plugIns.erase( it );
+ break;
+ }
+ }
+}
+
+
+void
+PlugInManager::addListener( TestResult *eventManager )
+{
+ for ( PlugIns::iterator it = m_plugIns.begin(); it != m_plugIns.end(); ++it )
+ it->m_interface->addListener( eventManager );
+}
+
+
+void
+PlugInManager::removeListener( TestResult *eventManager )
+{
+ for ( PlugIns::iterator it = m_plugIns.begin(); it != m_plugIns.end(); ++it )
+ it->m_interface->removeListener( eventManager );
+}
+
+
+void
+PlugInManager::unload( PlugInInfo &plugIn )
+{
+ try
+ {
+ plugIn.m_interface->uninitialize( &TestFactoryRegistry::getRegistry() );
+ }
+ catch (...)
+ {
+ delete plugIn.m_manager;
+ plugIn.m_manager = NULL;
+ throw;
+ }
+}
+
+
+} // namespace CppUnit
+