#include "bbSlicerModuleWrapper.h" #include "bbSlicerPackage.h" namespace bbSlicer { BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, ModuleWrapper ) BBTK_BLACK_BOX_IMPLEMENTATION ( ModuleWrapper, bbtk::AtomicBlackBox ); void ModuleWrapper::Process ( ) { /// MODULE INFORMATION /// std::string gblib = bbGetInputPath_to_library( ); const std::string des = getModuleDescription( gblib ); ModuleDescription module; ModuleDescriptionParser parser; parser.Parse( des, module ); /// LOADING DUMMY FILES /// std::string _body = loadDummyBody( ); std::string _header = loadDummyHeader( ); /// SETTING HEADER FILE /// _header = updateBoxName( &module, _header ); _header = updateBoxDescription( &module, _header ); _header = updateBoxInputs( &module, _header ); saveFile( _header, getHeaderFileName( &module ) ); /// SETTING BODY FILE /// _body = updateBoxName( &module, _body ); _body = updateProcessMethod( &module, _body, gblib ); saveFile( _body, getBodyFileName( &module ) ); } /// STD LD_OPEN CALLS /// char* ModuleWrapper::getModuleDescription ( std::string lib ) { void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); if ( ! handle ) { std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; return NULL; } typedef char* ( *method_t )( void ); // RESET ERRORS dlerror( ); method_t myMethod = ( method_t ) dlsym( handle, "GetXMLModuleDescription" ); const char *dlsym_error = dlerror( ); if ( dlsym_error ) { std::cerr << "CAN'T LOAD SYMBOL 'GetXMLModuleDescription: " << dlsym_error << '\n'; dlclose( handle ); return NULL; } // CALLING METHOD char* descrption = myMethod( ); // CLOSING LIB dlclose( handle ); return descrption; } /// FILE RELATED /// void ModuleWrapper::saveFile ( std::string content, std::string file_name ) { std::ofstream myfile; myfile.open( file_name.c_str( ) ); myfile << content; myfile.close( ); } std::string ModuleWrapper::loadFile ( std::string filename ) { std::string line = std::string( "" ); std::string content = std::string( "" ); std::ifstream infile; infile.open( filename.c_str( ) ); while ( ! infile.eof( ) ) { getline( infile, line ); content += line + "\n"; line.clear( ); } infile.close( ); return content; } std::string ModuleWrapper::loadDummyBody ( ) { return loadFile( "bbSlicerDummy.dummy_cxx" ); } std::string ModuleWrapper::loadDummyHeader ( ) { return loadFile( "bbSlicerDummy.dummy_h" ); } /// BBTK BOX CREATION /// std::string ModuleWrapper::updateBoxDescription ( const ModuleDescription* module, std::string _header ) { _header = Mthd::Aux::replace_str( _header, "_NNNNN_", Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ) ); _header = Mthd::Aux::replace_str( _header, "_AAAAA_", module->GetContributor( ) ); _header = Mthd::Aux::replace_str( _header, "_DDDDD_", module->GetDescription( ) ); _header = Mthd::Aux::replace_str( _header, "_CCCCC_", module->GetCategory( ) ); return _header; } std::string ModuleWrapper::updateBoxName ( const ModuleDescription* module, std::string content ) { std::string _new_box_name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ); content = Mthd::Aux::replace_str( content, "Dummy", _new_box_name ); return content; } std::string ModuleWrapper::getHeaderFileName ( const ModuleDescription* module ) { std::string name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ); return "bbSlicer" + name + ".h"; } std::string ModuleWrapper::getBodyFileName ( const ModuleDescription* module ) { std::string name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ); return "bbSlicer" + name + ".cxx"; } std::string ModuleWrapper::updateBoxInputs ( const ModuleDescription* module, std::string content ) { std::string _cxx_inputs = std::string( "\n" ); std::string _cxx_inputs_end = std::string( "\n" ); std::string _box_name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ); for ( unsigned long int i = 0; i < module->GetParameterGroups( ).size( ); i ++ ) { ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ); for ( unsigned long int j = 0; j < pGroup.GetParameters( ).size( ); j ++ ) { ModuleParameter mPara = pGroup.GetParameters( ).at( j ); _cxx_inputs += "BBTK_DECLARE_INPUT ( " + mPara.GetName( ) + " , " + mPara.GetCPPType( ) + " );\n"; _cxx_inputs_end += "BBTK_INPUT(" + _box_name + " , " + mPara.GetName( ) + " , " + "\"" + mPara.GetName( ) + "\"" + " , " + mPara.GetCPPType( ) + ", \"\");\n"; } } content = Mthd::Aux::replace_str( content, "_11111_", _cxx_inputs ); content = Mthd::Aux::replace_str( content, "_22222_", _cxx_inputs_end ); return content; } const int ModuleWrapper::getNumberOfArguments ( const ModuleDescription* module ) { int number = 0; for ( unsigned long int i = 0; i < module->GetParameterGroups( ).size( ); i ++ ) { ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ); for ( unsigned long int j = 0; j < pGroup.GetParameters( ).size( ); j ++ ) { ModuleParameter mPara = pGroup.GetParameters( ).at( j ); number ++; } } return number; } std::string ModuleWrapper::updateProcessMethod ( const ModuleDescription* module, std::string content, std::string lib ) { int number = 0; std::string arg_list = std::string( "" ); for ( unsigned long int i = 0; i < module->GetParameterGroups( ).size( ); i ++ ) { ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ); for ( unsigned long int j = 0; j < pGroup.GetParameters( ).size( ); j ++ ) { ModuleParameter mPara = pGroup.GetParameters( ).at( j ); arg_list += "Mthd::Aux::toCharArrray( "; if ( mPara.GetFlag( ) != "" ) { arg_list += "Mthd::Aux::toString( \""; arg_list += "-" + mPara.GetFlag( ) + "\" "; arg_list += " ) + "; } else if ( mPara.GetLongFlag( ) != "" ) { arg_list += "Mthd::Aux::toString( \""; arg_list += "--" + mPara.GetLongFlag( ) + "\" "; arg_list += " ) + "; } arg_list += "Mthd::Aux::toString( bbGetInput" + mPara.GetName( ) + "( ) )"; arg_list += " ),\n"; number ++; } } arg_list += "_EEENNNDDD_"; arg_list = Mthd::Aux::replace_str( arg_list, ",\n_EEENNNDDD_", "" ); std::string _argc = "\nint _argc =" + Mthd::Aux::toString( number ) + ";\n"; std::string _slib = "std::string lib = \"" + lib + "\";\n"; std::string _argv = "char * _argv[ ] = { " + arg_list + " };\n"; return Mthd::Aux::replace_str( content, "_33333_", _argc + _slib + _argv ); } void ModuleWrapper::bbUserSetDefaultValues ( ) { } void ModuleWrapper::bbUserInitializeProcessing ( ) { } void ModuleWrapper::bbUserFinalizeProcessing ( ) { } } // EO namespace bbSlicer