Mercurial > hg > orthanc-gcp
annotate Plugin/Plugin.cpp @ 36:92b93845d84b
use of OrthancPluginsExports.cmake, link against system-wide orthanc framework
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 06 Jul 2020 13:20:02 +0200 |
parents | 2af772742d0b |
children | 56c9b700a0db |
rev | line source |
---|---|
0 | 1 /** |
2 * Google Cloud Platform credentials for DICOMweb and Orthanc | |
26 | 3 * Copyright (C) 2019-2020 Osimis S.A., Belgium |
0 | 4 * |
5 * This program is free software: you can redistribute it and/or | |
6 * modify it under the terms of the GNU General Public License as | |
7 * published by the Free Software Foundation, either version 3 of the | |
8 * License, or (at your option) any later version. | |
9 * | |
10 * In addition, as a special exception, the copyright holders of this | |
11 * program give permission to link the code of its release with the | |
12 * OpenSSL project's "OpenSSL" library (or with modified versions of it | |
13 * that use the same license as the "OpenSSL" library), and distribute | |
14 * the linked executables. You must obey the GNU General Public License | |
15 * in all respects for all of the code used other than "OpenSSL". If you | |
16 * modify file(s) with this exception, you may extend this exception to | |
17 * your version of the file(s), but you are not obligated to do so. If | |
18 * you do not wish to do so, delete this exception statement from your | |
19 * version. If you delete this exception statement from all source files | |
20 * in the program, then also delete it here. | |
21 * | |
22 * This program is distributed in the hope that it will be useful, but | |
23 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
25 * General Public License for more details. | |
26 * | |
27 * You should have received a copy of the GNU General Public License | |
28 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
29 **/ | |
30 | |
31 | |
32 #include "GoogleConfiguration.h" | |
33 #include "GoogleUpdater.h" | |
34 | |
34 | 35 #include "../Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h" |
36 | |
31 | 37 #include <HttpClient.h> |
38 #include <Toolbox.h> | |
0 | 39 |
40 | |
41 static bool CheckDicomWebVersion() | |
42 { | |
43 Json::Value dicomweb; | |
44 if (!OrthancPlugins::RestApiGet(dicomweb, "/plugins/dicom-web", false)) | |
45 { | |
46 LOG(ERROR) << "The DICOMweb plugin is not installed, cannot start Google Cloud Platform plugin"; | |
47 return false; | |
48 } | |
49 else if (dicomweb.type() != Json::objectValue || | |
50 !dicomweb.isMember("Version") || | |
51 dicomweb["Version"].type() != Json::stringValue) | |
52 { | |
53 LOG(ERROR) << "Cannot determine the version of the DICOMweb plugin, start Google Cloud Platform plugin"; | |
54 return false; | |
55 } | |
56 else | |
57 { | |
58 std::string version = dicomweb["Version"].asString(); | |
59 | |
60 std::vector<std::string> tokens; | |
61 Orthanc::Toolbox::TokenizeString(tokens, version, '.'); | |
62 | |
63 bool ok = true; | |
64 | |
65 if (tokens.size() == 2) | |
66 { | |
67 try | |
68 { | |
69 int major = boost::lexical_cast<int>(tokens[0]); | |
70 int minor = boost::lexical_cast<int>(tokens[1]); | |
71 | |
28 | 72 ok = (major >= 2 || |
73 (major == 1 && minor >= 0)); | |
0 | 74 } |
75 catch (boost::bad_lexical_cast&) | |
76 { | |
77 ok = false; | |
78 } | |
79 } | |
80 | |
81 if (!ok) | |
82 { | |
83 LOG(ERROR) << "The DICOMweb version (currently " << version | |
27 | 84 << ") must be above 1.0 to use the Google Cloud Platform plugin"; |
0 | 85 } |
86 | |
87 return ok; | |
88 } | |
89 } | |
90 | |
91 | |
92 OrthancPluginErrorCode OnChangeCallback(OrthancPluginChangeType changeType, | |
93 OrthancPluginResourceType resourceType, | |
94 const char* resourceId) | |
95 { | |
96 try | |
97 { | |
98 switch (changeType) | |
99 { | |
100 case OrthancPluginChangeType_OrthancStarted: | |
101 { | |
102 if (CheckDicomWebVersion()) | |
103 { | |
104 GoogleUpdater::GetInstance().Start(); | |
105 } | |
106 | |
107 break; | |
108 } | |
109 | |
110 case OrthancPluginChangeType_OrthancStopped: | |
111 GoogleUpdater::GetInstance().Stop(); | |
112 break; | |
113 | |
114 default: | |
115 break; | |
116 } | |
117 } | |
118 catch (Orthanc::OrthancException& e) | |
119 { | |
120 LOG(ERROR) << "Exception in the change callback: " << e.What(); | |
121 return static_cast<OrthancPluginErrorCode>(e.GetErrorCode()); | |
122 } | |
123 | |
124 return OrthancPluginErrorCode_Success; | |
125 } | |
126 | |
127 | |
128 | |
35
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
129 /** |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
130 * We force the redefinition of the "ORTHANC_PLUGINS_API" macro, that |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
131 * was left empty with gcc until Orthanc SDK 1.5.7 (no "default" |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
132 * visibility). This causes the version script, if run from "Holy |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
133 * Build Box", to make private the 4 global functions of the plugin. |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
134 **/ |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
135 |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
136 #undef ORTHANC_PLUGINS_API |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
137 |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
138 #ifdef WIN32 |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
139 # define ORTHANC_PLUGINS_API __declspec(dllexport) |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
140 #elif __GNUC__ >= 4 |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
141 # define ORTHANC_PLUGINS_API __attribute__((visibility ("default"))) |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
142 #else |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
143 # define ORTHANC_PLUGINS_API |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
144 #endif |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
145 |
2af772742d0b
fix export of symbols in holy-build-box
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
34
diff
changeset
|
146 |
0 | 147 extern "C" |
148 { | |
149 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context) | |
150 { | |
151 OrthancPlugins::SetGlobalContext(context); | |
32 | 152 |
33 | 153 #if defined(ORTHANC_FRAMEWORK_VERSION_IS_ABOVE) // This indicates Orthanc framework >= 1.7.2 |
32 | 154 Orthanc::Logging::InitializePluginContext(context); |
155 #else | |
156 Orthanc::Logging::Initialize(context); | |
157 #endif | |
0 | 158 |
159 /* Check the version of the Orthanc core */ | |
160 if (OrthancPluginCheckVersion(context) == 0) | |
161 { | |
162 OrthancPlugins::ReportMinimalOrthancVersion(ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER, | |
163 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER, | |
164 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER); | |
165 return -1; | |
166 } | |
167 | |
168 try | |
169 { | |
170 Orthanc::Toolbox::InitializeOpenSsl(); | |
171 Orthanc::HttpClient::GlobalInitialize(); | |
172 | |
173 GoogleConfiguration::GetInstance(); // Force the initialization of the singleton | |
174 | |
175 OrthancPluginRegisterOnChangeCallback(context, OnChangeCallback); | |
176 } | |
177 catch (Orthanc::OrthancException& e) | |
178 { | |
179 OrthancPlugins::LogError("Error while initializing the Google Cloud Platform plugin: " + | |
180 std::string(e.What())); | |
181 return -1; | |
182 } | |
183 | |
184 return 0; | |
185 } | |
186 | |
187 | |
188 ORTHANC_PLUGINS_API void OrthancPluginFinalize() | |
189 { | |
190 try | |
191 { | |
192 GoogleUpdater::GetInstance().Stop(); | |
193 Orthanc::HttpClient::GlobalFinalize(); | |
194 Orthanc::Toolbox::FinalizeOpenSsl(); | |
195 } | |
196 catch (Orthanc::OrthancException&) | |
197 { | |
198 } | |
199 } | |
200 | |
201 | |
202 ORTHANC_PLUGINS_API const char* OrthancPluginGetName() | |
203 { | |
204 return "google-cloud-platform"; | |
205 } | |
206 | |
207 | |
208 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion() | |
209 { | |
210 return GCP_PLUGIN_VERSION; | |
211 } | |
212 } |