# HG changeset patch # User Sebastien Jodogne # Date 1402764614 -7200 # Node ID 29087d728e0a2c009c37fbd54d417f9ea8fcd1f0 # Parent 0570a8c859cb4b479ca911d592376dfc9db7731e plugin sample diff -r 0570a8c859cb -r 29087d728e0a Plugins/OrthancCPlugin/OrthancCPlugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/OrthancCPlugin/OrthancCPlugin.h Sat Jun 14 18:50:14 2014 +0200 @@ -0,0 +1,90 @@ +/** + * Orthanc - A Lightweight, RESTful DICOM Store + * Copyright (C) 2012-2014 Medical Physics Department, CHU of Liege, + * Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * In addition, as a special exception, the copyright holders of this + * program give permission to link the code of its release with the + * OpenSSL project's "OpenSSL" library (or with modified versions of it + * that use the same license as the "OpenSSL" library), and distribute + * the linked executables. You must obey the GNU General Public License + * in all respects for all of the code used other than "OpenSSL". If you + * modify file(s) with this exception, you may extend this exception to + * your version of the file(s), but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files + * in the program, then also delete it here. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + **/ + + +#pragma once + + +#ifdef _MSC_VER +#include "../../Resources/VisualStudio/stdint.h" +#else +#include +#endif + + +#ifdef WIN32 +#define ORTHANC_PLUGINS_API __declspec(dllexport) +#else +#define ORTHANC_PLUGINS_API +#endif + + +#include + + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef void (*OrthancPluginLogError) (const char* str); + + typedef void (*OrthancPluginLogWarning) (const char* str); + + typedef void (*OrthancPluginLogInfo) (const char* str); + + typedef int32_t (*OrthancPluginService) (const char* serviceName, + const void* serviceParameters); + + typedef struct OrthancPluginContext + { + const char* orthancVersion; + OrthancPluginService InvokeService; + OrthancPluginLogError LogError; + OrthancPluginLogWarning LogWarning; + OrthancPluginLogInfo LogInfo; + + /* TODO REGISTER */ + + } OrthancPluginContext; + + + /** + Each plugin must define 2 functions, whose signature is: + - int32_t OrthancPluginInitialize(const OrthancPluginContext*); + - void OrthancPluginFinalize(); + + nm -C -D --defined-only libPluginTest.so + **/ + +#ifdef __cplusplus +} +#endif diff -r 0570a8c859cb -r 29087d728e0a Resources/Samples/Plugins/Basic/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Resources/Samples/Plugins/Basic/CMakeLists.txt Sat Jun 14 18:50:14 2014 +0200 @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 2.8) + +project(Basic) + +add_library(PluginTest SHARED Plugin.c) + +if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + # Linking with "pthread" is necessary, otherwise the software crashes + # http://sourceware.org/bugzilla/show_bug.cgi?id=10652#c17 + target_link_libraries(PluginTest pthread dl) +endif() diff -r 0570a8c859cb -r 29087d728e0a Resources/Samples/Plugins/Basic/Plugin.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Resources/Samples/Plugins/Basic/Plugin.c Sat Jun 14 18:50:14 2014 +0200 @@ -0,0 +1,55 @@ +/** + * Orthanc - A Lightweight, RESTful DICOM Store + * Copyright (C) 2012-2014 Medical Physics Department, CHU of Liege, + * Belgium + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + **/ + + +#include "../../../../Plugins/OrthancCPlugin/OrthancCPlugin.h" + +#include +#include + +static const OrthancPluginContext* context = NULL; + + +ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(const OrthancPluginContext* c) +{ + context = c; + context->LogWarning("Plugin is initializing"); + + char info[1024]; + sprintf(info, "The version of Orthanc is '%s'", context->orthancVersion); + + context->LogInfo(info); + + return 0; +} + + +ORTHANC_PLUGINS_API void OrthancPluginFinalize() +{ + context->LogWarning("Plugin is finalizing"); +} + + diff -r 0570a8c859cb -r 29087d728e0a UnitTestsSources/PluginsTests.cpp --- a/UnitTestsSources/PluginsTests.cpp Sat Jun 14 16:53:28 2014 +0200 +++ b/UnitTestsSources/PluginsTests.cpp Sat Jun 14 18:50:14 2014 +0200 @@ -33,7 +33,10 @@ #include "PrecompiledHeadersUnitTests.h" #include "gtest/gtest.h" +#include + #include "../Plugins/Engine/SharedLibrary.h" +#include "../Plugins/OrthancCPlugin/OrthancCPlugin.h" using namespace Orthanc; @@ -54,3 +57,74 @@ #endif } + + + +static void LogError(const char* str) +{ + LOG(ERROR) << str; +} + +static void LogWarning(const char* str) +{ + LOG(WARNING) << str; +} + +static void LogInfo(const char* str) +{ + LOG(INFO) << str; +} + +static int32_t InvokeService(const char* serviceName, + const void* serviceParameters) +{ + return 0; +} + + + +TEST(SharedLibrary, Development) +{ +#if defined(_WIN32) +#error Support your platform here + +#elif defined(__linux) + SharedLibrary l("./libPluginTest.so"); + ASSERT_TRUE(l.HasFunction("OrthancPluginFinalize")); + ASSERT_TRUE(l.HasFunction("OrthancPluginInitialize")); + + OrthancPluginContext context; + context.orthancVersion = ORTHANC_VERSION; + context.InvokeService = InvokeService; + context.LogError = LogError; + context.LogWarning = LogWarning; + context.LogInfo = LogInfo; + + typedef void (*Finalize) (); + typedef int32_t (*Initialize) (const OrthancPluginContext*); + + /** + * gcc would complain about "ISO C++ forbids casting between + * pointer-to-function and pointer-to-object" without the trick + * below, that is known as "the POSIX.1-2003 (Technical Corrigendum + * 1) workaround". See the man page of "dlsym()". + * http://www.trilithium.com/johan/2004/12/problem-with-dlsym/ + * http://stackoverflow.com/a/14543811/881731 + **/ + + Finalize finalize; + *(void **) (&finalize) = l.GetFunction("OrthancPluginFinalize"); + assert(finalize != NULL); + + Initialize initialize; + *(void **) (&initialize) = l.GetFunction("OrthancPluginInitialize"); + assert(initialize != NULL); + + initialize(&context); + finalize(); + +#else +#error Support your platform here +#endif + +}