From f9ab02629a25eb99117c8ab9441f8a585eae4904 Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Wed, 29 Jul 2015 18:58:37 +0100 Subject: [PATCH] Finish the dynamic loading of modules --- app/ModulesHandle.cpp | 11 ++++++----- examples/modules/FrameBinarization_APIv1.cpp | 2 ++ modules/PlaYUVerModuleFactory.cpp | 11 ++++++++--- modules/PlaYUVerModuleFactory.h | 2 +- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/app/ModulesHandle.cpp b/app/ModulesHandle.cpp index 93bb11e..dce174a 100644 --- a/app/ModulesHandle.cpp +++ b/app/ModulesHandle.cpp @@ -239,21 +239,22 @@ Void ModulesHandle::processOpt( Int index ) Void ModulesHandle::loadExternalModule() { + Bool bUpdate = false; QString supported = tr( "Supported Files (*.so)" ); QStringList formatsList; formatsList << "Shared Libraries (*.so)"; - QStringList filter; filter << supported << formatsList << tr( "All Files (*)" ); + QStringList fileNames = QFileDialog::getOpenFileNames( m_pcParent, tr( "Open File" ), QString(), filter.join( ";;" ) ); - QString fileName = QFileDialog::getSaveFileName( m_pcParent, tr( "Open File" ), QString(), filter.join( ";;" ) ); - if( !fileName.isEmpty() ) + for( Int i = 0; i < fileNames.size(); i++ ) { - PlaYUVerModuleFactory::Get()->RegisterDl( fileName.toStdString().data() ); - buildMenu(); + bUpdate |= PlaYUVerModuleFactory::Get()->RegisterDl( fileNames.at( i ).toStdString().data() ); } + if( bUpdate ) + buildMenu(); } Void ModulesHandle::activateModule() diff --git a/examples/modules/FrameBinarization_APIv1.cpp b/examples/modules/FrameBinarization_APIv1.cpp index d48329f..7fd5538 100644 --- a/examples/modules/FrameBinarization_APIv1.cpp +++ b/examples/modules/FrameBinarization_APIv1.cpp @@ -27,6 +27,8 @@ namespace plaYUVer { +REGISTER_CLASS_MAKER( FrameBinarization ) + FrameBinarization::FrameBinarization() { /* Module Definition */ diff --git a/modules/PlaYUVerModuleFactory.cpp b/modules/PlaYUVerModuleFactory.cpp index f70e913..d43e182 100644 --- a/modules/PlaYUVerModuleFactory.cpp +++ b/modules/PlaYUVerModuleFactory.cpp @@ -61,17 +61,22 @@ Void PlaYUVerModuleFactory::Register( const char* moduleName, CreateModuleFn pfn m_FactoryMap[moduleName] = pfnCreate; } -Void PlaYUVerModuleFactory::RegisterDl( const char* dlName ) +Bool PlaYUVerModuleFactory::RegisterDl( const char* dlName ) { void *pHndl = dlopen( dlName, RTLD_NOW ); if( pHndl == NULL ) { std::cerr << dlerror() << std::endl; - exit( -1 ); + return false; + } + CreateModuleFn pfnCreate = ( CreateModuleFn )dlsym( pHndl, "Maker" ); + if( pfnCreate == NULL ) + { + return false; } - CreateModuleFn pfnCreate = (CreateModuleFn) dlsym( pHndl, "CreateModule" ); Register( dlName, pfnCreate ); + return true; } PlaYUVerModuleIf *PlaYUVerModuleFactory::CreateModule( const char* moduleName ) diff --git a/modules/PlaYUVerModuleFactory.h b/modules/PlaYUVerModuleFactory.h index 3f3b3ba..5672d37 100644 --- a/modules/PlaYUVerModuleFactory.h +++ b/modules/PlaYUVerModuleFactory.h @@ -58,7 +58,7 @@ public: } Void Register( const char* moduleName, CreateModuleFn pfnCreate ); - Void RegisterDl( const char* dlName ); + Bool RegisterDl( const char* dlName ); PlaYUVerModuleIf *CreateModule( const char *moduleName ); PlaYUVerModuleFactoryMap& getMap()