annotate Framework/Orthanc/OrthancServer/FromDcmtkBridge.cpp @ 38:8f68ad57fd18

sync
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 08 Nov 2016 10:51:48 +0100
parents dc730d11b101
children 9621fd6f17c9
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"
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 #include "../Core/Toolbox.h"
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 #include "../Core/Uuid.h"
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 #include "../Core/OrthancException.h"
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 #include <list>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 #include <limits>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 #include <boost/lexical_cast.hpp>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 #include <boost/filesystem.hpp>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 #include <boost/algorithm/string/predicate.hpp>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 #include <dcmtk/dcmdata/dcdeftag.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 #include <dcmtk/dcmdata/dcdicent.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 #include <dcmtk/dcmdata/dcdict.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 #include <dcmtk/dcmdata/dcfilefo.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 #include <dcmtk/dcmdata/dcostrmb.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 #include <dcmtk/dcmdata/dcpixel.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 #include <dcmtk/dcmdata/dcuid.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 #include <dcmtk/dcmdata/dcistrmb.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 #include <dcmtk/dcmdata/dcvrae.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 #include <dcmtk/dcmdata/dcvras.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 #include <dcmtk/dcmdata/dcvrat.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 #include <dcmtk/dcmdata/dcvrcs.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 #include <dcmtk/dcmdata/dcvrda.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 #include <dcmtk/dcmdata/dcvrds.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 #include <dcmtk/dcmdata/dcvrdt.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 #include <dcmtk/dcmdata/dcvrfd.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 #include <dcmtk/dcmdata/dcvrfl.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 #include <dcmtk/dcmdata/dcvris.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 #include <dcmtk/dcmdata/dcvrlo.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 #include <dcmtk/dcmdata/dcvrlt.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 #include <dcmtk/dcmdata/dcvrpn.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 #include <dcmtk/dcmdata/dcvrsh.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 #include <dcmtk/dcmdata/dcvrsl.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 #include <dcmtk/dcmdata/dcvrss.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 #include <dcmtk/dcmdata/dcvrst.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 #include <dcmtk/dcmdata/dcvrtm.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 #include <dcmtk/dcmdata/dcvrui.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 #include <dcmtk/dcmdata/dcvrul.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 #include <dcmtk/dcmdata/dcvrus.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 #include <dcmtk/dcmdata/dcvrut.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84
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 #if DCMTK_USE_EMBEDDED_DICTIONARIES == 1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 #include <EmbeddedResources.h>
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 #endif
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89
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 namespace Orthanc
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 static inline uint16_t GetCharValue(char c)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 if (c >= '0' && c <= '9')
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 return c - '0';
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 else if (c >= 'a' && c <= 'f')
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 return c - 'a' + 10;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 else if (c >= 'A' && c <= 'F')
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 return c - 'A' + 10;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 return 0;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 }
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 static inline uint16_t GetTagValue(const char* c)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 return ((GetCharValue(c[0]) << 12) +
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 (GetCharValue(c[1]) << 8) +
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109 (GetCharValue(c[2]) << 4) +
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 GetCharValue(c[3]));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 }
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 #if DCMTK_USE_EMBEDDED_DICTIONARIES == 1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 static void LoadEmbeddedDictionary(DcmDataDictionary& dictionary,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 EmbeddedResources::FileResourceId resource)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 std::string content;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119 EmbeddedResources::GetFileResource(content, resource);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121 Toolbox::TemporaryFile tmp;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122 tmp.Write(content);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 if (!dictionary.loadDictionary(tmp.GetPath().c_str()))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 LOG(ERROR) << "Cannot read embedded dictionary. Under Windows, make sure that "
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 << "your TEMP directory does not contain special characters.";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 }
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 #else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133 static void LoadExternalDictionary(DcmDataDictionary& dictionary,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 const std::string& directory,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 const std::string& filename)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 boost::filesystem::path p = directory;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 p = p / filename;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 LOG(WARNING) << "Loading the external DICOM dictionary " << p;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142 if (!dictionary.loadDictionary(p.string().c_str()))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 }
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181 void FromDcmtkBridge::InitializeDictionary()
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);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198 LoadEmbeddedDictionary(*locker, EmbeddedResources::DICTIONARY_PRIVATE);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200 #elif defined(__linux__) || defined(__FreeBSD_kernel__)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201 std::string path = DCMTK_DICTIONARY_DIR;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203 const char* env = std::getenv(DCM_DICT_ENVIRONMENT_VARIABLE);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
204 if (env != NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
205 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
206 path = std::string(env);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
207 }
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 LoadExternalDictionary(*locker, path, "dicom.dic");
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 LoadExternalDictionary(*locker, path, "private.dic");
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 #else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 #error Support your platform here
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 #endif
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215 }
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 /* make sure data dictionary is loaded */
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 if (!dcmDataDict.isDictionaryLoaded())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220 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
221 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
224 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
225 // Test the dictionary with a simple DICOM tag
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
226 DcmTag key(0x0010, 0x1030); // This is PatientWeight
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
227 if (key.getEVR() != EVR_DS)
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 LOG(ERROR) << "The DICOM dictionary has not been correctly read";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
230 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
231 }
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
235
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
236 void FromDcmtkBridge::RegisterDictionaryTag(const DicomTag& tag,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
237 ValueRepresentation vr,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
238 const std::string& name,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
239 unsigned int minMultiplicity,
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
240 unsigned int maxMultiplicity,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
241 const std::string& privateCreator)
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
242 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
243 if (minMultiplicity < 1)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
244 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
245 throw OrthancException(ErrorCode_ParameterOutOfRange);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
246 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
247
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
248 bool arbitrary = false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
249 if (maxMultiplicity == 0)
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 maxMultiplicity = DcmVariableVM;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
252 arbitrary = true;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
253 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
254 else if (maxMultiplicity < minMultiplicity)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
255 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
256 throw OrthancException(ErrorCode_ParameterOutOfRange);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
257 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
258
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
259 DcmEVR evr = ToDcmtkBridge::Convert(vr);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
260
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
261 LOG(INFO) << "Registering tag in dictionary: " << tag << " " << (DcmVR(evr).getValidVRName()) << " "
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
262 << name << " (multiplicity: " << minMultiplicity << "-"
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
263 << (arbitrary ? "n" : boost::lexical_cast<std::string>(maxMultiplicity)) << ")";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
264
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
265 std::auto_ptr<DcmDictEntry> entry;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
266 if (privateCreator.empty())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
267 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
268 if (tag.GetGroup() % 2 == 1)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
269 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
270 char buf[128];
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
271 sprintf(buf, "Warning: You are registering a private tag (%04x,%04x), "
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
272 "but no private creator was associated with it",
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
273 tag.GetGroup(), tag.GetElement());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
274 LOG(WARNING) << buf;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
275 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
276
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
277 entry.reset(new DcmDictEntry(tag.GetGroup(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
278 tag.GetElement(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
279 evr, name.c_str(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
280 static_cast<int>(minMultiplicity),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
281 static_cast<int>(maxMultiplicity),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
282 NULL /* version */,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
283 OFTrue /* doCopyString */,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
284 NULL /* private creator */));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
285 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
286 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
287 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
288 // "Private Data Elements have an odd Group Number that is not
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
289 // (0001,eeee), (0003,eeee), (0005,eeee), (0007,eeee), or
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
290 // (FFFF,eeee)."
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
291 if (tag.GetGroup() % 2 == 0 /* even */ ||
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
292 tag.GetGroup() == 0x0001 ||
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
293 tag.GetGroup() == 0x0003 ||
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
294 tag.GetGroup() == 0x0005 ||
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
295 tag.GetGroup() == 0x0007 ||
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
296 tag.GetGroup() == 0xffff)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
297 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
298 char buf[128];
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
299 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
300 tag.GetGroup(), tag.GetElement());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
301 LOG(ERROR) << buf;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
302 throw OrthancException(ErrorCode_ParameterOutOfRange);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
303 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
304
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
305 entry.reset(new DcmDictEntry(tag.GetGroup(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
306 tag.GetElement(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
307 evr, name.c_str(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
308 static_cast<int>(minMultiplicity),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
309 static_cast<int>(maxMultiplicity),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
310 "private" /* version */,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
311 OFTrue /* doCopyString */,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
312 privateCreator.c_str()));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
313 }
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
314
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
315 entry->setGroupRangeRestriction(DcmDictRange_Unspecified);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
316 entry->setElementRangeRestriction(DcmDictRange_Unspecified);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
317
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
318 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
319 DictionaryLocker locker;
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
320
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
321 if (locker->findEntry(name.c_str()))
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
322 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
323 LOG(ERROR) << "Cannot register two tags with the same symbolic name \"" << name << "\"";
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
324 throw OrthancException(ErrorCode_AlreadyExistingTag);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
325 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
326
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
327 locker->addEntry(entry.release());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
328 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
329 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
330
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 Encoding FromDcmtkBridge::DetectEncoding(DcmItem& dataset,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
333 Encoding defaultEncoding)
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 Encoding encoding = defaultEncoding;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
336
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
337 OFString tmp;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
338 if (dataset.findAndGetOFString(DCM_SpecificCharacterSet, tmp).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
339 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
340 std::string characterSet = Toolbox::StripSpaces(std::string(tmp.c_str()));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
341
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
342 if (characterSet.empty())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
343 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
344 // Empty specific character set tag: Use the default encoding
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 else if (GetDicomEncoding(encoding, characterSet.c_str()))
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 // The specific character set is supported by the Orthanc core
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
349 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
350 else
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 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
353 << ", fallback to ASCII (remove all special characters)";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
354 encoding = Encoding_Ascii;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
355 }
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 else
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 // No specific character set tag: Use the default encoding
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
362 return encoding;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
363 }
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
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
366 void FromDcmtkBridge::ExtractDicomSummary(DicomMap& target,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
367 DcmItem& dataset,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
368 unsigned int maxStringLength,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
369 Encoding defaultEncoding)
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
370 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
371 Encoding encoding = DetectEncoding(dataset, defaultEncoding);
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 target.Clear();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
374 for (unsigned long i = 0; i < dataset.card(); i++)
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 DcmElement* element = dataset.getElement(i);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
377 if (element && element->isLeaf())
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 target.SetValue(element->getTag().getGTag(),
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
380 element->getTag().getETag(),
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
381 ConvertLeafElement(*element, DicomToJsonFlags_Default, maxStringLength, encoding));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
382 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
383 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
384 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
385
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
386
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
387 DicomTag FromDcmtkBridge::Convert(const DcmTag& tag)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
388 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
389 return DicomTag(tag.getGTag(), tag.getETag());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
390 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
391
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 DicomTag FromDcmtkBridge::GetTag(const DcmElement& element)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
394 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
395 return DicomTag(element.getGTag(), element.getETag());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
396 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
397
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
398
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
399 DicomValue* FromDcmtkBridge::ConvertLeafElement(DcmElement& element,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
400 DicomToJsonFlags flags,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
401 unsigned int maxStringLength,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
402 Encoding encoding)
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 if (!element.isLeaf())
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 // This function is only applicable to leaf elements
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
407 throw OrthancException(ErrorCode_BadParameterType);
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 char *c = NULL;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
411 if (element.isaString() &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
412 element.getString(c).good())
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 if (c == NULL) // This case corresponds to the empty string
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 return new DicomValue("", false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
417 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
418 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
419 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
420 std::string s(c);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
421 std::string utf8 = Toolbox::ConvertToUtf8(s, encoding);
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 if (maxStringLength != 0 &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
424 utf8.size() > maxStringLength)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
425 {
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
426 return new DicomValue; // Too long, create a NULL value
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
427 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
428 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
429 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
430 return new DicomValue(utf8, false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
431 }
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 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
434
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
435
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
436 if (element.getVR() == EVR_UN)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
437 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
438 // Unknown value representation: Lookup in the dictionary. This
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
439 // is notably the case for private tags registered with the
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
440 // "Dictionary" configuration option.
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
441 DictionaryLocker locker;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
442
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
443 const DcmDictEntry* entry = locker->findEntry(element.getTag().getXTag(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
444 element.getTag().getPrivateCreator());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
445 if (entry != NULL &&
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
446 entry->getVR().isaString())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
447 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
448 Uint8* data = NULL;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
449
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
450 // At (*), we do not try and convert to UTF-8, as nothing says
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
451 // the encoding of the private tag is the same as that of the
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
452 // remaining of the DICOM dataset. Only go for ASCII strings.
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
453
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
454 if (element.getUint8Array(data) == EC_Normal &&
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
455 Toolbox::IsAsciiString(data, element.getLength())) // (*)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
456 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
457 if (data == NULL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
458 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
459 return new DicomValue("", false); // Empty string
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
460 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
461 else if (maxStringLength != 0 &&
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
462 element.getLength() > maxStringLength)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
463 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
464 return new DicomValue; // Too long, create a NULL value
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
465 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
466 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
467 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
468 std::string s(reinterpret_cast<const char*>(data), element.getLength());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
469 return new DicomValue(s, false);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
470 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
471 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
472 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
473 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
474
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
475
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
476 try
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
477 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
478 // http://support.dcmtk.org/docs/dcvr_8h-source.html
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
479 switch (element.getVR())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
480 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
481
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
482 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
483 * Deal with binary data (including PixelData).
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
484 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
485
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
486 case EVR_OB: // other byte
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
487 case EVR_OF: // other float
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
488 case EVR_OW: // other word
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
489 case EVR_UN: // unknown value representation
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
490 case EVR_ox: // OB or OW depending on context
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
491 case EVR_DS: // decimal string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
492 case EVR_IS: // integer string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
493 case EVR_AS: // age string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
494 case EVR_DA: // date string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
495 case EVR_DT: // date time string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
496 case EVR_TM: // time string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
497 case EVR_AE: // application entity title
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
498 case EVR_CS: // code string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
499 case EVR_SH: // short string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
500 case EVR_LO: // long string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
501 case EVR_ST: // short text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
502 case EVR_LT: // long text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
503 case EVR_UT: // unlimited text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
504 case EVR_PN: // person name
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
505 case EVR_UI: // unique identifier
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
506 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
507 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
508 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
509 if (!(flags & DicomToJsonFlags_ConvertBinaryToNull))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
510 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
511 Uint8* data = NULL;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
512 if (element.getUint8Array(data) == EC_Normal)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
513 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
514 return new DicomValue(reinterpret_cast<const char*>(data), element.getLength(), true);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
515 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
516 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
517
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
518 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
519 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
520
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
521 /**
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
522 * Numeric types
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
523 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
524
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
525 case EVR_SL: // signed long
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
526 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
527 Sint32 f;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
528 if (dynamic_cast<DcmSignedLong&>(element).getSint32(f).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
529 return new DicomValue(boost::lexical_cast<std::string>(f), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
530 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
531 return new DicomValue;
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 case EVR_SS: // signed short
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
535 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
536 Sint16 f;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
537 if (dynamic_cast<DcmSignedShort&>(element).getSint16(f).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
538 return new DicomValue(boost::lexical_cast<std::string>(f), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
539 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
540 return new DicomValue;
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
543 case EVR_UL: // unsigned long
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
544 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
545 Uint32 f;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
546 if (dynamic_cast<DcmUnsignedLong&>(element).getUint32(f).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
547 return new DicomValue(boost::lexical_cast<std::string>(f), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
548 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
549 return new DicomValue;
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
552 case EVR_US: // unsigned short
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
553 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
554 Uint16 f;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
555 if (dynamic_cast<DcmUnsignedShort&>(element).getUint16(f).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
556 return new DicomValue(boost::lexical_cast<std::string>(f), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
557 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
558 return new DicomValue;
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
561 case EVR_FL: // float single-precision
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
562 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
563 Float32 f;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
564 if (dynamic_cast<DcmFloatingPointSingle&>(element).getFloat32(f).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
565 return new DicomValue(boost::lexical_cast<std::string>(f), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
566 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
567 return new DicomValue;
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
570 case EVR_FD: // float double-precision
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
571 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
572 Float64 f;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
573 if (dynamic_cast<DcmFloatingPointDouble&>(element).getFloat64(f).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
574 return new DicomValue(boost::lexical_cast<std::string>(f), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
575 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
576 return new DicomValue;
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
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 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
581 * Attribute tag.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
582 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
583
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
584 case EVR_AT:
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 DcmTagKey tag;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
587 if (dynamic_cast<DcmAttributeTag&>(element).getTagVal(tag, 0).good())
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 DicomTag t(tag.getGroup(), tag.getElement());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
590 return new DicomValue(t.Format(), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
591 }
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 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
594 return new DicomValue;
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
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 * Sequence types, should never occur at this point because of
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
601 * "element.isLeaf()".
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
604 case EVR_SQ: // sequence of items
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
605 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
606
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
607
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 * Internal to DCMTK.
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
612 case EVR_xs: // SS or US depending on context
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
613 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
614 case EVR_na: // na="not applicable", for data which has no VR
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
615 case EVR_up: // up="unsigned pointer", used internally for DICOMDIR suppor
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
616 case EVR_item: // used internally for items
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
617 case EVR_metainfo: // used internally for meta info datasets
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
618 case EVR_dataset: // used internally for datasets
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
619 case EVR_fileFormat: // used internally for DICOM files
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
620 case EVR_dicomDir: // used internally for DICOMDIR objects
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
621 case EVR_dirRecord: // used internally for DICOMDIR records
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
622 case EVR_pixelSQ: // used internally for pixel sequences in a compressed image
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
623 case EVR_pixelItem: // used internally for pixel items in a compressed image
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
624 case EVR_PixelData: // used internally for uncompressed pixeld data
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
625 case EVR_OverlayData: // used internally for overlay data
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
626 return new DicomValue;
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 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
630 * Default case.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
631 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
632
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
633 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
634 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
635 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
636 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
637 catch (boost::bad_lexical_cast)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
638 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
639 return new DicomValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
640 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
641 catch (std::bad_cast)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
642 {
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
648 static Json::Value& PrepareNode(Json::Value& parent,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
649 DcmElement& element,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
650 DicomToJsonFormat format)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
651 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
652 assert(parent.type() == Json::objectValue);
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 DicomTag tag(FromDcmtkBridge::GetTag(element));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
655 const std::string formattedTag = tag.Format();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
656
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
657 if (format == DicomToJsonFormat_Short)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
658 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
659 parent[formattedTag] = Json::nullValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
660 return parent[formattedTag];
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 // This code gives access to the name of the private tags
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
664 std::string tagName = FromDcmtkBridge::GetTagName(element);
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
665
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
666 switch (format)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
667 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
668 case DicomToJsonFormat_Human:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
669 parent[tagName] = Json::nullValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
670 return parent[tagName];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
671
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
672 case DicomToJsonFormat_Full:
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 parent[formattedTag] = Json::objectValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
675 Json::Value& node = parent[formattedTag];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
676
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
677 if (element.isLeaf())
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 node["Name"] = tagName;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
680
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
681 if (element.getTag().getPrivateCreator() != NULL)
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 node["PrivateCreator"] = element.getTag().getPrivateCreator();
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
686 return node;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
687 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
688 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
689 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
690 node["Name"] = tagName;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
691 node["Type"] = "Sequence";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
692 node["Value"] = Json::nullValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
693 return node["Value"];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
694 }
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
697 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
698 throw OrthancException(ErrorCode_ParameterOutOfRange);
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 }
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 static void LeafValueToJson(Json::Value& target,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
704 const DicomValue& value,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
705 DicomToJsonFormat format,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
706 DicomToJsonFlags flags,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
707 unsigned int maxStringLength)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
708 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
709 Json::Value* targetValue = NULL;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
710 Json::Value* targetType = NULL;
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 switch (format)
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 case DicomToJsonFormat_Short:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
715 case DicomToJsonFormat_Human:
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 assert(target.type() == Json::nullValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
718 targetValue = &target;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
719 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
720 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
721
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
722 case DicomToJsonFormat_Full:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
723 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
724 assert(target.type() == Json::objectValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
725 target["Value"] = Json::nullValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
726 target["Type"] = Json::nullValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
727 targetType = &target["Type"];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
728 targetValue = &target["Value"];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
729 break;
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
732 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
733 throw OrthancException(ErrorCode_ParameterOutOfRange);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
734 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
735
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
736 assert(targetValue != NULL);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
737 assert(targetValue->type() == Json::nullValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
738 assert(targetType == NULL || targetType->type() == Json::nullValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
739
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
740 if (value.IsNull())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
741 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
742 if (targetType != NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
743 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
744 *targetType = "Null";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
745 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
746 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
747 else if (value.IsBinary())
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 if (flags & DicomToJsonFlags_ConvertBinaryToAscii)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
750 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
751 *targetValue = Toolbox::ConvertToAscii(value.GetContent());
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 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
754 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
755 std::string s;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
756 value.FormatDataUriScheme(s);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
757 *targetValue = s;
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
760 if (targetType != NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
761 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
762 *targetType = "Binary";
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 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
765 else if (maxStringLength == 0 ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
766 value.GetContent().size() <= maxStringLength)
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 = 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 if (targetType != NULL)
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 *targetType = "String";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
773 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
774 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
775 else
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 = "TooLong";
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 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
783
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
784
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
785 void FromDcmtkBridge::ElementToJson(Json::Value& parent,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
786 DcmElement& element,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
787 DicomToJsonFormat format,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
788 DicomToJsonFlags flags,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
789 unsigned int maxStringLength,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
790 Encoding encoding)
1
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 if (parent.type() == Json::nullValue)
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 parent = Json::objectValue;
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
797 assert(parent.type() == Json::objectValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
798 Json::Value& target = PrepareNode(parent, element, format);
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 if (element.isLeaf())
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 // The "0" below lets "LeafValueToJson()" take care of "TooLong" values
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
803 std::auto_ptr<DicomValue> v(FromDcmtkBridge::ConvertLeafElement(element, flags, 0, encoding));
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
804 LeafValueToJson(target, *v, format, flags, maxStringLength);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
805 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
806 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
807 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
808 assert(target.type() == Json::nullValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
809 target = Json::arrayValue;
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 // "All subclasses of DcmElement except for DcmSequenceOfItems
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
812 // are leaf nodes, while DcmSequenceOfItems, DcmItem, DcmDataset
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
813 // etc. are not." The following dynamic_cast is thus OK.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
814 DcmSequenceOfItems& sequence = dynamic_cast<DcmSequenceOfItems&>(element);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
815
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
816 for (unsigned long i = 0; i < sequence.card(); i++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
817 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
818 DcmItem* child = sequence.getItem(i);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
819 Json::Value& v = target.append(Json::objectValue);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
820 DatasetToJson(v, *child, format, flags, maxStringLength, encoding);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
821 }
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 }
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
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
826 void FromDcmtkBridge::DatasetToJson(Json::Value& parent,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
827 DcmItem& item,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
828 DicomToJsonFormat format,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
829 DicomToJsonFlags flags,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
830 unsigned int maxStringLength,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
831 Encoding encoding)
1
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 assert(parent.type() == Json::objectValue);
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 for (unsigned long i = 0; i < item.card(); i++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
836 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
837 DcmElement* element = item.getElement(i);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
838 if (element == NULL)
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 throw OrthancException(ErrorCode_InternalError);
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
843 DicomTag tag(FromDcmtkBridge::Convert(element->getTag()));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
844
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
845 /*element->getTag().isPrivate()*/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
846 if (tag.IsPrivate() &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
847 !(flags & DicomToJsonFlags_IncludePrivateTags))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
848 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
849 continue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
850 }
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 if (!(flags & DicomToJsonFlags_IncludeUnknownTags))
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 DictionaryLocker locker;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
855 if (locker->findEntry(element->getTag(), NULL) == 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 continue;
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
861 DcmEVR evr = element->getTag().getEVR();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
862 if (evr == EVR_OB ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
863 evr == EVR_OF ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
864 evr == EVR_OW ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
865 evr == EVR_UN ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
866 evr == EVR_ox)
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 // This is a binary tag
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
869 if ((tag == DICOM_TAG_PIXEL_DATA && !(flags & DicomToJsonFlags_IncludePixelData)) ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
870 (tag != DICOM_TAG_PIXEL_DATA && !(flags & DicomToJsonFlags_IncludeBinary)))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
871 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
872 continue;
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 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
875
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
876 FromDcmtkBridge::ElementToJson(parent, *element, format, flags, maxStringLength, encoding);
1
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 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
879
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
880
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
881 void FromDcmtkBridge::ExtractDicomAsJson(Json::Value& target,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
882 DcmDataset& dataset,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
883 DicomToJsonFormat format,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
884 DicomToJsonFlags flags,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
885 unsigned int maxStringLength,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
886 Encoding defaultEncoding)
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
887 {
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
888 Encoding encoding = DetectEncoding(dataset, defaultEncoding);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
889
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
890 target = Json::objectValue;
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
891 DatasetToJson(target, dataset, format, flags, maxStringLength, encoding);
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
892 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
893
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
894
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
895 void FromDcmtkBridge::ExtractHeaderAsJson(Json::Value& target,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
896 DcmMetaInfo& dataset,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
897 DicomToJsonFormat format,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
898 DicomToJsonFlags flags,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
899 unsigned int maxStringLength)
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
900 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
901 target = Json::objectValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
902 DatasetToJson(target, dataset, format, flags, maxStringLength, Encoding_Ascii);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
903 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
904
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
905
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
906
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
907 static std::string GetTagNameInternal(DcmTag& tag)
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
908 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
909 {
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
910 // Some patches for important tags because of different DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
911 // dictionaries between DCMTK versions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
912 DicomTag tmp(tag.getGroup(), tag.getElement());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
913 std::string n = tmp.GetMainTagsName();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
914 if (n.size() != 0)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
915 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
916 return n;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
917 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
918 // End of patches
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
919 }
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 #if 0
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
922 // This version explicitly calls the dictionary
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
923 const DcmDataDictionary& dict = dcmDataDict.rdlock();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
924 const DcmDictEntry* entry = dict.findEntry(tag, NULL);
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 std::string s(DcmTag_ERROR_TagName);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
927 if (entry != NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
928 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
929 s = std::string(entry->getTagName());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
930 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
931
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
932 dcmDataDict.unlock();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
933 return s;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
934 #else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
935 const char* name = tag.getTagName();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
936 if (name == NULL)
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 return DcmTag_ERROR_TagName;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
939 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
940 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
941 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
942 return std::string(name);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
943 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
944 #endif
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
947
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
948 std::string FromDcmtkBridge::GetTagName(const DicomTag& t,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
949 const std::string& privateCreator)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
950 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
951 DcmTag tag(t.GetGroup(), t.GetElement());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
952
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
953 if (!privateCreator.empty())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
954 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
955 tag.setPrivateCreator(privateCreator.c_str());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
956 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
957
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
958 return GetTagNameInternal(tag);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
959 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
960
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
961
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
962 std::string FromDcmtkBridge::GetTagName(const DcmElement& element)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
963 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
964 // Copy the tag to ensure const-correctness of DcmElement. Note
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
965 // that the private creator information is also copied.
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
966 DcmTag tag(element.getTag());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
967
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
968 return GetTagNameInternal(tag);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
969 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
970
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
971
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
972
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
973 DicomTag FromDcmtkBridge::ParseTag(const char* name)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
974 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
975 if (strlen(name) == 9 &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
976 isxdigit(name[0]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
977 isxdigit(name[1]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
978 isxdigit(name[2]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
979 isxdigit(name[3]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
980 (name[4] == '-' || name[4] == ',') &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
981 isxdigit(name[5]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
982 isxdigit(name[6]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
983 isxdigit(name[7]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
984 isxdigit(name[8]))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
985 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
986 uint16_t group = GetTagValue(name);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
987 uint16_t element = GetTagValue(name + 5);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
988 return DicomTag(group, element);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
989 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
990
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
991 if (strlen(name) == 8 &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
992 isxdigit(name[0]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
993 isxdigit(name[1]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
994 isxdigit(name[2]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
995 isxdigit(name[3]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
996 isxdigit(name[4]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
997 isxdigit(name[5]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
998 isxdigit(name[6]) &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
999 isxdigit(name[7]))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1000 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1001 uint16_t group = GetTagValue(name);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1002 uint16_t element = GetTagValue(name + 4);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1003 return DicomTag(group, element);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1004 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1005
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1006 #if 0
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1007 const DcmDataDictionary& dict = dcmDataDict.rdlock();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1008 const DcmDictEntry* entry = dict.findEntry(name);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1009
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1010 if (entry == NULL)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1011 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1012 dcmDataDict.unlock();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1013 throw OrthancException(ErrorCode_UnknownDicomTag);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1014 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1015 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1016 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1017 DcmTagKey key = entry->getKey();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1018 DicomTag tag(key.getGroup(), key.getElement());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1019 dcmDataDict.unlock();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1020 return tag;
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 #else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1023 DcmTag tag;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1024 if (DcmTag::findTagFromName(name, tag).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1025 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1026 return DicomTag(tag.getGTag(), tag.getETag());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1027 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1028 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1029 {
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 #endif
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1035
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1036 bool FromDcmtkBridge::IsUnknownTag(const DicomTag& tag)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1037 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1038 DcmTag tmp(tag.GetGroup(), tag.GetElement());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1039 return tmp.isUnknownVR();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1040 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1041
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 void FromDcmtkBridge::ToJson(Json::Value& result,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1044 const DicomMap& values,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1045 bool simplify)
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 if (result.type() != Json::objectValue)
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 throw OrthancException(ErrorCode_BadParameterType);
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 result.clear();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1053
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1054 for (DicomMap::Map::const_iterator
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1055 it = values.map_.begin(); it != values.map_.end(); ++it)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1056 {
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1057 // TODO Inject PrivateCreator if some is available in the DicomMap?
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1058 const std::string tagName = GetTagName(it->first, "");
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1059
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1060 if (simplify)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1061 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1062 if (it->second->IsNull())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1063 {
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1064 result[tagName] = Json::nullValue;
1
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 else
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 // TODO IsBinary
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1069 result[tagName] = it->second->GetContent();
1
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 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1072 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1073 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1074 Json::Value value = Json::objectValue;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1075
38
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1076 value["Name"] = tagName;
1
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1077
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1078 if (it->second->IsNull())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1079 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1080 value["Type"] = "Null";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1081 value["Value"] = Json::nullValue;
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1086 value["Type"] = "String";
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1087 value["Value"] = it->second->GetContent();
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1090 result[it->first.Format()] = value;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1091 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1092 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1093 }
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1096 std::string FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType level)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1097 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1098 char uid[100];
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 switch (level)
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 case ResourceType_Patient:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1103 // The "PatientID" field is of type LO (Long String), 64
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1104 // 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
1105 // as a random PatientID.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1106 return Toolbox::GenerateUuid();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1107
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1108 case ResourceType_Instance:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1109 return dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT);
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 case ResourceType_Series:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1112 return dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1113
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1114 case ResourceType_Study:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1115 return dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT);
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 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1118 throw OrthancException(ErrorCode_ParameterOutOfRange);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1119 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1120 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1121
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1122 bool FromDcmtkBridge::SaveToMemoryBuffer(std::string& buffer,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1123 DcmDataset& dataSet)
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 // Determine the transfer syntax which shall be used to write the
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1126 // information to the file. We always switch to the Little Endian
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1127 // syntax, with explicit length.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1128
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1129 // http://support.dcmtk.org/docs/dcxfer_8h-source.html
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1132 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1133 * Note that up to Orthanc 0.7.1 (inclusive), the
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1134 * "EXS_LittleEndianExplicit" was always used to save the DICOM
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1135 * dataset into memory. We now keep the original transfer syntax
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1136 * (if available).
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 E_TransferSyntax xfer = dataSet.getOriginalXfer();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1139 if (xfer == EXS_Unknown)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1140 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1141 // No information about the original transfer syntax: This is
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1142 // most probably a DICOM dataset that was read from memory.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1143 xfer = EXS_LittleEndianExplicit;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1144 }
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 E_EncodingType encodingType = /*opt_sequenceType*/ EET_ExplicitLength;
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 // Create the meta-header information
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1149 DcmFileFormat ff(&dataSet);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1150 ff.validateMetaInfo(xfer);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1151 ff.removeInvalidGroups();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1152
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1153 // Create a memory buffer with the proper size
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 const uint32_t estimatedSize = ff.calcElementLength(xfer, encodingType); // (*)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1156 buffer.resize(estimatedSize);
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1159 DcmOutputBufferStream ob(&buffer[0], buffer.size());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1160
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1161 // Fill the memory buffer with the meta-header and the dataset
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1162 ff.transferInit();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1163 OFCondition c = ff.write(ob, xfer, encodingType, NULL,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1164 /*opt_groupLength*/ EGL_recalcGL,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1165 /*opt_paddingType*/ EPD_withoutPadding);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1166 ff.transferEnd();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1167
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1168 if (c.good())
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 // The DICOM file is successfully written, truncate the target
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1171 // buffer if its size was overestimated by (*)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1172 ob.flush();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1173
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1174 size_t effectiveSize = static_cast<size_t>(ob.tell());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1175 if (effectiveSize < buffer.size())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1176 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1177 buffer.resize(effectiveSize);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1178 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1179
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1180 return true;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1181 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1182 else
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1183 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1184 // Error
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1185 buffer.clear();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1186 return false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1187 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1188 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1189
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 ValueRepresentation FromDcmtkBridge::LookupValueRepresentation(const DicomTag& tag)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1192 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1193 DcmTag t(tag.GetGroup(), tag.GetElement());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1194 return Convert(t.getEVR());
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 ValueRepresentation FromDcmtkBridge::Convert(const DcmEVR vr)
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 switch (vr)
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 case EVR_AE:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1202 return ValueRepresentation_ApplicationEntity;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1203
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1204 case EVR_AS:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1205 return ValueRepresentation_AgeString;
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 case EVR_AT:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1208 return ValueRepresentation_AttributeTag;
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 case EVR_CS:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1211 return ValueRepresentation_CodeString;
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 case EVR_DA:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1214 return ValueRepresentation_Date;
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 case EVR_DS:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1217 return ValueRepresentation_DecimalString;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1218
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1219 case EVR_DT:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1220 return ValueRepresentation_DateTime;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1221
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1222 case EVR_FL:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1223 return ValueRepresentation_FloatingPointSingle;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1224
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1225 case EVR_FD:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1226 return ValueRepresentation_FloatingPointDouble;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1227
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1228 case EVR_IS:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1229 return ValueRepresentation_IntegerString;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1230
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1231 case EVR_LO:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1232 return ValueRepresentation_LongString;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1233
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1234 case EVR_LT:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1235 return ValueRepresentation_LongText;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1236
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1237 case EVR_OB:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1238 return ValueRepresentation_OtherByte;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1239
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1240 // Not supported as of DCMTK 3.6.0
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1241 /*case EVR_OD:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1242 return ValueRepresentation_OtherDouble;*/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1243
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1244 case EVR_OF:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1245 return ValueRepresentation_OtherFloat;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1246
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1247 // Not supported as of DCMTK 3.6.0
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1248 /*case EVR_OL:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1249 return ValueRepresentation_OtherLong;*/
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_OW:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1252 return ValueRepresentation_OtherWord;
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_PN:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1255 return ValueRepresentation_PersonName;
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 case EVR_SH:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1258 return ValueRepresentation_ShortString;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1259
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1260 case EVR_SL:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1261 return ValueRepresentation_SignedLong;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1262
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1263 case EVR_SQ:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1264 return ValueRepresentation_Sequence;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1265
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1266 case EVR_SS:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1267 return ValueRepresentation_SignedShort;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1268
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1269 case EVR_ST:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1270 return ValueRepresentation_ShortText;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1271
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1272 case EVR_TM:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1273 return ValueRepresentation_Time;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1274
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1275 // Not supported as of DCMTK 3.6.0
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1276 /*case EVR_UC:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1277 return ValueRepresentation_UnlimitedCharacters;*/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1278
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1279 case EVR_UI:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1280 return ValueRepresentation_UniqueIdentifier;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1281
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1282 case EVR_UL:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1283 return ValueRepresentation_UnsignedLong;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1284
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1285 case EVR_UN:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1286 return ValueRepresentation_Unknown;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1287
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1288 // Not supported as of DCMTK 3.6.0
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1289 /*case EVR_UR:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1290 return ValueRepresentation_UniversalResource;*/
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 case EVR_US:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1293 return ValueRepresentation_UnsignedShort;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1294
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1295 case EVR_UT:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1296 return ValueRepresentation_UnlimitedText;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1297
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1298 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1299 return ValueRepresentation_NotSupported;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1300 }
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1303
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1304 static bool IsBinaryTag(const DcmTag& key)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1305 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1306 return (key.isUnknownVR() ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1307 key.getEVR() == EVR_OB ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1308 key.getEVR() == EVR_OF ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1309 key.getEVR() == EVR_OW ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1310 key.getEVR() == EVR_UN ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1311 key.getEVR() == EVR_ox);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1312 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1313
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 DcmElement* FromDcmtkBridge::CreateElementForTag(const DicomTag& tag)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1316 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1317 DcmTag key(tag.GetGroup(), tag.GetElement());
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 if (tag.IsPrivate() ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1320 IsBinaryTag(key))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1321 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1322 return new DcmOtherByteOtherWord(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1323 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1324
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1325 switch (key.getEVR())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1326 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1327 // http://support.dcmtk.org/docs/dcvr_8h-source.html
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1328
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 * Binary types, handled above
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1333 case EVR_OB: // other byte
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1334 case EVR_OF: // other float
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1335 case EVR_OW: // other word
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1336 case EVR_UN: // unknown value representation
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1337 case EVR_ox: // OB or OW depending on context
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1338 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1339
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 * String types.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1343 * http://support.dcmtk.org/docs/classDcmByteString.html
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1344 **/
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 case EVR_AS: // age string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1347 return new DcmAgeString(key);
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 case EVR_AE: // application entity title
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1350 return new DcmApplicationEntity(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1351
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1352 case EVR_CS: // code string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1353 return new DcmCodeString(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1354
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1355 case EVR_DA: // date string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1356 return new DcmDate(key);
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 case EVR_DT: // date time string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1359 return new DcmDateTime(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1360
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1361 case EVR_DS: // decimal string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1362 return new DcmDecimalString(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1363
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1364 case EVR_IS: // integer string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1365 return new DcmIntegerString(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1366
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1367 case EVR_TM: // time string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1368 return new DcmTime(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1369
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1370 case EVR_UI: // unique identifier
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1371 return new DcmUniqueIdentifier(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1372
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1373 case EVR_ST: // short text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1374 return new DcmShortText(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1375
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1376 case EVR_LO: // long string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1377 return new DcmLongString(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1378
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1379 case EVR_LT: // long text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1380 return new DcmLongText(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1381
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1382 case EVR_UT: // unlimited text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1383 return new DcmUnlimitedText(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1384
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1385 case EVR_SH: // short string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1386 return new DcmShortString(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1387
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1388 case EVR_PN: // person name
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1389 return new DcmPersonName(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1390
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1391
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 * Numerical types
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1394 **/
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_SL: // signed long
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1397 return new DcmSignedLong(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_SS: // signed short
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1400 return new DcmSignedShort(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_UL: // unsigned long
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1403 return new DcmUnsignedLong(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_US: // unsigned short
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1406 return new DcmUnsignedShort(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 case EVR_FL: // float single-precision
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1409 return new DcmFloatingPointSingle(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1410
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1411 case EVR_FD: // float double-precision
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1412 return new DcmFloatingPointDouble(key);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1413
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1414
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 * Sequence types, should never occur at this point.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1417 **/
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_SQ: // sequence of items
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1420 throw OrthancException(ErrorCode_ParameterOutOfRange);
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1423 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1424 * TODO
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1425 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1426
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1427 case EVR_AT: // attribute tag
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1428 throw OrthancException(ErrorCode_NotImplemented);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1429
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 * Internal to DCMTK.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1433 **/
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 case EVR_xs: // SS or US depending on context
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1436 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
1437 case EVR_na: // na="not applicable", for data which has no VR
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1438 case EVR_up: // up="unsigned pointer", used internally for DICOMDIR suppor
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1439 case EVR_item: // used internally for items
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1440 case EVR_metainfo: // used internally for meta info datasets
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1441 case EVR_dataset: // used internally for datasets
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1442 case EVR_fileFormat: // used internally for DICOM files
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1443 case EVR_dicomDir: // used internally for DICOMDIR objects
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1444 case EVR_dirRecord: // used internally for DICOMDIR records
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1445 case EVR_pixelSQ: // used internally for pixel sequences in a compressed image
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1446 case EVR_pixelItem: // used internally for pixel items in a compressed image
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1447 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
1448 case EVR_PixelData: // used internally for uncompressed pixeld data
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1449 case EVR_OverlayData: // used internally for overlay data
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1450 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
1451 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1452 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1453 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1454
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1455 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1456 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1457
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1458
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1459
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1460 void FromDcmtkBridge::FillElementWithString(DcmElement& element,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1461 const DicomTag& tag,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1462 const std::string& utf8Value,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1463 bool decodeDataUriScheme,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1464 Encoding dicomEncoding)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1465 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1466 std::string binary;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1467 const std::string* decoded = &utf8Value;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1468
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1469 if (decodeDataUriScheme &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1470 boost::starts_with(utf8Value, "data:application/octet-stream;base64,"))
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 std::string mime;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1473 if (!Toolbox::DecodeDataUriScheme(mime, binary, utf8Value))
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 throw OrthancException(ErrorCode_BadFileFormat);
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1478 decoded = &binary;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1479 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1480 else if (dicomEncoding != Encoding_Utf8)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1481 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1482 binary = Toolbox::ConvertFromUtf8(utf8Value, dicomEncoding);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1483 decoded = &binary;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1484 }
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 DcmTag key(tag.GetGroup(), tag.GetElement());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1487
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1488 if (tag.IsPrivate() ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1489 IsBinaryTag(key))
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1490 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1491 if (element.putUint8Array((const Uint8*) decoded->c_str(), decoded->size()).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1492 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1493 return;
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 else
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 throw OrthancException(ErrorCode_InternalError);
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 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1500
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1501 bool ok = false;
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 try
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 switch (key.getEVR())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1506 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1507 // http://support.dcmtk.org/docs/dcvr_8h-source.html
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1508
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 * TODO.
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1513 case EVR_OB: // other byte
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1514 case EVR_OF: // other float
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1515 case EVR_OW: // other word
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1516 case EVR_AT: // attribute tag
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1517 throw OrthancException(ErrorCode_NotImplemented);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1518
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1519 case EVR_UN: // unknown value representation
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1520 throw OrthancException(ErrorCode_ParameterOutOfRange);
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
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 * String types.
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 case EVR_DS: // decimal string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1528 case EVR_IS: // integer string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1529 case EVR_AS: // age string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1530 case EVR_DA: // date string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1531 case EVR_DT: // date time string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1532 case EVR_TM: // time string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1533 case EVR_AE: // application entity title
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1534 case EVR_CS: // code string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1535 case EVR_SH: // short string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1536 case EVR_LO: // long string
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1537 case EVR_ST: // short text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1538 case EVR_LT: // long text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1539 case EVR_UT: // unlimited text
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1540 case EVR_PN: // person name
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1541 case EVR_UI: // unique identifier
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 ok = element.putString(decoded->c_str()).good();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1544 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1545 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1546
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1547
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1548 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1549 * Numerical types
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1550 **/
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1551
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1552 case EVR_SL: // signed long
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1553 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1554 ok = element.putSint32(boost::lexical_cast<Sint32>(*decoded)).good();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1555 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1556 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1557
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1558 case EVR_SS: // signed short
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.putSint16(boost::lexical_cast<Sint16>(*decoded)).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 case EVR_UL: // unsigned long
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 ok = element.putUint32(boost::lexical_cast<Uint32>(*decoded)).good();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1567 break;
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1570 case EVR_US: // unsigned short
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1571 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1572 ok = element.putUint16(boost::lexical_cast<Uint16>(*decoded)).good();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1573 break;
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1576 case EVR_FL: // float single-precision
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1577 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1578 ok = element.putFloat32(boost::lexical_cast<float>(*decoded)).good();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1579 break;
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1582 case EVR_FD: // float double-precision
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1583 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1584 ok = element.putFloat64(boost::lexical_cast<double>(*decoded)).good();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1585 break;
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
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 /**
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1590 * Sequence types, should never occur at this point.
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_SQ: // sequence of items
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 = false;
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
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 * Internal to DCMTK.
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1602 **/
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 case EVR_ox: // OB or OW depending on context
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1605 case EVR_xs: // SS or US depending on context
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1606 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
1607 case EVR_na: // na="not applicable", for data which has no VR
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1608 case EVR_up: // up="unsigned pointer", used internally for DICOMDIR suppor
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1609 case EVR_item: // used internally for items
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1610 case EVR_metainfo: // used internally for meta info datasets
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1611 case EVR_dataset: // used internally for datasets
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1612 case EVR_fileFormat: // used internally for DICOM files
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1613 case EVR_dicomDir: // used internally for DICOMDIR objects
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1614 case EVR_dirRecord: // used internally for DICOMDIR records
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1615 case EVR_pixelSQ: // used internally for pixel sequences in a compressed image
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1616 case EVR_pixelItem: // used internally for pixel items in a compressed image
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1617 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
1618 case EVR_PixelData: // used internally for uncompressed pixeld data
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1619 case EVR_OverlayData: // used internally for overlay data
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1620 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
1621 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1622 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1623 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1624 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1625 catch (boost::bad_lexical_cast&)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1626 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1627 ok = false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1628 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1629
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1630 if (!ok)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1631 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1632 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1633 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1634 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1635
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1636
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1637 DcmElement* FromDcmtkBridge::FromJson(const DicomTag& tag,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1638 const Json::Value& value,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1639 bool decodeDataUriScheme,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1640 Encoding dicomEncoding)
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 std::auto_ptr<DcmElement> element;
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 switch (value.type())
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 case Json::stringValue:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1647 element.reset(CreateElementForTag(tag));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1648 FillElementWithString(*element, tag, value.asString(), decodeDataUriScheme, dicomEncoding);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1649 break;
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 case Json::arrayValue:
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 DcmTag key(tag.GetGroup(), tag.GetElement());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1654 if (key.getEVR() != EVR_SQ)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1655 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1656 throw OrthancException(ErrorCode_BadParameterType);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1657 }
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 DcmSequenceOfItems* sequence = new DcmSequenceOfItems(key, value.size());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1660 element.reset(sequence);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1661
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1662 for (Json::Value::ArrayIndex i = 0; i < value.size(); i++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1663 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1664 std::auto_ptr<DcmItem> item(new DcmItem);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1665
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1666 Json::Value::Members members = value[i].getMemberNames();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1667 for (Json::Value::ArrayIndex j = 0; j < members.size(); j++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1668 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1669 item->insert(FromJson(ParseTag(members[j]), value[i][members[j]], decodeDataUriScheme, dicomEncoding));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1670 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1671
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1672 sequence->append(item.release());
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1673 }
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 break;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1676 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1677
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1678 default:
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1679 throw OrthancException(ErrorCode_BadParameterType);
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1682 return element.release();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1683 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1684
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 DcmPixelSequence* FromDcmtkBridge::GetPixelSequence(DcmDataset& dataset)
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 DcmElement *element = NULL;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1689 if (!dataset.findAndGetElement(DCM_PixelData, element).good())
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 throw OrthancException(ErrorCode_BadFileFormat);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1692 }
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 DcmPixelData& pixelData = dynamic_cast<DcmPixelData&>(*element);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1695 DcmPixelSequence* pixelSequence = NULL;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1696 if (!pixelData.getEncapsulatedRepresentation
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1697 (dataset.getOriginalXfer(), NULL, pixelSequence).good())
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 NULL;
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 else
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 return pixelSequence;
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 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1706
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 Encoding FromDcmtkBridge::ExtractEncoding(const Json::Value& json,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1709 Encoding defaultEncoding)
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 if (json.type() != Json::objectValue)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1712 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1713 throw OrthancException(ErrorCode_BadParameterType);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1714 }
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 Encoding encoding = defaultEncoding;
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 const Json::Value::Members tags = json.getMemberNames();
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 // Look for SpecificCharacterSet (0008,0005) in the JSON file
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1721 for (size_t i = 0; i < tags.size(); i++)
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 DicomTag tag = FromDcmtkBridge::ParseTag(tags[i]);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1724 if (tag == DICOM_TAG_SPECIFIC_CHARACTER_SET)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1725 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1726 const Json::Value& value = json[tags[i]];
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1727 if (value.type() != Json::stringValue ||
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1728 !GetDicomEncoding(encoding, value.asCString()))
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 LOG(ERROR) << "Unknown encoding while creating DICOM from JSON: " << value;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1731 throw OrthancException(ErrorCode_BadRequest);
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 }
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1736 return encoding;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1737 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1738
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 static void SetString(DcmDataset& target,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1741 const DcmTag& tag,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1742 const std::string& value)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1743 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1744 if (!target.putAndInsertString(tag, value.c_str()).good())
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1745 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1746 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1747 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1748 }
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 DcmDataset* FromDcmtkBridge::FromJson(const Json::Value& json, // Encoded using UTF-8
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1752 bool generateIdentifiers,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1753 bool decodeDataUriScheme,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1754 Encoding defaultEncoding)
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 std::auto_ptr<DcmDataset> result(new DcmDataset);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1757 Encoding encoding = ExtractEncoding(json, defaultEncoding);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1758
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1759 SetString(*result, DCM_SpecificCharacterSet, GetDicomSpecificCharacterSet(encoding));
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 const Json::Value::Members tags = json.getMemberNames();
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 bool hasPatientId = false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1764 bool hasStudyInstanceUid = false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1765 bool hasSeriesInstanceUid = false;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1766 bool hasSopInstanceUid = false;
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 for (size_t i = 0; i < tags.size(); i++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1769 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1770 DicomTag tag = FromDcmtkBridge::ParseTag(tags[i]);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1771 const Json::Value& value = json[tags[i]];
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 if (tag == DICOM_TAG_PATIENT_ID)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1774 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1775 hasPatientId = true;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1776 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1777 else if (tag == DICOM_TAG_STUDY_INSTANCE_UID)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1778 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1779 hasStudyInstanceUid = true;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1780 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1781 else if (tag == DICOM_TAG_SERIES_INSTANCE_UID)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1782 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1783 hasSeriesInstanceUid = true;
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 else if (tag == DICOM_TAG_SOP_INSTANCE_UID)
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 hasSopInstanceUid = true;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1788 }
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_SPECIFIC_CHARACTER_SET)
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 std::auto_ptr<DcmElement> element(FromDcmtkBridge::FromJson(tag, value, decodeDataUriScheme, encoding));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1793 const DcmTagKey& tag = element->getTag();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1794
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1795 result->findAndDeleteElement(tag);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1796
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1797 DcmElement* tmp = element.release();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1798 if (!result->insert(tmp, false, false).good())
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 delete tmp;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1801 throw OrthancException(ErrorCode_InternalError);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1802 }
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 }
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 if (!hasPatientId &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1807 generateIdentifiers)
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 SetString(*result, DCM_PatientID, GenerateUniqueIdentifier(ResourceType_Patient));
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1810 }
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 if (!hasStudyInstanceUid &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1813 generateIdentifiers)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1814 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1815 SetString(*result, DCM_StudyInstanceUID, GenerateUniqueIdentifier(ResourceType_Study));
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1818 if (!hasSeriesInstanceUid &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1819 generateIdentifiers)
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 SetString(*result, DCM_SeriesInstanceUID, GenerateUniqueIdentifier(ResourceType_Series));
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1824 if (!hasSopInstanceUid &&
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1825 generateIdentifiers)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1826 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1827 SetString(*result, DCM_SOPInstanceUID, GenerateUniqueIdentifier(ResourceType_Instance));
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1830 return result.release();
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
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 DcmFileFormat* FromDcmtkBridge::LoadFromMemoryBuffer(const void* buffer,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1835 size_t size)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1836 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1837 DcmInputBufferStream is;
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1838 if (size > 0)
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 is.setBuffer(buffer, size);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1841 }
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1842 is.setEos();
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 std::auto_ptr<DcmFileFormat> result(new DcmFileFormat);
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 result->transferInit();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1847 if (!result->read(is).good())
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 throw OrthancException(ErrorCode_BadFileFormat);
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1852 result->loadAllDataIntoMemory();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1853 result->transferEnd();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1854
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1855 return result.release();
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
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 void FromDcmtkBridge::FromJson(DicomMap& target,
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1860 const Json::Value& source)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1861 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1862 if (source.type() != Json::objectValue)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1863 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1864 throw OrthancException(ErrorCode_BadFileFormat);
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1867 target.Clear();
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 Json::Value::Members members = source.getMemberNames();
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1870
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1871 for (size_t i = 0; i < members.size(); i++)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1872 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1873 const Json::Value& value = source[members[i]];
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 if (value.type() != Json::stringValue)
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1876 {
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1877 throw OrthancException(ErrorCode_BadFileFormat);
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
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1880 target.SetValue(ParseTag(members[i]), value.asString(), false);
dc730d11b101 orthanc dependencies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1881 }
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 }