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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ℑ3RDVP5qO{%Lm{fE&rMluecV{ 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⪙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 OE=h7@FHo4nHvYeOW*1ff 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.50.0