]> Creatis software - creaCLI.git/blobdiff - ModuleCall/main.cpp
Simple DL-Open example
[creaCLI.git] / ModuleCall / main.cpp
diff --git a/ModuleCall/main.cpp b/ModuleCall/main.cpp
new file mode 100644 (file)
index 0000000..9f7d71a
--- /dev/null
@@ -0,0 +1,266 @@
+/* 
+ * File:   main.cpp
+ * Author: gabriel
+ *
+ * Created on 15 fĂ©vrier 2012, 19:50
+ */
+
+#include <vector>
+#include <cstdlib>
+#include <dlfcn.h>
+#include <sstream>
+#include <iostream>
+
+
+#include <ModuleDescriptionParser.h>
+#include <ModuleParameterGroup.h>
+#include <ModuleDescription.h>
+#include <ModuleParameter.h>
+
+#include <fstream>
+#include <ModuleDescriptionUtilities.h>
+
+#include "CreationTool.h"
+
+
+///     STD LD_OPEN CALLS       ///
+
+char* 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;
+
+}
+
+void execute ( std::string lib, int _argc, char * _argv[] ) {
+    void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL );
+    if ( ! handle ) {
+        std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n';
+        return;
+    }
+    typedef int (*method_t )( int argc, char * argv[] );
+    // RESET ERRORS
+    dlerror( );
+    method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" );
+    const char *dlsym_error = dlerror( );
+    if ( dlsym_error ) {
+        std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint' " << dlsym_error << '\n';
+        dlclose( handle );
+        return;
+    }
+    // CALLING METHOD
+    myMethod( _argc, _argv );
+    // CLOSING LIB
+    dlclose( handle );
+}
+
+///     FILE RELATED     ///
+
+void saveFile ( std::string content, std::string file_name ) {
+    std::ofstream myfile;
+    myfile.open( file_name.c_str( ) );
+    myfile << content;
+    myfile.close( );
+}
+
+std::string 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 loadDummyBody ( ) {
+    return loadFile( "bbSlicerDummy.dummy_cxx" );
+}
+
+std::string loadDummyHeader ( ) {
+    return loadFile( "bbSlicerDummy.dummy_h" );
+}
+
+///     BBTK BOX CREATION       /// 
+
+std::string 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 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 getHeaderFileName ( const ModuleDescription* module ) {
+    std::string name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" );
+
+    return "bbSlicer" + name + ".h";
+}
+
+std::string getBodyFileName ( const ModuleDescription* module ) {
+    std::string name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" );
+
+    return "bbSlicer" + name + ".cxx";
+}
+
+std::string 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 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 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 );
+}
+
+int main ( int argc, char* argv[] ) {
+
+    int _argc = 3;
+    char * _argv[] = { "-s 20", "/home/riveros/Desktop/Experiments/RA1.mhd", "/home/riveros/Desktop/Experiments/RA1-OUT-MAIN.mhd" };
+    std::string gblib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libGaussianBlurImageFilterLib.so";
+
+    execute( gblib, _argc, _argv );
+
+    ///     MODULE INFORMATION      ///
+    const std::string des = getModuleDescription( gblib );
+
+    //    std::cout << "====================================" << std::endl << std::endl;
+    //    std::cout << "====================================" << std::endl << std::endl;
+    //    std::cout << "====================================" << std::endl << std::endl;
+    //    std::cout << "====================================" << std::endl << std::endl;
+    //
+    //    std::cout << des << std::endl << std::endl;
+
+    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::cout << "====================================" << std::endl << std::endl;
+    //    std::cout << "====================================" << std::endl << std::endl;
+    //    std::cout << "====================================" << std::endl << std::endl;
+    //    std::cout << "====================================" << std::endl << std::endl;
+    //
+    //    std::cout << _header << std::endl;
+    //
+    //    std::cout << "====================================" << std::endl << std::endl;
+    //    std::cout << "====================================" << std::endl << std::endl;
+    //    std::cout << "====================================" << std::endl << std::endl;
+    //    std::cout << "====================================" << std::endl << std::endl;
+    //
+    //    std::cout << _body << std::endl;
+
+    return EXIT_SUCCESS;
+}