# HG changeset patch # User Sebastien Jodogne # Date 1402932669 -7200 # Node ID 690aeb4cb89964922551896e90eed247596307c1 # Parent f57802f8b4dc51422e887d8cce922035de02c62b REST callbacks diff -r f57802f8b4dc -r 690aeb4cb899 Plugins/Engine/PluginsManager.cpp --- a/Plugins/Engine/PluginsManager.cpp Mon Jun 16 16:14:56 2014 +0200 +++ b/Plugins/Engine/PluginsManager.cpp Mon Jun 16 17:31:09 2014 +0200 @@ -32,6 +32,8 @@ #include "PluginsManager.h" +#include "../../Core/Toolbox.h" + #include #include #include @@ -144,20 +146,70 @@ LOG(INFO) << str; } - static int32_t InvokeService(const char* serviceName, - const void* serviceParameters) + void PluginsManager::RegisterRestCallback(const OrthancPluginContext* context, + const char* path, + OrthancRestCallback callback) { // TODO - return 0; + LOG(INFO) << "Plugin has registered a REST callback on: " << path; + + PluginsManager* manager = reinterpret_cast(context->pimpl); + manager->restCallbacks_.push_back(callback); + + + const char* pp = "/hello/world"; + + UriComponents components; + Toolbox::SplitUriComponents(components, pp); + + OrthancRestUrl url; + url.path = pp; + + std::vector c(components.size()); + for (unsigned int i = 0; i < components.size(); i++) + { + c[i] = components[i].c_str(); + } + + if (components.size() == 0) + { + url.components = NULL; + url.componentsSize = 0; + } + else + { + url.components = &c[0]; + url.componentsSize = components.size(); + } + + // TODO + url.parameters = NULL; + url.parametersSize = 0; + + callback(NULL, OrthancHttpMethod_Get, &url, NULL, 0); } + + static void AnswerBuffer(OrthancRestOutput* output, + const char* answer, + uint32_t answerSize, + const char* mimeType) + { + std::cout << "MIME " << mimeType << ": " << answer << std::endl; + } + + PluginsManager::PluginsManager() { + memset(&context_, 0, sizeof(context_)); + context_.pimpl = this; context_.orthancVersion = ORTHANC_VERSION; - context_.InvokeService = InvokeService; + context_.FreeBuffer = ::free; context_.LogError = LogError; context_.LogWarning = LogWarning; context_.LogInfo = LogInfo; + context_.RegisterRestCallback = RegisterRestCallback; + context_.AnswerBuffer = AnswerBuffer; } PluginsManager::~PluginsManager() diff -r f57802f8b4dc -r 690aeb4cb899 Plugins/Engine/PluginsManager.h --- a/Plugins/Engine/PluginsManager.h Mon Jun 16 16:14:56 2014 +0200 +++ b/Plugins/Engine/PluginsManager.h Mon Jun 16 17:31:09 2014 +0200 @@ -36,6 +36,7 @@ #include "../OrthancCPlugin/OrthancCPlugin.h" #include +#include namespace Orthanc { @@ -43,9 +44,15 @@ { private: typedef std::map Plugins; + typedef std::list RestCallbacks; OrthancPluginContext context_; Plugins plugins_; + RestCallbacks restCallbacks_; + + static void RegisterRestCallback(const OrthancPluginContext* context, + const char* path, + OrthancRestCallback callback); public: PluginsManager(); diff -r f57802f8b4dc -r 690aeb4cb899 Plugins/OrthancCPlugin/OrthancCPlugin.h --- a/Plugins/OrthancCPlugin/OrthancCPlugin.h Mon Jun 16 16:14:56 2014 +0200 +++ b/Plugins/OrthancCPlugin/OrthancCPlugin.h Mon Jun 16 17:31:09 2014 +0200 @@ -55,30 +55,61 @@ { #endif - typedef void (*OrthancPluginLogError) (const char* str); + typedef struct OrthancRestOutput_t OrthancRestOutput; + + typedef enum + { + OrthancHttpMethod_Get = 1, + OrthancHttpMethod_Post = 2, + OrthancHttpMethod_Put = 3, + OrthancHttpMethod_Delete = 4 + } OrthancHttpMethod; - typedef void (*OrthancPluginLogWarning) (const char* str); + typedef struct OrthancRestUrl_t + { + const char* path; + const char* const* components; + uint32_t componentsSize; + const char* const* parameters; + uint32_t parametersSize; + } OrthancRestUrl; - typedef void (*OrthancPluginLogInfo) (const char* str); typedef int32_t (*OrthancPluginService) (const char* serviceName, const void* serviceParameters); - typedef struct OrthancPluginContext + typedef int32_t (*OrthancRestCallback) (OrthancRestOutput* output, + OrthancHttpMethod method, + const OrthancRestUrl* url, + const char* body, + uint32_t bodySize); + + typedef struct OrthancPluginContext_t { + void* pimpl; + const char* orthancVersion; - OrthancPluginService InvokeService; - OrthancPluginLogError LogError; - OrthancPluginLogWarning LogWarning; - OrthancPluginLogInfo LogInfo; + void (*FreeBuffer) (void* buffer); + + /* Logging functions */ + void (*LogError) (const char* str); + void (*LogWarning) (const char* str); + void (*LogInfo) (const char* str); - /* TODO REGISTER */ + /* REST API */ + void (*RegisterRestCallback) (const struct OrthancPluginContext_t* context, + const char* path, + OrthancRestCallback callback); + void (*AnswerBuffer) (OrthancRestOutput* output, + const char* answer, + uint32_t answerSize, + const char* mimeType); } OrthancPluginContext; /** - Each plugin must define 4 functions, whose signature is: + Each plugin must define 4 functions, whose signature are: - int32_t OrthancPluginInitialize(const OrthancPluginContext*); - void OrthancPluginFinalize(); - const char* OrthancPluginGetName(); diff -r f57802f8b4dc -r 690aeb4cb899 Resources/Samples/Plugins/Basic/CMakeLists.txt --- a/Resources/Samples/Plugins/Basic/CMakeLists.txt Mon Jun 16 16:14:56 2014 +0200 +++ b/Resources/Samples/Plugins/Basic/CMakeLists.txt Mon Jun 16 17:31:09 2014 +0200 @@ -2,6 +2,11 @@ project(Basic) +if (${CMAKE_COMPILER_IS_GNUCXX}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -pedantic -Werror") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Werror") +endif() + add_library(PluginTest SHARED Plugin.c) if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") diff -r f57802f8b4dc -r 690aeb4cb899 Resources/Samples/Plugins/Basic/Plugin.c --- a/Resources/Samples/Plugins/Basic/Plugin.c Mon Jun 16 16:14:56 2014 +0200 +++ b/Resources/Samples/Plugins/Basic/Plugin.c Mon Jun 16 17:31:09 2014 +0200 @@ -33,15 +33,31 @@ static const OrthancPluginContext* context = NULL; +ORTHANC_PLUGINS_API int32_t Callback(OrthancRestOutput* output, + OrthancHttpMethod method, + const OrthancRestUrl* url, + const char* body, + uint32_t bodySize) +{ + char buffer[1024]; + sprintf(buffer, "Callback on URL [%s]\n", url->path); + context->LogInfo(buffer); + context->AnswerBuffer(output, buffer, strlen(buffer), "text/plain"); + return 1; +} + + ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(const OrthancPluginContext* c) { + char info[1024]; + context = c; context->LogWarning("Plugin is initializing"); - char info[1024]; sprintf(info, "The version of Orthanc is '%s'", context->orthancVersion); + context->LogInfo(info); - context->LogInfo(info); + context->RegisterRestCallback(c, "/plugin/hello", Callback); return 0; } diff -r f57802f8b4dc -r 690aeb4cb899 UnitTestsSources/PluginsTests.cpp --- a/UnitTestsSources/PluginsTests.cpp Mon Jun 16 16:14:56 2014 +0200 +++ b/UnitTestsSources/PluginsTests.cpp Mon Jun 16 17:31:09 2014 +0200 @@ -58,7 +58,6 @@ #else #error Support your platform here #endif - } @@ -70,10 +69,10 @@ //#error Support your platform here #elif defined(__linux) - //manager.RegisterPlugin("./libPluginTest.so"); - //ASSERT_THROW(manager.RegisterPlugin("./libPluginTest.so"), OrthancException); + manager.RegisterPlugin("./libPluginTest.so"); + ASSERT_THROW(manager.RegisterPlugin("./libPluginTest.so"), OrthancException); - manager.ScanFolderForPlugins(".", true); + //manager.ScanFolderForPlugins(".", true); #else #error Support your platform here