Mercurial > hg > orthanc
changeset 907:9b8298234254 plugins
documentation
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 19 Jun 2014 14:28:43 +0200 |
parents | cbc0ea03dffe |
children | e078ea944089 |
files | Plugins/Engine/IPluginServiceProvider.h Plugins/Engine/PluginsHttpHandler.cpp Plugins/Engine/PluginsHttpHandler.h Plugins/Engine/PluginsManager.cpp Plugins/Engine/PluginsManager.h Plugins/OrthancCPlugin/OrthancCPlugin.h Resources/OrthancPlugin.doxygen UnitTestsSources/PluginsTests.cpp |
diffstat | 8 files changed, 217 insertions(+), 73 deletions(-) [+] |
line wrap: on
line diff
--- a/Plugins/Engine/IPluginServiceProvider.h Thu Jun 19 13:37:49 2014 +0200 +++ b/Plugins/Engine/IPluginServiceProvider.h Thu Jun 19 14:28:43 2014 +0200 @@ -45,7 +45,7 @@ { } - virtual bool InvokeService(OrthancPluginService service, + virtual bool InvokeService(_OrthancPluginService service, const void* parameters) = 0; }; }
--- a/Plugins/Engine/PluginsHttpHandler.cpp Thu Jun 19 13:37:49 2014 +0200 +++ b/Plugins/Engine/PluginsHttpHandler.cpp Thu Jun 19 14:28:43 2014 +0200 @@ -190,12 +190,12 @@ } - bool PluginsHttpHandler::InvokeService(OrthancPluginService service, + bool PluginsHttpHandler::InvokeService(_OrthancPluginService service, const void* parameters) { switch (service) { - case OrthancPluginService_RegisterRestCallback: + case _OrthancPluginService_RegisterRestCallback: { const _OrthancPluginRestCallback& p = *reinterpret_cast<const _OrthancPluginRestCallback*>(parameters); @@ -206,7 +206,7 @@ return true; } - case OrthancPluginService_AnswerBuffer: + case _OrthancPluginService_AnswerBuffer: { const _OrthancPluginAnswerBuffer& p = *reinterpret_cast<const _OrthancPluginAnswerBuffer*>(parameters); @@ -217,7 +217,7 @@ return true; } - case OrthancPluginService_CompressAndAnswerPngImage: + case _OrthancPluginService_CompressAndAnswerPngImage: { const _OrthancPluginCompressAndAnswerPngImage& p = *reinterpret_cast<const _OrthancPluginCompressAndAnswerPngImage*>(parameters); @@ -263,7 +263,7 @@ return true; } - case OrthancPluginService_GetDicomForInstance: + case _OrthancPluginService_GetDicomForInstance: { const _OrthancPluginGetDicomForInstance& p = *reinterpret_cast<const _OrthancPluginGetDicomForInstance*>(parameters);
--- a/Plugins/Engine/PluginsHttpHandler.h Thu Jun 19 13:37:49 2014 +0200 +++ b/Plugins/Engine/PluginsHttpHandler.h Thu Jun 19 14:28:43 2014 +0200 @@ -60,7 +60,7 @@ const Arguments& getArguments, const std::string& postData); - virtual bool InvokeService(OrthancPluginService service, + virtual bool InvokeService(_OrthancPluginService service, const void* parameters); }; }
--- a/Plugins/Engine/PluginsManager.cpp Thu Jun 19 13:37:49 2014 +0200 +++ b/Plugins/Engine/PluginsManager.cpp Thu Jun 19 14:28:43 2014 +0200 @@ -133,20 +133,20 @@ int32_t PluginsManager::InvokeService(OrthancPluginContext* context, - OrthancPluginService service, + _OrthancPluginService service, const void* params) { switch (service) { - case OrthancPluginService_LogError: + case _OrthancPluginService_LogError: LOG(ERROR) << reinterpret_cast<const char*>(params); return 0; - case OrthancPluginService_LogWarning: + case _OrthancPluginService_LogWarning: LOG(WARNING) << reinterpret_cast<const char*>(params); return 0; - case OrthancPluginService_LogInfo: + case _OrthancPluginService_LogInfo: LOG(INFO) << reinterpret_cast<const char*>(params); return 0;
--- a/Plugins/Engine/PluginsManager.h Thu Jun 19 13:37:49 2014 +0200 +++ b/Plugins/Engine/PluginsManager.h Thu Jun 19 14:28:43 2014 +0200 @@ -50,7 +50,7 @@ std::list<IPluginServiceProvider*> serviceProviders_; static int32_t InvokeService(OrthancPluginContext* context, - OrthancPluginService service, + _OrthancPluginService service, const void* parameters); public:
--- a/Plugins/OrthancCPlugin/OrthancCPlugin.h Thu Jun 19 13:37:49 2014 +0200 +++ b/Plugins/OrthancCPlugin/OrthancCPlugin.h Thu Jun 19 14:28:43 2014 +0200 @@ -1,16 +1,28 @@ /** * \mainpage * - * This SDK allows external developers to create plugins that can be - * loaded into Orthanc to extend its functionality. Each Orthanc - * plugin must expose 4 public functions with the following + * This C/C++ SDK allows external developers to create plugins that + * can be loaded into Orthanc to extend its functionality. Each + * Orthanc plugin must expose 4 public functions with the following * signatures: * - * - <tt>int32_t OrthancPluginInitialize(const OrthancPluginContext*)</tt>: - * This function is invoked by Orthanc - * - <tt>void OrthancPluginFinalize()</tt> - * - <tt>const char* OrthancPluginGetName()</tt> - * - <tt>const char* OrthancPluginGetVersion()</tt> + * -# <tt>int32_t OrthancPluginInitialize(const OrthancPluginContext* context)</tt>: + * This function is invoked by Orthanc when it loads the plugin on startup. + * The plugin must store the context pointer so that it can use the plugin + * services of Orthanc. It must also register all its callbacks using + * ::OrthancPluginRegisterRestCallback(). + * -# <tt>void OrthancPluginFinalize()</tt>: + * This function is invoked by Orthanc during its shutdown. The plugin + * must free all its memory. + * -# <tt>const char* OrthancPluginGetName()</tt>: + * The plugin must return a short string to identify itself. + * -# <tt>const char* OrthancPluginGetVersion()</tt> + * The plugin must return a string containing its version number. + * + * The name and the version of a plugin is only used to prevent it + * from being loaded twice. + * + * **/ @@ -106,7 +118,7 @@ /******************************************************************** - ** Inclusion of standard libaries. + ** Inclusion of standard libraries. ********************************************************************/ #ifdef _MSC_VER @@ -130,49 +142,81 @@ { #endif + /** + * The various HTTP methods for a REST call. + **/ typedef enum { - OrthancPluginHttpMethod_Get = 1, - OrthancPluginHttpMethod_Post = 2, - OrthancPluginHttpMethod_Put = 3, - OrthancPluginHttpMethod_Delete = 4 + OrthancPluginHttpMethod_Get = 1, /*!< GET request */ + OrthancPluginHttpMethod_Post = 2, /*!< POST request */ + OrthancPluginHttpMethod_Put = 3, /*!< PUT request */ + OrthancPluginHttpMethod_Delete = 4 /*!< DELETE request */ } OrthancPluginHttpMethod; + + /** + * @brief The parameters of a REST request. + **/ typedef struct { - OrthancPluginHttpMethod method; + /** + * @brief The HTTP method. + **/ + OrthancPluginHttpMethod method; - /* Groups of the regular expression */ - const char* const* groups; + /** + * @brief The number of groups of the regular expression. + **/ uint32_t groupsCount; - /* For GET requests */ - const char* const* getKeys; - const char* const* getValues; + /** + * @brief The matched values for the groups of the regular expression. + **/ + const char* const* groups; + + /** + * @brief For a GET request, the number of GET parameters. + **/ uint32_t getCount; - /* For POST and PUT requests */ + /** + * @brief For a GET request, the keys of the GET parameters. + **/ + const char* const* getKeys; + + /** + * @brief For a GET request, the values of the GET parameters. + **/ + const char* const* getValues; + + /** + * @brief For a PUT or POST request, the content of the body. + **/ const char* body; + + /** + * @brief For a PUT or POST request, the number of bytes of the body. + **/ uint32_t bodySize; } OrthancPluginHttpRequest; typedef enum { /* Generic services */ - OrthancPluginService_LogInfo = 1, - OrthancPluginService_LogWarning = 2, - OrthancPluginService_LogError = 3, + _OrthancPluginService_LogInfo = 1, + _OrthancPluginService_LogWarning = 2, + _OrthancPluginService_LogError = 3, /* Registration of callbacks */ - OrthancPluginService_RegisterRestCallback = 1000, + _OrthancPluginService_RegisterRestCallback = 1000, /* Sending answers to REST calls */ - OrthancPluginService_AnswerBuffer = 2000, - OrthancPluginService_CompressAndAnswerPngImage = 2001, + _OrthancPluginService_AnswerBuffer = 2000, + _OrthancPluginService_CompressAndAnswerPngImage = 2001, /* Access to the Orthanc database */ - OrthancPluginService_GetDicomForInstance = 3000 - } OrthancPluginService; + _OrthancPluginService_GetDicomForInstance = 3000 + } _OrthancPluginService; @@ -223,33 +267,67 @@ } OrthancPluginPixelFormat; + /** + * @brief A memory buffer allocated by the core system of Orthanc. + * + * A memory buffer allocated by the core system of Orthanc. When the + * content of the buffer is not useful anymore, it must be free by a + * call to ::OrthancPluginFreeMemoryBuffer(). + **/ typedef struct { + /** + * @brief The content of the buffer. + **/ void* data; + + /** + * @brief The number of bytes in the buffer. + **/ uint32_t size; } OrthancPluginMemoryBuffer; + /** + * @brief Opaque structure that represents the HTTP connection to the client application. + **/ typedef struct _OrthancPluginRestOutput_t OrthancPluginRestOutput; + + /** + * @brief Signature of a function that answers to a REST request. + **/ typedef int32_t (*OrthancPluginRestCallback) ( OrthancPluginRestOutput* output, const char* url, const OrthancPluginHttpRequest* request); + + /** + * @brief Opaque structure that contains information about the Orthanc core. + **/ typedef struct _OrthancPluginContext_t { void* pluginsManager; const char* orthancVersion; void (*Free) (void* buffer); int32_t (*InvokeService) (struct _OrthancPluginContext_t* context, - OrthancPluginService service, + _OrthancPluginService service, const void* params); } OrthancPluginContext; + + /** + * @brief Free a string. + * + * Free a string that was allocated by the core system of Orthanc. + * + * @param context The Orthanc plugin context, as received by OrthancPluginInitialize(). + * @param str The string to be freed. + **/ ORTHANC_PLUGIN_INLINE void OrthancPluginFreeString( OrthancPluginContext* context, char* str) @@ -258,6 +336,14 @@ } + /** + * @brief Free a memory buffer. + * + * Free a memory buffer that was allocated by the core system of Orthanc. + * + * @param context The Orthanc plugin context, as received by OrthancPluginInitialize(). + * @param buffer The memory buffer to release. + **/ ORTHANC_PLUGIN_INLINE void OrthancPluginFreeMemoryBuffer( OrthancPluginContext* context, OrthancPluginMemoryBuffer* buffer) @@ -266,27 +352,51 @@ } + /** + * @brief Log an error. + * + * Log an error message using the Orthanc logging system. + * + * @param context The Orthanc plugin context, as received by OrthancPluginInitialize(). + * @param message The message to be logged. + **/ ORTHANC_PLUGIN_INLINE void OrthancPluginLogError( OrthancPluginContext* context, - const char* str) + const char* message) { - context->InvokeService(context, OrthancPluginService_LogError, str); + context->InvokeService(context, _OrthancPluginService_LogError, message); } + /** + * @brief Log a warning. + * + * Log a warning message using the Orthanc logging system. + * + * @param context The Orthanc plugin context, as received by OrthancPluginInitialize(). + * @param message The message to be logged. + **/ ORTHANC_PLUGIN_INLINE void OrthancPluginLogWarning( OrthancPluginContext* context, - const char* str) + const char* message) { - context->InvokeService(context, OrthancPluginService_LogWarning, str); + context->InvokeService(context, _OrthancPluginService_LogWarning, message); } + /** + * @brief Log an information. + * + * Log an information message using the Orthanc logging system. + * + * @param context The Orthanc plugin context, as received by OrthancPluginInitialize(). + * @param message The message to be logged. + **/ ORTHANC_PLUGIN_INLINE void OrthancPluginLogInfo( OrthancPluginContext* context, - const char* str) + const char* message) { - context->InvokeService(context, OrthancPluginService_LogInfo, str); + context->InvokeService(context, _OrthancPluginService_LogInfo, message); } @@ -297,6 +407,18 @@ } _OrthancPluginRestCallback; + /** + * @brief Register a REST callback. + * + * This function registers a REST callback against a regular + * expression for a URI. This function must be called during the + * initialization of the plugin, i.e. inside the + * OrthancPluginInitialize() public function. + * + * @param context The Orthanc plugin context, as received by OrthancPluginInitialize(). + * @param pathRegularExpression Regular expression for the URI. May contain groups. + * @param callback The callback function to handle the REST call. + **/ ORTHANC_PLUGIN_INLINE void OrthancPluginRegisterRestCallback( OrthancPluginContext* context, const char* pathRegularExpression, @@ -305,7 +427,7 @@ _OrthancPluginRestCallback params; params.pathRegularExpression = pathRegularExpression; params.callback = callback; - context->InvokeService(context, OrthancPluginService_RegisterRestCallback, ¶ms); + context->InvokeService(context, _OrthancPluginService_RegisterRestCallback, ¶ms); } @@ -317,6 +439,18 @@ const char* mimeType; } _OrthancPluginAnswerBuffer; + + /** + * @brief Answer to a REST request. + * + * This function answers to a REST request with the content of a memory buffer. + * + * @param context The Orthanc plugin context, as received by OrthancPluginInitialize(). + * @param output The HTTP connection to the client application. + * @param answer Pointer to the memory buffer containing the answer. + * @param answerSize Number of bytes of the answer. + * @param mimeType The MIME type of the answer. + **/ ORTHANC_PLUGIN_INLINE void OrthancPluginAnswerBuffer( OrthancPluginContext* context, OrthancPluginRestOutput* output, @@ -329,7 +463,7 @@ params.answer = answer; params.answerSize = answerSize; params.mimeType = mimeType; - context->InvokeService(context, OrthancPluginService_AnswerBuffer, ¶ms); + context->InvokeService(context, _OrthancPluginService_AnswerBuffer, ¶ms); } @@ -343,6 +477,23 @@ const void* buffer; } _OrthancPluginCompressAndAnswerPngImage; + /** + * @brief Answer to a REST request with a PNG image. + * + * This function answers to a REST request with a PNG image. The + * parameters of this function describe a memory buffer that + * contains an uncompressed image. The image will be automatically compressed + * as a PNG image by the core system of Orthanc. + * + * @param context The Orthanc plugin context, as received by OrthancPluginInitialize(). + * @param output The HTTP connection to the client application. + * @param format The memory layout of the uncompressed image. + * @param width The width of the image. + * @param height The height of the image. + * @param pitch The pitch of the image (i.e. the number of bytes + * between 2 successive lines of the image in the memory buffer. + * @param buffer The memory buffer containing the uncompressed image. + **/ ORTHANC_PLUGIN_INLINE void OrthancPluginCompressAndAnswerPngImage( OrthancPluginContext* context, OrthancPluginRestOutput* output, @@ -359,7 +510,7 @@ params.height = height; params.pitch = pitch; params.buffer = buffer; - context->InvokeService(context, OrthancPluginService_CompressAndAnswerPngImage, ¶ms); + context->InvokeService(context, _OrthancPluginService_CompressAndAnswerPngImage, ¶ms); } @@ -369,6 +520,18 @@ const char* instanceId; } _OrthancPluginGetDicomForInstance; + + /** + * @brief Retrieve a DICOM instance using its Orthanc identifier. + * + * Retrieve a DICOM instance using its Orthanc identifier. The DICOM + * file is stored into a newly allocated memory buffer. + * + * @param context The Orthanc plugin context, as received by OrthancPluginInitialize(). + * @param target The target memory buffer. + * @param instanceId The Orthanc identifier of the DICOM instance of interest. + * @return 0 if success, other value if error. + **/ ORTHANC_PLUGIN_INLINE int OrthancPluginGetDicomForInstance( OrthancPluginContext* context, OrthancPluginMemoryBuffer* target, @@ -377,7 +540,7 @@ _OrthancPluginGetDicomForInstance params; params.target = target; params.instanceId = instanceId; - return context->InvokeService(context, OrthancPluginService_GetDicomForInstance, ¶ms); + return context->InvokeService(context, _OrthancPluginService_GetDicomForInstance, ¶ms); }
--- a/Resources/OrthancPlugin.doxygen Thu Jun 19 13:37:49 2014 +0200 +++ b/Resources/OrthancPlugin.doxygen Thu Jun 19 14:28:43 2014 +0200 @@ -1475,13 +1475,13 @@ # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. -MACRO_EXPANSION = NO +MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. -EXPAND_ONLY_PREDEF = NO +EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. @@ -1509,7 +1509,7 @@ # undefined via #undef or recursively expanded use the := operator # instead of the = operator. -PREDEFINED = +PREDEFINED = ORTHANC_PLUGIN_INLINE= # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded.
--- a/UnitTestsSources/PluginsTests.cpp Thu Jun 19 13:37:49 2014 +0200 +++ b/UnitTestsSources/PluginsTests.cpp Thu Jun 19 14:28:43 2014 +0200 @@ -59,22 +59,3 @@ #error Support your platform here #endif } - - -TEST(SharedLibrary, Development) -{ - PluginsManager manager; - -#if defined(_WIN32) -//#error Support your platform here - -#elif defined(__linux) - manager.RegisterPlugin("./libPluginTest.so"); - ASSERT_THROW(manager.RegisterPlugin("./libPluginTest.so"), OrthancException); - - //manager.ScanFolderForPlugins(".", true); - -#else -#error Support your platform here -#endif -}