annotate Resources/Orthanc/OrthancServer/FromDcmtkBridge.cpp @ 59:7a3853d51c45

Move "Framework/Orthanc/" as "Resources/Orthanc/"
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 25 Nov 2016 16:34:34 +0100
parents Framework/Orthanc/OrthancServer/FromDcmtkBridge.cpp@06847108819c
children 5b127ab0080b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 * Department, University Hospital of Liege, Belgium
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5 *
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 * This program is free software: you can redistribute it and/or
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * modify it under the terms of the GNU General Public License as
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * published by the Free Software Foundation, either version 3 of the
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 * License, or (at your option) any later version.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 *
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * In addition, as a special exception, the copyright holders of this
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * program give permission to link the code of its release with the
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * that use the same license as the "OpenSSL" library), and distribute
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * the linked executables. You must obey the GNU General Public License
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * in all respects for all of the code used other than "OpenSSL". If you
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * modify file(s) with this exception, you may extend this exception to
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * your version of the file(s), but you are not obligated to do so. If
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 * you do not wish to do so, delete this exception statement from your
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * version. If you delete this exception statement from all source files
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 * in the program, then also delete it here.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 *
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23 * This program is distributed in the hope that it will be useful, but
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 * WITHOUT ANY WARRANTY; without even the implied warranty of
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 * General Public License for more details.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 *
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 * You should have received a copy of the GNU General Public License
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 * along with this program. If not, see <http://www.gnu.org/licenses/>.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 #include "PrecompiledHeadersServer.h"
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 #ifndef NOMINMAX
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 #define NOMINMAX
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37 #endif
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 #include "FromDcmtkBridge.h"
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 #include "ToDcmtkBridge.h"
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 #include "../Core/Logging.h"
54
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 48
diff changeset
42 #include "../Core/SystemToolbox.h"
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 #include "../Core/Toolbox.h"
43
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 38
diff changeset
44 #include "../Core/TemporaryFile.h"
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 #include "../Core/OrthancException.h"
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 #include <list>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 #include <limits>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 #include <boost/lexical_cast.hpp>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 #include <boost/filesystem.hpp>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 #include <boost/algorithm/string/predicate.hpp>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 #include <dcmtk/dcmdata/dcdeftag.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 #include <dcmtk/dcmdata/dcdicent.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 #include <dcmtk/dcmdata/dcdict.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 #include <dcmtk/dcmdata/dcfilefo.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 #include <dcmtk/dcmdata/dcostrmb.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 #include <dcmtk/dcmdata/dcpixel.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 #include <dcmtk/dcmdata/dcuid.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 #include <dcmtk/dcmdata/dcistrmb.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 #include <dcmtk/dcmdata/dcvrae.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 #include <dcmtk/dcmdata/dcvras.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 #include <dcmtk/dcmdata/dcvrat.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 #include <dcmtk/dcmdata/dcvrcs.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 #include <dcmtk/dcmdata/dcvrda.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 #include <dcmtk/dcmdata/dcvrds.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 #include <dcmtk/dcmdata/dcvrdt.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 #include <dcmtk/dcmdata/dcvrfd.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 #include <dcmtk/dcmdata/dcvrfl.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 #include <dcmtk/dcmdata/dcvris.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 #include <dcmtk/dcmdata/dcvrlo.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 #include <dcmtk/dcmdata/dcvrlt.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 #include <dcmtk/dcmdata/dcvrpn.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 #include <dcmtk/dcmdata/dcvrsh.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 #include <dcmtk/dcmdata/dcvrsl.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 #include <dcmtk/dcmdata/dcvrss.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 #include <dcmtk/dcmdata/dcvrst.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 #include <dcmtk/dcmdata/dcvrtm.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 #include <dcmtk/dcmdata/dcvrui.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 #include <dcmtk/dcmdata/dcvrul.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 #include <dcmtk/dcmdata/dcvrus.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 #include <dcmtk/dcmdata/dcvrut.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 #if DCMTK_USE_EMBEDDED_DICTIONARIES == 1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 #include <EmbeddedResources.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 #endif
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 namespace Orthanc
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 static inline uint16_t GetCharValue(char c)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 if (c >= '0' && c <= '9')
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 return c - '0';
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 else if (c >= 'a' && c <= 'f')
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 return c - 'a' + 10;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 else if (c >= 'A' && c <= 'F')
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 return c - 'A' + 10;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 return 0;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 static inline uint16_t GetTagValue(const char* c)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 return ((GetCharValue(c[0]) << 12) +
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109 (GetCharValue(c[1]) << 8) +
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 (GetCharValue(c[2]) << 4) +
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 GetCharValue(c[3]));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 #if DCMTK_USE_EMBEDDED_DICTIONARIES == 1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 static void LoadEmbeddedDictionary(DcmDataDictionary& dictionary,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 EmbeddedResources::FileResourceId resource)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119 std::string content;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 EmbeddedResources::GetFileResource(content, resource);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121
43
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 38
diff changeset
122 TemporaryFile tmp;
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123 tmp.Write(content);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 if (!dictionary.loadDictionary(tmp.GetPath().c_str()))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 LOG(ERROR) << "Cannot read embedded dictionary. Under Windows, make sure that "
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 << "your TEMP directory does not contain special characters.";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133 #else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 static void LoadExternalDictionary(DcmDataDictionary& dictionary,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 const std::string& directory,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 const std::string& filename)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 boost::filesystem::path p = directory;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 p = p / filename;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 LOG(WARNING) << "Loading the external DICOM dictionary " << p;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 if (!dictionary.loadDictionary(p.string().c_str()))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 #endif
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 namespace
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 class DictionaryLocker
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155 private:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 DcmDataDictionary& dictionary_;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 public:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 DictionaryLocker() : dictionary_(dcmDataDict.wrlock())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 ~DictionaryLocker()
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165 dcmDataDict.unlock();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168 DcmDataDictionary& operator*()
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170 return dictionary_;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 DcmDataDictionary* operator->()
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175 return &dictionary_;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 };
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180
48
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
181 void FromDcmtkBridge::InitializeDictionary(bool loadPrivateDictionary)
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184 DictionaryLocker locker;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186 locker->clear();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
188 #if DCMTK_USE_EMBEDDED_DICTIONARIES == 1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189 LOG(WARNING) << "Loading the embedded dictionaries";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191 * Do not load DICONDE dictionary, it breaks the other tags. The
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192 * command "strace storescu 2>&1 |grep dic" shows that DICONDE
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193 * dictionary is not loaded by storescu.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195 //LoadEmbeddedDictionary(*locker, EmbeddedResources::DICTIONARY_DICONDE);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197 LoadEmbeddedDictionary(*locker, EmbeddedResources::DICTIONARY_DICOM);
48
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
198
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
199 if (loadPrivateDictionary)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
200 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
201 LOG(INFO) << "Loading the embedded dictionary of private tags";
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
202 LoadEmbeddedDictionary(*locker, EmbeddedResources::DICTIONARY_PRIVATE);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
203 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
204 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
205 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
206 LOG(INFO) << "The dictionary of private tags has not been loaded";
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
207 }
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
208
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209 #elif defined(__linux__) || defined(__FreeBSD_kernel__)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 std::string path = DCMTK_DICTIONARY_DIR;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212 const char* env = std::getenv(DCM_DICT_ENVIRONMENT_VARIABLE);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 if (env != NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215 path = std::string(env);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 LoadExternalDictionary(*locker, path, "dicom.dic");
48
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
219
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
220 if (loadPrivateDictionary)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
221 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
222 LoadExternalDictionary(*locker, path, "private.dic");
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
223 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
224 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
225 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
226 LOG(INFO) << "The dictionary of private tags has not been loaded";
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 43
diff changeset
227 }
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
228
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
229 #else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
230 #error Support your platform here
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
231 #endif
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
232 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
233
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
234 /* make sure data dictionary is loaded */
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
235 if (!dcmDataDict.isDictionaryLoaded())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
236 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
237 LOG(ERROR) << "No DICOM dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
238 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
239 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
240
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
241 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
242 // Test the dictionary with a simple DICOM tag
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
243 DcmTag key(0x0010, 0x1030); // This is PatientWeight
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
244 if (key.getEVR() != EVR_DS)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
245 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
246 LOG(ERROR) << "The DICOM dictionary has not been correctly read";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
247 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
248 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
249 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
250 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
251
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
252
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
253 void FromDcmtkBridge::RegisterDictionaryTag(const DicomTag& tag,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
254 ValueRepresentation vr,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
255 const std::string& name,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
256 unsigned int minMultiplicity,
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
257 unsigned int maxMultiplicity,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
258 const std::string& privateCreator)
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
259 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
260 if (minMultiplicity < 1)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
261 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
262 throw OrthancException(ErrorCode_ParameterOutOfRange);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
263 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
264
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
265 bool arbitrary = false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
266 if (maxMultiplicity == 0)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
267 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
268 maxMultiplicity = DcmVariableVM;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
269 arbitrary = true;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
270 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
271 else if (maxMultiplicity < minMultiplicity)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
272 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
273 throw OrthancException(ErrorCode_ParameterOutOfRange);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
274 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
275
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
276 DcmEVR evr = ToDcmtkBridge::Convert(vr);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
277
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
278 LOG(INFO) << "Registering tag in dictionary: " << tag << " " << (DcmVR(evr).getValidVRName()) << " "
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
279 << name << " (multiplicity: " << minMultiplicity << "-"
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
280 << (arbitrary ? "n" : boost::lexical_cast<std::string>(maxMultiplicity)) << ")";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
281
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
282 std::auto_ptr<DcmDictEntry> entry;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
283 if (privateCreator.empty())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
284 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
285 if (tag.GetGroup() % 2 == 1)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
286 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
287 char buf[128];
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
288 sprintf(buf, "Warning: You are registering a private tag (%04x,%04x), "
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
289 "but no private creator was associated with it",
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
290 tag.GetGroup(), tag.GetElement());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
291 LOG(WARNING) << buf;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
292 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
293
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
294 entry.reset(new DcmDictEntry(tag.GetGroup(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
295 tag.GetElement(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
296 evr, name.c_str(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
297 static_cast<int>(minMultiplicity),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
298 static_cast<int>(maxMultiplicity),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
299 NULL /* version */,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
300 OFTrue /* doCopyString */,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
301 NULL /* private creator */));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
302 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
303 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
304 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
305 // "Private Data Elements have an odd Group Number that is not
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
306 // (0001,eeee), (0003,eeee), (0005,eeee), (0007,eeee), or
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
307 // (FFFF,eeee)."
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
308 if (tag.GetGroup() % 2 == 0 /* even */ ||
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
309 tag.GetGroup() == 0x0001 ||
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
310 tag.GetGroup() == 0x0003 ||
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
311 tag.GetGroup() == 0x0005 ||
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
312 tag.GetGroup() == 0x0007 ||
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
313 tag.GetGroup() == 0xffff)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
314 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
315 char buf[128];
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
316 sprintf(buf, "Trying to register private tag (%04x,%04x), but it must have an odd group >= 0x0009",
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
317 tag.GetGroup(), tag.GetElement());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
318 LOG(ERROR) << buf;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
319 throw OrthancException(ErrorCode_ParameterOutOfRange);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
320 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
321
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
322 entry.reset(new DcmDictEntry(tag.GetGroup(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
323 tag.GetElement(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
324 evr, name.c_str(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
325 static_cast<int>(minMultiplicity),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
326 static_cast<int>(maxMultiplicity),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
327 "private" /* version */,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
328 OFTrue /* doCopyString */,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
329 privateCreator.c_str()));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
330 }
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
331
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
332 entry->setGroupRangeRestriction(DcmDictRange_Unspecified);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
333 entry->setElementRangeRestriction(DcmDictRange_Unspecified);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
334
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
335 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
336 DictionaryLocker locker;
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
337
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
338 if (locker->findEntry(name.c_str()))
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
339 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
340 LOG(ERROR) << "Cannot register two tags with the same symbolic name \"" << name << "\"";
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
341 throw OrthancException(ErrorCode_AlreadyExistingTag);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
342 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
343
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
344 locker->addEntry(entry.release());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
345 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
346 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
347
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
348
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
349 Encoding FromDcmtkBridge::DetectEncoding(DcmItem& dataset,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
350 Encoding defaultEncoding)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
351 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
352 Encoding encoding = defaultEncoding;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
353
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
354 OFString tmp;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
355 if (dataset.findAndGetOFString(DCM_SpecificCharacterSet, tmp).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
356 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
357 std::string characterSet = Toolbox::StripSpaces(std::string(tmp.c_str()));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
358
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
359 if (characterSet.empty())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
360 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
361 // Empty specific character set tag: Use the default encoding
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
362 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
363 else if (GetDicomEncoding(encoding, characterSet.c_str()))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
364 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
365 // The specific character set is supported by the Orthanc core
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
366 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
367 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
368 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
369 LOG(WARNING) << "Value of Specific Character Set (0008,0005) is not supported: " << characterSet
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
370 << ", fallback to ASCII (remove all special characters)";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
371 encoding = Encoding_Ascii;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
372 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
373 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
374 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
375 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
376 // No specific character set tag: Use the default encoding
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
377 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
378
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
379 return encoding;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
380 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
381
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
382
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
383 void FromDcmtkBridge::ExtractDicomSummary(DicomMap& target,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
384 DcmItem& dataset,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
385 unsigned int maxStringLength,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
386 Encoding defaultEncoding)
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
387 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
388 Encoding encoding = DetectEncoding(dataset, defaultEncoding);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
389
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
390 target.Clear();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
391 for (unsigned long i = 0; i < dataset.card(); i++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
392 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
393 DcmElement* element = dataset.getElement(i);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
394 if (element && element->isLeaf())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
395 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
396 target.SetValue(element->getTag().getGTag(),
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
397 element->getTag().getETag(),
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
398 ConvertLeafElement(*element, DicomToJsonFlags_Default, maxStringLength, encoding));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
399 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
400 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
401 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
402
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
403
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
404 DicomTag FromDcmtkBridge::Convert(const DcmTag& tag)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
405 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
406 return DicomTag(tag.getGTag(), tag.getETag());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
407 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
408
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
409
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
410 DicomTag FromDcmtkBridge::GetTag(const DcmElement& element)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
411 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
412 return DicomTag(element.getGTag(), element.getETag());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
413 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
414
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
415
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
416 DicomValue* FromDcmtkBridge::ConvertLeafElement(DcmElement& element,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
417 DicomToJsonFlags flags,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
418 unsigned int maxStringLength,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
419 Encoding encoding)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
420 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
421 if (!element.isLeaf())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
422 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
423 // This function is only applicable to leaf elements
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
424 throw OrthancException(ErrorCode_BadParameterType);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
425 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
426
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
427 char *c = NULL;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
428 if (element.isaString() &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
429 element.getString(c).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
430 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
431 if (c == NULL) // This case corresponds to the empty string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
432 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
433 return new DicomValue("", false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
434 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
435 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
436 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
437 std::string s(c);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
438 std::string utf8 = Toolbox::ConvertToUtf8(s, encoding);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
439
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
440 if (maxStringLength != 0 &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
441 utf8.size() > maxStringLength)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
442 {
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
443 return new DicomValue; // Too long, create a NULL value
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
444 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
445 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
446 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
447 return new DicomValue(utf8, false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
448 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
449 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
450 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
451
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
452
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
453 if (element.getVR() == EVR_UN)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
454 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
455 // Unknown value representation: Lookup in the dictionary. This
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
456 // is notably the case for private tags registered with the
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
457 // "Dictionary" configuration option.
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
458 DictionaryLocker locker;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
459
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
460 const DcmDictEntry* entry = locker->findEntry(element.getTag().getXTag(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
461 element.getTag().getPrivateCreator());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
462 if (entry != NULL &&
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
463 entry->getVR().isaString())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
464 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
465 Uint8* data = NULL;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
466
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
467 // At (*), we do not try and convert to UTF-8, as nothing says
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
468 // the encoding of the private tag is the same as that of the
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
469 // remaining of the DICOM dataset. Only go for ASCII strings.
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
470
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
471 if (element.getUint8Array(data) == EC_Normal &&
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
472 Toolbox::IsAsciiString(data, element.getLength())) // (*)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
473 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
474 if (data == NULL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
475 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
476 return new DicomValue("", false); // Empty string
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
477 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
478 else if (maxStringLength != 0 &&
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
479 element.getLength() > maxStringLength)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
480 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
481 return new DicomValue; // Too long, create a NULL value
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
482 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
483 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
484 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
485 std::string s(reinterpret_cast<const char*>(data), element.getLength());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
486 return new DicomValue(s, false);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
487 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
488 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
489 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
490 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
491
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
492
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
493 try
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
494 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
495 // http://support.dcmtk.org/docs/dcvr_8h-source.html
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
496 switch (element.getVR())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
497 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
498
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
499 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
500 * Deal with binary data (including PixelData).
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
501 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
502
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
503 case EVR_OB: // other byte
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
504 case EVR_OF: // other float
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
505 case EVR_OW: // other word
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
506 case EVR_UN: // unknown value representation
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
507 case EVR_ox: // OB or OW depending on context
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
508 case EVR_DS: // decimal string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
509 case EVR_IS: // integer string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
510 case EVR_AS: // age string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
511 case EVR_DA: // date string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
512 case EVR_DT: // date time string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
513 case EVR_TM: // time string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
514 case EVR_AE: // application entity title
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
515 case EVR_CS: // code string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
516 case EVR_SH: // short string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
517 case EVR_LO: // long string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
518 case EVR_ST: // short text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
519 case EVR_LT: // long text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
520 case EVR_UT: // unlimited text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
521 case EVR_PN: // person name
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
522 case EVR_UI: // unique identifier
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
523 case EVR_UNKNOWN: // used internally for elements with unknown VR (encoded with 4-byte length field in explicit VR)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
524 case EVR_UNKNOWN2B: // used internally for elements with unknown VR with 2-byte length field in explicit VR
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
525 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
526 if (!(flags & DicomToJsonFlags_ConvertBinaryToNull))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
527 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
528 Uint8* data = NULL;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
529 if (element.getUint8Array(data) == EC_Normal)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
530 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
531 return new DicomValue(reinterpret_cast<const char*>(data), element.getLength(), true);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
532 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
533 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
534
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
535 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
536 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
537
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
538 /**
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
539 * Numeric types
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
540 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
541
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
542 case EVR_SL: // signed long
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
543 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
544 Sint32 f;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
545 if (dynamic_cast<DcmSignedLong&>(element).getSint32(f).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
546 return new DicomValue(boost::lexical_cast<std::string>(f), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
547 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
548 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
549 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
550
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
551 case EVR_SS: // signed short
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
552 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
553 Sint16 f;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
554 if (dynamic_cast<DcmSignedShort&>(element).getSint16(f).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
555 return new DicomValue(boost::lexical_cast<std::string>(f), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
556 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
557 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
558 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
559
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
560 case EVR_UL: // unsigned long
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
561 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
562 Uint32 f;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
563 if (dynamic_cast<DcmUnsignedLong&>(element).getUint32(f).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
564 return new DicomValue(boost::lexical_cast<std::string>(f), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
565 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
566 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
567 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
568
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
569 case EVR_US: // unsigned short
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
570 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
571 Uint16 f;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
572 if (dynamic_cast<DcmUnsignedShort&>(element).getUint16(f).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
573 return new DicomValue(boost::lexical_cast<std::string>(f), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
574 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
575 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
576 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
577
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
578 case EVR_FL: // float single-precision
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
579 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
580 Float32 f;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
581 if (dynamic_cast<DcmFloatingPointSingle&>(element).getFloat32(f).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
582 return new DicomValue(boost::lexical_cast<std::string>(f), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
583 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
584 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
585 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
586
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
587 case EVR_FD: // float double-precision
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
588 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
589 Float64 f;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
590 if (dynamic_cast<DcmFloatingPointDouble&>(element).getFloat64(f).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
591 return new DicomValue(boost::lexical_cast<std::string>(f), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
592 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
593 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
594 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
595
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
596
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
597 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
598 * Attribute tag.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
599 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
600
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
601 case EVR_AT:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
602 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
603 DcmTagKey tag;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
604 if (dynamic_cast<DcmAttributeTag&>(element).getTagVal(tag, 0).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
605 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
606 DicomTag t(tag.getGroup(), tag.getElement());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
607 return new DicomValue(t.Format(), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
608 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
609 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
610 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
611 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
612 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
613 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
614
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
615
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
616 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
617 * Sequence types, should never occur at this point because of
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
618 * "element.isLeaf()".
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
619 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
620
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
621 case EVR_SQ: // sequence of items
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
622 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
623
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
624
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
625 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
626 * Internal to DCMTK.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
627 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
628
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
629 case EVR_xs: // SS or US depending on context
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
630 case EVR_lt: // US, SS or OW depending on context, used for LUT Data (thus the name)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
631 case EVR_na: // na="not applicable", for data which has no VR
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
632 case EVR_up: // up="unsigned pointer", used internally for DICOMDIR suppor
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
633 case EVR_item: // used internally for items
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
634 case EVR_metainfo: // used internally for meta info datasets
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
635 case EVR_dataset: // used internally for datasets
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
636 case EVR_fileFormat: // used internally for DICOM files
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
637 case EVR_dicomDir: // used internally for DICOMDIR objects
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
638 case EVR_dirRecord: // used internally for DICOMDIR records
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
639 case EVR_pixelSQ: // used internally for pixel sequences in a compressed image
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
640 case EVR_pixelItem: // used internally for pixel items in a compressed image
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
641 case EVR_PixelData: // used internally for uncompressed pixeld data
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
642 case EVR_OverlayData: // used internally for overlay data
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
643 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
644
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
645
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
646 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
647 * Default case.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
648 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
649
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
650 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
651 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
652 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
653 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
654 catch (boost::bad_lexical_cast)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
655 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
656 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
657 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
658 catch (std::bad_cast)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
659 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
660 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
661 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
662 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
663
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
664
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
665 static Json::Value& PrepareNode(Json::Value& parent,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
666 DcmElement& element,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
667 DicomToJsonFormat format)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
668 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
669 assert(parent.type() == Json::objectValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
670
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
671 DicomTag tag(FromDcmtkBridge::GetTag(element));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
672 const std::string formattedTag = tag.Format();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
673
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
674 if (format == DicomToJsonFormat_Short)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
675 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
676 parent[formattedTag] = Json::nullValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
677 return parent[formattedTag];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
678 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
679
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
680 // This code gives access to the name of the private tags
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
681 std::string tagName = FromDcmtkBridge::GetTagName(element);
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
682
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
683 switch (format)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
684 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
685 case DicomToJsonFormat_Human:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
686 parent[tagName] = Json::nullValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
687 return parent[tagName];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
688
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
689 case DicomToJsonFormat_Full:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
690 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
691 parent[formattedTag] = Json::objectValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
692 Json::Value& node = parent[formattedTag];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
693
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
694 if (element.isLeaf())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
695 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
696 node["Name"] = tagName;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
697
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
698 if (element.getTag().getPrivateCreator() != NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
699 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
700 node["PrivateCreator"] = element.getTag().getPrivateCreator();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
701 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
702
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
703 return node;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
704 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
705 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
706 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
707 node["Name"] = tagName;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
708 node["Type"] = "Sequence";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
709 node["Value"] = Json::nullValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
710 return node["Value"];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
711 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
712 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
713
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
714 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
715 throw OrthancException(ErrorCode_ParameterOutOfRange);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
716 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
717 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
718
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
719
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
720 static void LeafValueToJson(Json::Value& target,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
721 const DicomValue& value,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
722 DicomToJsonFormat format,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
723 DicomToJsonFlags flags,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
724 unsigned int maxStringLength)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
725 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
726 Json::Value* targetValue = NULL;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
727 Json::Value* targetType = NULL;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
728
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
729 switch (format)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
730 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
731 case DicomToJsonFormat_Short:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
732 case DicomToJsonFormat_Human:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
733 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
734 assert(target.type() == Json::nullValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
735 targetValue = &target;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
736 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
737 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
738
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
739 case DicomToJsonFormat_Full:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
740 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
741 assert(target.type() == Json::objectValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
742 target["Value"] = Json::nullValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
743 target["Type"] = Json::nullValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
744 targetType = &target["Type"];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
745 targetValue = &target["Value"];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
746 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
747 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
748
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
749 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
750 throw OrthancException(ErrorCode_ParameterOutOfRange);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
751 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
752
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
753 assert(targetValue != NULL);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
754 assert(targetValue->type() == Json::nullValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
755 assert(targetType == NULL || targetType->type() == Json::nullValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
756
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
757 if (value.IsNull())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
758 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
759 if (targetType != NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
760 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
761 *targetType = "Null";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
762 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
763 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
764 else if (value.IsBinary())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
765 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
766 if (flags & DicomToJsonFlags_ConvertBinaryToAscii)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
767 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
768 *targetValue = Toolbox::ConvertToAscii(value.GetContent());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
769 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
770 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
771 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
772 std::string s;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
773 value.FormatDataUriScheme(s);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
774 *targetValue = s;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
775 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
776
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
777 if (targetType != NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
778 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
779 *targetType = "Binary";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
780 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
781 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
782 else if (maxStringLength == 0 ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
783 value.GetContent().size() <= maxStringLength)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
784 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
785 *targetValue = value.GetContent();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
786
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
787 if (targetType != NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
788 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
789 *targetType = "String";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
790 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
791 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
792 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
793 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
794 if (targetType != NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
795 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
796 *targetType = "TooLong";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
797 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
798 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
799 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
800
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
801
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
802 void FromDcmtkBridge::ElementToJson(Json::Value& parent,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
803 DcmElement& element,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
804 DicomToJsonFormat format,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
805 DicomToJsonFlags flags,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
806 unsigned int maxStringLength,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
807 Encoding encoding)
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
808 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
809 if (parent.type() == Json::nullValue)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
810 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
811 parent = Json::objectValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
812 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
813
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
814 assert(parent.type() == Json::objectValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
815 Json::Value& target = PrepareNode(parent, element, format);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
816
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
817 if (element.isLeaf())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
818 {
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
819 // The "0" below lets "LeafValueToJson()" take care of "TooLong" values
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
820 std::auto_ptr<DicomValue> v(FromDcmtkBridge::ConvertLeafElement(element, flags, 0, encoding));
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
821 LeafValueToJson(target, *v, format, flags, maxStringLength);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
822 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
823 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
824 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
825 assert(target.type() == Json::nullValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
826 target = Json::arrayValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
827
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
828 // "All subclasses of DcmElement except for DcmSequenceOfItems
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
829 // are leaf nodes, while DcmSequenceOfItems, DcmItem, DcmDataset
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
830 // etc. are not." The following dynamic_cast is thus OK.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
831 DcmSequenceOfItems& sequence = dynamic_cast<DcmSequenceOfItems&>(element);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
832
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
833 for (unsigned long i = 0; i < sequence.card(); i++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
834 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
835 DcmItem* child = sequence.getItem(i);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
836 Json::Value& v = target.append(Json::objectValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
837 DatasetToJson(v, *child, format, flags, maxStringLength, encoding);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
838 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
839 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
840 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
841
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
842
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
843 void FromDcmtkBridge::DatasetToJson(Json::Value& parent,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
844 DcmItem& item,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
845 DicomToJsonFormat format,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
846 DicomToJsonFlags flags,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
847 unsigned int maxStringLength,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
848 Encoding encoding)
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
849 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
850 assert(parent.type() == Json::objectValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
851
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
852 for (unsigned long i = 0; i < item.card(); i++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
853 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
854 DcmElement* element = item.getElement(i);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
855 if (element == NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
856 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
857 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
858 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
859
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
860 DicomTag tag(FromDcmtkBridge::Convert(element->getTag()));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
861
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
862 /*element->getTag().isPrivate()*/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
863 if (tag.IsPrivate() &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
864 !(flags & DicomToJsonFlags_IncludePrivateTags))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
865 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
866 continue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
867 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
868
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
869 if (!(flags & DicomToJsonFlags_IncludeUnknownTags))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
870 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
871 DictionaryLocker locker;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
872 if (locker->findEntry(element->getTag(), NULL) == NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
873 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
874 continue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
875 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
876 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
877
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
878 DcmEVR evr = element->getTag().getEVR();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
879 if (evr == EVR_OB ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
880 evr == EVR_OF ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
881 evr == EVR_OW ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
882 evr == EVR_UN ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
883 evr == EVR_ox)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
884 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
885 // This is a binary tag
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
886 if ((tag == DICOM_TAG_PIXEL_DATA && !(flags & DicomToJsonFlags_IncludePixelData)) ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
887 (tag != DICOM_TAG_PIXEL_DATA && !(flags & DicomToJsonFlags_IncludeBinary)))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
888 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
889 continue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
890 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
891 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
892
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
893 FromDcmtkBridge::ElementToJson(parent, *element, format, flags, maxStringLength, encoding);
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
894 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
895 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
896
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
897
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
898 void FromDcmtkBridge::ExtractDicomAsJson(Json::Value& target,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
899 DcmDataset& dataset,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
900 DicomToJsonFormat format,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
901 DicomToJsonFlags flags,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
902 unsigned int maxStringLength,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
903 Encoding defaultEncoding)
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
904 {
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
905 Encoding encoding = DetectEncoding(dataset, defaultEncoding);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
906
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
907 target = Json::objectValue;
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
908 DatasetToJson(target, dataset, format, flags, maxStringLength, encoding);
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
909 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
910
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
911
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
912 void FromDcmtkBridge::ExtractHeaderAsJson(Json::Value& target,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
913 DcmMetaInfo& dataset,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
914 DicomToJsonFormat format,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
915 DicomToJsonFlags flags,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
916 unsigned int maxStringLength)
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
917 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
918 target = Json::objectValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
919 DatasetToJson(target, dataset, format, flags, maxStringLength, Encoding_Ascii);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
920 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
921
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
922
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
923
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
924 static std::string GetTagNameInternal(DcmTag& tag)
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
925 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
926 {
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
927 // Some patches for important tags because of different DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
928 // dictionaries between DCMTK versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
929 DicomTag tmp(tag.getGroup(), tag.getElement());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
930 std::string n = tmp.GetMainTagsName();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
931 if (n.size() != 0)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
932 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
933 return n;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
934 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
935 // End of patches
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
936 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
937
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
938 #if 0
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
939 // This version explicitly calls the dictionary
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
940 const DcmDataDictionary& dict = dcmDataDict.rdlock();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
941 const DcmDictEntry* entry = dict.findEntry(tag, NULL);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
942
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
943 std::string s(DcmTag_ERROR_TagName);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
944 if (entry != NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
945 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
946 s = std::string(entry->getTagName());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
947 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
948
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
949 dcmDataDict.unlock();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
950 return s;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
951 #else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
952 const char* name = tag.getTagName();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
953 if (name == NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
954 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
955 return DcmTag_ERROR_TagName;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
956 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
957 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
958 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
959 return std::string(name);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
960 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
961 #endif
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
962 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
963
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
964
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
965 std::string FromDcmtkBridge::GetTagName(const DicomTag& t,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
966 const std::string& privateCreator)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
967 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
968 DcmTag tag(t.GetGroup(), t.GetElement());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
969
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
970 if (!privateCreator.empty())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
971 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
972 tag.setPrivateCreator(privateCreator.c_str());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
973 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
974
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
975 return GetTagNameInternal(tag);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
976 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
977
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
978
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
979 std::string FromDcmtkBridge::GetTagName(const DcmElement& element)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
980 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
981 // Copy the tag to ensure const-correctness of DcmElement. Note
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
982 // that the private creator information is also copied.
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
983 DcmTag tag(element.getTag());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
984
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
985 return GetTagNameInternal(tag);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
986 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
987
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
988
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
989
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
990 DicomTag FromDcmtkBridge::ParseTag(const char* name)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
991 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
992 if (strlen(name) == 9 &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
993 isxdigit(name[0]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
994 isxdigit(name[1]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
995 isxdigit(name[2]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
996 isxdigit(name[3]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
997 (name[4] == '-' || name[4] == ',') &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
998 isxdigit(name[5]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
999 isxdigit(name[6]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1000 isxdigit(name[7]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1001 isxdigit(name[8]))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1002 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1003 uint16_t group = GetTagValue(name);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1004 uint16_t element = GetTagValue(name + 5);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1005 return DicomTag(group, element);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1006 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1007
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1008 if (strlen(name) == 8 &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1009 isxdigit(name[0]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1010 isxdigit(name[1]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1011 isxdigit(name[2]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1012 isxdigit(name[3]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1013 isxdigit(name[4]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1014 isxdigit(name[5]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1015 isxdigit(name[6]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1016 isxdigit(name[7]))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1017 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1018 uint16_t group = GetTagValue(name);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1019 uint16_t element = GetTagValue(name + 4);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1020 return DicomTag(group, element);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1021 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1022
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1023 #if 0
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1024 const DcmDataDictionary& dict = dcmDataDict.rdlock();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1025 const DcmDictEntry* entry = dict.findEntry(name);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1026
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1027 if (entry == NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1028 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1029 dcmDataDict.unlock();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1030 throw OrthancException(ErrorCode_UnknownDicomTag);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1031 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1032 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1033 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1034 DcmTagKey key = entry->getKey();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1035 DicomTag tag(key.getGroup(), key.getElement());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1036 dcmDataDict.unlock();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1037 return tag;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1038 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1039 #else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1040 DcmTag tag;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1041 if (DcmTag::findTagFromName(name, tag).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1042 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1043 return DicomTag(tag.getGTag(), tag.getETag());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1044 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1045 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1046 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1047 throw OrthancException(ErrorCode_UnknownDicomTag);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1048 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1049 #endif
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1050 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1051
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1052
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1053 bool FromDcmtkBridge::IsUnknownTag(const DicomTag& tag)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1054 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1055 DcmTag tmp(tag.GetGroup(), tag.GetElement());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1056 return tmp.isUnknownVR();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1057 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1058
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1059
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1060 void FromDcmtkBridge::ToJson(Json::Value& result,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1061 const DicomMap& values,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1062 bool simplify)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1063 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1064 if (result.type() != Json::objectValue)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1065 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1066 throw OrthancException(ErrorCode_BadParameterType);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1067 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1068
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1069 result.clear();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1070
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1071 for (DicomMap::Map::const_iterator
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1072 it = values.map_.begin(); it != values.map_.end(); ++it)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1073 {
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1074 // TODO Inject PrivateCreator if some is available in the DicomMap?
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1075 const std::string tagName = GetTagName(it->first, "");
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1076
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1077 if (simplify)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1078 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1079 if (it->second->IsNull())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1080 {
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1081 result[tagName] = Json::nullValue;
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1082 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1083 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1084 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1085 // TODO IsBinary
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1086 result[tagName] = it->second->GetContent();
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1087 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1088 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1089 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1090 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1091 Json::Value value = Json::objectValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1092
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1093 value["Name"] = tagName;
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1094
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1095 if (it->second->IsNull())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1096 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1097 value["Type"] = "Null";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1098 value["Value"] = Json::nullValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1099 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1100 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1101 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1102 // TODO IsBinary
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1103 value["Type"] = "String";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1104 value["Value"] = it->second->GetContent();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1105 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1106
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1107 result[it->first.Format()] = value;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1108 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1109 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1110 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1111
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1112
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1113 std::string FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType level)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1114 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1115 char uid[100];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1116
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1117 switch (level)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1118 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1119 case ResourceType_Patient:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1120 // The "PatientID" field is of type LO (Long String), 64
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1121 // Bytes Maximum. An UUID is of length 36, thus it can be used
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1122 // as a random PatientID.
54
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 48
diff changeset
1123 return SystemToolbox::GenerateUuid();
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1124
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1125 case ResourceType_Instance:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1126 return dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1127
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1128 case ResourceType_Series:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1129 return dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1130
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1131 case ResourceType_Study:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1132 return dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1133
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1134 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1135 throw OrthancException(ErrorCode_ParameterOutOfRange);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1136 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1137 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1138
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1139 bool FromDcmtkBridge::SaveToMemoryBuffer(std::string& buffer,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1140 DcmDataset& dataSet)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1141 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1142 // Determine the transfer syntax which shall be used to write the
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1143 // information to the file. We always switch to the Little Endian
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1144 // syntax, with explicit length.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1145
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1146 // http://support.dcmtk.org/docs/dcxfer_8h-source.html
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1147
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1148
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1149 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1150 * Note that up to Orthanc 0.7.1 (inclusive), the
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1151 * "EXS_LittleEndianExplicit" was always used to save the DICOM
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1152 * dataset into memory. We now keep the original transfer syntax
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1153 * (if available).
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1154 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1155 E_TransferSyntax xfer = dataSet.getOriginalXfer();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1156 if (xfer == EXS_Unknown)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1157 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1158 // No information about the original transfer syntax: This is
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1159 // most probably a DICOM dataset that was read from memory.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1160 xfer = EXS_LittleEndianExplicit;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1161 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1162
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1163 E_EncodingType encodingType = /*opt_sequenceType*/ EET_ExplicitLength;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1164
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1165 // Create the meta-header information
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1166 DcmFileFormat ff(&dataSet);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1167 ff.validateMetaInfo(xfer);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1168 ff.removeInvalidGroups();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1169
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1170 // Create a memory buffer with the proper size
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1171 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1172 const uint32_t estimatedSize = ff.calcElementLength(xfer, encodingType); // (*)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1173 buffer.resize(estimatedSize);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1174 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1175
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1176 DcmOutputBufferStream ob(&buffer[0], buffer.size());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1177
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1178 // Fill the memory buffer with the meta-header and the dataset
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1179 ff.transferInit();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1180 OFCondition c = ff.write(ob, xfer, encodingType, NULL,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1181 /*opt_groupLength*/ EGL_recalcGL,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1182 /*opt_paddingType*/ EPD_withoutPadding);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1183 ff.transferEnd();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1184
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1185 if (c.good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1186 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1187 // The DICOM file is successfully written, truncate the target
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1188 // buffer if its size was overestimated by (*)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1189 ob.flush();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1190
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1191 size_t effectiveSize = static_cast<size_t>(ob.tell());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1192 if (effectiveSize < buffer.size())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1193 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1194 buffer.resize(effectiveSize);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1195 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1196
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1197 return true;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1198 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1199 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1200 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1201 // Error
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1202 buffer.clear();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1203 return false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1204 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1205 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1206
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1207
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1208 ValueRepresentation FromDcmtkBridge::LookupValueRepresentation(const DicomTag& tag)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1209 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1210 DcmTag t(tag.GetGroup(), tag.GetElement());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1211 return Convert(t.getEVR());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1212 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1213
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1214 ValueRepresentation FromDcmtkBridge::Convert(const DcmEVR vr)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1215 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1216 switch (vr)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1217 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1218 case EVR_AE:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1219 return ValueRepresentation_ApplicationEntity;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1220
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1221 case EVR_AS:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1222 return ValueRepresentation_AgeString;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1223
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1224 case EVR_AT:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1225 return ValueRepresentation_AttributeTag;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1226
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1227 case EVR_CS:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1228 return ValueRepresentation_CodeString;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1229
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1230 case EVR_DA:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1231 return ValueRepresentation_Date;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1232
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1233 case EVR_DS:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1234 return ValueRepresentation_DecimalString;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1235
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1236 case EVR_DT:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1237 return ValueRepresentation_DateTime;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1238
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1239 case EVR_FL:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1240 return ValueRepresentation_FloatingPointSingle;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1241
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1242 case EVR_FD:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1243 return ValueRepresentation_FloatingPointDouble;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1244
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1245 case EVR_IS:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1246 return ValueRepresentation_IntegerString;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1247
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1248 case EVR_LO:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1249 return ValueRepresentation_LongString;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1250
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1251 case EVR_LT:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1252 return ValueRepresentation_LongText;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1253
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1254 case EVR_OB:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1255 return ValueRepresentation_OtherByte;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1256
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1257 // Not supported as of DCMTK 3.6.0
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1258 /*case EVR_OD:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1259 return ValueRepresentation_OtherDouble;*/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1260
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1261 case EVR_OF:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1262 return ValueRepresentation_OtherFloat;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1263
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1264 // Not supported as of DCMTK 3.6.0
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1265 /*case EVR_OL:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1266 return ValueRepresentation_OtherLong;*/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1267
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1268 case EVR_OW:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1269 return ValueRepresentation_OtherWord;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1270
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1271 case EVR_PN:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1272 return ValueRepresentation_PersonName;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1273
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1274 case EVR_SH:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1275 return ValueRepresentation_ShortString;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1276
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1277 case EVR_SL:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1278 return ValueRepresentation_SignedLong;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1279
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1280 case EVR_SQ:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1281 return ValueRepresentation_Sequence;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1282
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1283 case EVR_SS:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1284 return ValueRepresentation_SignedShort;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1285
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1286 case EVR_ST:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1287 return ValueRepresentation_ShortText;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1288
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1289 case EVR_TM:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1290 return ValueRepresentation_Time;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1291
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1292 // Not supported as of DCMTK 3.6.0
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1293 /*case EVR_UC:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1294 return ValueRepresentation_UnlimitedCharacters;*/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1295
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1296 case EVR_UI:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1297 return ValueRepresentation_UniqueIdentifier;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1298
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1299 case EVR_UL:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1300 return ValueRepresentation_UnsignedLong;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1301
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1302 case EVR_UN:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1303 return ValueRepresentation_Unknown;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1304
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1305 // Not supported as of DCMTK 3.6.0
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1306 /*case EVR_UR:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1307 return ValueRepresentation_UniversalResource;*/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1308
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1309 case EVR_US:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1310 return ValueRepresentation_UnsignedShort;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1311
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1312 case EVR_UT:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1313 return ValueRepresentation_UnlimitedText;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1314
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1315 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1316 return ValueRepresentation_NotSupported;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1317 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1318 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1319
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1320
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1321 static bool IsBinaryTag(const DcmTag& key)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1322 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1323 return (key.isUnknownVR() ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1324 key.getEVR() == EVR_OB ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1325 key.getEVR() == EVR_OF ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1326 key.getEVR() == EVR_OW ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1327 key.getEVR() == EVR_UN ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1328 key.getEVR() == EVR_ox);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1329 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1330
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1331
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1332 DcmElement* FromDcmtkBridge::CreateElementForTag(const DicomTag& tag)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1333 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1334 DcmTag key(tag.GetGroup(), tag.GetElement());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1335
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1336 if (tag.IsPrivate() ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1337 IsBinaryTag(key))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1338 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1339 return new DcmOtherByteOtherWord(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1340 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1341
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1342 switch (key.getEVR())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1343 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1344 // http://support.dcmtk.org/docs/dcvr_8h-source.html
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1345
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1346 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1347 * Binary types, handled above
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1348 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1349
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1350 case EVR_OB: // other byte
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1351 case EVR_OF: // other float
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1352 case EVR_OW: // other word
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1353 case EVR_UN: // unknown value representation
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1354 case EVR_ox: // OB or OW depending on context
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1355 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1356
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1357
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1358 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1359 * String types.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1360 * http://support.dcmtk.org/docs/classDcmByteString.html
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1361 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1362
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1363 case EVR_AS: // age string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1364 return new DcmAgeString(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1365
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1366 case EVR_AE: // application entity title
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1367 return new DcmApplicationEntity(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1368
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1369 case EVR_CS: // code string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1370 return new DcmCodeString(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1371
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1372 case EVR_DA: // date string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1373 return new DcmDate(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1374
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1375 case EVR_DT: // date time string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1376 return new DcmDateTime(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1377
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1378 case EVR_DS: // decimal string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1379 return new DcmDecimalString(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1380
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1381 case EVR_IS: // integer string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1382 return new DcmIntegerString(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1383
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1384 case EVR_TM: // time string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1385 return new DcmTime(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1386
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1387 case EVR_UI: // unique identifier
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1388 return new DcmUniqueIdentifier(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1389
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1390 case EVR_ST: // short text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1391 return new DcmShortText(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1392
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1393 case EVR_LO: // long string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1394 return new DcmLongString(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1395
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1396 case EVR_LT: // long text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1397 return new DcmLongText(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1398
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1399 case EVR_UT: // unlimited text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1400 return new DcmUnlimitedText(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1401
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1402 case EVR_SH: // short string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1403 return new DcmShortString(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1404
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1405 case EVR_PN: // person name
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1406 return new DcmPersonName(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1407
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1408
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1409 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1410 * Numerical types
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1411 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1412
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1413 case EVR_SL: // signed long
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1414 return new DcmSignedLong(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1415
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1416 case EVR_SS: // signed short
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1417 return new DcmSignedShort(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1418
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1419 case EVR_UL: // unsigned long
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1420 return new DcmUnsignedLong(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1421
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1422 case EVR_US: // unsigned short
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1423 return new DcmUnsignedShort(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1424
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1425 case EVR_FL: // float single-precision
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1426 return new DcmFloatingPointSingle(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1427
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1428 case EVR_FD: // float double-precision
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1429 return new DcmFloatingPointDouble(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1430
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1431
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1432 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1433 * Sequence types, should never occur at this point.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1434 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1435
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1436 case EVR_SQ: // sequence of items
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1437 throw OrthancException(ErrorCode_ParameterOutOfRange);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1438
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1439
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1440 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1441 * TODO
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1442 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1443
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1444 case EVR_AT: // attribute tag
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1445 throw OrthancException(ErrorCode_NotImplemented);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1446
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1447
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1448 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1449 * Internal to DCMTK.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1450 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1451
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1452 case EVR_xs: // SS or US depending on context
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1453 case EVR_lt: // US, SS or OW depending on context, used for LUT Data (thus the name)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1454 case EVR_na: // na="not applicable", for data which has no VR
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1455 case EVR_up: // up="unsigned pointer", used internally for DICOMDIR suppor
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1456 case EVR_item: // used internally for items
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1457 case EVR_metainfo: // used internally for meta info datasets
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1458 case EVR_dataset: // used internally for datasets
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1459 case EVR_fileFormat: // used internally for DICOM files
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1460 case EVR_dicomDir: // used internally for DICOMDIR objects
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1461 case EVR_dirRecord: // used internally for DICOMDIR records
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1462 case EVR_pixelSQ: // used internally for pixel sequences in a compressed image
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1463 case EVR_pixelItem: // used internally for pixel items in a compressed image
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1464 case EVR_UNKNOWN: // used internally for elements with unknown VR (encoded with 4-byte length field in explicit VR)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1465 case EVR_PixelData: // used internally for uncompressed pixeld data
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1466 case EVR_OverlayData: // used internally for overlay data
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1467 case EVR_UNKNOWN2B: // used internally for elements with unknown VR with 2-byte length field in explicit VR
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1468 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1469 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1470 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1471
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1472 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1473 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1474
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1475
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1476
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1477 void FromDcmtkBridge::FillElementWithString(DcmElement& element,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1478 const DicomTag& tag,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1479 const std::string& utf8Value,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1480 bool decodeDataUriScheme,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1481 Encoding dicomEncoding)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1482 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1483 std::string binary;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1484 const std::string* decoded = &utf8Value;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1485
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1486 if (decodeDataUriScheme &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1487 boost::starts_with(utf8Value, "data:application/octet-stream;base64,"))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1488 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1489 std::string mime;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1490 if (!Toolbox::DecodeDataUriScheme(mime, binary, utf8Value))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1491 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1492 throw OrthancException(ErrorCode_BadFileFormat);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1493 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1494
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1495 decoded = &binary;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1496 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1497 else if (dicomEncoding != Encoding_Utf8)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1498 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1499 binary = Toolbox::ConvertFromUtf8(utf8Value, dicomEncoding);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1500 decoded = &binary;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1501 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1502
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1503 DcmTag key(tag.GetGroup(), tag.GetElement());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1504
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1505 if (tag.IsPrivate() ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1506 IsBinaryTag(key))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1507 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1508 if (element.putUint8Array((const Uint8*) decoded->c_str(), decoded->size()).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1509 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1510 return;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1511 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1512 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1513 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1514 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1515 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1516 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1517
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1518 bool ok = false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1519
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1520 try
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1521 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1522 switch (key.getEVR())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1523 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1524 // http://support.dcmtk.org/docs/dcvr_8h-source.html
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1525
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1526 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1527 * TODO.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1528 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1529
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1530 case EVR_OB: // other byte
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1531 case EVR_OF: // other float
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1532 case EVR_OW: // other word
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1533 case EVR_AT: // attribute tag
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1534 throw OrthancException(ErrorCode_NotImplemented);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1535
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1536 case EVR_UN: // unknown value representation
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1537 throw OrthancException(ErrorCode_ParameterOutOfRange);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1538
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1539
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1540 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1541 * String types.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1542 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1543
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1544 case EVR_DS: // decimal string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1545 case EVR_IS: // integer string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1546 case EVR_AS: // age string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1547 case EVR_DA: // date string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1548 case EVR_DT: // date time string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1549 case EVR_TM: // time string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1550 case EVR_AE: // application entity title
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1551 case EVR_CS: // code string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1552 case EVR_SH: // short string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1553 case EVR_LO: // long string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1554 case EVR_ST: // short text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1555 case EVR_LT: // long text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1556 case EVR_UT: // unlimited text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1557 case EVR_PN: // person name
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1558 case EVR_UI: // unique identifier
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1559 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1560 ok = element.putString(decoded->c_str()).good();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1561 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1562 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1563
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1564
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1565 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1566 * Numerical types
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1567 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1568
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1569 case EVR_SL: // signed long
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1570 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1571 ok = element.putSint32(boost::lexical_cast<Sint32>(*decoded)).good();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1572 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1573 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1574
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1575 case EVR_SS: // signed short
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1576 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1577 ok = element.putSint16(boost::lexical_cast<Sint16>(*decoded)).good();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1578 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1579 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1580
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1581 case EVR_UL: // unsigned long
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1582 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1583 ok = element.putUint32(boost::lexical_cast<Uint32>(*decoded)).good();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1584 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1585 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1586
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1587 case EVR_US: // unsigned short
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1588 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1589 ok = element.putUint16(boost::lexical_cast<Uint16>(*decoded)).good();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1590 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1591 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1592
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1593 case EVR_FL: // float single-precision
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1594 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1595 ok = element.putFloat32(boost::lexical_cast<float>(*decoded)).good();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1596 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1597 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1598
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1599 case EVR_FD: // float double-precision
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1600 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1601 ok = element.putFloat64(boost::lexical_cast<double>(*decoded)).good();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1602 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1603 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1604
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1605
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1606 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1607 * Sequence types, should never occur at this point.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1608 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1609
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1610 case EVR_SQ: // sequence of items
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1611 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1612 ok = false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1613 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1614 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1615
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1616
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1617 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1618 * Internal to DCMTK.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1619 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1620
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1621 case EVR_ox: // OB or OW depending on context
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1622 case EVR_xs: // SS or US depending on context
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1623 case EVR_lt: // US, SS or OW depending on context, used for LUT Data (thus the name)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1624 case EVR_na: // na="not applicable", for data which has no VR
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1625 case EVR_up: // up="unsigned pointer", used internally for DICOMDIR suppor
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1626 case EVR_item: // used internally for items
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1627 case EVR_metainfo: // used internally for meta info datasets
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1628 case EVR_dataset: // used internally for datasets
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1629 case EVR_fileFormat: // used internally for DICOM files
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1630 case EVR_dicomDir: // used internally for DICOMDIR objects
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1631 case EVR_dirRecord: // used internally for DICOMDIR records
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1632 case EVR_pixelSQ: // used internally for pixel sequences in a compressed image
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1633 case EVR_pixelItem: // used internally for pixel items in a compressed image
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1634 case EVR_UNKNOWN: // used internally for elements with unknown VR (encoded with 4-byte length field in explicit VR)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1635 case EVR_PixelData: // used internally for uncompressed pixeld data
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1636 case EVR_OverlayData: // used internally for overlay data
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1637 case EVR_UNKNOWN2B: // used internally for elements with unknown VR with 2-byte length field in explicit VR
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1638 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1639 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1640 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1641 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1642 catch (boost::bad_lexical_cast&)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1643 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1644 ok = false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1645 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1646
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1647 if (!ok)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1648 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1649 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1650 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1651 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1652
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1653
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1654 DcmElement* FromDcmtkBridge::FromJson(const DicomTag& tag,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1655 const Json::Value& value,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1656 bool decodeDataUriScheme,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1657 Encoding dicomEncoding)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1658 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1659 std::auto_ptr<DcmElement> element;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1660
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1661 switch (value.type())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1662 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1663 case Json::stringValue:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1664 element.reset(CreateElementForTag(tag));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1665 FillElementWithString(*element, tag, value.asString(), decodeDataUriScheme, dicomEncoding);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1666 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1667
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1668 case Json::arrayValue:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1669 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1670 DcmTag key(tag.GetGroup(), tag.GetElement());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1671 if (key.getEVR() != EVR_SQ)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1672 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1673 throw OrthancException(ErrorCode_BadParameterType);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1674 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1675
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1676 DcmSequenceOfItems* sequence = new DcmSequenceOfItems(key, value.size());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1677 element.reset(sequence);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1678
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1679 for (Json::Value::ArrayIndex i = 0; i < value.size(); i++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1680 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1681 std::auto_ptr<DcmItem> item(new DcmItem);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1682
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1683 Json::Value::Members members = value[i].getMemberNames();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1684 for (Json::Value::ArrayIndex j = 0; j < members.size(); j++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1685 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1686 item->insert(FromJson(ParseTag(members[j]), value[i][members[j]], decodeDataUriScheme, dicomEncoding));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1687 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1688
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1689 sequence->append(item.release());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1690 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1691
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1692 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1693 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1694
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1695 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1696 throw OrthancException(ErrorCode_BadParameterType);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1697 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1698
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1699 return element.release();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1700 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1701
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1702
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1703 DcmPixelSequence* FromDcmtkBridge::GetPixelSequence(DcmDataset& dataset)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1704 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1705 DcmElement *element = NULL;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1706 if (!dataset.findAndGetElement(DCM_PixelData, element).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1707 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1708 throw OrthancException(ErrorCode_BadFileFormat);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1709 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1710
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1711 DcmPixelData& pixelData = dynamic_cast<DcmPixelData&>(*element);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1712 DcmPixelSequence* pixelSequence = NULL;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1713 if (!pixelData.getEncapsulatedRepresentation
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1714 (dataset.getOriginalXfer(), NULL, pixelSequence).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1715 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1716 return NULL;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1717 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1718 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1719 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1720 return pixelSequence;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1721 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1722 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1723
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1724
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1725 Encoding FromDcmtkBridge::ExtractEncoding(const Json::Value& json,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1726 Encoding defaultEncoding)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1727 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1728 if (json.type() != Json::objectValue)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1729 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1730 throw OrthancException(ErrorCode_BadParameterType);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1731 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1732
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1733 Encoding encoding = defaultEncoding;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1734
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1735 const Json::Value::Members tags = json.getMemberNames();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1736
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1737 // Look for SpecificCharacterSet (0008,0005) in the JSON file
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1738 for (size_t i = 0; i < tags.size(); i++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1739 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1740 DicomTag tag = FromDcmtkBridge::ParseTag(tags[i]);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1741 if (tag == DICOM_TAG_SPECIFIC_CHARACTER_SET)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1742 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1743 const Json::Value& value = json[tags[i]];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1744 if (value.type() != Json::stringValue ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1745 !GetDicomEncoding(encoding, value.asCString()))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1746 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1747 LOG(ERROR) << "Unknown encoding while creating DICOM from JSON: " << value;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1748 throw OrthancException(ErrorCode_BadRequest);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1749 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1750 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1751 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1752
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1753 return encoding;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1754 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1755
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1756
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1757 static void SetString(DcmDataset& target,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1758 const DcmTag& tag,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1759 const std::string& value)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1760 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1761 if (!target.putAndInsertString(tag, value.c_str()).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1762 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1763 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1764 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1765 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1766
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1767
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1768 DcmDataset* FromDcmtkBridge::FromJson(const Json::Value& json, // Encoded using UTF-8
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1769 bool generateIdentifiers,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1770 bool decodeDataUriScheme,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1771 Encoding defaultEncoding)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1772 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1773 std::auto_ptr<DcmDataset> result(new DcmDataset);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1774 Encoding encoding = ExtractEncoding(json, defaultEncoding);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1775
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1776 SetString(*result, DCM_SpecificCharacterSet, GetDicomSpecificCharacterSet(encoding));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1777
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1778 const Json::Value::Members tags = json.getMemberNames();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1779
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1780 bool hasPatientId = false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1781 bool hasStudyInstanceUid = false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1782 bool hasSeriesInstanceUid = false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1783 bool hasSopInstanceUid = false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1784
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1785 for (size_t i = 0; i < tags.size(); i++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1786 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1787 DicomTag tag = FromDcmtkBridge::ParseTag(tags[i]);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1788 const Json::Value& value = json[tags[i]];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1789
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1790 if (tag == DICOM_TAG_PATIENT_ID)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1791 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1792 hasPatientId = true;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1793 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1794 else if (tag == DICOM_TAG_STUDY_INSTANCE_UID)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1795 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1796 hasStudyInstanceUid = true;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1797 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1798 else if (tag == DICOM_TAG_SERIES_INSTANCE_UID)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1799 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1800 hasSeriesInstanceUid = true;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1801 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1802 else if (tag == DICOM_TAG_SOP_INSTANCE_UID)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1803 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1804 hasSopInstanceUid = true;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1805 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1806
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1807 if (tag != DICOM_TAG_SPECIFIC_CHARACTER_SET)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1808 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1809 std::auto_ptr<DcmElement> element(FromDcmtkBridge::FromJson(tag, value, decodeDataUriScheme, encoding));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1810 const DcmTagKey& tag = element->getTag();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1811
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1812 result->findAndDeleteElement(tag);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1813
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1814 DcmElement* tmp = element.release();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1815 if (!result->insert(tmp, false, false).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1816 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1817 delete tmp;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1818 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1819 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1820 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1821 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1822
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1823 if (!hasPatientId &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1824 generateIdentifiers)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1825 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1826 SetString(*result, DCM_PatientID, GenerateUniqueIdentifier(ResourceType_Patient));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1827 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1828
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1829 if (!hasStudyInstanceUid &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1830 generateIdentifiers)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1831 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1832 SetString(*result, DCM_StudyInstanceUID, GenerateUniqueIdentifier(ResourceType_Study));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1833 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1834
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1835 if (!hasSeriesInstanceUid &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1836 generateIdentifiers)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1837 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1838 SetString(*result, DCM_SeriesInstanceUID, GenerateUniqueIdentifier(ResourceType_Series));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1839 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1840
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1841 if (!hasSopInstanceUid &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1842 generateIdentifiers)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1843 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1844 SetString(*result, DCM_SOPInstanceUID, GenerateUniqueIdentifier(ResourceType_Instance));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1845 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1846
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1847 return result.release();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1848 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1849
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1850
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1851 DcmFileFormat* FromDcmtkBridge::LoadFromMemoryBuffer(const void* buffer,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1852 size_t size)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1853 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1854 DcmInputBufferStream is;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1855 if (size > 0)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1856 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1857 is.setBuffer(buffer, size);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1858 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1859 is.setEos();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1860
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1861 std::auto_ptr<DcmFileFormat> result(new DcmFileFormat);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1862
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1863 result->transferInit();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1864 if (!result->read(is).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1865 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1866 throw OrthancException(ErrorCode_BadFileFormat);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1867 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1868
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1869 result->loadAllDataIntoMemory();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1870 result->transferEnd();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1871
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1872 return result.release();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1873 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1874
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1875
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1876 void FromDcmtkBridge::FromJson(DicomMap& target,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1877 const Json::Value& source)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1878 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1879 if (source.type() != Json::objectValue)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1880 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1881 throw OrthancException(ErrorCode_BadFileFormat);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1882 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1883
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1884 target.Clear();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1885
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1886 Json::Value::Members members = source.getMemberNames();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1887
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1888 for (size_t i = 0; i < members.size(); i++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1889 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1890 const Json::Value& value = source[members[i]];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1891
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1892 if (value.type() != Json::stringValue)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1893 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1894 throw OrthancException(ErrorCode_BadFileFormat);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1895 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1896
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1897 target.SetValue(ParseTag(members[i]), value.asString(), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1898 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1899 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1900 }