# HG changeset patch # User Sebastien Jodogne # Date 1443191053 -7200 # Node ID 8040d56cb0b37d3b2ec1cc043a8c04a2d050f0e3 # Parent a0a4fa28624c0ecc20fb2ba5a2b8bd000ca1db86 New function "OrthancPluginRegisterErrorCode()" to declare custom error codes diff -r a0a4fa28624c -r 8040d56cb0b3 Core/HttpServer/MongooseServer.cpp --- a/Core/HttpServer/MongooseServer.cpp Fri Sep 25 11:33:55 2015 +0200 +++ b/Core/HttpServer/MongooseServer.cpp Fri Sep 25 16:24:13 2015 +0200 @@ -749,12 +749,11 @@ catch (OrthancException& e) { // Using this candidate handler results in an exception - LOG(ERROR) << "Exception in the HTTP handler: " << e.What(); - try { if (that->GetExceptionFormatter() == NULL) { + LOG(ERROR) << "Exception in the HTTP handler: " << e.What(); output.SendStatus(e.GetHttpStatus()); } else diff -r a0a4fa28624c -r 8040d56cb0b3 NEWS --- a/NEWS Fri Sep 25 11:33:55 2015 +0200 +++ b/NEWS Fri Sep 25 16:24:13 2015 +0200 @@ -4,6 +4,11 @@ * Add ".dcm" suffix to files in ZIP archives (cf. URI ".../archive") * "/tools/create-dicom": Support of binary tags encoded using data URI scheme +Plugins +------- + +* New function "OrthancPluginRegisterErrorCode()" to declare custom error codes + Maintenance ----------- diff -r a0a4fa28624c -r 8040d56cb0b3 OrthancServer/main.cpp --- a/OrthancServer/main.cpp Fri Sep 25 11:33:55 2015 +0200 +++ b/OrthancServer/main.cpp Fri Sep 25 16:24:13 2015 +0200 @@ -327,42 +327,47 @@ HttpMethod method, const char* uri) { - if (!describeErrors_) - { - output.SendStatus(exception.GetHttpStatus()); - return; - } - Json::Value message = Json::objectValue; - message["Method"] = EnumerationToString(method); - message["Uri"] = uri; - ErrorCode errorCode = exception.GetErrorCode(); HttpStatus httpStatus = exception.GetHttpStatus(); - bool isPlugin = false; + { + bool isPlugin = false; #if ORTHANC_PLUGINS_ENABLED == 1 - if (plugins_ != NULL && - plugins_->GetErrorDictionary().Format(message, httpStatus, exception)) - { - errorCode = ErrorCode_Plugin; - isPlugin = true; - } + if (plugins_ != NULL && + plugins_->GetErrorDictionary().Format(message, httpStatus, exception)) + { + LOG(ERROR) << "Error code " << message["PluginCode"].asInt() << " inside plugin \"" + << message["PluginName"].asString() << "\": " << message["Message"].asString(); + errorCode = ErrorCode_Plugin; + isPlugin = true; + } #endif - if (!isPlugin) - { - message["Message"] = exception.What(); + if (!isPlugin) + { + LOG(ERROR) << "Exception in the HTTP handler: " << exception.What(); + message["Message"] = exception.What(); + } } - message["HttpError"] = EnumerationToString(httpStatus); - message["HttpStatus"] = httpStatus; - message["OrthancError"] = EnumerationToString(errorCode); - message["OrthancStatus"] = errorCode; + if (!describeErrors_) + { + output.SendStatus(httpStatus); + } + else + { + message["Method"] = EnumerationToString(method); + message["Uri"] = uri; + message["HttpError"] = EnumerationToString(httpStatus); + message["HttpStatus"] = httpStatus; + message["OrthancError"] = EnumerationToString(errorCode); + message["OrthancStatus"] = errorCode; - std::string info = message.toStyledString(); - output.SendStatus(httpStatus, info); + std::string info = message.toStyledString(); + output.SendStatus(httpStatus, info); + } } }; diff -r a0a4fa28624c -r 8040d56cb0b3 Plugins/Engine/OrthancPlugins.cpp --- a/Plugins/Engine/OrthancPlugins.cpp Fri Sep 25 11:33:55 2015 +0200 +++ b/Plugins/Engine/OrthancPlugins.cpp Fri Sep 25 16:24:13 2015 +0200 @@ -1674,6 +1674,14 @@ return true; } + case _OrthancPluginService_RegisterErrorCode: + { + const _OrthancPluginRegisterErrorCode& p = + *reinterpret_cast(parameters); + *(p.target) = pimpl_->dictionary_.Register(plugin, p.code, p.httpStatus, p.message); + return true; + } + default: { // This service is unknown to the Orthanc plugin engine diff -r a0a4fa28624c -r 8040d56cb0b3 Plugins/Engine/PluginsErrorDictionary.cpp --- a/Plugins/Engine/PluginsErrorDictionary.cpp Fri Sep 25 11:33:55 2015 +0200 +++ b/Plugins/Engine/PluginsErrorDictionary.cpp Fri Sep 25 16:24:13 2015 +0200 @@ -62,16 +62,16 @@ } - OrthancPluginErrorCode PluginsErrorDictionary::Register(const std::string& pluginName, + OrthancPluginErrorCode PluginsErrorDictionary::Register(SharedLibrary& library, int32_t pluginCode, uint16_t httpStatus, - const char* description) + const char* message) { std::auto_ptr error(new Error); - error->pluginName_ = pluginName; + error->pluginName_ = PluginsManager::GetPluginName(library); error->pluginCode_ = pluginCode; - error->description_ = description; + error->message_ = message; error->httpStatus_ = static_cast(httpStatus); OrthancPluginErrorCode code; @@ -87,7 +87,7 @@ } - bool PluginsErrorDictionary::Format(Json::Value& message, /* out */ + bool PluginsErrorDictionary::Format(Json::Value& message, /* out */ HttpStatus& httpStatus, /* out */ const OrthancException& exception) { @@ -101,7 +101,7 @@ httpStatus = error->second->httpStatus_; message["PluginName"] = error->second->pluginName_; message["PluginCode"] = error->second->pluginCode_; - message["Message"] = error->second->description_; + message["Message"] = error->second->message_; return true; } diff -r a0a4fa28624c -r 8040d56cb0b3 Plugins/Engine/PluginsErrorDictionary.h --- a/Plugins/Engine/PluginsErrorDictionary.h Fri Sep 25 11:33:55 2015 +0200 +++ b/Plugins/Engine/PluginsErrorDictionary.h Fri Sep 25 16:24:13 2015 +0200 @@ -36,6 +36,7 @@ #include "../Include/orthanc/OrthancCPlugin.h" #include "../../Core/OrthancException.h" +#include "SharedLibrary.h" #include #include @@ -54,7 +55,7 @@ std::string pluginName_; int32_t pluginCode_; HttpStatus httpStatus_; - std::string description_; + std::string message_; }; typedef std::map Errors; @@ -68,12 +69,12 @@ ~PluginsErrorDictionary(); - OrthancPluginErrorCode Register(const std::string& pluginName, + OrthancPluginErrorCode Register(SharedLibrary& library, int32_t pluginCode, uint16_t httpStatus, - const char* description); + const char* message); - bool Format(Json::Value& message, /* out */ + bool Format(Json::Value& message, /* out */ HttpStatus& httpStatus, /* out */ const OrthancException& exception); }; diff -r a0a4fa28624c -r 8040d56cb0b3 Plugins/Include/orthanc/OrthancCPlugin.h --- a/Plugins/Include/orthanc/OrthancCPlugin.h Fri Sep 25 11:33:55 2015 +0200 +++ b/Plugins/Include/orthanc/OrthancCPlugin.h Fri Sep 25 16:24:13 2015 +0200 @@ -383,6 +383,7 @@ _OrthancPluginService_WriteFile = 16, _OrthancPluginService_GetErrorDescription = 17, _OrthancPluginService_CallHttpClient = 18, + _OrthancPluginService_RegisterErrorCode = 19, /* Registration of callbacks */ _OrthancPluginService_RegisterRestCallback = 1000, @@ -3598,7 +3599,6 @@ OrthancPluginContentType type; } _OrthancPluginStorageAreaRemove; - /** * @brief Remove a file from the storage area. * @@ -3628,6 +3628,55 @@ + typedef struct + { + OrthancPluginErrorCode* target; + int32_t code; + uint16_t httpStatus; + const char* message; + } _OrthancPluginRegisterErrorCode; + + /** + * @brief Declare a custom error code for this plugin. + * + * This function declares a custom error code that can be generated + * by this plugin. This declaration is used to enrich the body of + * the HTTP answer in the case of an error, and to set the proper + * HTTP status code. + * + * @param context The Orthanc plugin context, as received by OrthancPluginInitialize(). + * @param code The error code that is internal to this plugin. + * @param httpStatus The HTTP status corresponding to this error. + * @param message The description of the error. + * @return The error code that has been assigned inside the Orthanc core. + * @ingroup Toolbox + **/ + ORTHANC_PLUGIN_INLINE OrthancPluginErrorCode OrthancPluginRegisterErrorCode( + OrthancPluginContext* context, + int32_t code, + uint16_t httpStatus, + const char* message) + { + OrthancPluginErrorCode target; + + _OrthancPluginRegisterErrorCode params; + params.target = ⌖ + params.code = code; + params.httpStatus = httpStatus; + params.message = message; + + if (context->InvokeService(context, _OrthancPluginService_RegisterErrorCode, ¶ms) == OrthancPluginErrorCode_Success) + { + return target; + } + else + { + /* There was an error while assigned the error. Use a generic code. */ + return OrthancPluginErrorCode_Plugin; + } + } + + #ifdef __cplusplus } #endif diff -r a0a4fa28624c -r 8040d56cb0b3 Resources/CMake/Compiler.cmake --- a/Resources/CMake/Compiler.cmake Fri Sep 25 11:33:55 2015 +0200 +++ b/Resources/CMake/Compiler.cmake Fri Sep 25 16:24:13 2015 +0200 @@ -50,7 +50,7 @@ ${CMAKE_SYSTEM_NAME} STREQUAL "kFreeBSD" OR ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-undefined") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined -Wl,--version-script=${CMAKE_SOURCE_DIR}/Plugins/Samples/Common/VersionScript.map") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined -Wl,--version-script=${ORTHANC_ROOT}/Plugins/Samples/Common/VersionScript.map") # Remove the "-rdynamic" option # http://www.mail-archive.com/cmake@cmake.org/msg08837.html @@ -108,7 +108,7 @@ endif() elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -exported_symbols_list ${CMAKE_SOURCE_DIR}/Plugins/Samples/Common/ExportedSymbols.list") + SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -exported_symbols_list ${ORTHANC_ROOT}/Plugins/Samples/Common/ExportedSymbols.list") add_definitions( -D_XOPEN_SOURCE=1