Mercurial > hg > orthanc
annotate Plugins/Samples/ModalityWorklists/Plugin.cpp @ 2205:395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 08 Dec 2016 16:16:25 +0100 |
parents | 7a05144cb919 |
children | 27106f7e3759 |
rev | line source |
---|---|
1802 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
1900 | 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
1802 | 4 * Department, University Hospital of Liege, Belgium |
5 * | |
6 * This program is free software: you can redistribute it and/or | |
7 * modify it under the terms of the GNU General Public License as | |
8 * published by the Free Software Foundation, either version 3 of the | |
9 * License, or (at your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, but | |
12 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
18 **/ | |
19 | |
20 | |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
21 #include "../Common/OrthancPluginCppWrapper.h" |
1802 | 22 |
23 #include <boost/filesystem.hpp> | |
24 #include <json/value.h> | |
25 #include <json/reader.h> | |
26 #include <string.h> | |
27 #include <iostream> | |
1814 | 28 #include <algorithm> |
1802 | 29 |
30 static OrthancPluginContext* context_ = NULL; | |
31 static std::string folder_; | |
32 | |
33 | |
34 /** | |
35 * This is the main function for matching a DICOM worklist against a query. | |
36 **/ | |
37 static OrthancPluginErrorCode MatchWorklist(OrthancPluginWorklistAnswers* answers, | |
38 const OrthancPluginWorklistQuery* query, | |
39 const std::string& path) | |
40 { | |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
41 OrthancPlugins::MemoryBuffer dicom(context_); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
42 dicom.ReadFile(path); |
1802 | 43 |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
44 if (OrthancPluginWorklistIsMatch(context_, query, dicom.GetData(), dicom.GetSize())) |
1802 | 45 { |
46 // This DICOM file matches the worklist query, add it to the answers | |
1810
796d0b087fb8
more consistent naming in worklist primitives
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1808
diff
changeset
|
47 return OrthancPluginWorklistAddAnswer |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
48 (context_, answers, query, dicom.GetData(), dicom.GetSize()); |
1802 | 49 } |
50 else | |
51 { | |
52 // This DICOM file does not match | |
53 return OrthancPluginErrorCode_Success; | |
54 } | |
55 } | |
56 | |
57 | |
58 | |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
59 static void GetQueryDicom(Json::Value& value, |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
60 const OrthancPluginWorklistQuery* query) |
1802 | 61 { |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
62 OrthancPlugins::MemoryBuffer dicom(context_); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
63 dicom.GetDicomQuery(query); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
64 |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
65 OrthancPlugins::OrthancString str(context_); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
66 str.DicomToJson(dicom, OrthancPluginDicomToJsonFormat_Short, |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
67 static_cast<OrthancPluginDicomToJsonFlags>(0), 0); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
68 |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
69 str.ToJson(value); |
1802 | 70 } |
71 | |
72 | |
1814 | 73 static void ToLowerCase(std::string& s) |
74 { | |
75 std::transform(s.begin(), s.end(), s.begin(), tolower); | |
76 } | |
77 | |
78 | |
1802 | 79 OrthancPluginErrorCode Callback(OrthancPluginWorklistAnswers* answers, |
80 const OrthancPluginWorklistQuery* query, | |
81 const char* remoteAet, | |
82 const char* calledAet) | |
83 { | |
84 try | |
85 { | |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
86 namespace fs = boost::filesystem; |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
87 |
1802 | 88 { |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
89 Json::Value json; |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
90 GetQueryDicom(json, query); |
1911 | 91 |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
92 std::string msg = ("Received worklist query from remote modality " + |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
93 std::string(remoteAet) + ":\n" + json.toStyledString()); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
94 OrthancPluginLogInfo(context_, msg.c_str()); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
95 } |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
96 |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
97 fs::path source(folder_); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
98 fs::directory_iterator end; |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
99 |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
100 try |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
101 { |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
102 for (fs::directory_iterator it(source); it != end; ++it) |
1802 | 103 { |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
104 fs::file_type type(it->status().type()); |
1814 | 105 |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
106 if (type == fs::regular_file || |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
107 type == fs::reparse_file) // cf. BitBucket issue #11 |
1802 | 108 { |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
109 std::string extension = fs::extension(it->path()); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
110 ToLowerCase(extension); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
111 |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
112 if (extension == ".wl") |
1802 | 113 { |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
114 OrthancPluginErrorCode error = MatchWorklist(answers, query, it->path().string()); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
115 if (error) |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
116 { |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
117 OrthancPluginLogError(context_, "Error while adding an answer to a worklist request"); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
118 return error; |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
119 } |
1802 | 120 } |
121 } | |
122 } | |
123 } | |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
124 catch (fs::filesystem_error&) |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
125 { |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
126 std::string description = std::string("Inexistent folder while scanning for worklists: ") + source.string(); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
127 OrthancPluginLogError(context_, description.c_str()); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
128 return OrthancPluginErrorCode_DirectoryExpected; |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
129 } |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
130 |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
131 // Uncomment the following line if too many answers are to be returned |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
132 // OrthancPluginMarkWorklistAnswersIncomplete(context_, answers); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
133 |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
134 return OrthancPluginErrorCode_Success; |
1802 | 135 } |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
136 catch (OrthancPlugins::PluginException& e) |
1802 | 137 { |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
138 return e.GetErrorCode(); |
1802 | 139 } |
140 } | |
141 | |
142 | |
143 extern "C" | |
144 { | |
145 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* c) | |
146 { | |
147 context_ = c; | |
148 | |
149 /* Check the version of the Orthanc core */ | |
150 if (OrthancPluginCheckVersion(c) == 0) | |
151 { | |
152 char info[1024]; | |
153 sprintf(info, "Your version of Orthanc (%s) must be above %d.%d.%d to run this plugin", | |
154 context_->orthancVersion, | |
155 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER, | |
156 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER, | |
157 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER); | |
158 OrthancPluginLogError(context_, info); | |
159 return -1; | |
160 } | |
161 | |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
162 OrthancPlugins::LogWarning(context_, "Sample worklist plugin is initializing"); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
163 OrthancPluginSetDescription(context_, "Serve DICOM modality worklists from a folder with Orthanc."); |
1802 | 164 |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
165 OrthancPlugins::OrthancConfiguration configuration(context_); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
166 |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
167 OrthancPlugins::OrthancConfiguration worklists; |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
168 configuration.GetSection(worklists, "Worklists"); |
1808
9c2ffc4e938b
configuration of the sample modality worklists plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1802
diff
changeset
|
169 |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
170 bool enabled = worklists.GetBooleanValue("Enable", false); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
171 if (enabled) |
1802 | 172 { |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
173 if (worklists.LookupStringValue(folder_, "Database")) |
1802 | 174 { |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
175 OrthancPlugins::LogWarning(context_, "The database of worklists will be read from folder: " + folder_); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
176 OrthancPluginRegisterWorklistCallback(context_, Callback); |
1802 | 177 } |
1808
9c2ffc4e938b
configuration of the sample modality worklists plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1802
diff
changeset
|
178 else |
9c2ffc4e938b
configuration of the sample modality worklists plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1802
diff
changeset
|
179 { |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
180 OrthancPlugins::LogError(context_, "The configuration option \"Worklists.Database\" must contain a path"); |
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
181 return -1; |
1808
9c2ffc4e938b
configuration of the sample modality worklists plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1802
diff
changeset
|
182 } |
1802 | 183 } |
184 else | |
185 { | |
2205
395522e46b2b
refactoring of the worklist sample using OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
186 OrthancPlugins::LogWarning(context_, "Worklists server is disabled by the configuration file"); |
1808
9c2ffc4e938b
configuration of the sample modality worklists plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1802
diff
changeset
|
187 } |
1802 | 188 |
189 return 0; | |
190 } | |
191 | |
192 | |
193 ORTHANC_PLUGINS_API void OrthancPluginFinalize() | |
194 { | |
195 OrthancPluginLogWarning(context_, "Sample worklist plugin is finalizing"); | |
196 } | |
197 | |
198 | |
199 ORTHANC_PLUGINS_API const char* OrthancPluginGetName() | |
200 { | |
1808
9c2ffc4e938b
configuration of the sample modality worklists plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1802
diff
changeset
|
201 return "worklists"; |
1802 | 202 } |
203 | |
204 | |
205 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion() | |
206 { | |
1808
9c2ffc4e938b
configuration of the sample modality worklists plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1802
diff
changeset
|
207 return MODALITY_WORKLISTS_VERSION; |
1802 | 208 } |
209 } |