1 /** 2 * Orthanc - A Lightweight, RESTful DICOM Store 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics 4 * Department, University Hospital of Liege, Belgium 5 * Copyright (C) 2017-2021 Osimis S.A., Belgium 6 * 7 * This program is free software: you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License as 9 * published by the Free Software Foundation, either version 3 of the 10 * License, or (at your option) any later version. 11 * 12 * In addition, as a special exception, the copyright holders of this 13 * program give permission to link the code of its release with the 14 * OpenSSL project's "OpenSSL" library (or with modified versions of it 15 * that use the same license as the "OpenSSL" library), and distribute 16 * the linked executables. You must obey the GNU General Public License 17 * in all respects for all of the code used other than "OpenSSL". If you 18 * modify file(s) with this exception, you may extend this exception to 19 * your version of the file(s), but you are not obligated to do so. If 20 * you do not wish to do so, delete this exception statement from your 21 * version. If you delete this exception statement from all source files 22 * in the program, then also delete it here. 23 * 24 * This program is distributed in the hope that it will be useful, but 25 * WITHOUT ANY WARRANTY; without even the implied warranty of 26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 27 * General Public License for more details. 28 * 29 * You should have received a copy of the GNU General Public License 30 * along with this program. If not, see <http://www.gnu.org/licenses/>. 31 **/ 32 33 34 #pragma once 35 36 #if ORTHANC_ENABLE_PLUGINS == 1 37 38 #include "IPluginServiceProvider.h" 39 40 #include <map> 41 #include <list> 42 43 namespace Orthanc 44 { 45 class PluginsManager : public boost::noncopyable 46 { 47 private: 48 class Plugin : public boost::noncopyable 49 { 50 private: 51 OrthancPluginContext context_; 52 SharedLibrary library_; 53 std::string version_; 54 PluginsManager& pluginManager_; 55 56 public: 57 Plugin(PluginsManager& pluginManager, 58 const std::string& path); 59 GetSharedLibrary()60 SharedLibrary& GetSharedLibrary() 61 { 62 return library_; 63 } 64 SetVersion(const std::string & version)65 void SetVersion(const std::string& version) 66 { 67 version_ = version; 68 } 69 GetVersion()70 const std::string& GetVersion() const 71 { 72 return version_; 73 } 74 GetPluginManager()75 PluginsManager& GetPluginManager() 76 { 77 return pluginManager_; 78 } 79 GetContext()80 OrthancPluginContext& GetContext() 81 { 82 return context_; 83 } 84 }; 85 86 typedef std::map<std::string, Plugin*> Plugins; 87 88 Plugins plugins_; 89 std::list<IPluginServiceProvider*> serviceProviders_; 90 91 static OrthancPluginErrorCode InvokeService(OrthancPluginContext* context, 92 _OrthancPluginService service, 93 const void* parameters); 94 95 public: 96 PluginsManager(); 97 98 ~PluginsManager(); 99 100 void RegisterPlugin(const std::string& path); 101 102 void ScanFolderForPlugins(const std::string& path, 103 bool isRecursive); 104 RegisterServiceProvider(IPluginServiceProvider & provider)105 void RegisterServiceProvider(IPluginServiceProvider& provider) 106 { 107 serviceProviders_.push_back(&provider); 108 } 109 110 void ListPlugins(std::list<std::string>& result) const; 111 112 bool HasPlugin(const std::string& name) const; 113 114 const std::string& GetPluginVersion(const std::string& name) const; 115 116 static std::string GetPluginName(SharedLibrary& library); 117 }; 118 } 119 120 #endif 121