comparison Plugins/Samples/Common/FullOrthancDataset.cpp @ 2179:de32f3b4ff09

shared toolbox to access DICOM datasets from plugins
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 25 Nov 2016 16:11:44 +0100
parents
children 71b8bec8ca91
comparison
equal deleted inserted replaced
2178:037e7bc16541 2179:de32f3b4ff09
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 *
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 * In addition, as a special exception, the copyright holders of this
12 * program give permission to link the code of its release with the
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it
14 * that use the same license as the "OpenSSL" library), and distribute
15 * the linked executables. You must obey the GNU General Public License
16 * in all respects for all of the code used other than "OpenSSL". If you
17 * modify file(s) with this exception, you may extend this exception to
18 * your version of the file(s), but you are not obligated to do so. If
19 * you do not wish to do so, delete this exception statement from your
20 * version. If you delete this exception statement from all source files
21 * in the program, then also delete it here.
22 *
23 * This program is distributed in the hope that it will be useful, but
24 * WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
26 * General Public License for more details.
27 *
28 * You should have received a copy of the GNU General Public License
29 * along with this program. If not, see <http://www.gnu.org/licenses/>.
30 **/
31
32
33 #include "FullOrthancDataset.h"
34
35 #include "OrthancPluginCppWrapper.h"
36
37 #include <json/reader.h>
38
39 namespace OrthancPlugins
40 {
41 void FullOrthancDataset::Parse(const std::string& source)
42 {
43 Json::Reader reader;
44
45 if (!reader.parse(source, root_) ||
46 root_.type() != Json::objectValue)
47 {
48 ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_BadFileFormat);
49 }
50 }
51
52
53 static const Json::Value* AccessTag(const Json::Value& dataset,
54 const DicomTag& tag)
55 {
56 if (dataset.type() != Json::objectValue)
57 {
58 ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_BadFileFormat);
59 }
60
61 char name[16];
62 sprintf(name, "%04x,%04x", tag.GetGroup(), tag.GetElement());
63
64 if (!dataset.isMember(name))
65 {
66 return NULL;
67 }
68
69 const Json::Value& value = dataset[name];
70 if (value.type() != Json::objectValue ||
71 !value.isMember("Name") ||
72 !value.isMember("Type") ||
73 !value.isMember("Value") ||
74 value["Name"].type() != Json::stringValue ||
75 value["Type"].type() != Json::stringValue)
76 {
77 ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_BadFileFormat);
78 }
79
80 return &value;
81 }
82
83
84 static const Json::Value& GetSequenceContent(const Json::Value& sequence)
85 {
86 assert(sequence.type() == Json::objectValue);
87 assert(sequence.isMember("Type"));
88 assert(sequence.isMember("Value"));
89
90 const Json::Value& value = sequence["Value"];
91
92 if (sequence["Type"].asString() != "Sequence" ||
93 value.type() != Json::arrayValue)
94 {
95 ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_BadFileFormat);
96 }
97 else
98 {
99 return value;
100 }
101 }
102
103
104 static bool GetStringInternal(std::string& result,
105 const Json::Value& tag)
106 {
107 assert(tag.type() == Json::objectValue);
108 assert(tag.isMember("Type"));
109 assert(tag.isMember("Value"));
110
111 const Json::Value& value = tag["Value"];
112
113 if (tag["Type"].asString() != "String" ||
114 value.type() != Json::stringValue)
115 {
116 ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_BadFileFormat);
117 }
118 else
119 {
120 result = value.asString();
121 return true;
122 }
123 }
124
125
126 const Json::Value* FullOrthancDataset::LookupPath(const DicomPath& path) const
127 {
128 const Json::Value* content = &root_;
129
130 for (unsigned int depth = 0; depth < path.GetPrefixLength(); depth++)
131 {
132 const Json::Value* sequence = AccessTag(*content, path.GetPrefixTag(depth));
133 if (sequence == NULL)
134 {
135 return NULL;
136 }
137
138 const Json::Value& nextContent = GetSequenceContent(*sequence);
139
140 size_t index = path.GetPrefixIndex(depth);
141 if (index >= nextContent.size())
142 {
143 return NULL;
144 }
145 else
146 {
147 content = &nextContent[static_cast<Json::Value::ArrayIndex>(index)];
148 }
149 }
150
151 return AccessTag(*content, path.GetFinalTag());
152 }
153
154
155 FullOrthancDataset::FullOrthancDataset(IOrthancConnection& orthanc,
156 const std::string& uri)
157 {
158 std::string content;
159 orthanc.RestApiGet(content, uri);
160 Parse(content);
161 }
162
163
164 bool FullOrthancDataset::GetStringValue(std::string& result,
165 const DicomPath& path) const
166 {
167 const Json::Value* value = LookupPath(path);
168
169 if (value == NULL)
170 {
171 return false;
172 }
173 else
174 {
175 return GetStringInternal(result, *value);
176 }
177 }
178
179
180 bool FullOrthancDataset::GetSequenceSize(size_t& size,
181 const DicomPath& path) const
182 {
183 const Json::Value* sequence = LookupPath(path);
184
185 if (sequence == NULL)
186 {
187 return false;
188 }
189 else
190 {
191 size = GetSequenceContent(*sequence).size();
192 return true;
193 }
194 }
195 }