comparison Plugins/Samples/Common/SimplifiedOrthancDataset.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 "SimplifiedOrthancDataset.h"
34
35 #include "OrthancPluginCppWrapper.h"
36
37 #include <json/reader.h>
38
39 namespace OrthancPlugins
40 {
41 void SimplifiedOrthancDataset::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 const Json::Value* SimplifiedOrthancDataset::LookupPath(const DicomPath& path) const
54 {
55 const Json::Value* content = &root_;
56
57 for (unsigned int depth = 0; depth < path.GetPrefixLength(); depth++)
58 {
59 const char* name = path.GetPrefixTag(depth).GetName();
60 if (content->type() != Json::objectValue)
61 {
62 ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_BadFileFormat);
63 }
64
65 if (!content->isMember(name))
66 {
67 return NULL;
68 }
69
70 const Json::Value& sequence = (*content) [name];
71 if (sequence.type() != Json::arrayValue)
72 {
73 ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_BadFileFormat);
74 }
75
76 size_t index = path.GetPrefixIndex(depth);
77 if (index >= sequence.size())
78 {
79 return NULL;
80 }
81 else
82 {
83 content = &sequence[static_cast<Json::Value::ArrayIndex>(index)];
84 }
85 }
86
87 const char* name = path.GetFinalTag().GetName();
88
89 if (content->type() != Json::objectValue)
90 {
91 ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_BadFileFormat);
92 }
93 if (!content->isMember(name))
94 {
95 return NULL;
96 }
97 else
98 {
99 return &((*content) [name]);
100 }
101 }
102
103
104 SimplifiedOrthancDataset::SimplifiedOrthancDataset(IOrthancConnection& orthanc,
105 const std::string& uri)
106 {
107 std::string content;
108 orthanc.RestApiGet(content, uri);
109 Parse(content);
110 }
111
112
113 bool SimplifiedOrthancDataset::GetStringValue(std::string& result,
114 const DicomPath& path) const
115 {
116 const Json::Value* value = LookupPath(path);
117
118 if (value == NULL)
119 {
120 return false;
121 }
122 else if (value->type() != Json::stringValue)
123 {
124 ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_BadFileFormat);
125 }
126 else
127 {
128 result = value->asString();
129 return true;
130 }
131 }
132
133
134 bool SimplifiedOrthancDataset::GetSequenceSize(size_t& size,
135 const DicomPath& path) const
136 {
137 const Json::Value* sequence = LookupPath(path);
138
139 if (sequence == NULL)
140 {
141 // Inexistent path
142 return false;
143 }
144 else if (sequence->type() != Json::arrayValue)
145 {
146 // Not a sequence
147 ORTHANC_PLUGINS_THROW_EXCEPTION(OrthancPluginErrorCode_BadFileFormat);
148 }
149 else
150 {
151 size = sequence->size();
152 return true;
153 }
154 }
155 }