+
+#include "bbSlicerSlicerLibToBlackBoxSrc.h"
+#include "bbSlicerPackage.h"
+namespace bbSlicer {
+
+ BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer , SlicerLibToBlackBoxSrc )
+ BBTK_BLACK_BOX_IMPLEMENTATION ( SlicerLibToBlackBoxSrc , bbtk::AtomicBlackBox ) ;
+
+ /// STD LD_OPEN CALLS ///
+
+ char* SlicerLibToBlackBoxSrc::
+ getModuleDescription ( const std::string lib ) {
+
+ void* handle = dlopen( lib.c_str( ) , RTLD_NOW | RTLD_LOCAL ) ;
+ 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 SlicerLibToBlackBoxSrc::
+ saveFile ( const std::string content , const std::string file_name ) {
+ std::ofstream myfile ;
+ myfile.open( file_name.c_str( ) ) ;
+ myfile << content ;
+ myfile.close( ) ;
+ }
+
+ std::string SlicerLibToBlackBoxSrc::
+ loadFile ( const 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 SlicerLibToBlackBoxSrc::
+ loadDummyBody ( ) {
+ return loadFile( "bbSlicerDummy.dummy_cxx" ) ;
+ }
+
+ std::string SlicerLibToBlackBoxSrc::
+ loadDummyHeader ( ) {
+ return loadFile( "bbSlicerDummy.dummy_h" ) ;
+ }
+
+ /// BBTK BOX CREATION ///
+
+ std::string SlicerLibToBlackBoxSrc::
+ 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 SlicerLibToBlackBoxSrc::
+ 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 SlicerLibToBlackBoxSrc::
+ getHeaderFileName ( const ModuleDescription* module ) {
+ std::string name = Mthd::Aux::replace_str( module->GetTitle( ) , " " , "" ) ;
+ return "bbSlicer" + name + ".h" ;
+ }
+
+ std::string SlicerLibToBlackBoxSrc::
+ getBodyFileName ( const ModuleDescription* module ) {
+ std::string name = Mthd::Aux::replace_str( module->GetTitle( ) , " " , "" ) ;
+
+ return "bbSlicer" + name + ".cxx" ;
+ }
+
+ std::string SlicerLibToBlackBoxSrc::
+ 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 SlicerLibToBlackBoxSrc::
+ 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 SlicerLibToBlackBoxSrc::
+ 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 ) ;
+ }
+
+ std::vector < std::string > SlicerLibToBlackBoxSrc::
+ getFilesByExtention ( std::string dir , std::string ext ) {
+ std::vector < std::string > files ;
+ files.clear( ) ;
+ DIR *dp ;
+ struct dirent *dirp ;
+ if ( ( dp = opendir( dir.c_str( ) ) ) == NULL ) {
+ std::cout << "ERROR OPENING " << dir << std::endl ;
+ return files ;
+ }
+
+ while ( ( dirp = readdir( dp ) ) != NULL ) {
+ std::string file = std::string( dirp->d_name ) ;
+ if ( Mthd::Aux::str_ends_with( file , ext ) ) {
+ files.push_back( file ) ;
+ }
+ }
+ closedir( dp ) ;
+ return files ;
+ }
+
+ void SlicerLibToBlackBoxSrc::Process ( ) {
+ std::string gblib = bbGetInputLibFullPath( ) ;
+ /// MODULE INFORMATION ///
+ 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 , bbGetInputSrcDestinationDir( ) + "/" + getBodyFileName( &module ) ) ;
+
+ }
+
+ void SlicerLibToBlackBoxSrc::bbUserSetDefaultValues ( ) {
+ }
+
+ void SlicerLibToBlackBoxSrc::bbUserInitializeProcessing ( ) {
+ }
+
+ void SlicerLibToBlackBoxSrc::bbUserFinalizeProcessing ( ) {
+ }
+}
+
+
+