# HG changeset patch # User Sebastien Jodogne # Date 1448294335 -3600 # Node ID 9c2ffc4e938be31da63fe4bf396abde5fced73f7 # Parent 91216c42c6e5cb258a81ffa7069b23c4e88e5d0f configuration of the sample modality worklists plugin diff -r 91216c42c6e5 -r 9c2ffc4e938b CMakeLists.txt --- a/CMakeLists.txt Mon Nov 23 15:26:42 2015 +0100 +++ b/CMakeLists.txt Mon Nov 23 16:58:55 2015 +0100 @@ -31,6 +31,7 @@ SET(ENABLE_JPEG_LOSSLESS ON CACHE BOOL "Enable JPEG-LS (Lossless) decompression") SET(ENABLE_PLUGINS ON CACHE BOOL "Enable plugins") SET(BUILD_SERVE_FOLDERS ON CACHE BOOL "Build the ServeFolders plugin") +SET(BUILD_MODALITY_WORKLISTS ON CACHE BOOL "Build the sample plugin to serve modality worklists") # Advanced parameters to fine-tune linking against system libraries SET(USE_SYSTEM_JSONCPP ON CACHE BOOL "Use the system version of JsonCpp") @@ -511,6 +512,49 @@ ##################################################################### +## Build the "ModalityWorklists" plugin +##################################################################### + +if (ENABLE_PLUGINS AND BUILD_MODALITY_WORKLISTS) + execute_process( + COMMAND + ${PYTHON_EXECUTABLE} ${ORTHANC_ROOT}/Resources/WindowsResources.py + ${ORTHANC_VERSION} ModalityWorklists ModalityWorklists.dll "Sample Orthanc plugin to serve modality worklists" + ERROR_VARIABLE Failure + OUTPUT_FILE ${AUTOGENERATED_DIR}/ModalityWorklists.rc + ) + + if (Failure) + message(FATAL_ERROR "Error while computing the version information: ${Failure}") + endif() + + add_definitions(-DMODALITY_WORKLISTS_VERSION="${ORTHANC_VERSION}") + + include_directories(${CMAKE_SOURCE_DIR}/Plugins/Include) + + add_library(ModalityWorklists SHARED + ${BOOST_SOURCES} + ${JSONCPP_SOURCES} + Plugins/Samples/ModalityWorklists/Plugin.cpp + ${AUTOGENERATED_DIR}/ModalityWorklists.rc + ) + + set_target_properties( + ModalityWorklists PROPERTIES + VERSION ${ORTHANC_VERSION} + SOVERSION ${ORTHANC_VERSION} + ) + + install( + TARGETS ModalityWorklists + RUNTIME DESTINATION lib # Destination for Windows + LIBRARY DESTINATION share/orthanc/plugins # Destination for Linux + ) +endif() + + + +##################################################################### ## Generate the documentation if Doxygen is present ##################################################################### diff -r 91216c42c6e5 -r 9c2ffc4e938b Plugins/Samples/ModalityWorklists/CMakeLists.txt --- a/Plugins/Samples/ModalityWorklists/CMakeLists.txt Mon Nov 23 15:26:42 2015 +0100 +++ b/Plugins/Samples/ModalityWorklists/CMakeLists.txt Mon Nov 23 16:58:55 2015 +0100 @@ -1,8 +1,8 @@ cmake_minimum_required(VERSION 2.8) -project(SampleModalityWorklists) +project(ModalityWorklists) -SET(SAMPLE_MODALITY_WORKLISTS_VERSION "0.0" CACHE STRING "Version of the plugin") +SET(MODALITY_WORKLISTS_VERSION "0.0" CACHE STRING "Version of the plugin") SET(STATIC_BUILD OFF CACHE BOOL "Static build of the third-party libraries (necessary for Windows)") SET(ALLOW_DOWNLOADS OFF CACHE BOOL "Allow CMake to download packages") @@ -10,28 +10,27 @@ SET(USE_SYSTEM_BOOST ON CACHE BOOL "Use the system version of boost") set(SAMPLES_ROOT ${CMAKE_SOURCE_DIR}/..) -include(${CMAKE_SOURCE_DIR}/../Common/OrthancPlugins.cmake) +include(${SAMPLES_ROOT}/Common/OrthancPlugins.cmake) include(${ORTHANC_ROOT}/Resources/CMake/JsonCppConfiguration.cmake) include(${ORTHANC_ROOT}/Resources/CMake/BoostConfiguration.cmake) -add_library(SampleModalityWorklists SHARED +add_library(ModalityWorklists SHARED Plugin.cpp ${JSONCPP_SOURCES} ${BOOST_SOURCES} ) -message("Setting the version of the plugin to ${SAMPLE_MODALITY_WORKLISTS_VERSION}") +message("Setting the version of the plugin to ${MODALITY_WORKLISTS_VERSION}") add_definitions( - -DSAMPLE_MODALITY_WORKLISTS_VERSION="${SAMPLE_MODALITY_WORKLISTS_VERSION}" - -DDEFAULT_WORKLISTS_FOLDER="${CMAKE_SOURCE_DIR}/WorklistsDatabase" + -DMODALITY_WORKLISTS_VERSION="${MODALITY_WORKLISTS_VERSION}" ) -set_target_properties(SampleModalityWorklists PROPERTIES - VERSION ${SAMPLE_MODALITY_WORKLISTS_VERSION} - SOVERSION ${SAMPLE_MODALITY_WORKLISTS_VERSION}) +set_target_properties(ModalityWorklists PROPERTIES + VERSION ${MODALITY_WORKLISTS_VERSION} + SOVERSION ${MODALITY_WORKLISTS_VERSION}) install( - TARGETS SampleModalityWorklists + TARGETS ModalityWorklists RUNTIME DESTINATION lib # Destination for Windows LIBRARY DESTINATION share/orthanc/plugins # Destination for Linux ) diff -r 91216c42c6e5 -r 9c2ffc4e938b Plugins/Samples/ModalityWorklists/Plugin.cpp --- a/Plugins/Samples/ModalityWorklists/Plugin.cpp Mon Nov 23 15:26:42 2015 +0100 +++ b/Plugins/Samples/ModalityWorklists/Plugin.cpp Mon Nov 23 16:58:55 2015 +0100 @@ -169,7 +169,8 @@ ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* c) { context_ = c; - OrthancPluginLogWarning(context_, "Storage plugin is initializing"); + OrthancPluginLogWarning(context_, "Sample worklist plugin is initializing"); + OrthancPluginSetDescription(context_, "Serve DICOM modality worklists from a folder with Orthanc."); /* Check the version of the Orthanc core */ if (OrthancPluginCheckVersion(c) == 0) @@ -187,29 +188,53 @@ Json::Value configuration; if (!ConvertToJson(configuration, OrthancPluginGetConfiguration(context_))) { - OrthancPluginLogError(context_, "Cannot access the configuration"); + OrthancPluginLogError(context_, "Cannot access the configuration of the worklist server"); return -1; } - if (configuration.isMember("WorklistsFolder")) + bool enabled = false; + + if (configuration.isMember("Worklists")) { - if (configuration["WorklistsFolder"].type() != Json::stringValue) + const Json::Value& config = configuration["Worklists"]; + if (!config.isMember("Enable") || + config["Enable"].type() != Json::booleanValue) { - OrthancPluginLogError(context_, "The configuration option \"WorklistsFolder\" must be a string"); + OrthancPluginLogError(context_, "The configuration option \"Worklists.Enable\" must contain a Boolean"); return -1; } + else + { + enabled = config["Enable"].asBool(); + if (enabled) + { + if (!config.isMember("Database") || + config["Database"].type() != Json::stringValue) + { + OrthancPluginLogError(context_, "The configuration option \"Worklists.Database\" must contain a path"); + return -1; + } - folder_ = configuration["WorklistsFolder"].asString(); + folder_ = config["Database"].asString(); + } + else + { + OrthancPluginLogWarning(context_, "Worklists server is disabled by the configuration file"); + } + } } else { - folder_ = DEFAULT_WORKLISTS_FOLDER; + OrthancPluginLogWarning(context_, "Worklists server is disabled, no suitable configuration section was provided"); } - std::string message = "The database of worklists will be read from folder: " + folder_; - OrthancPluginLogWarning(context_, message.c_str()); + if (enabled) + { + std::string message = "The database of worklists will be read from folder: " + folder_; + OrthancPluginLogWarning(context_, message.c_str()); - OrthancPluginRegisterWorklistCallback(context_, Callback); + OrthancPluginRegisterWorklistCallback(context_, Callback); + } return 0; } @@ -223,12 +248,12 @@ ORTHANC_PLUGINS_API const char* OrthancPluginGetName() { - return "sample-worklists"; + return "worklists"; } ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion() { - return SAMPLE_MODALITY_WORKLISTS_VERSION; + return MODALITY_WORKLISTS_VERSION; } } diff -r 91216c42c6e5 -r 9c2ffc4e938b Plugins/Samples/ModalityWorklists/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/Samples/ModalityWorklists/README Mon Nov 23 16:58:55 2015 +0100 @@ -0,0 +1,60 @@ +Introduction +============ + +This sample plugin enables Orthanc to serve DICOM modality worklists +that are read from some folder. + +Whenever a C-Find SCP request is issued to Orthanc, it will read the +content of this folder to locate the worklists that match the request. +An external application can dynamically modify the content of this +folder while Orthanc is running to add/remove worklists. + +This sample mimics the behavior of the "wlmscpfs" tool from the +DCMTK package: +http://support.dcmtk.org/docs/wlmscpfs.html + + +Compilation for Linux +===================== + +# mkdir Build +# cd Build +# cmake .. +# make + + +Cross-compilation for Windows using MinGW +========================================= + +# mkdir Build +# cd Build +# cmake .. -DCMAKE_TOOLCHAIN_FILE=../../../Resources/MinGWToolchain.cmake +# make + + +Configuration +============= + +First, generate the default configuration of Orthanc: +https://orthanc.chu.ulg.ac.be/book/users/configuration.html + +Then, modify the "Plugins" option to point to the folder containing +the built plugins. Finally, create a section "ModalityWorklists" in +the configuration file to configure the worklist server. If using the +build commands above, a sample configuration would read as follows: + +{ + [...] + "Plugins" : [ + "." + ], + "Worklists" : { + "Enable": true, + "Database": "../WorklistsDatabase" + } +} + +The folder "WorklistsDatabase" contains a database of sample +worklists, that come from the DCMTK source distribution, as described +in the FAQ entry #37 of the DCMTK project: +http://forum.dcmtk.org/viewtopic.php?t=84 diff -r 91216c42c6e5 -r 9c2ffc4e938b Plugins/Samples/ServeFolders/README --- a/Plugins/Samples/ServeFolders/README Mon Nov 23 15:26:42 2015 +0100 +++ b/Plugins/Samples/ServeFolders/README Mon Nov 23 16:58:55 2015 +0100 @@ -27,7 +27,7 @@ ============= First, generate the default configuration of Orthanc: -https://code.google.com/p/orthanc/wiki/OrthancConfiguration +https://orthanc.chu.ulg.ac.be/book/users/configuration.html Then, modify the "Plugins" option to point to the folder containing the built plugins.