diff options
Diffstat (limited to 'src/cppunit/PlugInManager.cpp')
| -rw-r--r-- | src/cppunit/PlugInManager.cpp | 90 |
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 ¶meters ) +{ + 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 + |
