From 462cbc78485df39d3141c2d1e6137c4b78ab5db2 Mon Sep 17 00:00:00 2001 From: riveros Date: Fri, 30 Mar 2012 15:36:45 +0200 Subject: [PATCH] Simple DL-Open example Used to test dl execution aka sandbox! --- ModuleCall/.dep.inc | 5 + ModuleCall/CMakeLists.txt | 32 ++++ ModuleCall/CreationTool.cxx | 164 +++++++++++++++++ ModuleCall/CreationTool.h | 63 +++++++ ModuleCall/Makefile | 193 ++++++++++++++++++++ ModuleCall/bbSlicerDummy.dummy_cxx | 50 ++++++ ModuleCall/bbSlicerDummy.dummy_h | 53 ++++++ ModuleCall/bbSlicerDummyBackUp.h | 34 ++++ ModuleCall/bbSlicerGaussianBlur.cxx | 57 ++++++ ModuleCall/bbSlicerGaussianBlur.h | 62 +++++++ ModuleCall/cmake_install.cmake | 44 +++++ ModuleCall/interoperating_Baby | Bin 0 -> 183304 bytes ModuleCall/main.cpp | 266 ++++++++++++++++++++++++++++ 13 files changed, 1023 insertions(+) create mode 100644 ModuleCall/.dep.inc create mode 100644 ModuleCall/CMakeLists.txt create mode 100644 ModuleCall/CreationTool.cxx create mode 100644 ModuleCall/CreationTool.h create mode 100644 ModuleCall/Makefile create mode 100644 ModuleCall/bbSlicerDummy.dummy_cxx create mode 100644 ModuleCall/bbSlicerDummy.dummy_h create mode 100644 ModuleCall/bbSlicerDummyBackUp.h create mode 100644 ModuleCall/bbSlicerGaussianBlur.cxx create mode 100644 ModuleCall/bbSlicerGaussianBlur.h create mode 100644 ModuleCall/cmake_install.cmake create mode 100755 ModuleCall/interoperating_Baby create mode 100644 ModuleCall/main.cpp diff --git a/ModuleCall/.dep.inc b/ModuleCall/.dep.inc new file mode 100644 index 0000000..4560e55 --- /dev/null +++ b/ModuleCall/.dep.inc @@ -0,0 +1,5 @@ +# This code depends on make tool being used +DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES})) +ifneq (${DEPFILES},) +include ${DEPFILES} +endif diff --git a/ModuleCall/CMakeLists.txt b/ModuleCall/CMakeLists.txt new file mode 100644 index 0000000..474b985 --- /dev/null +++ b/ModuleCall/CMakeLists.txt @@ -0,0 +1,32 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +project (Inter) +set (Inter_VERSION_MAJOR 1) +set (Inter_VERSION_MINOR 0) + +SET(CMAKE_CXX_FLAGS "-ldl -w") + +FIND_PACKAGE (GenerateCLP REQUIRED) +if (GenerateCLP_FOUND) + INCLUDE(${GenerateCLP_USE_FILE}) +endif (GenerateCLP_FOUND) + +FIND_PACKAGE (ModuleDescriptionParser REQUIRED) +if (ModuleDescriptionParser_FOUND) + INCLUDE(${ModuleDescriptionParser_USE_FILE}) +endif (ModuleDescriptionParser_FOUND) + +SET(INCLUDE_DIRS + ${GenerateCLP_BINARY_DIR} + ${GenerateCLP_SOURCE_DIR} + ${ModuleDescriptionParser_BINARY_DIR} + ${ModuleDescriptionParser_SOURCE_DIR} + ) + +SET(LINK_DIRECTORIES + ${GenerateCLP_LINK_DIRECTORY} + ${ModuleDescriptionParser_LINK_DIRECTORY} + ) + +ADD_EXECUTABLE (interoperating_Baby main.cpp CreationTool.cxx) +TARGET_LINK_LIBRARIES (interoperating_Baby ${ModuleDescriptionParser_LIBRARY} ModuleDescriptionParser ) + diff --git a/ModuleCall/CreationTool.cxx b/ModuleCall/CreationTool.cxx new file mode 100644 index 0000000..8203b4d --- /dev/null +++ b/ModuleCall/CreationTool.cxx @@ -0,0 +1,164 @@ +/* + * File: CreationTool.cxx + * Author: riveros + * + * Created on 23 mars 2012, 10:12 + */ + +#include "CreationTool.h" + +std::string Mthd::Aux::toString ( float n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( double n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( long double n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( char n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( unsigned char n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( short n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( unsigned short n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( int n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( long int n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( unsigned int n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( unsigned long n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( unsigned long long n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( std::string n ) { + return n; +} + +char* Mthd::Aux::toCharArrray ( float n ) { + std::ostringstream oss; + oss << n; + return const_cast < char* > ( oss.str( ).data( ) ); +} + +char* Mthd::Aux::toCharArrray ( double n ) { + std::ostringstream oss; + oss << n; + return const_cast < char* > ( oss.str( ).data( ) ); +} + +char* Mthd::Aux::toCharArrray ( long double n ) { + std::ostringstream oss; + oss << n; + return const_cast < char* > ( oss.str( ).data( ) ); +} + +char* Mthd::Aux::toCharArrray ( char n ) { + std::ostringstream oss; + oss << n; + return const_cast < char* > ( oss.str( ).data( ) ); +} + +char* Mthd::Aux::toCharArrray ( unsigned char n ) { + std::ostringstream oss; + oss << n; + return const_cast < char* > ( oss.str( ).data( ) ); +} + +char* Mthd::Aux::toCharArrray ( short n ) { + std::ostringstream oss; + oss << n; + return const_cast < char* > ( oss.str( ).data( ) ); +} + +char* Mthd::Aux::toCharArrray ( unsigned short n ) { + std::ostringstream oss; + oss << n; + return const_cast < char* > ( oss.str( ).data( ) ); +} + +char* Mthd::Aux::toCharArrray ( int n ) { + std::ostringstream oss; + oss << n; + return const_cast < char* > ( oss.str( ).data( ) ); +} + +char* Mthd::Aux::toCharArrray ( long int n ) { + std::ostringstream oss; + oss << n; + return const_cast < char* > ( oss.str( ).data( ) ); +} + +char* Mthd::Aux::toCharArrray ( unsigned int n ) { + std::ostringstream oss; + oss << n; + return const_cast < char* > ( oss.str( ).data( ) ); +} + +char* Mthd::Aux::toCharArrray ( long unsigned int n ) { + std::ostringstream oss; + oss << n; + return const_cast < char* > ( oss.str( ).data( ) ); +} + +char* Mthd::Aux::toCharArrray ( std::string n ) { + return const_cast < char* > ( n.data( ) ); +} + +std::string Mthd::Aux::replace_str ( std::string input, std::string old_str, std::string new_str ) { + size_t found = input.find( old_str ); + while ( found != std::string::npos ) { + input.replace( found, old_str.length( ), new_str ); + found = input.find( old_str ); + } + return input; +} + diff --git a/ModuleCall/CreationTool.h b/ModuleCall/CreationTool.h new file mode 100644 index 0000000..1859178 --- /dev/null +++ b/ModuleCall/CreationTool.h @@ -0,0 +1,63 @@ +/* + * File: CreationTool.h + * Author: riveros + * + * Created on 23 mars 2012, 10:12 + */ + +#ifndef CREATIONTOOL_H +#define CREATIONTOOL_H + +#include +#include +#include + +namespace Mthd { + + class Aux { + public: + static std::string toString ( float n ) ; + static std::string toString ( double n ) ; + static std::string toString ( long double n ) ; + + static std::string toString ( char n ) ; + static std::string toString ( unsigned char n ) ; + + static std::string toString ( short n ) ; + static std::string toString ( unsigned short n ) ; + + static std::string toString ( int n ) ; + static std::string toString ( long int n ) ; + static std::string toString ( unsigned int n ) ; + static std::string toString ( unsigned long n ) ; + static std::string toString ( unsigned long long n ) ; + + static std::string toString ( std::string n ) ; + + static char* toCharArrray ( float n ) ; + static char* toCharArrray ( double n ) ; + static char* toCharArrray ( long double n ) ; + + static char* toCharArrray ( char n ) ; + static char* toCharArrray ( unsigned char n ) ; + + static char* toCharArrray ( short n ) ; + static char* toCharArrray ( unsigned short n ) ; + + static char* toCharArrray ( int n ) ; + static char* toCharArrray ( long int n ) ; + static char* toCharArrray ( unsigned int n ) ; + static char* toCharArrray ( long unsigned int n ) ; + + static char* toCharArrray ( std::string n ) ; + + static std::string replace_str ( std::string input , std::string old_str , std::string new_str ) ; + + } ; + +} ; + + + +#endif /* CREATIONTOOL_H */ + diff --git a/ModuleCall/Makefile b/ModuleCall/Makefile new file mode 100644 index 0000000..c4a8046 --- /dev/null +++ b/ModuleCall/Makefile @@ -0,0 +1,193 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Produce verbose output by default. +VERBOSE = 1 + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/bin/cmake + +# The command to remove a file. +RM = /usr/local/bin/cmake -E remove -f + +# The program to use to edit the cache. +CMAKE_EDIT_COMMAND = /usr/local/bin/ccmake + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/riveros/NetBeansProjects/ModuleCall + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/riveros/NetBeansProjects/ModuleCall + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." + /usr/local/bin/ccmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/local/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/riveros/NetBeansProjects/ModuleCall/CMakeFiles /home/riveros/NetBeansProjects/ModuleCall/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/riveros/NetBeansProjects/ModuleCall/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named interoperating_Baby + +# Build rule for target. +interoperating_Baby: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 interoperating_Baby +.PHONY : interoperating_Baby + +# fast build rule for target. +interoperating_Baby/fast: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/build +.PHONY : interoperating_Baby/fast + +CreationTool.o: CreationTool.cxx.o +.PHONY : CreationTool.o + +# target to build an object file +CreationTool.cxx.o: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/CreationTool.cxx.o +.PHONY : CreationTool.cxx.o + +CreationTool.i: CreationTool.cxx.i +.PHONY : CreationTool.i + +# target to preprocess a source file +CreationTool.cxx.i: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/CreationTool.cxx.i +.PHONY : CreationTool.cxx.i + +CreationTool.s: CreationTool.cxx.s +.PHONY : CreationTool.s + +# target to generate assembly for a file +CreationTool.cxx.s: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/CreationTool.cxx.s +.PHONY : CreationTool.cxx.s + +main.o: main.cpp.o +.PHONY : main.o + +# target to build an object file +main.cpp.o: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/main.cpp.o +.PHONY : main.cpp.o + +main.i: main.cpp.i +.PHONY : main.i + +# target to preprocess a source file +main.cpp.i: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/main.cpp.i +.PHONY : main.cpp.i + +main.s: main.cpp.s +.PHONY : main.s + +# target to generate assembly for a file +main.cpp.s: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/main.cpp.s +.PHONY : main.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... interoperating_Baby" + @echo "... rebuild_cache" + @echo "... CreationTool.o" + @echo "... CreationTool.i" + @echo "... CreationTool.s" + @echo "... main.o" + @echo "... main.i" + @echo "... main.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ModuleCall/bbSlicerDummy.dummy_cxx b/ModuleCall/bbSlicerDummy.dummy_cxx new file mode 100644 index 0000000..462fdea --- /dev/null +++ b/ModuleCall/bbSlicerDummy.dummy_cxx @@ -0,0 +1,50 @@ +#include "bbSlicerDummy.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, Dummy ) + BBTK_BLACK_BOX_IMPLEMENTATION ( Dummy, bbtk::AtomicBlackBox ); + + void Dummy::Process ( ) { + + // GENERATED +_33333_ + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void Dummy::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 ERROR + dlerror( ); + // PROTOTYPE + 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; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void Dummy::bbUserSetDefaultValues ( ) { + } + + void Dummy::bbUserInitializeProcessing ( ) { + } + + void Dummy::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + diff --git a/ModuleCall/bbSlicerDummy.dummy_h b/ModuleCall/bbSlicerDummy.dummy_h new file mode 100644 index 0000000..1dd4d56 --- /dev/null +++ b/ModuleCall/bbSlicerDummy.dummy_h @@ -0,0 +1,53 @@ +#ifndef __bbSlicerDummy_h_INCLUDED__ +#define __bbSlicerDummy_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT Dummy + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( Dummy , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + _11111_ + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( Dummy , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "_NNNNN_" ) ; + BBTK_AUTHOR ( "_AAAAA_" ) ; + BBTK_DESCRIPTION ( "_DDDDD_" ) ; + BBTK_CATEGORY ( "_CCCCC_" ) ; + + // GENERATED DESCRPTION + _22222_ + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( Dummy ) ; +} + +#endif // __bbSlicerDummy_h_INCLUDED__ + diff --git a/ModuleCall/bbSlicerDummyBackUp.h b/ModuleCall/bbSlicerDummyBackUp.h new file mode 100644 index 0000000..3287b72 --- /dev/null +++ b/ModuleCall/bbSlicerDummyBackUp.h @@ -0,0 +1,34 @@ +#ifndef __bbSlicerDummy_h_INCLUDED__ +#define __bbSlicerDummy_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include + +namespace bbSlicer +{ +class bbSlicer_EXPORT Dummy:public bbtk::AtomicBlackBox{ + BBTK_BLACK_BOX_INTERFACE(Dummy,bbtk::AtomicBlackBox); +// GENERATED + BBTK_DECLARE_INPUT(In,double); +// EO GENERATED + BBTK_PROCESS(Process); + void Process(); +}; + +BBTK_BEGIN_DESCRIBE_BLACK_BOX(Dummy,bbtk::AtomicBlackBox); +BBTK_NAME("_NNNN"); +BBTK_AUTHOR("_AAAA"); +BBTK_DESCRIPTION("_DDDD"); +BBTK_CATEGORY("_CCCC"); +// GENERATED +BBTK_INPUT(Dummy,In,"input",double,""); +// EO GENERATED +BBTK_END_DESCRIBE_BLACK_BOX(Dummy); +} + +#endif // __bbSlicerDummy_h_INCLUDED__ + diff --git a/ModuleCall/bbSlicerGaussianBlur.cxx b/ModuleCall/bbSlicerGaussianBlur.cxx new file mode 100644 index 0000000..bb99921 --- /dev/null +++ b/ModuleCall/bbSlicerGaussianBlur.cxx @@ -0,0 +1,57 @@ +#include "bbSlicerGaussianBlur.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, GaussianBlur ) + BBTK_BLACK_BOX_IMPLEMENTATION ( GaussianBlur, bbtk::AtomicBlackBox ); + + void GaussianBlur::Process ( ) { + + // GENERATED + +int _argc =3; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libGaussianBlurImageFilterLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-s" ) + Mthd::Aux::toString( bbGetInputsigma( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void GaussianBlur::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 ERROR + dlerror( ); + // PROTOTYPE + 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; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void GaussianBlur::bbUserSetDefaultValues ( ) { + } + + void GaussianBlur::bbUserInitializeProcessing ( ) { + } + + void GaussianBlur::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/ModuleCall/bbSlicerGaussianBlur.h b/ModuleCall/bbSlicerGaussianBlur.h new file mode 100644 index 0000000..98aa7bf --- /dev/null +++ b/ModuleCall/bbSlicerGaussianBlur.h @@ -0,0 +1,62 @@ +#ifndef __bbSlicerGaussianBlur_h_INCLUDED__ +#define __bbSlicerGaussianBlur_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT GaussianBlur + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( GaussianBlur , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( sigma , double ); +BBTK_DECLARE_INPUT ( inputVolume , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( GaussianBlur , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "GaussianBlur" ) ; + BBTK_AUTHOR ( "Julien Jomier and Stephen Aylward" ) ; + BBTK_DESCRIPTION ( "Apply a gaussian blurr to an image" ) ; + BBTK_CATEGORY ( "Filtering.Denoising" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(GaussianBlur , sigma , "sigma" , double, ""); +BBTK_INPUT(GaussianBlur , inputVolume , "inputVolume" , std::string, ""); +BBTK_INPUT(GaussianBlur , outputVolume , "outputVolume" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( GaussianBlur ) ; +} + +#endif // __bbSlicerGaussianBlur_h_INCLUDED__ + + diff --git a/ModuleCall/cmake_install.cmake b/ModuleCall/cmake_install.cmake new file mode 100644 index 0000000..754308a --- /dev/null +++ b/ModuleCall/cmake_install.cmake @@ -0,0 +1,44 @@ +# Install script for directory: /home/riveros/NetBeansProjects/ModuleCall + +# Set the install prefix +IF(NOT DEFINED CMAKE_INSTALL_PREFIX) + SET(CMAKE_INSTALL_PREFIX "/usr/local") +ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX) +STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + IF(BUILD_TYPE) + STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + ELSE(BUILD_TYPE) + SET(CMAKE_INSTALL_CONFIG_NAME "Debug") + ENDIF(BUILD_TYPE) + MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + +# Set the component getting installed. +IF(NOT CMAKE_INSTALL_COMPONENT) + IF(COMPONENT) + MESSAGE(STATUS "Install component: \"${COMPONENT}\"") + SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + ELSE(COMPONENT) + SET(CMAKE_INSTALL_COMPONENT) + ENDIF(COMPONENT) +ENDIF(NOT CMAKE_INSTALL_COMPONENT) + +# Install shared libraries without execute permission? +IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + SET(CMAKE_INSTALL_SO_NO_EXE "1") +ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + +IF(CMAKE_INSTALL_COMPONENT) + SET(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +ELSE(CMAKE_INSTALL_COMPONENT) + SET(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +ENDIF(CMAKE_INSTALL_COMPONENT) + +FILE(WRITE "/home/riveros/NetBeansProjects/ModuleCall/${CMAKE_INSTALL_MANIFEST}" "") +FOREACH(file ${CMAKE_INSTALL_MANIFEST_FILES}) + FILE(APPEND "/home/riveros/NetBeansProjects/ModuleCall/${CMAKE_INSTALL_MANIFEST}" "${file}\n") +ENDFOREACH(file) diff --git a/ModuleCall/interoperating_Baby b/ModuleCall/interoperating_Baby new file mode 100755 index 0000000000000000000000000000000000000000..72882e86731fb5acfd82e01787413dcccef7bc0d GIT binary patch literal 183304 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 X4{A>b4NoFjCSct&y>abp)TRF~cxD$? literal 0 HcmV?d00001 diff --git a/ModuleCall/main.cpp b/ModuleCall/main.cpp new file mode 100644 index 0000000..9f7d71a --- /dev/null +++ b/ModuleCall/main.cpp @@ -0,0 +1,266 @@ +/* + * File: main.cpp + * Author: gabriel + * + * Created on 15 février 2012, 19:50 + */ + +#include +#include +#include +#include +#include + + +#include +#include +#include +#include + +#include +#include + +#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; +} -- 2.45.0